public static void addEntity(Entity e) { if (Game1.online) { outmsg = Client.CreateMessage(); outmsg.Write((byte)NetworkAction.AddEntity); try { EntityPacket packet = new EntityPacket(e); byte[] objectArray = packet.Serialize(true); //Convert Object to bytearray outmsg.Write(objectArray.Length); //SEND LENGTH OF ARRAY outmsg.Write(objectArray); //SEND ARRAY ITSELF } catch (Exception b) { Global.chat.WriteLine(new graphics.ui.ChatMessage("Network", Color.White, e + " Objekt kann noch nicht in bytes umgewandelt werden!", Color.Red)); Debug.WriteLine(b); return; } semdcbytespersecond += outmsg.LengthBytes; Client.SendMessage(outmsg, NetDeliveryMethod.Unreliable); return; } }
public static EntityPacket Deserialize(byte[] data) { EntityPacket result = new EntityPacket(); using (MemoryStream m = new MemoryStream(data)) { using (BinaryReader reader = new BinaryReader(m)) { int b = reader.ReadInt32(); string byteString = Convert.ToString(b, 2).PadLeft(32, '0'); for (int i = 0; i < result.PacketProperties.Count; i++) { if (byteString[i] == '1') { if (result.PacketProperties[i] is PacketPropertyBase <byte> ) { ((PacketPropertyBase <byte>)result.PacketProperties[i]).Value = reader.ReadByte(); } if (result.PacketProperties[i] is PacketPropertyBase <short> ) { ((PacketPropertyBase <short>)result.PacketProperties[i]).Value = reader.ReadInt16(); } if (result.PacketProperties[i] is PacketPropertyBase <int> ) { ((PacketPropertyBase <int>)result.PacketProperties[i]).Value = reader.ReadInt32(); } else if (result.PacketProperties[i] is PacketPropertyBase <bool> ) { ((PacketPropertyBase <bool>)result.PacketProperties[i]).Value = reader.ReadBoolean(); } else if (result.PacketProperties[i] is PacketPropertyBase <float> ) { ((PacketPropertyBase <float>)result.PacketProperties[i]).Value = reader.ReadSingle(); } else if (result.PacketProperties[i] is PacketPropertyBase <string> ) { ((PacketPropertyBase <string>)result.PacketProperties[i]).Value = reader.ReadString(); } else if (result.PacketProperties[i] is PacketPropertyVector2) { ((PacketPropertyVector2)result.PacketProperties[i]).Value = new Vector2(reader.ReadInt32(), reader.ReadInt32()); } else if (result.PacketProperties[i] is PacketPropertyType) { ((PacketPropertyType)result.PacketProperties[i]).Value = Type.GetType((result.EntityType.Shorttype + reader.ReadString())); } } } //Debug.WriteLine(byteString); } } return(result); }
public EntityPacket(Entity e, EntityPacket ep) : this() //DIFFERENCE { ID.Value = (short)e.ID; //SEND ID EVERYTIME if (ep.Position.Value != e.Position) { Position.Value = e.Position; } if (ep.MapID.Value != e.mapid) { MapID.Value = (byte)e.mapid; } if (ep.EntityType.Value != e.GetType()) { EntityType.Value = e.GetType(); } if (ep.MoveTo.Value != e.MoveTo) { MoveTo.Value = e.MoveTo; } if (e is Player && ((Player)e).Jacket != null && ep.Player_Jacket.Value != ((Player)e).Jacket.ID) { Player_Jacket.Value = ((Player)e).Jacket.ID; } if (e is Mob && ep.Speed.Value != ((Mob)e).speed) { Speed.Value = ((Mob)e).speed; } if (e is Mob && ep.direction.Value != ((Mob)e).direction) { direction.Value = (byte)((Mob)e).direction; } if (e is Mob && !((Mob)e).name.Equals(ep.Name.Value)) { Name.Value = ((Mob)e).name; } if (e is Furniture && ep.On.Value != ((Furniture)e).On) { On.Value = ((Furniture)e).On; } }
public static void Connect(string[] param) { string name = level.getClientPlayer().name; string ip = "localhost"; int port = 25232; string[] paramip = new string[1]; if (param.Length > 1) { paramip = param[1].Split(':'); ip = paramip[0]; if (paramip.Length > 1) { port = Int32.Parse(paramip[1]); } } if (param.Length > 2) { port = Int32.Parse(param[2]); } Debug.WriteLine(ip + " " + port); Client.Connect(ip, port); System.Threading.Thread.Sleep(300); outmsg = Client.CreateMessage(); outmsg.Write((byte)NetworkAction.Connect); EntityPacket packet = new EntityPacket(level.getClientPlayer()); byte[] objectArray = packet.Serialize(true); //Convert Object to bytearray outmsg.Write(objectArray.Length); //SEND LENGTH OF ARRAY outmsg.Write(objectArray); //SEND ARRAY ITSELF semdcbytespersecond += outmsg.LengthBytes; Client.SendMessage(outmsg, NetDeliveryMethod.ReliableOrdered); }
public static void Update() { while ((incmsg = Client.ReadMessage()) != null) { switch (incmsg.MessageType) { case NetIncomingMessageType.Data: { byte headStringMessage = incmsg.ReadByte(); switch (headStringMessage) { case (byte)NetworkAction.Connect: //CONNECT { recbytespersecond += incmsg.LengthBytes; int arraylength = incmsg.ReadInt32(); EntityPacket receiveE = EntityPacket.Deserialize(incmsg.ReadBytes(arraylength)); Player e = new Player(); if (level.getClientPlayer().ID == 0 || level.getClientPlayer().ID == receiveE.ID.Value) { break; } e.ApplyPacket(receiveE); Debug.WriteLine(receiveE.Name.Value); level.AddEntity(e); Global.chat.WriteLine(new graphics.ui.ChatMessage("Network", Color.Blue, receiveE.Name.Value + " joined!", Color.Gray)); } break; case (byte)NetworkAction.ConnectResponse: //CONNECT { int id = incmsg.ReadInt32(); level.getClientPlayer().ID = id; Game1.online = true; Global.chat.WriteLine(new graphics.ui.ChatMessage("Network", Color.Blue, "Connected to server with ID: " + id, Color.Gray)); } break; case (byte)NetworkAction.Disconnect: //Disconnect { int id = incmsg.ReadInt32(); //TODO REMOVE ENTITY foreach (var e in level.mobs) { if (e != level.getClientPlayer() && e.ID == id) { Global.chat.WriteLine(new graphics.ui.ChatMessage("Network", Color.Blue, e.name + " left!", Color.Gray)); level.remEntity(e); break; } } } break; case (byte)NetworkAction.Deny: //CONNECTION DENY { //EMPTY } break; case (byte)NetworkAction.Chat: //CHAT { recbytespersecond += incmsg.LengthBytes; int id = incmsg.ReadInt32(); string message = incmsg.ReadString(); foreach (var e in level.mobs) { if (e.ID == id) { message = Global.CheckChars(Global.PixelFont, message); Global.chat.WriteLine(new ChatMessage(e.name, Color.Blue, message, Color.White)); e.Say(message); break; } } } break; case (byte)NetworkAction.AddEntity: //ADDENTITY { recbytespersecond += incmsg.LengthBytes; int arraylength = incmsg.ReadInt32(); EntityPacket receiveE = EntityPacket.Deserialize(incmsg.ReadBytes(arraylength)); Entity e = (Entity)Activator.CreateInstance(receiveE.EntityType.Value); e.ApplyPacket(receiveE); level.AddEntity(e); } break; case (byte)NetworkAction.RefreshEntity: //REFRESHENTITY { int arraylength = incmsg.ReadInt32(); EntityPacket receiveE = EntityPacket.Deserialize(incmsg.ReadBytes(arraylength)); if (receiveE.ID.Value == level.getClientPlayer().ID) //CLIENT PLAYER { break; } foreach (var e in level.entities) { if (e.ID == receiveE.ID.Value) //FIND ENTITY { //receiveE.Position.Value = e.Position; //TEMPORARY SOLUTION TO NOT SYNC POSITION DIRECTLY e.ApplyPacket(receiveE); break; } } } break; case (byte)NetworkAction.RefreshEntities: //ADDENTITY { recbytespersecond += incmsg.LengthBytes; level.clearEntities(); int counter = incmsg.ReadInt32(); //ENTITIES COUNT for (int i = 0; i < counter; i++) { int length = incmsg.ReadInt32(); //ARRAYLENGTH byte[] packetbytes = incmsg.ReadBytes(length); EntityPacket entitypacket = EntityPacket.Deserialize(packetbytes); if (entitypacket.ID.Value == level.getClientPlayer().ID) { continue; } Entity ent = (Entity)Activator.CreateInstance(entitypacket.EntityType.Value); ent.ApplyPacket(entitypacket); level.AddEntity(ent); } } break; } } break; case NetIncomingMessageType.DiscoveryResponse: { string ip = incmsg.SenderEndPoint.ToString(); string name = incmsg.ReadString(); string players = incmsg.ReadString(); Debug.WriteLine(("Found server at " + ip + " name: " + name)); foreach (var server in servers) { if (server.ip == ip) { return; } } servers.Add(new ListMenuElement(name, ip, players)); break; } } recbytespersecond += incmsg.LengthBytes; Client.Recycle(incmsg); } //INCOMING MESSAGES if (!Game1.online) { return; } outmsg = Client.CreateMessage(); outmsg.Write((byte)NetworkAction.RefreshEntity); //REFRESH CLIENT PLAYER EntityPacket packet = new EntityPacket(level.getClientPlayer(), level.getClientPlayer().EntityPacket); packet.MoveTo.Value = level.getClientPlayer().Position; byte[] objectArray = packet.Serialize(true); //Convert Object to bytearray outmsg.Write(objectArray.Length); //SEND LENGTH OF ARRAY outmsg.Write(objectArray); //SEND ARRAY ITSELF semdcbytespersecond += outmsg.LengthBytes; Client.SendMessage(outmsg, NetDeliveryMethod.ReliableOrdered); start = DateTime.Now.TimeOfDay; if (start >= end) { RecievingBytesPerSecond = recbytespersecond; SendingBytesPerSecond = semdcbytespersecond; semdcbytespersecond = 0; recbytespersecond = 0; end = start + TimeSpan.FromSeconds(1); } }