public void GenerateDrop(int Killer) { if (Calculation.PercentSuccess(30)) { int Times = 1; if (Calculation.PercentSuccess(15)) { Times = MainGS.Rand.Next(1, 6); } for (int i = 0; i < Times; i++) { int Money = MainGS.Rand.Next(1, 10); if (Calculation.PercentSuccess(90)) Money = MainGS.Rand.Next(2, 240); if (Calculation.PercentSuccess(70)) Money = MainGS.Rand.Next(60, 3000); if (Calculation.PercentSuccess(50)) Money = MainGS.Rand.Next(200, 4000); if (Calculation.PercentSuccess(30)) Money = MainGS.Rand.Next(1000, 30000); if (Calculation.PercentSuccess(100)) Money = MainGS.Rand.Next(2000, 50000); Money = Money / ((138 - Level) * 10); if (Money < 1) Money = 1; Struct.ItemGround IG = new Struct.ItemGround(); Money *= 3; IG.Money = Money; if (Money < 10) IG.ItemID = 1090000; else if (Money < 100) IG.ItemID = 1090010; else if (Money < 1000) IG.ItemID = 1090020; else if (Money < 3000) IG.ItemID = 1091000; else if (Money < 10000) IG.ItemID = 1091010; else IG.ItemID = 1091020; IG.UID = MainGS.Rand.Next(1, 1000); while (MainGS.ItemFloor.ContainsKey(IG.UID)) { IG.UID = MainGS.Rand.Next(1, 1000); } IG.Map = Map; IG.X = (X - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); IG.Y = (Y - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); if (MainGS.Maps.ContainsKey(IG.Map)) { Struct.DmapData Mapping = MainGS.Maps[IG.Map]; byte tries = 0; while (!Mapping.CheckLoc((ushort)IG.X, (ushort)IG.Y)) { IG.X = (X - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); IG.Y = (Y - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); tries++; if (tries > 8) break; } } IG.OwnerOnly = new System.Timers.Timer(); IG.OwnerOnly.Interval = 10000; IG.OwnerOnly.AutoReset = false; IG.OwnerID = Killer; IG.Dispose = new System.Timers.Timer(); IG.Dispose.Interval = 60000; IG.Dispose.AutoReset = false; IG.Dispose.Elapsed += delegate { IG.Disappear(); }; IG.Dispose.Start(); IG.OwnerOnly.Start(); //lock(MainGS.ItemFloor) //{ try { Monitor.Enter(MainGS.ItemFloor); MainGS.ItemFloor.Add(IG.UID, IG); } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { Monitor.Exit(MainGS.ItemFloor); } //} EudemonPacket.ToLocal(EudemonPacket.DropItem(IG.UID, IG.ItemID, IG.X, IG.Y), IG.X, IG.Y, IG.Map, 0, 0); } } else { if (Calculation.PercentSuccess(3.7) && Level > 22) { Struct.ItemGround IG = new Struct.ItemGround(); if (Calculation.PercentSuccess(.333333)) IG.ItemID = 1088000; else IG.ItemID = 1088001; IG.Map = Map; IG.X = (X - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); IG.Y = (Y - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); if (MainGS.Maps.ContainsKey(IG.Map)) { Struct.DmapData Mapping = MainGS.Maps[IG.Map]; byte tries = 0; while (!Mapping.CheckLoc((ushort)IG.X, (ushort)IG.Y)) { IG.X = (X - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); IG.Y = (Y - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); tries++; if (tries > 8) break; } } IG.OwnerOnly = new System.Timers.Timer(); IG.OwnerOnly.Interval = 10000; IG.OwnerOnly.AutoReset = false; IG.OwnerID = Killer; IG.UID = MainGS.Rand.Next(1000, 9999999); while (MainGS.ItemFloor.ContainsKey(IG.UID)) { IG.UID = MainGS.Rand.Next(1000, 9999999); } //TODO: UID generation that is better. IG.Dispose = new System.Timers.Timer(); IG.Dispose.Interval = 60000; IG.Dispose.AutoReset = false; IG.Dispose.Elapsed += delegate { IG.Disappear(); }; IG.Dispose.Start(); IG.OwnerOnly.Start(); //lock(MainGS.ItemFloor) //{ try { Monitor.Enter(MainGS.ItemFloor); MainGS.ItemFloor.Add(IG.UID, IG); } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { Monitor.Exit(MainGS.ItemFloor); } //} EudemonPacket.ToLocal(EudemonPacket.DropItem(IG.UID, IG.ItemID, IG.X, IG.Y), IG.X, IG.Y, IG.Map, 0, 0); } if (Calculation.PercentSuccess(27)) //Drop an item { int Quality = MainGS.Rand.Next(3, 6); int Soc1 = 0; int Soc2 = 0; int Bless = 0; int Plus = 0; if (Calculation.PercentSuccess(2)) Plus = 1; if (Calculation.PercentSuccess(2)) Quality = 7; if (Calculation.PercentSuccess(1)) Quality = 8; if (Calculation.PercentSuccess(.578)) Quality = 9; int ItemID = Calculation.Item(Level, Quality); if (ItemID > 0) { if (Calculation.Type1(ItemID.ToString()) == 4 || Calculation.Type1(ItemID.ToString()) == 5) { if (Quality < 8) { if (Calculation.PercentSuccess(15)) { Soc1 = 255; if (Calculation.PercentSuccess(7)) { Soc2 = 255; } } } else if (Quality >= 8) { if (Calculation.PercentSuccess(5)) { Soc1 = 255; if (Calculation.PercentSuccess(2)) { Soc2 = 255; } } } } if (Calculation.PercentSuccess(3)) { Bless = MainGS.Rand.Next(1, 7); while (Bless != 1 && Bless != 3 && Bless != 5 && Bless != 7) { Bless = MainGS.Rand.Next(1, 7); } } Struct.ItemGround DropItem = new Struct.ItemGround(); DropItem.Bless = Bless; DropItem.Plus = Plus; DropItem.Soc1 = Soc1; DropItem.Soc2 = Soc2; DropItem.Color = MainGS.Rand.Next(3, 9); DropItem.MaxDura = MainGS.Rand.Next(10, 70); DropItem.Dura = MainGS.Rand.Next(0, DropItem.MaxDura); DropItem.Enchant = 0; DropItem.ItemID = ItemID; DropItem.Map = Map; DropItem.X = (X - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); DropItem.Y = (Y - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); if (MainGS.Maps.ContainsKey(DropItem.Map)) { Struct.DmapData Mapping = MainGS.Maps[DropItem.Map]; byte tries = 0; while (!Mapping.CheckLoc((ushort)DropItem.X, (ushort)DropItem.Y)) { DropItem.X = (X - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); DropItem.Y = (Y - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); tries++; if (tries > 8) break; } } DropItem.OwnerID = Killer; DropItem.OwnerOnly = new System.Timers.Timer(); DropItem.OwnerOnly.Interval = 10000; DropItem.OwnerOnly.AutoReset = false; DropItem.Dispose = new System.Timers.Timer(); DropItem.Dispose.Interval = 60000; DropItem.Dispose.AutoReset = false; DropItem.Dispose.Elapsed += delegate { DropItem.Disappear(); }; DropItem.UID = MainGS.Rand.Next(1000, 9999999); while (MainGS.ItemFloor.ContainsKey(DropItem.UID)) { DropItem.UID = MainGS.Rand.Next(1000, 9999999); } //lock(MainGS.ItemFloor) //{ try { Monitor.Enter(MainGS.ItemFloor); MainGS.ItemFloor.Add(DropItem.UID, DropItem); } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { Monitor.Exit(MainGS.ItemFloor); } //} DropItem.OwnerOnly.Start(); DropItem.Dispose.Start(); EudemonPacket.ToLocal(EudemonPacket.DropItem(DropItem.UID, DropItem.ItemID, DropItem.X, DropItem.Y), X, Y, Map, 0, 0); } } } }
public static void Chat(byte[] Data, ClientSocket CSocket) { Struct.ChatType Type = (Struct.ChatType)((Data[9] << 8) + Data[8]); int Position = 26; int Len = 0; string From = ""; string To = ""; string Message = ""; for (int C = 0; C < Data[25]; C++) { From += Convert.ToChar(Data[Position]); Position++; } Len = Data[Position]; Position++; for (int C = 0; C < Len; C++) { To += Convert.ToChar(Data[Position]); Position++; } Position++; Len = Data[Position]; Position++; for (int C = 0; C < Len; C++) { Message += Convert.ToChar(Data[Position]); Position++; } #region Commands try { if (Message.StartsWith("/")) { string[] Command = Message.Substring(1).Split(' '); switch (Command[0].ToLower()) { case "heal": { CSocket.Send(EudemonPacket.Status(CSocket, Struct.StatusTypes.Hp, CSocket.Client.MaxHP)); CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[GameServer] Healed " + CSocket.Client.Name, Struct.ChatType.System)); break; } case "bp": { Calculation.BP(CSocket.Client); CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[Info] Current BP " + CSocket.Client.BP, Struct.ChatType.System)); break; } case "dc": { CSocket.Disconnect(); break; } case "dl": { int type = Convert.ToInt16(Command[1]); CSocket.Send(EudemonPacket.General(CSocket.Client.ID, CSocket.Client.X, CSocket.Client.Y, CSocket.Client.Direction, Struct.DataType.Dialog, type)); break; } case "pos": { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[GameServer] Current Pos " + CSocket.Client.X + ", " + CSocket.Client.Y, Struct.ChatType.System)); break; } case "unstuck": { Handler.Teleport((int)Struct.Maps.Cronus, 290, 424, 0, CSocket); break; } case "stattest": { CSocket.Send(EudemonPacket.Status(CSocket, Struct.StatusTypes.Hp, 50)); break; } case "kick": { if (CSocket.Client.isGM || CSocket.Client.isPM) { if (Command.Length < 2) { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Command example: /kick player", Struct.ChatType.Talk)); break; } bool kicked = false; try { Monitor.Enter(MainGS.ClientPool); foreach (KeyValuePair<int, ClientSocket> Player in MainGS.ClientPool) { if (Player.Value.Client.Name.ToLower() == Command[1].ToLower()) { if (Player.Value.Client.isPM && !CSocket.Client.isPM) CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "GMs cannot kick PMs, sorry!", Struct.ChatType.System)); else { EudemonPacket.ToServer(EudemonPacket.Chat(0, "SYSTEM", "ALLUSERS", Player.Value.Client.Name + " has been kicked from the server", Struct.ChatType.CenterGm), 0); Player.Value.Disconnect(); kicked = true; } break; } } } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { Monitor.Exit(MainGS.ClientPool); } if (!kicked) { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Cannot kick player.", Struct.ChatType.Talk)); } } break; } case "ban": { if (CSocket.Client.isPM) { if (Command.Length < 2) { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Command example: /kick player", Struct.ChatType.Talk)); break; } bool kicked = false; Database.Database.BanPlayer(Command[1]); try { Monitor.Enter(MainGS.ClientPool); foreach (KeyValuePair<int, ClientSocket> Player in MainGS.ClientPool) { if (Player.Value.Client.Name.ToLower() == Command[1].ToLower()) { EudemonPacket.ToServer(EudemonPacket.Chat(0, "SYSTEM", "ALLUSERS", Player.Value.Client.Name + " has been kicked & banned from the server.", Struct.ChatType.CenterGm), 0); Player.Value.Disconnect(); kicked = true; break; } } } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { Monitor.Exit(MainGS.ClientPool); } if (!kicked) { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Cannot ban player.", Struct.ChatType.Talk)); } } break; } case "save": { Database.Database.SaveCharacter(CSocket.Client); CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[GameServer] Saved " + CSocket.Client.Name, Struct.ChatType.System)); break; } case "reload": { if (Command.Length == 2 && CSocket.Client.isGM || CSocket.Client.isPM) { switch (Command[1].ToLower()) { case "portals": { MainGS.Portals.Clear(); Struct.LoadPortals(); break; } case "monsters": { MainGS.BaseMonsters.Clear(); MainGS.MonsterSpawns.Clear(); MainGS.Monsters.Clear(); Struct.LoadMonsters(); break; } case "npcs": { MainGS.Npcs.Clear(); Struct.LoadNpcs(); break; } case "tnpcs": { MainGS.TerrainNpcs.Clear(); Struct.LoadTNpcs(); break; } } } break; } case "scroll": { if (Command.Length == 2) { switch (Command[1].ToLower()) { case "tc": { Handler.Teleport(1002, 438, 377, 0, CSocket); break; } default: { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Unknown scroll location. Example: /scroll tc", Struct.ChatType.Talk)); break; } } } else { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] /scroll tc", Struct.ChatType.Talk)); } break; } case "i": { if (CSocket.Client.isGM || CSocket.Client.isPM) { if (!CSocket.Client.Invincible) { CSocket.Client.Invincible = true; EudemonPacket.ToLocal(EudemonPacket.Chat(0, "SYSTEM", "ALLUSERS", CSocket.Client.Name + " has just become even more godly..", Struct.ChatType.CenterGm), CSocket.Client.X, CSocket.Client.Y, (int)CSocket.Client.Map, 0, 0); } else { CSocket.Client.Invincible = false; CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "You are no longer flagged as invincible.", Struct.ChatType.System)); } EudemonPacket.ToLocal(EudemonPacket.General(CSocket.Client.ID, CSocket.Client.X, CSocket.Client.Y, CSocket.Client.Direction, Struct.DataType.EntityRemove, 0), CSocket.Client.X, CSocket.Client.Y, (int)CSocket.Client.Map, 0, CSocket.Client.ID); EudemonPacket.ToLocal(EudemonPacket.SpawnCharacter(CSocket), CSocket.Client.X, CSocket.Client.Y, (int)CSocket.Client.Map, 0, 0); } break; } case "money": { if (Command.Length == 2 && CSocket.Client.isPM || CSocket.Client.isGM) { int Money = Convert.ToInt32(Command[1]); CSocket.Client.Money += Money; CSocket.Send(EudemonPacket.Status(CSocket, 2, CSocket.Client.Money, Struct.StatusTypes.InvMoney)); } break; } case "eps": { if (Command.Length == 2 && CSocket.Client.isPM || CSocket.Client.isGM) { int Ep = Convert.ToInt32(Command[1]); CSocket.Client.EPs += Ep; CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "You now have " + CSocket.Client.EPs + " EPs.", Struct.ChatType.System)); CSocket.Send(EudemonPacket.Status(CSocket, 2, CSocket.Client.EPs, Struct.StatusTypes.InvEPoints)); } break; } case "hair": { if (Command.Length == 2) { int Hair = Convert.ToInt32(Command[1]); CSocket.Client.Hair = Hair; CSocket.Send(EudemonPacket.Status(CSocket, 2, CSocket.Client.Hair, Struct.StatusTypes.HairStyle)); } break; } case "dropitem": { if (CSocket.Client.isPM || CSocket.Client.isGM) { if (Calculation.PercentSuccess(30)) { int Level = 137; int Times = 1; if (Calculation.PercentSuccess(15)) { Times = MainGS.Rand.Next(1, 6); } for (int i = 0; i < Times; i++) { int Money = MainGS.Rand.Next(1, 10); if (Calculation.PercentSuccess(90)) Money = MainGS.Rand.Next(2, 240); if (Calculation.PercentSuccess(70)) Money = MainGS.Rand.Next(60, 3000); if (Calculation.PercentSuccess(50)) Money = MainGS.Rand.Next(200, 4000); if (Calculation.PercentSuccess(30)) Money = MainGS.Rand.Next(1000, 30000); if (Calculation.PercentSuccess(100)) Money = MainGS.Rand.Next(2000, 50000); Money = Money / ((138 - Level) * 10); if (Money < 1) Money = 1; Struct.ItemGround IG = new Struct.ItemGround(); IG.Money = Money; if (Money < 10) IG.ItemID = 1090000; else if (Money < 100) IG.ItemID = 1090010; else if (Money < 1000) IG.ItemID = 1090020; else if (Money < 3000) IG.ItemID = 1091000; else if (Money < 10000) IG.ItemID = 1091010; else IG.ItemID = 1091020; IG.UID = MainGS.Rand.Next(1, 1000); while (MainGS.ItemFloor.ContainsKey(IG.UID)) { IG.UID = MainGS.Rand.Next(1, 1000); } IG.X = CSocket.Client.X; IG.Y = CSocket.Client.Y; IG.OwnerOnly = new System.Timers.Timer(); IG.Map = (int)CSocket.Client.Map; IG.Dispose = new System.Timers.Timer(); IG.Dispose.Interval = 60000; IG.Dispose.AutoReset = false; IG.Dispose.Elapsed += delegate { IG.Disappear(); }; IG.Dispose.Start(); MainGS.ItemFloor.Add(IG.UID, IG); EudemonPacket.ToLocal(EudemonPacket.DropItem(IG.UID, IG.ItemID, IG.X, IG.Y), IG.X, IG.Y, IG.Map, 0, 0); } } else { if (Calculation.PercentSuccess(5)) { Struct.ItemGround IG = new Struct.ItemGround(); IG.ItemID = 1088001; IG.X = CSocket.Client.X; IG.Y = CSocket.Client.Y; IG.Map = (int)CSocket.Client.Map; IG.OwnerOnly = new System.Timers.Timer(); IG.UID = MainGS.Rand.Next(1000, 9999999); while (MainGS.ItemFloor.ContainsKey(IG.UID)) { IG.UID = MainGS.Rand.Next(1000, 9999999); } //TODO: UID generation that is better. IG.Dispose.Interval = 10000; IG.Dispose.AutoReset = false; IG.Dispose.Elapsed += delegate { IG.Disappear(); }; IG.Dispose.Start(); MainGS.ItemFloor.Add(IG.UID, IG); EudemonPacket.ToLocal(EudemonPacket.DropItem(IG.UID, IG.ItemID, IG.X, IG.Y), IG.X, IG.Y, IG.Map, 0, 0); } else if (Calculation.PercentSuccess(3)) { Struct.ItemGround IG = new Struct.ItemGround(); IG.ItemID = 1088000; IG.X = CSocket.Client.X; IG.Y = CSocket.Client.Y; IG.Map = (int)CSocket.Client.Map; IG.OwnerOnly = new System.Timers.Timer(); IG.UID = MainGS.Rand.Next(1000, 9999999); while (MainGS.ItemFloor.ContainsKey(IG.UID)) { IG.UID = MainGS.Rand.Next(1000, 9999999); } //TODO: UID generation that is better. IG.Dispose.Interval = 10000; IG.Dispose.AutoReset = false; IG.Dispose.Elapsed += delegate { IG.Disappear(); }; IG.Dispose.Start(); MainGS.ItemFloor.Add(IG.UID, IG); EudemonPacket.ToLocal(EudemonPacket.DropItem(IG.UID, IG.ItemID, IG.X, IG.Y), IG.X, IG.Y, IG.Map, 0, 0); } } } break; } case "bringtome": { if (CSocket.Client.isPM || CSocket.Client.isGM) { if (Command.Length == 2) { ClientSocket Target = null; try { Monitor.Enter(MainGS.ClientPool); foreach (KeyValuePair<int, ClientSocket> Clients in MainGS.ClientPool) { if (Clients.Value.Client.Name == Command[1]) { Target = Clients.Value; break; } } } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { Monitor.Exit(MainGS.ClientPool); } if (Target != null) { Handler.Teleport((int)CSocket.Client.Map, CSocket.Client.X, CSocket.Client.Y, 0, Target); Target.Send(EudemonPacket.Chat(0, "SYSTEM", Target.Client.Name, "You have been summoned by " + CSocket.Client.Name, Struct.ChatType.System)); } else { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Player not found!", Struct.ChatType.System)); } } } break; } case "bringmeto": { if (CSocket.Client.isPM || CSocket.Client.isGM) { if (Command.Length == 2) { ClientSocket Target = null; try { Monitor.Enter(MainGS.ClientPool); foreach (KeyValuePair<int, ClientSocket> Clients in MainGS.ClientPool) { if (Clients.Value.Client.Name == Command[1]) { Target = Clients.Value; break; } } //} } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { Monitor.Exit(MainGS.ClientPool); } if (Target != null) { Handler.Teleport((int)Target.Client.Map, Target.Client.X, Target.Client.Y, 0, CSocket); CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "Teleported to " + Target.Client.Name, Struct.ChatType.System)); } else { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Player not found!", Struct.ChatType.System)); } } } break; } case "bc": { if (CSocket.Client.isPM || CSocket.Client.isGM) { EudemonPacket.ToServer(EudemonPacket.Chat(0, CSocket.Client.Name, "ALLUSERS", Message.Substring(2 + Command[0].Length), Struct.ChatType.NewBroadcast), 0); } break; } case "gm": { if (CSocket.Client.isPM || CSocket.Client.isGM) { EudemonPacket.ToServer(EudemonPacket.Chat(0, CSocket.Client.Name, "ALLUSERS", Message.Substring(2 + Command[0].Length), Struct.ChatType.CenterGm), 0); } break; } case "itemtest": { if (Command.Length == 2) { Struct.ItemInfo NewItem = new Struct.ItemInfo(); NewItem.Bless = 0; NewItem.Dura = 1; NewItem.Enchant = 0; NewItem.ItemID = Convert.ToInt32(Command[1]); NewItem.MaxDura = 1; NewItem.Plus = 0; NewItem.Position = 50; NewItem.Soc1 = 0; NewItem.Soc2 = 0; NewItem.Color = 0; NewItem.UID = MainGS.Rand.Next(1, 9999999); bool created = Database.Database.NewItem(NewItem, CSocket); while (!created) { NewItem.UID = MainGS.Rand.Next(1, 9999999); created = Database.Database.NewItem(NewItem, CSocket); } CSocket.Client.Inventory.Add(NewItem.UID, NewItem); //CSocket.Send(EudemonPacket.ItemInfo(0, Item.Value.ItemID, Item.Value.Plus, Item.Value.Soc1, Item.Value.Soc2, Item.Value.Dura, Item.Value.MaxDura, Item.Value.Position, 0, 0, 6)); CSocket.Send(EudemonPacket.ItemInfo(NewItem.UID, NewItem.ItemID, NewItem.Plus, NewItem.Soc1, NewItem.Soc2, NewItem.Dura, NewItem.MaxDura, NewItem.Position, 0, 0, 0)); // CSocket.Send(EudemonPacket.ItemInfo(NewItem.UID, NewItem.ItemID, NewItem.Plus, NewItem.Bless, NewItem.Enchant, NewItem.Soc1, NewItem.Soc2, NewItem.Dura, NewItem.MaxDura, NewItem.Position, NewItem.Color)); //CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "Created a(n) " + Item.Name + " Plus: " + Plus + ", Bless: " + Bless + ", Enchant: " + Enchant + ", Version: " + version, Struct.ChatType.Top)); } else { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "Error in command", Struct.ChatType.System)); } break; } case "item": { if (CSocket.Client.isPM || CSocket.Client.isGM) { if (Command.Length == 8) { if (CSocket.Client.Inventory.Count == 40) { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Your inventory is full.", Struct.ChatType.System)); break; } foreach (KeyValuePair<int, Struct.ItemData> Items in MainGS.Items) { Struct.ItemData Item = Items.Value; if (Item.Name.ToLower() == Command[1].ToLower()) { int version = Convert.ToInt32(Command[2]); int NewItemID = Item.ID; int Plus = Convert.ToInt32(Command[4]); int Bless = Convert.ToInt32(Command[5]); int Enchant = Convert.ToInt32(Command[6]); int Soc1 = 0; int Soc2 = 0; int Color = Convert.ToInt32(Command[7]); if ((Convert.ToInt32(Command[3])) == 1) { Soc1 = 255; } else if ((Convert.ToInt32(Command[3])) == 2) { Soc1 = 255; Soc2 = 255; } else if ((Convert.ToInt32(Command[3])) == 0) { Soc1 = 0; Soc2 = 0; } if (Color < 2 || Color > 9) if (Bless != 1 && Bless != 3 && Bless != 5 && Bless != 7 && Bless != 0) { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] " + Bless + " is an invalid bless amount. Accepted amounts are 0/1/3/5/7.", Struct.ChatType.System)); break; } if (Enchant > 255 || Enchant < 0) { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] " + Enchant + " is an invalid enchant amount. Accepted amounts are 255>x>0.", Struct.ChatType.System)); break; } if (Plus > 12 || Plus < 0) { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] " + Plus + " is an invalid plus amount. Accepted amounts are 12>x>0.", Struct.ChatType.System)); break; } string ItemID = Item.ID.ToString(); if (ItemID.EndsWith("0")) NewItemID += 3; #region Version Switch switch (version) { case 3: { //the default item break; } case 4: { NewItemID += 1; break; } case 5: { NewItemID += 2; break; } case 6: { NewItemID += 3; break; } case 7: { NewItemID += 4; break; } case 8: { NewItemID += 5; break; } case 9: { NewItemID += 6; break; } case 13: { NewItemID += 10; break; } case 14: { NewItemID += 11; break; } case 15: { NewItemID += 12; break; } case 16: { NewItemID += 13; break; } case 17: { NewItemID += 14; break; } case 18: { NewItemID += 15; break; } case 19: { NewItemID += 16; break; } case 23: { NewItemID += 20; break; } case 24: { NewItemID += 21; break; } case 25: { NewItemID += 22; break; } case 26: { NewItemID += 23; break; } case 27: { NewItemID += 24; break; } case 28: { NewItemID += 25; break; } case 29: { NewItemID += 26; break; } case 33: { NewItemID += 30; break; } case 34: { NewItemID += 31; break; } case 35: { NewItemID += 32; break; } case 36: { NewItemID += 33; break; } case 37: { NewItemID += 34; break; } case 38: { NewItemID += 35; break; } case 39: { NewItemID += 36; break; } case 43: { NewItemID += 40; break; } case 44: { NewItemID += 41; break; } case 45: { NewItemID += 42; break; } case 46: { NewItemID += 43; break; } case 47: { NewItemID += 44; break; } case 48: { NewItemID += 45; break; } case 49: { NewItemID += 46; break; } case 53: { NewItemID += 50; break; } case 54: { NewItemID += 51; break; } case 55: { NewItemID += 52; break; } case 56: { NewItemID += 53; break; } case 57: { NewItemID += 54; break; } case 58: { NewItemID += 55; break; } case 59: { NewItemID += 56; break; } case 63: { NewItemID += 60; break; } case 64: { NewItemID += 61; break; } case 65: { NewItemID += 62; break; } case 66: { NewItemID += 63; break; } case 67: { NewItemID += 64; break; } case 68: { NewItemID += 65; break; } case 69: { NewItemID += 66; break; } case 73: { NewItemID += 70; break; } case 74: { NewItemID += 71; break; } case 75: { NewItemID += 72; break; } case 76: { NewItemID += 73; break; } case 77: { NewItemID += 74; break; } case 78: { NewItemID += 75; break; } case 79: { NewItemID += 76; break; } case 83: { NewItemID += 80; break; } case 84: { NewItemID += 81; break; } case 85: { NewItemID += 82; break; } case 86: { NewItemID += 83; break; } case 87: { NewItemID += 84; break; } case 88: { NewItemID += 85; break; } case 89: { NewItemID += 86; break; } case 93: { NewItemID += 90; break; } case 94: { NewItemID += 91; break; } case 95: { NewItemID += 92; break; } case 96: { NewItemID += 93; break; } case 97: { NewItemID += 94; break; } case 98: { NewItemID += 95; break; } case 99: { NewItemID += 96; break; } case 103: { NewItemID += 100; break; } case 104: { NewItemID += 101; break; } case 105: { NewItemID += 102; break; } case 106: { NewItemID += 103; break; } case 107: { NewItemID += 104; break; } case 108: { NewItemID += 105; break; } case 109: { NewItemID += 106; break; } case 113: { NewItemID += 110; break; } case 114: { NewItemID += 111; break; } case 115: { NewItemID += 112; break; } case 116: { NewItemID += 113; break; } case 117: { NewItemID += 114; break; } case 118: { NewItemID += 115; break; } case 119: { NewItemID += 116; break; } default: { //Do nothing break; } } #endregion Struct.ItemInfo NewItem = new Struct.ItemInfo(); NewItem.Bless = Bless; NewItem.Dura = Item.MaxDura; NewItem.Enchant = Enchant; NewItem.ItemID = NewItemID; NewItem.MaxDura = Item.MaxDura; NewItem.Plus = Plus; NewItem.Position = 0; NewItem.Soc1 = Soc1; NewItem.Soc2 = Soc2; NewItem.Color = Color; NewItem.UID = MainGS.Rand.Next(1, 9999999); bool created = Database.Database.NewItem(NewItem, CSocket); while (!created) { NewItem.UID = MainGS.Rand.Next(1, 9999999); created = Database.Database.NewItem(NewItem, CSocket); } CSocket.Client.Inventory.Add(NewItem.UID, NewItem); CSocket.Send(EudemonPacket.ItemInfo(NewItem.UID, NewItem.ItemID, NewItem.Plus, NewItem.Bless, NewItem.Enchant, NewItem.Soc1, NewItem.Soc2, NewItem.Dura, NewItem.MaxDura, NewItem.Position, NewItem.Color)); CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "Created a(n) " + Item.Name + " Plus: " + Plus + ", Bless: " + Bless + ", Enchant: " + Enchant + ", Version: " + version, Struct.ChatType.System)); break; } } } } break; } case "effect": { if (CSocket.Client.isPM || CSocket.Client.isGM) { if (Command.Length == 2) { EudemonPacket.ToLocal(EudemonPacket.Effect(CSocket.Client.ID, Command[1]), CSocket.Client.X, CSocket.Client.Y, (int)CSocket.Client.Map, 0, 0); } } break; } case "modify": { if (CSocket.Client.isPM || CSocket.Client.isGM) { if (Command.Length > 2) { switch (Command[1].ToLower()) { case "name": { //TODO:Modify name and other's name's. break; } case "level": { if (Command.Length == 3) { int NewLevel = Convert.ToInt32(Command[2]); if (NewLevel <= 135) { CSocket.Client.Level = NewLevel; CSocket.Client.Exp = 0; CSocket.Send(EudemonPacket.Status(CSocket, 2, CSocket.Client.Level, Struct.StatusTypes.Level)); EudemonPacket.ToLocal(EudemonPacket.Effect(CSocket.Client.ID, "LevelUp"), CSocket.Client.X, CSocket.Client.Y, (int)CSocket.Client.Map, 0, 0); if (CSocket.Client.Level == 135) EudemonPacket.ToServer(EudemonPacket.Chat(0, "SYSTEM", "ALLUSERS", "CONGRATULATIONS! " + CSocket.Client.Name + " has just achieved level 135! Great job!", Struct.ChatType.NewBroadcast), 0); } } break; } case "dex": { if (Command.Length == 3) { int Dex = Convert.ToInt32(Command[2]); CSocket.Client.Dexterity = Dex; CSocket.Send(EudemonPacket.Status(CSocket, 2, CSocket.Client.Dexterity, Struct.StatusTypes.DexterityStatPoints)); Calculation.Vitals(CSocket, false); } break; } case "vit": { if (Command.Length == 3) { int Vit = Convert.ToInt32(Command[2]); CSocket.Client.Vitality = Vit; CSocket.Send(EudemonPacket.Status(CSocket, 2, CSocket.Client.Vitality, Struct.StatusTypes.VitalityStatPoints)); Calculation.Vitals(CSocket, false); } break; } } } } break; } case "skill": { if (CSocket.Client.isPM || CSocket.Client.isGM) { if (Command.Length == 3) { int ID = Convert.ToInt32(Command[1]); int Level = Convert.ToInt32(Command[2]); if (CSocket.Client.Skills.ContainsKey(ID)) { Struct.CharSkill Skill = CSocket.Client.Skills[ID]; Skill.Level = Level; Skill.Exp = 0; Database.Database.SetSkill(Skill.ID, Skill.Level, Skill.Exp, CSocket.Client.ID, true); } else { Struct.CharSkill Skill = new Struct.CharSkill(); Skill.Level = Level; Skill.ID = ID; CSocket.Client.Skills.Add(Skill.ID, Skill); Database.Database.SetSkill(ID, Level, 0, CSocket.Client.ID, false); } CSocket.Send(EudemonPacket.Skill(ID, Level, 0)); } else { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] /skill ID Level.", Struct.ChatType.Talk)); } } break; } case "status": { if (CSocket.Client.isPM || CSocket.Client.isGM) { CSocket.Send(EudemonPacket.Chat(0, "", "", "", Struct.ChatType.ClearTopRight)); CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "Players online: " + MainGS.ClientPool.Count, Struct.ChatType.TopRight)); CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "Monsters spawned: " + MainGS.Monsters.Count, Struct.ChatType.TopRight)); CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "Exp/Prof/Skill Rates: " + MainGS.EXP_MULTIPLER + "/" + MainGS.PROF_MULTIPLER + "/" + MainGS.SKILL_MULTIPLER, Struct.ChatType.TopRight)); } break; } /*case "tnpc": { if(CSocket.Client.isPM) { if(Command.Length == 4) { int ID = Convert.ToInt32(Command[1]); int TType = Convert.ToInt32(Command[2]); int Flag = Convert.ToInt32(Command[3]); CSocket.Send(EudemonPacket.TerrainNPC(ID, 100, 100, CSocket.Client.X, CSocket.Client.Y, TType, Flag)); } } break; }*/ /*case "killallmobs": { if(CSocket.Client.isPM) { Dictionary<int, Monster> Mobs = new Dictionary<int, Monster>(); foreach(KeyValuePair<int, Monster> Mon in MainGS.Monsters) { Mobs.Add(Mon.Key, Mon.Value); } MainGS.Monsters.Clear(); foreach(KeyValuePair<int, Monster> Mon in Mobs) { Handler.doMonster(Mon.Value, Mon.Value.CurrentHP, 2, CSocket); } } break; }*/ case "gmove": { if (Command.Length == 4) { Handler.Teleport(Convert.ToInt32(Command[1]), Convert.ToUInt16(Command[2]), Convert.ToUInt16(Command[3]), 0, CSocket); } break; } } } #endregion #region Chats else { switch (Type) { case Struct.ChatType.Talk: { EudemonPacket.ToLocal(EudemonPacket.Chat(0, CSocket.Client.Name, To, Message, Type), CSocket.Client.X, CSocket.Client.Y, (int)CSocket.Client.Map, 0, CSocket.Client.ID); break; } case Struct.ChatType.Team: { if (CSocket.Client.Team != null) { if (MainGS.ClientPool.ContainsKey(CSocket.Client.Team.LeaderID)) { ClientSocket Leader = MainGS.ClientPool[CSocket.Client.Team.LeaderID]; foreach (KeyValuePair<int, ClientSocket> Member in Leader.Client.Team.Members) { if (Member.Value.Client.ID != CSocket.Client.ID) Member.Value.Send(EudemonPacket.Chat(0, CSocket.Client.Name, To, Message, Type)); } } } break; } case Struct.ChatType.Ghost: { EudemonPacket.ToLocal(EudemonPacket.Chat(0, CSocket.Client.Name, To, Message, Type), CSocket.Client.X, CSocket.Client.Y, (int)CSocket.Client.Map, 0, CSocket.Client.ID); break; } case Struct.ChatType.Whisper: { bool online = false; //lock(MainGS.ClientPool) //{ try { Monitor.Enter(MainGS.ClientPool); foreach (KeyValuePair<int, ClientSocket> Player in MainGS.ClientPool) { if (Player.Value.Client.Name == To) { Player.Value.Send(EudemonPacket.Chat(0, CSocket.Client.Name, To, Message, Type)); online = true; break; } } //} } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { Monitor.Exit(MainGS.ClientPool); } //} if (!online) CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", "ALLUSERS", "[ERROR] Player not found.", Struct.ChatType.Talk)); break; } case Struct.ChatType.Friend: { EudemonPacket.ToServer(EudemonPacket.Chat(0, From, To, Message, Struct.ChatType.Friend), CSocket.Client.ID); break; } default: { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Chat type not coded.", Struct.ChatType.Talk)); break; } } } #endregion } catch (Exception Except) { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Please report: Exception thrown during command parsing/message handling.", Struct.ChatType.System)); Console.WriteLine(Except.ToString()); } }
public static void DropItem(int UID, ClientSocket CSocket) { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "Item UID: " + UID, Struct.ChatType.Normal)); if (CSocket.Client.Inventory.ContainsKey(UID)) { Struct.ItemInfo Ii = CSocket.Client.Inventory[UID]; Struct.ItemGround IG = new Struct.ItemGround(); IG.CopyItem(Ii); IG.Position = (int)Struct.ItemPosition.Ground; IG.Map = (int)CSocket.Client.Map; IG.X = (CSocket.Client.X - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); IG.Y = (CSocket.Client.Y - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); if (MainGS.Maps.ContainsKey(IG.Map)) { Struct.DmapData Mapping = MainGS.Maps[IG.Map]; byte tries = 0; while (!Mapping.CheckLoc((ushort)IG.X, (ushort)IG.Y)) { IG.X = (CSocket.Client.X - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); IG.Y = (CSocket.Client.Y - MainGS.Rand.Next(4) + MainGS.Rand.Next(4)); tries++; if (tries > 8) break; } } IG.OwnerID = CSocket.Client.ID; IG.OwnerOnly = new System.Timers.Timer(); IG.OwnerOnly.Interval = 7000; IG.OwnerOnly.AutoReset = false; IG.Dispose = new System.Timers.Timer(); IG.Dispose.Interval = 60000; IG.Dispose.AutoReset = false; IG.Dispose.Elapsed += delegate { IG.Disappear(); }; IG.OwnerOnly.Start(); IG.Dispose.Start(); if (!MainGS.ItemFloor.ContainsKey(UID)) { Database.Database.DeleteItem(UID); CSocket.Client.Inventory.Remove(UID); CSocket.Send(EudemonPacket.ItemUsage(UID, 254, Struct.ItemUsage.RemoveDropItem)); //EudemonPacket.ToLocal(tmp, IG.X, IG.Y, IG.Map, 0, 0); EudemonPacket.ToLocal(EudemonPacket.DropItem(IG.UID, IG.ItemID, IG.X, IG.Y), IG.X, IG.Y, IG.Map, 0, 0); CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "Ground UID: " + IG.UID + " Dropped at X: " + IG.X + " Y: " + IG.Y, Struct.ChatType.Normal)); //lock(MainGS.ItemFloor) //{ try { Monitor.Enter(MainGS.ItemFloor); MainGS.ItemFloor.Add(IG.UID, IG); } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { Monitor.Exit(MainGS.ItemFloor); } //} } } else { CSocket.Send(EudemonPacket.Chat(0, "SYSTEM", CSocket.Client.Name, "[ERROR] Item does not exist.", Struct.ChatType.System)); } }