/// <summary> /// FindLevel /// </summary> /// <param name="Name"></param> /// <returns></returns> public GraalLevel FindLevel(String Name) { GraalLevel Level = null; if (!LevelList.TryGetValue(Name, out Level)) { Level = new GraalLevel(Name, new object()); //lock (TimerLock) //{ LevelList[Name] = Level; //} } return(Level); }
/// <summary> /// Handle Received Data /// </summary> protected override void HandleData(CString Packet) { while (Packet.BytesLeft > 0) { // Grab Single Packet CString CurPacket = Packet.ReadString ('\n'); // Read Packet Type int PacketId = CurPacket.ReadGUByte1 (); // Call Packet Callback //RemoteControl.CallCallBack(PacketId, (CString)CurPacket.DeepClone()); // Run Internal Packet Function switch ((PacketIn)PacketId) { // Packet 6 - Set Active Level & Clear case PacketIn.LEVELNAME: ActiveLevel = Server.FindLevel (CurPacket.ReadString ().Text); Console.WriteLine (ActiveLevel.Name); //ActiveLevel.Clear(); break; // Paceket 1 - Level Links case PacketIn.LEVELLINKS: break; // Packet 3 - Level NPC Props case PacketIn.LEVELNPCPROPS: { int npcId = CurPacket.ReadGByte3 (); //Console.WriteLine("npc-id("+npcId.ToString()+")"); if (ActiveLevel != null) { GraalLevelNPC test = ActiveLevel.GetNPC (this.Server.GSConn, npcId); test.npcserver = true; test.SetProps (CurPacket); /* foreach (NCConnection nc in Server.NCList) { nc.SendPacket(new CString() + (byte)NCConnection.PacketOut.NC_NPCADD + (int)test.Id + (byte)50 + (byte)test.Nickname.Length + test.Nickname + (byte)51 + (byte)("OBJECT".Length) + "OBJECT" + (byte)52 + (byte)test.Level.Name.Length + test.Level.Name); } */ this.Server.Compiler.CompileAdd (test); } break; } // Packet 5 - Level Signs case PacketIn.LEVELSIGNS: break; // Packet 39 - Level Mod Time case PacketIn.LEVELMODTIME: if (ActiveLevel != null) ActiveLevel.SetModTime (CurPacket.ReadGUByte5 ()); break; // Packet 150 - Delete Level NPC case PacketIn.LEVELNPCDELETE: Server.FindLevel (CurPacket.ReadChars (CurPacket.ReadGUByte1 ())).DeleteNPC (CurPacket.ReadGByte3 ()); break; // Packet 156 - Set Active Level case PacketIn.LEVELSETACTIVE: ActiveLevel = Server.FindLevel (CurPacket.ReadString ().Text); break; // Add Player & Set Props case PacketIn.OTHERPLPROPS: { Players.Player Player = (Players.Player)Server.PlayerManager.AddPlayer (CurPacket.ReadGByte2 (), this); if (Player != null) { Player.SetProps (CurPacket); } break; } case PacketIn.PLFLAGSET: { Players.Player Player = (Players.Player)Server.PlayerManager.AddPlayer (CurPacket.ReadGByte2 ()); String FlagName = CurPacket.ReadString ('=').Text; String FlagValue = CurPacket.ReadString ().Text; if (Player != null) Player.Flags [FlagName] = FlagValue; break; } case PacketIn.PLAYERPROPS: if (NCPlayer == null) NCPlayer = (Players.Player)Server.PlayerManager.AddPlayer (0); NCPlayer.SetProps (CurPacket); break; // Add weapon to list case PacketIn.NPCWEAPONADD: { String WeaponName = CurPacket.ReadChars (CurPacket.ReadGUByte1 ()); String WeaponImage = CurPacket.ReadChars (CurPacket.ReadGUByte1 ()); String WeaponScript = CurPacket.ReadString ().Text; Server.SetWeapon (this, WeaponName, WeaponImage, WeaponScript, false); /* foreach (Players.Player p in this.Server.PlayerManager) { this.Server.SendGSPacket (new CString () + (byte)GServerConnection.PacketOut.NCQUERY + (byte)GServerConnection.NCREQ.PLGETWEPS + (short)p.Id); } */ break; } // Add/Remove weapon from Player case PacketIn.PLWEAPONMNG: { Players.Player Player = (Players.Player)Server.PlayerManager.AddPlayer (CurPacket.ReadGByte2 ()); if (Player != null) { bool addWeapon = (CurPacket.ReadGByte1 () > 0); String name = CurPacket.ReadString ().Text; if (addWeapon) Player.AddWeapon (name); else Player.DeleteWeapon (name, false); } break; } case PacketIn.PLWEAPONSSET: { Players.Player Player = (Players.Player)Server.PlayerManager.AddPlayer (CurPacket.ReadGByte2 ()); if (Player != null) { while (CurPacket.BytesLeft > 0) Player.AddWeapon (CurPacket.ReadChars (CurPacket.ReadGUByte1 ())); } break; } case PacketIn.NEWWORLDTIME: // Remove Class from List Server.NWTime = CurPacket.ReadGByte4 (); //RemoteControl.ClassList.Remove(CurPacket.ReadString().Text); break; // Private Message case PacketIn.PRIVATEMESSAGE: short PlayerId = CurPacket.ReadGByte2 (); CString Message = CurPacket.ReadString (); Server.SendPM (PlayerId, Server.NCMsg, true); break; case PacketIn.TRIGGERACTION: short _pid = CurPacket.ReadGByte2 (); int _npcId = (int)CurPacket.readGUInt (); float x = (float)CurPacket.readGUChar () / 2.0f; float y = (float)CurPacket.readGUChar () / 2.0f; string action = CurPacket.ReadString (',').ToString ().Trim (); string[] _params = CurPacket.ReadString ().ToString ().Split (','); Console.Write ("Call npcid(" + _npcId.ToString () + ") onAction" + action + "(_params); _params: "); foreach (string p in _params) Console.Write (p + ", "); Console.WriteLine (); if (_npcId != 0) { GraalLevelNPC tmpNpc = this.Server.PlayerManager.FindPlayer (_pid).Level.GetNPC (_npcId); if (tmpNpc == null) Console.WriteLine ("npc cannot be found! :'("); if (tmpNpc != null) tmpNpc.Call ("onAction" + action, new object[] { this.Server.PlayerManager.FindPlayer (_pid), _params }); } else { this.Server.PlayerManager.FindPlayer (_pid).CallNPCs ("onAction" + action, new object[] { this.Server.PlayerManager.FindPlayer (_pid), _params } ); this.Server.PlayerManager.FindPlayer (_pid).Level.CallNPCs ("onAction" + action, new object[] { this.Server.PlayerManager.FindPlayer (_pid), _params } ); } break; case PacketIn.NC_CONTROL: System.Console.Write ("GSCONN -> Packet [" + (PacketIn)PacketId + "]: "); Server.SendGSPacket (new CString () + (byte)PacketOut.GETWEAPONS); Server.SendGSPacket (new CString () + (byte)PacketOut.GETLEVELS); int PacketId2 = CurPacket.ReadGUByte1 (); switch ((NCI)PacketId2) { case NCI.PLAYERWEAPONS: // 0 { Players.Player Player = (Players.Player)Server.PlayerManager.AddPlayer (CurPacket.ReadGByte2 ()); if (Player != null) { Console.WriteLine (Player.Account); CString weapons = CurPacket.Untokenize (); string[] weaponsarr = weapons.ToString ().Split ('\n'); foreach (string tmpWeap in weaponsarr) { //string tmpWeap = CurPacket.ReadChars(CurPacket.ReadGUByte1()); Console.WriteLine ("Weapon: " + tmpWeap); if (Player.FindWeapon (tmpWeap) == null) { Console.WriteLine ("Not Found on player"); Common.Scripting.ServerWeapon tmpWeap2 = this.Server.FindWeapon (tmpWeap); if (tmpWeap2 != null) { Console.WriteLine ("Adding"); Player.AddWeapon (tmpWeap2); } else Console.WriteLine ("Weapon not found in system. :'("); } } } break; } case NCI.PLAYERWEAPONADD: System.Console.WriteLine (" ADDWEAPON"); Players.Player _Player = (Players.Player)Server.PlayerManager.AddPlayer (CurPacket.ReadGByte2 ()); if (_Player != null) { System.Console.Write ("Player: " + _Player.Account); bool addWeapon = (CurPacket.ReadGByte1 () > 0); String name = CurPacket.ReadString ().Text; System.Console.WriteLine (" Name: " + name); Common.Scripting.ServerWeapon tmpWp = this.Server.FindWeapon (name); if (addWeapon) _Player.AddWeapon (tmpWp); else _Player.DeleteWeapon (name, false); } break; default: System.Console.WriteLine ("[" + PacketId2 + "]: " + CurPacket.ReadString ().Text); break; } break; default: System.Console.WriteLine ("GSCONN -> Packet [" + (PacketIn)PacketId + "]: " + CurPacket.ReadString ().Text); break; } } }
/// <summary> /// FindLevel /// </summary> /// <param name="Name"></param> /// <returns></returns> public GraalLevel FindLevel(String Name) { GraalLevel Level = null; if (!LevelList.TryGetValue (Name, out Level)) { Level = new GraalLevel (Name, this.TimerLock); lock (this.TimerLock) { LevelList [Name] = Level; } } return Level; }