i had worked into this screen class...
maybe it's not the best one, but i wan't to get some opinions about how to do it better...
NOTE: ANY STUPID POST WILL BE REPORTED -.-''
Code:
public class Screen { uint Uid; Character mOwner { get { return Server.Pool[Uid]; } } Dictionary<uint, object> List = null; public Screen(uint _uid) { List = new Dictionary<uint, object>(); Uid = _uid; } public void Send(byte[] Data, bool m_nTo) { if (m_nTo) mOwner.Owner.Send(Data); object[] Objs = null; again: try { Objs = new object[List.Count]; List.Values.CopyTo(Objs, 0); } catch { goto again; } foreach (object Obj in Objs) if (Obj is Character) (Obj as Character).Owner.Send(Data); } public void Add(uint UID, object Obj) { if (!List.ContainsKey(UID) && UID != Uid) { lock (List) List.Add(UID, Obj); #region [Client] if (Obj is Character) { Character Client = (Obj as Character); mOwner.Owner.Send(Client.Spawn); } #endregion #region [Monster] if (Obj is Monster) { Monster Mob = (Obj as Monster); mOwner.Owner.Send(Packets.ConquerPacket.SpawnMonster(Mob)); } #endregion #region [Npc] if (Obj is Struct.NPC) { Struct.NPC Npc = (Obj as Struct.NPC); mOwner.Owner.Send(Packets.ConquerPacket.SpawnNPC(Npc)); } #endregion #region [Terrain] if (Obj is Struct.Terrain) { Struct.Terrain Terrain = (Obj as Struct.Terrain); mOwner.Owner.Send(Packets.ConquerPacket.TerrainNPC(Terrain)); } #endregion } } public void Remove(uint UID) { if (Uid != UID && List.ContainsKey(UID)) List.Remove(UID); mOwner.Owner.Send(Packets.ConquerPacket.General(UID, 0, 0, 0, 0, 0, Struct.DataType.EntityRemove)); } public object Get(uint UID) { object Return = null; if (List.ContainsKey(UID)) lock (List) Return = List[UID]; return Return; } public bool TryGetValue(uint key, out object value) { value = null; try { object ob = null; if (List.ContainsKey(key)) { ob = List[key]; #region [Client] if (ob is Character) { value = ob as Character; return true; } #endregion #region [Monster] if (ob is Monster) { value = ob as Monster; return true; } #endregion #region [Npc] if (ob is Struct.NPC) { value = ob as Struct.NPC; return true; } #endregion #region [Terrain] if (ob is Struct.Terrain) { value = ob as Struct.Terrain; return true; } #endregion } } catch { return false; } return false; } public void CheckUp() { object[] Objs = null; again: try { Objs = new object[List.Count]; List.Values.CopyTo(Objs, 0); } catch { goto again; } foreach (object Obj in Objs) { #region [Client] if (Obj is Character) { Character Client = (Obj as Character); if (!Calculation.CanSee(Client.X, Client.Y, mOwner.X, mOwner.Y)) Remove(Client.UID); } #endregion #region [Monster] if (Obj is Monster) { Monster Mob = (Obj as Monster); if (!Calculation.CanSee(Mob.X, Mob.Y, mOwner.X, mOwner.Y)) Remove(Mob.UID); } #endregion #region [Npc] if (Obj is Struct.NPC) { Struct.NPC Npc = (Obj as Struct.NPC); if (!Calculation.CanSee(Npc.X, Npc.Y, mOwner.X, mOwner.Y)) Remove(Npc.Type); } #endregion #region [Terrain] if (Obj is Struct.Terrain) { Struct.Terrain Terrain = (Obj as Struct.Terrain); if (!Calculation.CanSee(Terrain.X, Terrain.Y, mOwner.X, mOwner.Y)) Remove(Terrain.UID); } #endregion } } }