You've already forked lidgren-network-gen3
mirror of
https://github.com/lidgren/lidgren-network-gen3.git
synced 2026-05-16 07:06:30 +09:00
transferred from trunk/Generation3 of lidgren-network
This commit is contained in:
122
Samples/XNA sample/XnaGameServer/Program.cs
Normal file
122
Samples/XNA sample/XnaGameServer/Program.cs
Normal file
@@ -0,0 +1,122 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
using Lidgren.Network;
|
||||
|
||||
namespace XnaGameServer
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
NetPeerConfiguration config = new NetPeerConfiguration("xnaapp");
|
||||
config.EnableMessageType(NetIncomingMessageType.DiscoveryRequest);
|
||||
config.Port = 14242;
|
||||
|
||||
// create and start server
|
||||
NetServer server = new NetServer(config);
|
||||
server.Start();
|
||||
|
||||
// schedule initial sending of position updates
|
||||
double nextSendUpdates = NetTime.Now;
|
||||
|
||||
// run until escape is pressed
|
||||
while (!Console.KeyAvailable || Console.ReadKey().Key != ConsoleKey.Escape)
|
||||
{
|
||||
NetIncomingMessage msg;
|
||||
while ((msg = server.ReadMessage()) != null)
|
||||
{
|
||||
switch (msg.MessageType)
|
||||
{
|
||||
case NetIncomingMessageType.DiscoveryRequest:
|
||||
//
|
||||
// Server received a discovery request from a client; send a discovery response (with no extra data attached)
|
||||
//
|
||||
server.SendDiscoveryResponse(null, msg.SenderEndpoint);
|
||||
break;
|
||||
case NetIncomingMessageType.VerboseDebugMessage:
|
||||
case NetIncomingMessageType.DebugMessage:
|
||||
case NetIncomingMessageType.WarningMessage:
|
||||
case NetIncomingMessageType.ErrorMessage:
|
||||
//
|
||||
// Just print diagnostic messages to console
|
||||
//
|
||||
Console.WriteLine(msg.ReadString());
|
||||
break;
|
||||
case NetIncomingMessageType.StatusChanged:
|
||||
NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte();
|
||||
if (status == NetConnectionStatus.Connected)
|
||||
{
|
||||
//
|
||||
// A new player just connected!
|
||||
//
|
||||
Console.WriteLine(NetUtility.ToHexString(msg.SenderConnection.RemoteUniqueIdentifier) + " connected!");
|
||||
|
||||
// randomize his position and store in connection tag
|
||||
msg.SenderConnection.Tag = new int[] {
|
||||
NetRandom.Instance.Next(10, 100),
|
||||
NetRandom.Instance.Next(10, 100)
|
||||
};
|
||||
}
|
||||
|
||||
break;
|
||||
case NetIncomingMessageType.Data:
|
||||
//
|
||||
// The client sent input to the server
|
||||
//
|
||||
int xinput = msg.ReadInt32();
|
||||
int yinput = msg.ReadInt32();
|
||||
|
||||
int[] pos = msg.SenderConnection.Tag as int[];
|
||||
|
||||
// fancy movement logic goes here; we just append input to position
|
||||
pos[0] += xinput;
|
||||
pos[1] += yinput;
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// send position updates 30 times per second
|
||||
//
|
||||
double now = NetTime.Now;
|
||||
if (now > nextSendUpdates)
|
||||
{
|
||||
// Yes, it's time to send position updates
|
||||
|
||||
// for each player...
|
||||
foreach (NetConnection player in server.Connections)
|
||||
{
|
||||
// ... send information about every other player (actually including self)
|
||||
foreach (NetConnection otherPlayer in server.Connections)
|
||||
{
|
||||
// send position update about 'otherPlayer' to 'player'
|
||||
NetOutgoingMessage om = server.CreateMessage();
|
||||
|
||||
// write who this position is for
|
||||
om.Write(otherPlayer.RemoteUniqueIdentifier);
|
||||
|
||||
if (otherPlayer.Tag == null)
|
||||
otherPlayer.Tag = new int[2];
|
||||
|
||||
int[] pos = otherPlayer.Tag as int[];
|
||||
om.Write(pos[0]);
|
||||
om.Write(pos[1]);
|
||||
|
||||
// send message
|
||||
server.SendMessage(om, player, NetDeliveryMethod.Unreliable);
|
||||
}
|
||||
}
|
||||
|
||||
// schedule next update
|
||||
nextSendUpdates += (1.0 / 30.0);
|
||||
}
|
||||
}
|
||||
|
||||
// sleep to allow other processes to run smoothly
|
||||
Thread.Sleep(1);
|
||||
}
|
||||
|
||||
server.Shutdown("app exiting");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user