/// <summary> /// Sends data synchronously, ignores any exceptions, thread-safe /// </summary> /// <param name="sender">Sending client object</param> /// <param name="data">The payload</param> /// <param name="ep">Receiver's endpoint</param> /// <returns>True on success, false otherwise</returns> internal static bool SecureOut(UdpClient sender, NetPacket data, IPEndPoint ep) { try { lock (ol) sender.Send(data, data.Length, ep); return true; } catch { } return false; }
/// <summary>Reads a single game object's data from the packet</summary> /// <param name="np"></param> /// <returns></returns> private static GameObj ReadEntData(NetPacket np) { uint id = np.ReadUInt(); GameObj ret; string cls = np.ReadString(); if ((ret = PaintKiller.GetObj(id)) == null) ret = (GameObj)Type.GetType(cls).GetConstructor(new Type[] { typeof(uint) }).Invoke(new object[] { id }); ret.SetHM(np.ReadShort(), np.ReadShort()); ret.state = np.ReadByte(); ret.frame = np.ReadByte(); ret.dir = np.ReadFloat(); ret.ang = new Vector2(np.ReadFloat(), np.ReadFloat()); ret.spd = new Vector2(np.ReadFloat(), np.ReadFloat()); ret.pos = new Vector2(np.ReadFloat(), np.ReadFloat()); ret.fce = new Vector2(np.ReadFloat(), np.ReadFloat()); if (ret is GEC) { GEC g = (GEC)ret; g.gfx = PaintKiller.GetTex(np.ReadString()); g.SetPrefs(np.ReadByte()); } else if (ret is GPChain) ((GPChain)ret).SetBolt(new Vector2(np.ReadFloat(), np.ReadFloat())); return ret; }
/// <summary>Sends a packet to a specific endpoint</summary> /// <param name="np">The payload</param> /// <param name="ep">Client's endpoint</param> private void Send(NetPacket np, IPEndPoint ep) { Net.SecureOut(server, np, ep); }
/// <summary>Writes data of a single game object into a packet</summary> /// <param name="data">The output packet</param> /// <param name="go">A game object to extract data from</param> private void WriteData(NetPacket.Factory data, GameObj go) { data.WriteUInt(go.ID); data.WriteString(go.GetType().FullName); data.WriteShort(go.hp); data.WriteShort(go.mp); data.WriteByte(go.state); data.WriteByte(go.frame); data.WriteFloat(go.dir); data.WriteFloat(go.ang.X); data.WriteFloat(go.ang.Y); data.WriteFloat(go.spd.X); data.WriteFloat(go.spd.Y); data.WriteFloat(go.pos.X); data.WriteFloat(go.pos.Y); data.WriteFloat(go.fce.X); data.WriteFloat(go.fce.Y); // TODO: Add a member method into GameObj for writing/reading? if (go is GEC) { GEC g = (GEC)go; data.WriteString(g.gfx.Name); data.WriteByte(g.GetPrefs()); } else if (go is GPChain) { GPChain g = (GPChain)go; data.WriteFloat(g.GetBoltDest().X); data.WriteFloat(g.GetBoltDest().Y); } }
/// <summary>Sends a packet to all registered clients</summary> /// <param name="np">The payload</param> private void Broadcast(NetPacket np) { for (int i = 1; i < 4; ++i) if (PaintKiller.P[i] != null) Send(np, PaintKiller.P[i].ep); }