Confirmedusers, Bureaucrats, editor, Administrators
1,522
edits
m (Tylermcwilliams moved page NetworkApiTest to Network API: title didn't fit) |
VeryGoodDog (talk | contribs) m (VeryGoodDog moved page Network API to Modding:Network API) |
||
(13 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
__FORCETOC__ | __FORCETOC__ | ||
{{GameVersion|1.12}} | |||
Before starting, you should have a development environment set up. If you don't have one already you should read the tutorial [[Setting up your Development Environment]]. Furthermore, we assume that you have a basic understanding of the C# language and Object Oriented Programming. Let's get started! | Before starting, you should have a development environment set up. If you don't have one already you should read the tutorial [[Setting up your Development Environment]]. Furthermore, we assume that you have a basic understanding of the C# language and Object Oriented Programming. Let's get started! | ||
Line 32: | Line 33: | ||
== ProtoContracts == | == ProtoContracts == | ||
VintageStory uses the | VintageStory uses the [https://github.com/protobuf-net/protobuf-net Protobuf-net] library to serialize classes declared with the <code>ProtoContract</code> attribute. | ||
Inside our namespace block, let's create our ProtoContract classes: | Inside our namespace block, let's create our <code>ProtoContract</code> classes: | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)] | [ProtoContract(ImplicitFields = ImplicitFields.AllPublic)] | ||
public class NetworkApiTestMessage | public class NetworkApiTestMessage | ||
{ | { | ||
Line 49: | Line 50: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
The argument we pass to <code>ProtoContract</code> makes it so all <code>public</code> fields will be serialized; without this, we'd declare fields for serialization by using <code>ProtoMember</code> attributes. If we chose this approach, we'd write our classes like so: | |||
<syntaxhighlight lang="c#"> | |||
[ProtoContract] | |||
public class NetworkApiTestMessage | |||
{ | |||
[ProtoMember(1)] | |||
public string message; | |||
} | |||
[ProtoContract] | |||
public class NetworkApiTestResponse | |||
{ | |||
[ProtoMember(1)] | |||
public string response; | |||
} | |||
</syntaxhighlight> | |||
The argument we pass to <code>ProtoMember</code> is a unique unsigned integer called a tag, and it's used to identify the fields flagged for serialization. When the client receives the packet containing the serialized <code>ProtoContract</code>, it won't know the type of its members, and will identify them by the tag number. We use the <code>ImplicitFields.AllPublic</code> to flag all public fields for serialization, and tags are assigned in alphabetic order. ProtoBuf is beyond the scope of this tutorial, but you can read more about this powerful library [https://developers.google.com/protocol-buffers/docs/csharptutorial here]. | |||
The fields in these classes hold the data we wish to send through our channel. We'll use <code>NetworkApiTestMessage</code> to encase the initial message from the server, while <code>NetWorkApiTestResponse</code> will be used by the Client to send its response. | The fields in these classes hold the data we wish to send through our channel. We'll use <code>NetworkApiTestMessage</code> to encase the initial message from the server, while <code>NetWorkApiTestResponse</code> will be used by the Client to send its response. | ||
== | == NetworkApiTest == | ||
Now we will create our main class that inherits from the <code>ModSystem</code> class, which is the base class for mod systems. You can read more about this [http://apidocs.vintagestory.at/api/Vintagestory.API.Common.ModSystem.html here]. Moreover, we'll be separating our Client and Server sides within the class with region blocks for readability purposes. | Now we will create our main class that inherits from the <code>ModSystem</code> class, which is the base class for mod systems. You can read more about this [http://apidocs.vintagestory.at/api/Vintagestory.API.Common.ModSystem.html here]. Moreover, we'll be separating our Client and Server sides within the class with region blocks for readability purposes. | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public class NetworkApiTest : ModSystem | public class NetworkApiTest : ModSystem | ||
{ | { | ||
#region Client | #region Client | ||
Line 96: | Line 116: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
The Core Server API contains the Network member, which provides us with the RegisterChannel method. We pass this method a string containing the name we choose for our channel, in this case we'll call our channel "networkapitest". A channel with this exact name will be registered on the Client side. | The Core Server API contains the Network member, which provides us with the <code>RegisterChannel</code> method. We pass this method a string containing the name we choose for our channel, in this case we'll call our channel "networkapitest". A channel with this exact name will be registered on the Client side. | ||
We then register the ProtoContract classes that we'll be using to this channel with the <code>RegisterMessageType</code> method. | We then register the ProtoContract classes that we'll be using to this channel with the <code>RegisterMessageType</code> method. | ||
Finally, we call <code>SetMessageHandler<T></code>, which takes a delegate that will be called every time a ProtoContract of type <code>T</code> is received from a client, in this case <code>NetworkApiTestResponse</code> will be handled by <code>OnClientMessage</code> which we'll declare later. | Finally, we call <code>SetMessageHandler<T></code>, which takes a delegate that will be called every time a <code>ProtoContract</code> of type <code>T</code> is received from a client, in this case <code>NetworkApiTestResponse</code> will be handled by <code>OnClientMessage</code> which we'll declare later. | ||
Now that our channel is set up on the Server side, we'll want to register a server command that will broadcast a network message to all the clients listening to our "networkapitest" channel. | Now that our channel is set up on the Server side, we'll want to register a server command that will broadcast a network message to all the clients listening to our "networkapitest" channel. | ||
Line 121: | Line 141: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
The server channel gives us the BroadcastPacket method which we'll use to send out a <code>NetworkApiTestMessage</code> instance to all clients listening to the "networkapitest" channel, in this case we send "Hello World!" as the message. | The server channel gives us the <code>BroadcastPacket</code> method which we'll use to send out a <code>NetworkApiTestMessage</code> instance to all clients listening to the "networkapitest" channel, in this case we send "Hello World!" as the message. | ||
== Client Setup == | == Client Setup == | ||
Line 316: | Line 336: | ||
Here are the official versions: | Here are the official versions: | ||
* for VS v1.10-rc.4: [https://wiki.vintagestory.at/images/7/73/NetworkApiTest_vs1.10-rc.4_v1.0.0.zip NetworkApiTest_vs1.10-rc.4_v1.0.0.zip] | * for VS v1.10-rc.4: [https://wiki.vintagestory.at/images/7/73/NetworkApiTest_vs1.10-rc.4_v1.0.0.zip NetworkApiTest_vs1.10-rc.4_v1.0.0.zip] | ||
* for VS v1.6: [https://wiki.vintagestory.at/images/d/d1/NetworkApiTest_vs1.6_v1.0.0.zip NetworkApiTest_vs1.6_v1.0.0.zip] | |||
{{Navbox/modding|Vintage Story}} | {{Navbox/modding|Vintage Story}} |