/// <summary> /// Process the message for the specified client. /// </summary> /// <param name="aClient">The client who sent the message.</param> public override void Process(Client aClient) { try { if (aClient == null || aClient.Player == null) { return; } Player player = aClient.Player; switch (_Action) { case Action.Buy: { if (!player.IsAlive()) { player.SendSysMsg(StrRes.STR_DIE); return; } if (UniqId != 2888) //VIP Shop { NPC Npc = null; if (!World.AllNPCs.TryGetValue(UniqId, out Npc)) { return; } if (!Npc.IsShopNpc()) { return; } if (player.Map != Npc.Map) { return; } if (!MyMath.CanSee(player.X, player.Y, Npc.X, Npc.Y, 17)) { return; } } ShopInfo Shop = new ShopInfo(); if (!Database.AllShops.TryGetValue(UniqId, out Shop)) { return; } if (!Shop.Items.Contains(Data)) { return; } if (player.ItemInInventory() + 1 > 40) { player.SendSysMsg(StrRes.STR_FULL_CANNOT_BUY); return; } Item.Info Info = new Item.Info(); if (!Database.AllItems.TryGetValue(Data, out Info)) { return; } Byte Craft = 0; if ((Int32)(Data / 10) == 73000) { Craft = (Byte)(Data % 10); } UInt16 Dura = ItemHandler.GetMaxDura(Data); UInt32 Money = Math.Min(Player._MAX_MONEYLIMIT, Info.Price); if (player.Money < Money) { player.SendSysMsg(StrRes.STR_NOT_SO_MUCH_MONEY); return; } player.Money -= Money; player.Send(new MsgUserAttrib(player, player.Money, MsgUserAttrib.AttributeType.Money)); Item Item = Item.Create(player.UniqId, 0, Data, Craft, 0, 0, 0, 0, 2, 0, Dura, Dura); if (Item != null) { player.AddItem(Item, true); } Database.Save(player, true); break; } case Action.Sell: { if (!player.IsAlive()) { player.SendSysMsg(StrRes.STR_DIE); return; } NPC Npc = null; if (!World.AllNPCs.TryGetValue(UniqId, out Npc)) { return; } if (!Npc.IsShopNpc()) { return; } if (player.Map != Npc.Map) { return; } if (!MyMath.CanSee(player.X, player.Y, Npc.X, Npc.Y, 17)) { return; } Item Item = player.GetItemByUID(Data); if (Item == null) { player.SendSysMsg(StrRes.STR_ITEM_NOT_FOUND); return; } Item.Info Info = new Item.Info(); Database.AllItems.TryGetValue(Item.Type, out Info); if (!Info.IsSellEnable()) { player.SendSysMsg(StrRes.STR_NOT_SELL_ENABLE); return; } UInt32 Money = (UInt32)(Info.Price / 3); Money = (UInt32)((Double)Money * ((Double)Item.CurDura / (Double)Item.MaxDura)); if (Money < 0 || Money > Player._MAX_MONEYLIMIT) { Money = 0; } if (player.Money + Money > Player._MAX_MONEYLIMIT) { player.SendSysMsg(StrRes.STR_TOOMUCH_MONEY); return; } player.DelItem(Data, true); player.Money += Money; player.Send(new MsgUserAttrib(player, player.Money, MsgUserAttrib.AttributeType.Money)); break; } case Action.Drop: { if (!MyMath.CanSee(player.X, player.Y, PosX, PosY, MyMath.USERDROP_RANGE)) { return; } if (!player.IsAlive()) { return; } if (!player.Map.GetFloorAccess(PosX, PosY)) { return; } Item Item = player.GetItemByUID(UniqId); if (Item == null) { return; } player.DelItem(Item, true); FloorItem FloorItem = new FloorItem(Item, 0, 0, player.Map, PosX, PosY); World.FloorThread.AddToQueue(FloorItem); break; } case Action.Use: { if (!player.IsAlive()) { player.SendSysMsg(StrRes.STR_DIE); return; } Item Item = player.GetItemByUID(UniqId); if (Item == null) { return; } Item.Info Info; if (!Database.AllItems.TryGetValue(Item.Type, out Info)) { return; } if ((UInt16)(Item.Type / 10000) == 105) { Data = 5; } if ((UInt16)(Item.Type / 10000) == 105) { Item Bow = player.GetItemByPos(4); if (Bow == null || Bow.Type / 1000 != 500) { return; } } if (Data != 0) { Byte Sex = (Byte)((player.Look / 1000) - ((player.Look / 1000) - ((player.Look / 1000) % 10))); Byte Job = player.Profession; Byte Weapon = (Byte)((Item.Type - (Item.Type % 100000)) / 100000); UInt16 WeaponSkill = (UInt16)((Item.Type - (Item.Type % 1000)) / 1000); if (player.Profession > 129 && player.Profession < 136) { Job = (Byte)(player.Profession + 60); } else if (player.Profession > 139 && player.Profession < 146) { Job = (Byte)(player.Profession + 50); } else if (player.Profession > 99 && player.Profession < 116) { Job = (Byte)(player.Profession + 90); } //Equip if (Info.RequiredLevel > player.Level) { return; } if (Info.RequiredSex != 0 && Info.RequiredSex != Sex) { return; } if (Info.RequiredLevel > 70 || (player.Metempsychosis == 0 && player.Level < 70)) { if (Info.RequiredProfession != 0 && Info.RequiredProfession / 10 != Job / 10 && Info.RequiredProfession > Job) { return; } if (Info.RequiredForce > player.Strength) { return; } if (Info.RequiredSpeed > player.Agility) { return; } if (Info.RequiredHealth > player.Vitality) { return; } if (Info.RequiredSoul > player.Spirit) { return; } } if (Info.RequiredWeaponSkill != 0) { if (Weapon == 4 || Weapon == 5) { if (player.GetWeaponSkillByType(WeaponSkill) == null || Info.RequiredWeaponSkill > player.GetWeaponSkillByType(WeaponSkill).Level) { return; } } } if (Weapon == 9 && !(Job > 19 && Job < 26)) { return; } if (Item.Type == 137310 && !(player.IsGM || player.IsPM)) //GM Robe { return; } if (player.GetItemByPos(5) != null) { if (((Byte)(Item.Type / 100000) == 5 || (Int16)(Item.Type / 1000) == 421)) { Item LeftHand = player.GetItemByPos(5); if (Item.Type / 1000 == 500 && (UInt16)(LeftHand.Type / 10000) != 105) { player.GetItemByPos(5).Position = 0; } else if (Item.Type / 1000 != 500) { player.GetItemByPos(5).Position = 0; } } } if (player.GetItemByPos((Byte)Data) != null) { player.GetItemByPos((Byte)Data).Position = 0; } Item.Position = (Byte)Data; player.CalcMaxHP(); player.CalcMaxMP(); MyMath.GetEquipStats(player); player.Send(new MsgItem(UniqId, Item.Position, Action.Equip)); World.BroadcastRoomMsg(player, new MsgPlayer(player), false); } else { if (!Item.Use()) { ItemHandler.Use(player, Item); } } break; } case Action.Unequip: { if (!player.IsAlive()) { player.SendSysMsg(StrRes.STR_DIE); return; } Item Item = player.GetItemByUID(UniqId); if (Item == null) { return; } if (Item.Position != (Byte)Data) { return; } Item.Position = 0; player.CalcMaxHP(); player.CalcMaxMP(); MyMath.GetEquipStats(player); player.Send(this); World.BroadcastRoomMsg(player, new MsgPlayer(player), false); break; } case Action.QueryMoneySaved: { NPC Npc = null; if (!World.AllNPCs.TryGetValue(UniqId, out Npc)) { return; } if (player.Map != Npc.Map) { return; } if (!MyMath.CanSee(player.X, player.Y, Npc.X, Npc.Y, 17)) { return; } if (!Npc.IsStorageNpc()) { return; } player.Send(new MsgItem(UniqId, player.WHMoney, Action.QueryMoneySaved)); break; } case Action.SaveMoney: { NPC Npc = null; if (!World.AllNPCs.TryGetValue(UniqId, out Npc)) { return; } if (player.Map != Npc.Map) { return; } if (!MyMath.CanSee(player.X, player.Y, Npc.X, Npc.Y, 17)) { return; } if (!Npc.IsStorageNpc()) { return; } if (player.WHMoney + Data > Player._MAX_MONEYLIMIT) { return; } if (player.Money >= Data) { player.Money -= (UInt32)Data; player.WHMoney += (UInt32)Data; player.Send(new MsgUserAttrib(player, player.Money, MsgUserAttrib.AttributeType.Money)); } break; } case Action.DrawMoney: { NPC Npc = null; if (!World.AllNPCs.TryGetValue(UniqId, out Npc)) { return; } if (player.Map != Npc.Map) { return; } if (!MyMath.CanSee(player.X, player.Y, Npc.X, Npc.Y, 17)) { return; } if (!Npc.IsStorageNpc()) { return; } if (player.Money + Data > Player._MAX_MONEYLIMIT) { return; } if (player.WHMoney >= Data) { player.WHMoney -= (UInt32)Data; player.Money += (UInt32)Data; player.Send(new MsgUserAttrib(player, player.Money, MsgUserAttrib.AttributeType.Money)); } break; } case Action.DropMoney: { if (!MyMath.CanSee(player.X, player.Y, PosX, PosY, MyMath.USERDROP_RANGE)) { return; } if (player.Money < UniqId) { return; } if (UniqId < 100) { return; } if (!player.IsAlive()) { player.SendSysMsg(StrRes.STR_DIE_DROP_MONEY); return; } Item Item = null; if (UniqId <= 10) //Silver { Item = Item.CreateMoney(1090000); } else if (UniqId <= 100) //Sycee { Item = Item.CreateMoney(1090010); } else if (UniqId <= 1000) //Gold { Item = Item.CreateMoney(1090020); } else if (UniqId <= 2000) //GoldBullion { Item = Item.CreateMoney(1091000); } else if (UniqId <= 5000) //GoldBar { Item = Item.CreateMoney(1091010); } else if (UniqId > 5000) //GoldBars { Item = Item.CreateMoney(1091020); } else //Error { Item = Item.CreateMoney(1090000); } if (Item != null) { player.Money -= (UInt32)UniqId; player.Send(new MsgUserAttrib(player, player.Money, MsgUserAttrib.AttributeType.Money)); Database.Save(player, true); player.SendSysMsg(StrRes.STR_DROP_MONEY_SUCC, UniqId.ToString()); FloorItem FloorItem = new FloorItem(Item, (UInt32)UniqId, 0, player.Map, PosX, PosY); World.FloorThread.AddToQueue(FloorItem); } else { player.SendSysMsg(StrRes.STR_MAKE_MONEY_FAILED); } break; } case Action.Repair: { if (!player.IsAlive()) { player.SendSysMsg(StrRes.STR_DIE); return; } Item Item = player.GetItemByUID(UniqId); if (Item == null) { player.SendSysMsg(StrRes.STR_ITEM_NOT_FOUND); return; } if (Item.Position != 0) { return; } Item.Info Info = new Item.Info(); Database.AllItems.TryGetValue(Item.Type, out Info); if (!Info.IsRepairEnable() || Item.CurDura == Item.MaxDura) { player.SendSysMsg(StrRes.STR_REPAIR_FAILED); return; } if (Item.CurDura > Item.MaxDura) { Item.CurDura = Item.MaxDura; player.Send(new MsgItem(Item.Id, Item.CurDura, Action.SynchroAmount)); return; } if (Item.CurDura > 0) { UInt32 Money = Item.CalcRepairMoney(); if (player.Money < Money) { player.SendSysMsg(StrRes.STR_NOT_SO_MUCH_MONEY); return; } player.Money -= Money; player.Send(new MsgUserAttrib(player, player.Money, MsgUserAttrib.AttributeType.Money)); Item.CurDura = Item.MaxDura; player.Send(new MsgItem(Item.Id, Item.CurDura, Action.SynchroAmount)); } else { if (!player.InventoryContains(1088001, 5)) { player.SendSysMsg(StrRes.STR_REPAIR_FAILED); return; } for (Byte i = 0; i < 5; i++) { player.DelItem(player.GetItemById(1088001), true); } Item.CurDura = Item.MaxDura; player.Send(new MsgItemInfo(Item, MsgItemInfo.Action.Update)); } break; } case Action.Improve: { if (!player.IsAlive()) { player.SendSysMsg(StrRes.STR_DIE); return; } Item Item = player.GetItemByUID(UniqId); if (Item == null) { player.SendSysMsg(StrRes.STR_ITEM_NOT_FOUND); return; } if (Item.Position != 0 || Item.Type % 10 == 9) { return; } if (Item.CurDura != Item.MaxDura) { player.SendSysMsg(StrRes.STR_ITEM_DAMAGED); return; } Item Treasure = player.GetItemByUID(Data); if (Treasure == null) { player.SendSysMsg(StrRes.STR_ITEM_NOT_FOUND); return; } if (Treasure.Position != 0 || Treasure.Type != 1088000) { return; } Double Chance; Int32 NextId; if (!ItemHandler.GetUpQualityInfo(Item, out Chance, out NextId)) { return; } player.DelItem(Treasure, true); if (!MyMath.Success(Chance)) { Item.CurDura /= 2; Item.MaxDura -= 15; player.SendSysMsg(StrRes.STR_IMPROVE_FAILED); } else { if (Item.FirstGem == 0 && MyMath.Success(2.00)) { Item.FirstGem = 255; } else if (Item.SecondGem == 0 && MyMath.Success(1.00)) { Item.SecondGem = 255; } Item.Type = NextId; Item.CurDura = ItemHandler.GetMaxDura(NextId); Item.MaxDura = ItemHandler.GetMaxDura(NextId); Byte DuraEffect = 0; if (Item.FirstGem - (Item.FirstGem % 10) == 40) //Kylin { DuraEffect += (Byte)(Item.FirstGem % 10); if (Item.FirstGem % 10 == 3) { DuraEffect++; } } if (Item.SecondGem - (Item.SecondGem % 10) == 40) //Kylin { DuraEffect += (Byte)(Item.SecondGem % 10); if (Item.SecondGem % 10 == 3) { DuraEffect++; } } Double Bonus = 1.0; Bonus += 0.5 * DuraEffect; Item.MaxDura = (UInt16)((Double)Item.MaxDura * Bonus); Item.CurDura = Item.MaxDura; player.SendSysMsg(StrRes.STR_IMPROVE_SUCCEED); } player.Send(new MsgItemInfo(Item, MsgItemInfo.Action.Update)); break; } case Action.UpLevel: { if (!player.IsAlive()) { player.SendSysMsg(StrRes.STR_DIE); return; } Item Item = player.GetItemByUID(UniqId); if (Item == null) { player.SendSysMsg(StrRes.STR_ITEM_NOT_FOUND); return; } if (Item.Position != 0) { return; } if (Item.CurDura != Item.MaxDura) { player.SendSysMsg(StrRes.STR_ITEM_DAMAGED); return; } Item Treasure = player.GetItemByUID(Data); if (Treasure == null) { player.SendSysMsg(StrRes.STR_ITEM_NOT_FOUND); return; } if (Treasure.Position != 0 || Treasure.Type != 1088001) { return; } Double Chance; Int32 NextId; if (!ItemHandler.GetUpLevelInfo(Item, out Chance, out NextId)) { return; } player.DelItem(Treasure, true); if (!MyMath.Success(Chance)) { Item.CurDura /= 2; Item.MaxDura -= 15; player.SendSysMsg(StrRes.STR_IMPROVE_FAILED); } else { if (Item.FirstGem == 0 && MyMath.Success(1.50)) { Item.FirstGem = 255; } else if (Item.SecondGem == 0 && MyMath.Success(0.75)) { Item.SecondGem = 255; } Item.Type = NextId; Item.CurDura = ItemHandler.GetMaxDura(NextId); Item.MaxDura = ItemHandler.GetMaxDura(NextId); Byte DuraEffect = 0; if (Item.FirstGem - (Item.FirstGem % 10) == 40) //Kylin { DuraEffect += (Byte)(Item.FirstGem % 10); if (Item.FirstGem % 10 == 3) { DuraEffect++; } } if (Item.SecondGem - (Item.SecondGem % 10) == 40) //Kylin { DuraEffect += (Byte)(Item.SecondGem % 10); if (Item.SecondGem % 10 == 3) { DuraEffect++; } } Double Bonus = 1.0; Bonus += 0.5 * DuraEffect; Item.MaxDura = (UInt16)((Double)Item.MaxDura * Bonus); Item.CurDura = Item.MaxDura; player.SendSysMsg(StrRes.STR_IMPROVE_SUCCEED); } player.Send(new MsgItemInfo(Item, MsgItemInfo.Action.Update)); break; } case Action.BoothQuery: { if (!player.Map.Entities.ContainsKey(UniqId)) { return; } Booth Booth = (player.Map.Entities[UniqId] as Booth); if (!MyMath.CanSee(player.X, player.Y, Booth.X, Booth.Y, MyMath.NORMAL_RANGE)) { return; } Booth.SendItems(player); break; } case Action.BoothAdd: { if (player.Booth == null) { return; } if (Data > Player._MAX_MONEYLIMIT) { return; } if (!player.Items.ContainsKey(UniqId)) { return; } if (player.Booth.AddItem(UniqId, (UInt32)Data)) { player.Send(this); } break; } case Action.BoothDel: { if (player.Booth == null) { return; } if (player.Booth.UniqId != Data) { return; } player.Booth.DelItem(UniqId); break; } case Action.BoothBuy: { if (!player.Map.Entities.ContainsKey(Data)) { return; } Booth Booth = (player.Map.Entities[Data] as Booth); if (!MyMath.CanSee(player.X, player.Y, Booth.X, Booth.Y, MyMath.NORMAL_RANGE)) { return; } Booth.BuyItem(player, UniqId); break; } case Action.CompleteTask: { aClient.Send(this); break; } case Action.Enchant: { if (!player.IsAlive()) { player.SendSysMsg(StrRes.STR_DIE); return; } Item Item = player.GetItemByUID(UniqId); if (Item == null) { player.SendSysMsg(StrRes.STR_ITEM_NOT_FOUND); return; } if (Item.Position != 0) { return; } if (Item.Enchant >= 255) { return; } Item Gem = player.GetItemByUID(Data); if (Gem == null) { player.SendSysMsg(StrRes.STR_ITEM_NOT_FOUND); return; } if (Gem.Position != 0 || (Gem.Type / 100000) != 7) { return; } Byte GemID = (Byte)(Gem.Type % 100); player.DelItem(Gem, true); Byte Enchant = 0; if (GemID % 10 == 1) //Normal { Enchant = (Byte)MyMath.Generate(1, 59); } else if (GemID == 2 || GemID == 52 || GemID == 62) //Reffined (Phoenix/Violet/Moon) { Enchant = (Byte)MyMath.Generate(60, 109); } else if (GemID == 22 || GemID == 42 || GemID == 72) //Reffined (Fury/Kylin/Tortoise) { Enchant = (Byte)MyMath.Generate(40, 89); } else if (GemID == 12) //Reffined (Dragon) { Enchant = (Byte)MyMath.Generate(100, 159); } else if (GemID == 32) //Reffined (Rainbow) { Enchant = (Byte)MyMath.Generate(80, 129); } else if (GemID == 3 || GemID == 33 || GemID == 73) //Super (Phoenix/Rainbow/Tortoise) { Enchant = (Byte)MyMath.Generate(170, 229); } else if (GemID == 53 || GemID == 63) //Super (Violet/Moon) { Enchant = (Byte)MyMath.Generate(140, 199); } else if (GemID == 13) //Reffined (Dragon) { Enchant = (Byte)MyMath.Generate(200, 255); } else if (GemID == 23) //Reffined (Fury) { Enchant = (Byte)MyMath.Generate(90, 149); } else if (GemID == 43) //Reffined (Kylin) { Enchant = (Byte)MyMath.Generate(70, 119); } player.Send(new MsgItem(UniqId, Enchant, Action.Enchant)); if (Enchant > Item.Enchant) { Item.Enchant = Enchant; player.Send(new MsgItemInfo(Item, MsgItemInfo.Action.Update)); } break; } default: { sLogger.Error("Action {0} is not implemented for MsgItem.", (UInt32)_Action); break; } } } catch (Exception exc) { sLogger.Error(exc); } }