//InventoryPacket private static void HandlePacket(InventoryPacket packet) { foreach (var inv in packet.Slots) { HandlePacket((dynamic)inv); } }
public static void TradePutItem(InPacket lea, Client c) { var chr = c.Character; int SourceType = lea.ReadShort(); int SourceSlot = lea.ReadShort(); int Quantity = lea.ReadInt(); if (SourceType == 0x64 && SourceSlot == 0x64) { // Money欄位 chr.Money -= Quantity; chr.Trade.Money = Quantity; InventoryPacket.getInvenMoney(c, chr.Money, -Quantity); TradePacket.TradePutItem(c); TradePacket.TradePutItem(chr.Trader.Client); return; } Item Source = chr.Items.getItem((byte)SourceType, (byte)SourceSlot); chr.Trade.SourceQuantity.Add(Source.Quantity); if (Source != null) { chr.Trade.Item.Add(Source); chr.Trade.TargetQuantity.Add((short)Quantity); chr.Items.Remove((byte)SourceType, (byte)SourceSlot, Quantity); InventoryHandler.UpdateInventory(c, (byte)SourceType); TradePacket.TradePutItem(c); TradePacket.TradePutItem(chr.Trader.Client); } }
public override void Handle(EzClient client, EzPacket packet) { int itemSlot = packet.Data.ReadInt32(); int equipmentSlot = packet.Data.ReadInt32(); packet.Data.ReadInt32(); InventoryItem item = client.Inventory.GetItem(itemSlot); InventoryItem equip = client.Inventory.GetEquip(equipmentSlot); if (!client.Inventory.Equip(itemSlot, equipmentSlot)) { _logger.Error("couldn't apply itemSlot {0} and equipmentSlot {1}", itemSlot, equipmentSlot); return; } if (item != null && !Database.UpdateInventoryItem(item)) { _logger.Error("Couldn't save item to database {0}", item.Item.Name); return; } if (equip != null && !Database.UpdateInventoryItem(equip)) { _logger.Error("Couldn't save item to database {0}", equip.Item.Name); return; } _logger.Debug("applied itemSlot {0} and equipmentSlot {1}", itemSlot, equipmentSlot); IBuffer showInventoryPacket = InventoryPacket.ShowInventoryPacket(client.Inventory); Send(client, 0x1E, showInventoryPacket); }
public static void Buy_Req(InPacket lea, Client c) { int CharacterID = lea.ReadInt(); int ItemID = lea.ReadInt(); int Slot = lea.ReadShort(); int Quantity = lea.ReadShort(); var chr = c.Character; try { Map map = MapFactory.GetMap(chr.MapX, chr.MapY); Character Seller = null; foreach (Character find in map.Characters) { if (find.CharacterID == CharacterID) { Seller = find; } } ShopData Item = Seller.Shop.Find(i => ItemID == i.ItemID && Slot == i.TargetSlot); byte Type = InventoryType.getItemType(ItemID); byte FreeSlot = chr.Items.GetNextFreeSlot((InventoryType.ItemType)Type); if (Item.Quantity < Quantity || Item == null) { PlayerShopPacket.Buy(c, 0); return; } chr.Money -= (Item.Price * Quantity); InventoryPacket.getInvenMoney(c, chr.Money, -(Item.Price * Quantity)); chr.Items.Add(new Item(Item.ItemID, (short)Quantity, Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Type, FreeSlot)); InventoryHandler.UpdateInventory(c, Type); //Seller.Shop.Remove(Item); Seller.Items.Remove((byte)Item.SourceType, (byte)Item.SourceSlot); Seller.Items.Add(new Item(Item.ItemID, (short)(Item.Quantity - Quantity), Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, (byte)Item.SourceType, (byte)Item.SourceSlot)); Item.Quantity = Item.Quantity - Quantity; Seller.Shop.Money += (Item.Price * Quantity); Seller.Money += (Item.Price * Quantity); PlayerShopPacket.ShopInfo(c, Seller, CharacterID); InventoryHandler.UpdateInventory(Seller.Client, (byte)Item.SourceType); PlayerShopPacket.SellInfo(Seller.Client); InventoryPacket.getInvenMoney(Seller.Client, Seller.Money, Item.Price * Quantity); PlayerShopPacket.Buy(c, 1); } catch { PlayerShopPacket.Buy(c, 0); return; } }
public static void SelectSlot_Req(InPacket lea, Client c) { int Slot = lea.ReadInt(); var chr = c.Character; chr.UseSlot.Remove((byte)InventoryType.ItemType.Spend3); chr.UseSlot.Add((byte)InventoryType.ItemType.Spend3, (byte)Slot); InventoryPacket.SelectSlot(c, Slot); }
public static void UpdateInventory(Client gc, byte SourceType, byte TargetType = 0xFF) { switch (SourceType) { case 0: UpdateAvatar(gc); switch (TargetType) { case 1: InventoryPacket.getInvenEquip1(gc); break; case 2: InventoryPacket.getInvenEquip2(gc); break; case 5: InventoryPacket.getInvenPet5(gc); break; } break; case 1: if (TargetType == 0) { UpdateAvatar(gc); } InventoryPacket.getInvenEquip1(gc); break; case 2: if (TargetType == 0) { UpdateAvatar(gc); } InventoryPacket.getInvenEquip2(gc); break; case 3: InventoryPacket.getInvenSpend3(gc); break; case 4: InventoryPacket.getInvenOther4(gc); break; case 5: if (TargetType == 0) { UpdateAvatar(gc); } InventoryPacket.getInvenPet5(gc); break; } }
public static void UpdateAvatar(Client gc) { var chr = gc.Character; Map map = MapFactory.GetMap(chr.MapX, chr.MapY); InventoryPacket.getInvenEquip(gc); StatusPacket.getStatusInfo(gc); foreach (Character All in map.Characters) { InventoryPacket.getAvatar(All.Client, chr); } }
public static void CommodityToInventory_Req(InPacket lea, Client c) { var chr = c.Character; int Slot = lea.ReadInt(); Item Source = chr.Items.getItem((byte)InventoryType.ItemType.Cash, (byte)Slot); if (Source.ItemID / 100000 == 90) { // 頭髮 chr.Hair = Source.ItemID; chr.Items.Remove(Source.Type, Source.Slot); chr.Items.Save(); CashShopPacket.CommodityToInventory(c); InventoryPacket.getInvenCash(c); InventoryHandler.UpdateInventory(c, (byte)InventoryType.ItemType.Equip); return; } else if (Source.ItemID / 100000 == 91) { // 眼睛 chr.Eyes = Source.ItemID; chr.Items.Remove(Source.Type, Source.Slot); chr.Items.Save(); CashShopPacket.CommodityToInventory(c); InventoryPacket.getInvenCash(c); InventoryHandler.UpdateInventory(c, (byte)InventoryType.ItemType.Equip); return; } else if (Source.ItemID / 100000 == 92 || Source.ItemID == 7820501) { // 寵物 chr.Pets.Add(new Pet(Source.ItemID, 0, "", 1, 100, 100, 0, (byte)InventoryType.ItemType.Pet5, chr.Pets.GetNextFreeSlot(InventoryType.ItemType.Pet5))); chr.Items.Remove(Source.Type, Source.Slot); chr.Pets.Save(); chr.Items.Save(); CashShopPacket.CommodityToInventory(c); InventoryPacket.getInvenCash(c); InventoryHandler.UpdateInventory(c, (byte)InventoryType.ItemType.Pet5); return; } byte TargetType = InventoryType.getItemType(Source.ItemID); byte TargetSlot = chr.Items.GetNextFreeSlot((InventoryType.ItemType)InventoryType.getItemType(Source.ItemID)); Source.Type = TargetType; Source.Slot = TargetSlot; chr.Items.Save(); CashShopPacket.CommodityToInventory(c); InventoryPacket.getInvenCash(c); InventoryHandler.UpdateInventory(c, TargetType); }
public static void BuyCommodity_Req(InPacket lea, Client c) { int ItemID = lea.ReadInt(); string ItemName = lea.ReadString(62); short Quantity = 1; bool IsLocked = true; var chr = c.Character; if (CashShopFactory.GetItemData(ItemID) == null) { return; } if (ItemID == 8842002) { Quantity = 10; } if (ItemID == 8841001 || ItemID == 8841002 || ItemID == 8841003 || ItemID == 8841004 || ItemID == 8841005) { Quantity = 20; } if (ItemID == 8890031 || ItemID == 8890037) // 鞭炮 + 心花怒放 { Quantity = 100; } if (ItemID / 100000 == 92 || ItemID == 8890031 || ItemID == 8890037) // 寵物 + 鞭炮 + 心花怒放 { IsLocked = false; } // 購買日誌 dynamic datum = new Datum("BuyCommodityLog"); datum.name = chr.Name; datum.itemID = ItemID; datum.itemName = ItemName; datum.Insert(); c.Account.GamePoints -= CashShopFactory.GetItemData(ItemID).BargainPrice; c.Account.Save(); chr.Items.Add(new Item(ItemID, IsLocked, 0, -1, (byte)InventoryType.ItemType.Cash, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Cash), Quantity)); chr.Items.Save(); CashShopPacket.BuyCommodity(c); CashShopPacket.MgameCash(c); CashShopPacket.GuiHonCash(c); InventoryPacket.getInvenCash(c); }
public static void GiveStorageMoney(InPacket lea, Client gc) { var chr = gc.Character; int money = lea.ReadInt(); int unk = lea.ReadInt(); chr.Storages.getStorages()[0].Money -= money; chr.Storages.getStorages()[0].Save(); chr.Money += money; chr.Save(); InventoryPacket.getInvenMoney(gc, chr.Money, money); StoragePacket.getStoreMoney(gc); }
public static void InvenUseSpendStart_Req(InPacket lea, Client c) { short PositionX = lea.ReadShort(); short PositionY = lea.ReadShort(); int Slot = lea.ReadInt(); var chr = c.Character; Map map = MapFactory.GetMap(chr.MapX, chr.MapY); Item Item = chr.Items.getItem((byte)InventoryType.ItemType.Spend3, (byte)Slot); foreach (Character All in map.Characters) { InventoryPacket.UseSpendStart(All.Client, chr, PositionX, PositionY, Item.ItemID, (byte)InventoryType.ItemType.Spend3, Slot); } chr.Items.Remove((byte)InventoryType.ItemType.Spend3, (byte)Slot, 1); UpdateInventory(c, (byte)InventoryType.ItemType.Spend3); }
private void OnSessionResponse(Response <Session> result, EzClient client, EzPacket packet) { _logger.Debug("Client ({0}) entered world (SessionKey: {1})", client.Identity, result.Result.Key); client.Session = result.Result; Channel channel = Server.GetChannel(client.Mode, client.Session.ChannelId); channel.Join(client); IBuffer response = EzServer.Buffer.Provide(); response.WriteByte(1); response.WriteByte(0); response.WriteByte(7); //0A? response.WriteByte(0); response.WriteByte((byte)client.Mode); // Mode 0=RubyMix 1=STREET MIX 2=CLUB MIX response.WriteByte(0); response.WriteByte((byte)client.Session.ChannelId); //1-xCH / 0=1ch 1=2ch 2=3ch 3=4ch response.WriteByte(0); Send(client, 1, response); IBuffer characterList = LobbyCharacterListPacket.Create(channel); Send(channel.GetLobbyClients(), 2, characterList); IBuffer announceRoomPacket = RoomPacket.CreateAnnounceRoomPacket(channel); Send(client.Channel.GetLobbyClients(), 13, announceRoomPacket); IBuffer applyInventoryPacket = InventoryPacket.ShowInventoryPacket(client.Inventory); Send(client, 0x21, applyInventoryPacket); IBuffer djPointsPacket = SongPacket.CreateDjPointsPacket(); Send(client, 0x2B, djPointsPacket); //43 IBuffer settings = SettingsPacket.Create(client.Setting, client.Mode); Send(client, 0x2D, settings); //45 }
public static void Use_Coupon_Req(InPacket lea, Client gc) { var chr = gc.Character; string Code = lea.ReadString(20); foreach (dynamic datum in new Datums("Coupon").Populate()) { if (Code.Equals(datum.code) && datum.valid == 1) { byte Type = InventoryType.getItemType(datum.itemID); chr.Items.Add(new Item(datum.itemID, InventoryType.getItemType(datum.itemID), chr.Items.GetNextFreeSlot((InventoryType.ItemType)Type), (short)datum.quantity)); InventoryHandler.UpdateInventory(gc, Type); InventoryPacket.ClearDropItem(gc, chr.CharacterID, -1, datum.itemID); datum.valid = 0; datum.Update("code = '{0}'", Code); break; } } }
public static void InvenUseSpendShout_Req(InPacket lea, Client gc) { byte Slot = lea.ReadByte(); string Message = lea.ReadString(60); lea.ReadInt(); lea.ReadByte(); lea.ReadByte(); var chr = gc.Character; if (Slot >= 0 && Slot < 24 && Message.Length <= 60) { gc.Character.Items.Remove((byte)InventoryType.ItemType.Spend3, Slot, 1); foreach (Character All in MapFactory.AllCharacters) { GamePacket.InvenUseSpendShout(All.Client, chr, Message); } InventoryPacket.getInvenSpend3(gc); } }
public override void Handle(EzClient client, EzPacket packet) { byte unknown = packet.Data.ReadByte(); byte sourceSlot = packet.Data.ReadByte(); int itemId = packet.Data.ReadInt16(Endianness.Big); byte destinationSlot = packet.Data.ReadByte(); InventoryItem source = client.Inventory.GetItem(sourceSlot); InventoryItem destination = client.Inventory.GetItem(destinationSlot); if (source == null) { _logger.Error("Source item could not be found"); return; } if (!client.Inventory.Move(sourceSlot, destinationSlot)) { _logger.Error("Couldn't move item {0}, destination is occupied", source.Item.Name); return; } if (!Database.UpdateInventoryItem(source)) { _logger.Error("Couldn't save source item to database {0}", source.Item.Name); return; } if (destination != null && !Database.UpdateInventoryItem(destination)) { _logger.Error("Couldn't save destination item to database {0}", source.Item.Name); return; } _logger.Debug("Move ItemId {0} from slot {1} to {2}", itemId, sourceSlot, destinationSlot); IBuffer showInventoryPacket = InventoryPacket.ShowInventoryPacket(client.Inventory); Send(client, 0x1E, showInventoryPacket); }
public override void Handle(EzClient client, EzPacket packet) { byte unknown = packet.Data.ReadByte(); short itemId = packet.Data.ReadInt16(Endianness.Big); byte itemSlot = packet.Data.ReadByte(); InventoryItem inventoryItem = client.Inventory.GetItem(itemSlot); if (inventoryItem == null) { _logger.Error("Item could not be found"); return; } if (inventoryItem.Item.Id != itemId) { _logger.Error("InventoryItem Id {0} does not match clients {1}", inventoryItem.Item.Id, itemId); return; } if (!client.Inventory.RemoveItem(inventoryItem)) { _logger.Error("Could not remove item {0} from bag", inventoryItem.Item.Name); return; } if (!Database.DeleteInventoryItem(inventoryItem.Id)) { _logger.Error("Could not deleye item {0} from database", inventoryItem.Item.Name); return; } _logger.Debug("Deleted Item {0} from slot {1}", inventoryItem.Item.Name, inventoryItem.Slot); IBuffer showInventoryPacket = InventoryPacket.ShowInventoryPacket(client.Inventory); Send(client, 0x1E, showInventoryPacket); }
public void getPackets() { //GD.Print("Get Packets"); //GD.Print(wrapped_client.GetAvailablePacketCount()); if (connected && client.GetAvailableBytes() > 0) { //byte[] packet_data = wrapped_client.GetPacket(); //UInt32 packetLength = BitConverter.ToUInt32(packet_data, 0); //short packetId = BitConverter.ToInt16(packet_data, 4); UInt32 packetLength = (UInt32)client.GetU32(); short packetId = (short)client.Get16(); var packetData = client.GetData((int)packetLength - 2); //var data = new List<byte>(packet_data).GetRange(6, packet_data.Length -6).ToArray(); //GD.Print(BitConverter.ToString( (byte[]) packetData[1])); var data = (byte[])packetData[1]; var packet = Packets.Packets.decode(packetId, data); if (GetParent().GetNodeOrNull("GUI") != null) { var gui = (Control)GetParent().GetNodeOrNull("GUI"); gui.Call("recordPacket", packetLength + 4); } GD.Print(String.Format("Received packet {0}, ID: {1} Length: {2}", packet.name, packetId, packetLength)); if (packet is ReadyPacket) { ReadyPacket parsed_packet = (ReadyPacket)packet; if (parsed_packet.code == 0) { string token = (string)GetParent().GetNode("Discord Integration").Call("getToken"); var loginPacket = new LoginPacket(token); GD.Print("Sending login"); sendPacket(loginPacket); } else if (parsed_packet.code == 1) { var requestWorldPacket = new RequestWorldPacket(); sendPacket(requestWorldPacket); if (!joined) { var loadingRes = GD.Load <PackedScene>("res://scenes/world.tscn"); var node = loadingRes.Instance(); node.SetName("WorldScene"); var loadingGuiRes = GD.Load <PackedScene>("res://scenes/gui.tscn"); var gui = (Control)loadingGuiRes.Instance(); gui.SetName("GUI"); GetParent().Call("setState", 2); GetParent().AddChild(node); //GetParent().AddChild(gui); GetParent().AddChild(gui); //node.AddChild(gui); GetParent().GetNode("GameLoader").Free(); //var playerSpriteScene = (PackedScene) node.Call("getSprite", "rowan"); //var playerSprite = (AnimatedSprite) playerSpriteScene.Instance(); //playerSprite.SetName("PlayerSprite"); //node.GetNode("World/Player").AddChild(playerSprite); //playerSprite.Position = ((KinematicBody2D) node.GetNode("Player")).Position; //playerSprite.Visible = true; //GD.Print(playerSprite); joined = true; } } } else if (packet is PongPacket) { PongPacket parsed_packet = (PongPacket)packet; GD.Print("Got pong of " + parsed_packet.message); } else if (packet is LoginResultPacket) { LoginResultPacket parsed_packet = (LoginResultPacket)packet; GD.Print("Login Result: " + parsed_packet.responseCode.ToString() + " Name: " + parsed_packet.userId); var joinGamePacket = new JoinGamePacket(); sendPacket(joinGamePacket); } else if (packet is WorldPacket) { WorldPacket parsed_packet = (WorldPacket)packet; //GD.Print(parsed_packet.debug); GetParent().GetNode("WorldScene").Call("loadWorld", new object[] { parsed_packet.worldData, parsed_packet.bumpData, parsed_packet.height, parsed_packet.width }); } else if (packet is PlayerPositionPacket) { PlayerPositionPacket parsed_packet = (PlayerPositionPacket)packet; GetParent().GetNode("WorldScene/World/Player").Call("move", new object[] { parsed_packet.x, parsed_packet.y }); } else if (packet is ChatPacket) { ChatPacket parsed_packet = (ChatPacket)packet; GetNode("../GUI/Chat").Call("AddMessage", parsed_packet.author + ": " + parsed_packet.msg); } else if (packet is EntityPacket) { EntityPacket parsed_packet = (EntityPacket)packet; GD.Print("Got entity '", parsed_packet.sprite, "' at ", parsed_packet.x, ",", parsed_packet.y, " ID: ", parsed_packet.uuid); GetNode("../WorldScene").Call("addEntity", parsed_packet.x, parsed_packet.y, parsed_packet.type, parsed_packet.facing, parsed_packet.interactable, parsed_packet.sprite, parsed_packet.uuid, parsed_packet.type != 2); } else if (packet is EntityMovePacket) { EntityMovePacket parsed_packet = (EntityMovePacket)packet; GD.Print("Got entity moving to ", parsed_packet.x, ",", parsed_packet.y, " ID: ", parsed_packet.uuid); GetNode("../WorldScene").Call("moveEntity", parsed_packet.uuid, parsed_packet.x, parsed_packet.y, parsed_packet.facing); } else if (packet is InvalidateCachePacket) { InvalidateCachePacket parsed_packet = (InvalidateCachePacket)packet; GD.Print(parsed_packet.uuid, " Invalidated."); GetNode("../WorldScene").Call("hideEntity", parsed_packet.uuid); } else if (packet is DialoguePacket) { DialoguePacket parsed_packet = (DialoguePacket)packet; GD.Print("Got dialogue \"", parsed_packet.text, "\""); Window window = (Window)GetNode("../GUI/Window"); window.OpenDialoguePanel(); DialoguePanel dialoguePanel = window.OpenDialoguePanel(); //(DialoguePanel) GetNode("../GUI/Window/DialoguePanel"); dialoguePanel.SetDialogue(parsed_packet.text, parsed_packet.author, parsed_packet.sprite, parsed_packet.substitutions, parsed_packet.optionViews); } else if (packet is CloseDialoguePacket) { CloseDialoguePacket parsed_packet = (CloseDialoguePacket)packet; DialoguePanel dialoguePanel = (DialoguePanel)GetNode("../GUI/Window/DialoguePanel"); dialoguePanel.CloseDialogue(parsed_packet.guid); //dialoguePanel.SetDialogue(parsed_packet.text, parsed_packet.author, parsed_packet.sprite, parsed_packet.substitutions, parsed_packet.optionViews); } else if (packet is PlayerDataPacket) { PlayerDataPacket parsed_packet = (PlayerDataPacket)packet; var player = (Player)GetNode("../WorldScene/World/Player"); player.SetUuid(parsed_packet.guid); if (player.GetNodeOrNull("PlayerSprite") != null) { player.GetNodeOrNull("PlayerSprite").Free(); } var playerSpriteScene = (PackedScene)GetNode("../WorldScene").Call("getSprite", parsed_packet.sprite); var playerSprite = (AnimatedSprite)playerSpriteScene.Instance(); playerSprite.SetName("PlayerSprite"); player.AddChild(playerSprite); } else if (packet is InventoryPacket) { InventoryPacket parsed_packet = (InventoryPacket)packet; var player = (Player)GetNode("../WorldScene/World/Player"); if (player.guid == parsed_packet.inventory.guid) { player.inventory = parsed_packet.inventory; foreach (Item item in player.inventory.items) { GD.Print("Item: ", item.GetName(), " \"", item.GetDescription(), "\""); } } } else if (packet is AddItemPacket) { AddItemPacket parsed_packet = (AddItemPacket)packet; var player = (Player)GetNode("../WorldScene/World/Player"); if (player.guid == parsed_packet.guid) { //TODO: Make use of indices. player.inventory.AddItem(parsed_packet.item, true); } } else if (packet is ModifyItemPacket) { ModifyItemPacket parsed_packet = (ModifyItemPacket)packet; var player = (Player)GetNode("../WorldScene/World/Player"); if (player.guid == parsed_packet.guid) { //TODO: Make use of indices. player.inventory.UpdateItem(parsed_packet.item, parsed_packet.index); } } } else { var testPacket = new Packets.PingPacket("Hello There!"); //sendPacket(testPacket); } }
public static void Command_Req(InPacket lea, Client gc) { string[] cmd = lea.ReadString(60).Split(new[] { (char)0x20 }, StringSplitOptions.None); if (gc.Account.Master == 0 || cmd.Length < 1) { return; } var chr = gc.Character; Character victim = null; switch (cmd[0]) { case "//notice": if (cmd.Length != 2) { break; } foreach (Character all in MapFactory.AllCharacters) { GamePacket.getNotice(all.Client, 3, cmd[1]); } break; case "//item": if (cmd.Length != 2 && cmd.Length != 3) { break; } short Quantity = 1; if (cmd.Length == 3) { if (int.Parse(cmd[2]) > 100) { Quantity = 100; } else { Quantity = short.Parse(cmd[2]); } } if (InventoryType.getItemType(int.Parse(cmd[1])) == 1 || InventoryType.getItemType(int.Parse(cmd[1])) == 2) { Quantity = 1; } if (InventoryType.getItemType(int.Parse(cmd[1])) == 5) { return; } chr.Items.Add(new Item(int.Parse(cmd[1]), InventoryType.getItemType(int.Parse(cmd[1])), chr.Items.GetNextFreeSlot((InventoryType.ItemType)InventoryType.getItemType(int.Parse(cmd[1]))), Quantity)); InventoryHandler.UpdateInventory(gc, InventoryType.getItemType(int.Parse(cmd[1]))); break; case "//money": if (cmd.Length != 2) { break; } chr.Money = int.Parse(cmd[1]); InventoryPacket.getInvenMoney(gc, chr.Money, int.Parse(cmd[1])); break; case "//levelup": chr.LevelUp(); break; case "//gogo": if (cmd.Length != 3) { break; } MapPacket.warpToMapAuth(gc, true, short.Parse(cmd[1]), short.Parse(cmd[2]), short.Parse(cmd[3]), short.Parse(cmd[4])); break; case "//hp": if (cmd.Length != 2) { break; } short Hp = short.Parse(cmd[1]); if (Hp > short.MaxValue) { Hp = short.MaxValue; } chr.MaxHp = Hp; chr.Hp = Hp; StatusPacket.getStatusInfo(gc); break; case "//mp": short Mp = short.Parse(cmd[1]); if (Mp > short.MaxValue) { Mp = short.MaxValue; } chr.MaxMp = Mp; chr.Mp = Mp; StatusPacket.getStatusInfo(gc); break; case "//heal": chr.Hp = chr.MaxHp; chr.Mp = chr.MaxMp; chr.Fury = chr.MaxFury; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); break; case "//warp": if (cmd.Length != 2) { break; } foreach (Character find in MapFactory.AllCharacters) { if (find.Name.Equals(cmd[1])) { victim = find; } } if (victim != null) { chr.MapX = victim.MapX; chr.MapY = victim.MapY; chr.PlayerX = victim.PlayerX; chr.PlayerY = victim.PlayerY; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); } break; case "//ban": if (cmd.Length != 2) { break; } foreach (Character find in MapFactory.AllCharacters) { if (find.Name.Equals(cmd[1])) { victim = find; } } if (victim != null) { dynamic datum = new Datum("accounts"); victim.Client.Account.Banned = 7; victim.Client.Dispose(); } break; case "//save": for (int i = 0; i < MapFactory.AllCharacters.Count; i++) { if (chr.CharacterID == MapFactory.AllCharacters[i].CharacterID) { continue; } MapFactory.AllCharacters[i].Client.Dispose(); } //GameServer.IsAlive = false; break; case "//skillhack": break; case "//serverinfo": GamePacket.NormalNotice(gc, 1, "I: P:15101 U:1 E:1.00 D:1.00 M:1.00 G:1.00"); break; case "//come": case "//oxstate": break; case "//now": DateTime now = DateTime.Now; string nowtime = string.Format("Server Time Now : [{0}-{1}-{2} {3}:{4}:{5}]", now.Year, now.Month, now.Day.ToString("00.##"), now.Hour.ToString("00.##"), now.Minute.ToString("00.##"), now.Second.ToString("00.##")); GamePacket.NormalNotice(gc, 4, nowtime); break; case "//user": break; case "//serverdown": break; case "//test": GamePacket.getNotice(gc, 4, "Tes000t"); break; case "//expbuff": GamePacket.getNotice(gc, 1, "!@ExpEvent2@!"); break; case "//processlist": GamePacket.GmProcessList(gc); GamePacket.NormalNotice(gc, 4, "[GM] Process File has saved in game folder."); break; case "//gameinfo": GamePacket.GmGameInfo(gc); GamePacket.NormalNotice(gc, 4, "[GM] GAME_INFO has copied to your clipboard."); //[GM] Game Log has copied to your clipboard. break; default: break; } }
public static void PickupItem(InPacket lea, Client gc) { int OriginalID = lea.ReadInt(); int ItemID = lea.ReadInt(); lea.ReadInt(); var chr = gc.Character; Map Map = MapFactory.GetMap(chr.MapX, chr.MapY); // 撿取靈魂 if (ItemID >= 9900001 && ItemID <= 9900004) { if (Map.getDropByOriginalID(OriginalID) == null) { return; } switch (ItemID) { case 9900001: // Blue chr.Mp += (short)(chr.MaxMp * 0.2); if (chr.Mp > chr.MaxMp) { chr.Mp = chr.MaxMp; } break; case 9900002: // Green chr.Mp += (short)(chr.MaxMp * 0.4); if (chr.Mp > chr.MaxMp) { chr.Mp = chr.MaxMp; } break; case 9900003: // Red int rnd = Randomizer.Next(3, 7); chr.Fury += (short)(chr.MaxFury / 100 * rnd); if (chr.Fury > chr.MaxFury) { chr.Fury = chr.MaxFury; } break; case 9900004: // Purple if (chr.Items[InventoryType.ItemType.Equip, (byte)InventoryType.EquipType.Seal] != null) { chr.Items[InventoryType.ItemType.Equip, (byte)InventoryType.EquipType.Seal].Spirit++; InventoryPacket.getInvenEquip(gc); } break; } StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); foreach (Character All in Map.Characters) { InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID); } return; } // 撿取錢 if (ItemID >= 9800001 && ItemID <= 9800005) { if (Map.getDropByOriginalID(OriginalID) == null) { return; } chr.Money += Map.getDropByOriginalID(OriginalID).Quantity; InventoryPacket.getInvenMoney(gc, chr.Money, Map.getDropByOriginalID(OriginalID).Quantity); foreach (Character All in Map.Characters) { InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID); } return; } if (!Map.Item.ContainsKey(OriginalID)) { return; } byte Type = InventoryType.getItemType(ItemID); Item finditem = null; foreach (Item it in gc.Character.Items) { if (it.ItemID == ItemID) { finditem = it; } } if (((Type == (byte)InventoryType.ItemType.Spend3) || (Type == (byte)InventoryType.ItemType.Other4)) && (finditem != null) && (finditem.Quantity + Map.getDropByOriginalID(OriginalID).Quantity) <= 100) { // 合併消費物品跟其他物品 chr.Items[(InventoryType.ItemType)finditem.Type, finditem.Slot].Quantity += Map.getDropByOriginalID(OriginalID).Quantity; } else { byte Slot = gc.Character.Items.GetNextFreeSlot((InventoryType.ItemType)Type); Item oItem = new Item(ItemID, Type, Slot, Map.getDropByOriginalID(OriginalID).Quantity); chr.Items.Add(oItem); } foreach (Character All in Map.Characters) { InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID); } Map.Item.Remove(OriginalID); UpdateInventory(gc, Type); }
public static void UseSpend_Req(InPacket lea, Client gc) { var chr = gc.Character; byte Type = lea.ReadByte(); byte Slot = lea.ReadByte(); Item Item = chr.Items.getItem(Type, Slot); Map map = MapFactory.GetMap(chr.MapX, chr.MapY); var use = ItemFactory.useData[Item.ItemID]; // 使用回復HP 跟 MP 的物品 switch (Item.ItemID) { case 8841006: // 全部還原本 int Recover = 0; Recover = Recover + (chr.Str - 3); Recover = Recover + (chr.Dex - 3); Recover = Recover + (chr.Vit - 3); Recover = Recover + (chr.Int - 3); chr.Str = 3; chr.Dex = 3; chr.Vit = 3; chr.Int = 3; chr.AbilityBonus += (short)Recover; StatusPacket.getStatusInfo(gc); break; case 8850011: // 回城符 switch (chr.MapX) { case 1: case 2: case 3: case 4: case 5: case 6: case 22: case 23: chr.MapX = 1; chr.MapY = 1; break; case 7: case 8: case 9: chr.MapX = 16; chr.MapY = 1; break; case 10: case 11: case 20: chr.MapX = 10; chr.MapY = 1; break; case 12: case 13: chr.MapX = 12; chr.MapY = 1; break; case 14: case 15: case 17: case 18: case 19: case 21: chr.MapX = 15; chr.MapY = 1; break; case 16: chr.MapX = 16; chr.MapY = 1; break; case 24: case 25: case 26: case 31: case 32: case 33: chr.MapX = 25; chr.MapY = 1; break; case 27: case 28: chr.MapX = 27; chr.MapY = 1; break; default: chr.MapX = 1; chr.MapY = 1; break; } chr.PlayerX = 0; chr.PlayerY = 0; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850021: // 清陰符 chr.MapX = 1; chr.MapY = 2; chr.PlayerX = 2955; chr.PlayerY = 1116; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850031: // 龍林符(龍林城) chr.MapX = 15; chr.MapY = 2; chr.PlayerX = 3600; chr.PlayerY = 1041; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850041: // 冥珠符 chr.MapX = 10; chr.MapY = 3; chr.PlayerX = 1645; chr.PlayerY = 899; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850051: // 古樂符 chr.MapX = 25; chr.MapY = 1; chr.PlayerX = 4237; chr.PlayerY = 1230; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850061: // 無名符 chr.MapX = 16; chr.MapY = 1; chr.PlayerX = 2005; chr.PlayerY = 1101; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850071: // 龍林符(龍林客棧) chr.MapX = 12; chr.MapY = 1; chr.PlayerX = 1040; chr.PlayerY = 782; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8890011: // 蠟燭 case 8890021: // 火把 InventoryPacket.UseSpendStart(gc, chr, chr.PlayerX, chr.PlayerY, Item.ItemID, (byte)InventoryType.ItemType.Spend3, Slot); break; case 8899017: // 逮巴符 chr.MapX = 27; chr.MapY = 1; chr.PlayerX = 2070; chr.PlayerY = 1330; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; default: switch (use.Type) { case 0: // 恢復鬼力 if ((chr.MaxMp > chr.Mp + use.Recover)) { chr.Mp += (short)use.Recover; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxMp - chr.Mp < use.Recover) { chr.Mp = chr.MaxMp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; case 1: // 恢復鬼力(%) if ((chr.MaxMp > chr.Mp + chr.MaxMp * use.Recover / 100)) { chr.Mp += (short)(chr.MaxMp * use.Recover / 100); StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxMp - chr.Mp < chr.MaxMp * use.Recover / 100) { chr.Mp = chr.MaxMp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; case 2: // 恢復體力 if ((chr.MaxHp > chr.Hp + use.Recover)) { chr.Hp += (short)use.Recover; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxHp - chr.Hp < use.Recover) { chr.Hp = chr.MaxHp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; case 3: // 恢復體力(%) if ((chr.MaxHp > chr.Hp + chr.MaxHp * use.Recover / 100)) { chr.Hp += (short)(chr.MaxHp * use.Recover / 100); StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxHp - chr.Hp < chr.MaxHp * use.Recover / 100) { chr.Hp = chr.MaxHp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; default: break; } break; } chr.Items.Remove(Type, Slot, 1); UpdateInventory(gc, Type); }
public static void Command_Req(InPacket lea, Client gc) { string[] cmd = lea.ReadString(60).Split(new[] { (char)0x20 }, StringSplitOptions.None); if (gc.Account.Master == 0 || cmd.Length < 1) { return; } var chr = gc.Character; Character victim = null; switch (cmd[0]) { case "//1": case "//公告": case "//notice": if (cmd.Length != 2) { break; } foreach (Character all in MapFactory.AllCharacters) { GamePacket.getNotice(all.Client, 3, cmd[1]); } break; case "//item": if (cmd.Length != 2 && cmd.Length != 3) { break; } short Quantity = 1; if (cmd.Length == 3) { if (int.Parse(cmd[2]) > 100) { Quantity = 100; } else { Quantity = short.Parse(cmd[2]); } } if (InventoryType.getItemType(int.Parse(cmd[1])) == 1 || InventoryType.getItemType(int.Parse(cmd[1])) == 2) { Quantity = 1; } if (InventoryType.getItemType(int.Parse(cmd[1])) == 5) { return; } chr.Items.Add(new Item(int.Parse(cmd[1]), InventoryType.getItemType(int.Parse(cmd[1])), chr.Items.GetNextFreeSlot((InventoryType.ItemType)InventoryType.getItemType(int.Parse(cmd[1]))), Quantity)); InventoryHandler.UpdateInventory(gc, InventoryType.getItemType(int.Parse(cmd[1]))); break; case "//money": if (cmd.Length != 2) { break; } chr.Money = int.Parse(cmd[1]); InventoryPacket.getInvenMoney(gc, chr.Money, int.Parse(cmd[1])); break; case "//levelup": chr.LevelUp(); break; case "//gogo": if (cmd.Length != 3) { break; } MapPacket.warpToMapAuth(gc, true, short.Parse(cmd[1]), short.Parse(cmd[2]), -1, -1); break; case "//hp": if (cmd.Length != 2) { break; } short Hp = short.Parse(cmd[1]); if (Hp > short.MaxValue) { Hp = short.MaxValue; } chr.MaxHp = Hp; chr.Hp = Hp; StatusPacket.getStatusInfo(gc); break; case "//mp": short Mp = short.Parse(cmd[1]); if (Mp > short.MaxValue) { Mp = short.MaxValue; } chr.MaxMp = Mp; chr.Mp = Mp; StatusPacket.getStatusInfo(gc); break; case "//heal": chr.Hp = chr.MaxHp; chr.Mp = chr.MaxMp; chr.Fury = chr.MaxFury; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); break; case "//warp": if (cmd.Length != 2) { break; } foreach (Character find in MapFactory.AllCharacters) { if (find.Name.Equals(cmd[1])) { victim = find; } } if (victim != null) { chr.MapX = victim.MapX; chr.MapY = victim.MapY; chr.PlayerX = victim.PlayerX; chr.PlayerY = victim.PlayerY; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); } break; case "//ban": if (cmd.Length != 2) { break; } foreach (Character find in MapFactory.AllCharacters) { if (find.Name.Equals(cmd[1])) { victim = find; } } if (victim != null) { dynamic datum = new Datum("accounts"); victim.Client.Account.Banned = 1; victim.Client.Dispose(); } break; case "//save": for (int i = 0; i < MapFactory.AllCharacters.Count; i++) { if (chr.CharacterID == MapFactory.AllCharacters[i].CharacterID) { continue; } MapFactory.AllCharacters[i].Client.Dispose(); } //GameServer.IsAlive = false; break; case "//選擇正派": Quest Quest = new Quest(60); Quest.QuestState = 0x31; chr.Quests.Add(Quest); QuestPacket.getQuestInfo(gc, chr.Quests.getQuests()); chr.Items.Add(new Item(8990019, 4, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Other4))); break; case "//選擇邪派": Quest = new Quest(64); Quest.QuestState = 0x31; chr.Quests.Add(Quest); QuestPacket.getQuestInfo(gc, chr.Quests.getQuests()); chr.Items.Add(new Item(8990020, 4, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Other4))); break; //case "//test": // PartyPacket.PartyInvite(gc); // break; //case "//test2": // PartyPacket.PartyInvite(gc, 1, 1); // break; //case "//test3": // PartyPacket.PartyInvite(gc, 1 , 0); // break; default: break; } }
public static void Sell_Req(InPacket lea, Client gc) { int ItemID = lea.ReadInt(); byte Type = lea.ReadByte(); byte Slot = lea.ReadByte(); short Quantity = lea.ReadShort(); if (Quantity > 100) { return; } int Money = 0; switch (ItemID / 100000) { case 75: // 耳環 Money = ItemFactory.earringData[ItemID].Price; Money /= 5; break; case 79: // 武器 case 80: // 武器 Money = ItemFactory.weaponData[ItemID].Price; Money /= 5; break; case 81: // 衣服 Money = ItemFactory.topData[ItemID].Price; Money /= 5; break; case 84: // 披風 Money = ItemFactory.capeData[ItemID].Price; Money /= 5; break; case 86: // 帽子 Money = ItemFactory.hatData[ItemID].Price; Money /= 5; break; case 87: // 面具 Money = ItemFactory.maskData[ItemID].Price; Money /= 5; break; case 93: // 武器 Money = ItemFactory.weaponData[ItemID].Price; Money /= 5; break; case 94: // 鬍子 Money = ItemFactory.beardData[ItemID].Price; Money /= 5; break; case 95: // 服裝 Money = ItemFactory.clothingData[ItemID].Price; Money /= 5; break; case 82: // 戒指 Money = ItemFactory.ringData[ItemID].Price; Money /= 5; break; case 83: // 項鍊 Money = ItemFactory.necklaceData[ItemID].Price; Money /= 5; break; case 85: // 封印箱 Money = ItemFactory.soulData[ItemID].Price; Money /= 5; break; case 11: // 拼圖 Money = ItemFactory.jigsawData[ItemID].Price; break; case 88: // 消耗 Money = ItemFactory.useData[ItemID].Price; Money /= 5; break; case 89: // 其他 Money = ItemFactory.etcData[ItemID].Price; break; default: Log.Error("未知的物品型態:" + ItemID / 100000); break; } if (ItemID == 8880011 || ItemID == 8880021 || ItemID == 8880031 || ItemID == 8880041 || ItemID == 8880051 || ItemID == 8880061 || ItemID == 8880071 || ItemID == 8880081 || ItemID == 8880091 || ItemID == 8880101) { Money = 0; } Item Source = gc.Character.Items.getItem(Type, Slot); if (Source != null) { if (Source.Quantity > Quantity) { if (Quantity <= 0) { return; } gc.Character.Items[(InventoryType.ItemType)Source.Type, Source.Slot].Quantity -= Quantity; } else { if (Quantity > Source.Quantity) { return; } gc.Character.Items.Remove(Type, Slot); } gc.Character.Money += (Money * Quantity); InventoryPacket.getInvenMoney(gc, gc.Character.Money, Money); InventoryHandler.UpdateInventory(gc, Type); } }
public static void TradeEventItem(InPacket lea, Client c) { lea.ReadShort(); // 活動ID ? byte Type = lea.ReadByte(); byte Slot = lea.ReadByte(); int Quantity = lea.ReadInt(); var chr = c.Character; Item Item = null; foreach (Item im in chr.Items.getItems()) { if (im.Type == 4 && im.ItemID == 8990049 && im.Quantity >= Quantity) { Item = im; break; } } if (Item == null && Quantity <= 100) { return; } switch (Quantity) { case 5: chr.Rank += 1; StatusPacket.UpdateFame(c, 1); break; case 8: chr.Rank += 2; StatusPacket.UpdateFame(c, 2); break; case 12: chr.Rank += 3; StatusPacket.UpdateFame(c, 3); break; case 20: chr.Items.Add(new Item(8510071, (byte)InventoryType.ItemType.Equip2, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2))); InventoryHandler.UpdateInventory(c, 2); InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510071); break; case 30: chr.Items.Add(new Item(8510081, (byte)InventoryType.ItemType.Equip2, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2))); InventoryHandler.UpdateInventory(c, 2); InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510081); break; case 40: chr.Items.Add(new Item(8510091, (byte)InventoryType.ItemType.Equip2, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2))); InventoryHandler.UpdateInventory(c, 2); InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510091); break; case 50: chr.Items.Add(new Item(8510101, (byte)InventoryType.ItemType.Equip2, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2))); InventoryHandler.UpdateInventory(c, 2); InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510101); break; case 60: chr.Money += 2000000; InventoryPacket.getInvenMoney(c, chr.Money, 2000000); break; case 100: chr.Money += 4000000; InventoryPacket.getInvenMoney(c, chr.Money, 4000000); break; case 200: chr.Money += 8200000; InventoryPacket.getInvenMoney(c, chr.Money, 8200000); break; case 300: chr.Money += 13000000; InventoryPacket.getInvenMoney(c, chr.Money, 13000000); break; case 500: chr.Money += 24000000; InventoryPacket.getInvenMoney(c, chr.Money, 24000000); break; } if (Quantity > 100) { Item Target1 = null; Item Target2 = null; Item Target3 = null; Item Target4 = null; Item Target5 = null; int i = 0; foreach (Item Target in chr.Items.getItems()) { if (i == 0 && Target.ItemID == 8990049 && Target.Quantity == 100) { Target1 = Target; i++; } else if (i == 1 && Target.ItemID == 8990049 && Target.Quantity == 100) { Target2 = Target; i++; } else if (i == 2 && (Quantity == 300 || Quantity == 500) && Target.ItemID == 8990049 && Target.Quantity == 100) { Target3 = Target; i++; } else if (i == 3 && Quantity == 500 && Target.ItemID == 8990049 && Target.Quantity == 100) { Target4 = Target; i++; } else if (i == 4 && Quantity == 500 && Target.ItemID == 8990049 && Target.Quantity == 100) { Target5 = Target; i++; } else if (i == 5) { break; } } if (Target1 != null) { chr.Items.Remove(Target1.Type, Target1.Slot, 100); } if (Target2 != null) { chr.Items.Remove(Target2.Type, Target2.Slot, 100); } if (Target3 != null) { chr.Items.Remove(Target3.Type, Target3.Slot, 100); } if (Target4 != null) { chr.Items.Remove(Target4.Type, Target4.Slot, 100); } if (Target5 != null) { chr.Items.Remove(Target5.Type, Target5.Slot, 100); } } else { chr.Items.Remove(Type, Slot, Quantity); } InventoryHandler.UpdateInventory(c, Type); }
public static void TradeCancel(InPacket lea, Client c) { var chr = c.Character; int j = 0; // 個人 chr.Money += chr.Trade.Money; // 對方 chr.Trader.Money += chr.Trader.Trade.Money; // 個人 if (chr.Trade.Money > 0) { InventoryPacket.getInvenMoney(c, chr.Money, chr.Trade.Money); } // 對方 if (chr.Trader.Trade.Money > 0) { InventoryPacket.getInvenMoney(chr.Trader.Client, chr.Trader.Money, chr.Trader.Trade.Money); } // 個人 foreach (Item Item in chr.Trade.Item) { Item i = chr.Items.getItem(Item.Type, Item.Slot); if (i != null) { // 合併消費物品、其他物品 if (chr.Trade.SourceQuantity[j] + chr.Trade.TargetQuantity[j] <= 100) { chr.Items.Remove(Item.Type, Item.Slot); chr.Items.Add(new Item(Item.ItemID, chr.Trade.SourceQuantity[j], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Item.Type, Item.Slot)); } else { chr.Items.Add(Item); } } else { chr.Items.Add(Item); } InventoryHandler.UpdateInventory(c, Item.Type); j++; } int k = 0; // 對方 foreach (Item Item in chr.Trader.Trade.Item) { Item i = chr.Trader.Items.getItem(Item.Type, Item.Slot); if (i != null) { // 合併消費物品、其他物品 if (chr.Trader.Trade.SourceQuantity[k] + chr.Trader.Trade.TargetQuantity[k] <= 100) { chr.Trader.Items.Remove(Item.Type, Item.Slot); chr.Trader.Items.Add(new Item(Item.ItemID, chr.Trader.Trade.SourceQuantity[k], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Item.Type, Item.Slot)); } else { chr.Trader.Items.Add(Item); } } else { chr.Trader.Items.Add(Item); } InventoryHandler.UpdateInventory(chr.Trader.Client, Item.Type); k++; } TradePacket.TradeCancel(chr.Trader.Client); chr.Trade = null; chr.Trader = null; }
public static void WarpToMap_Req(InPacket lea, Client gc) { int CharacterID = lea.ReadInt(); short MapX = lea.ReadShort(); short MapY = lea.ReadShort(); short PositionX = lea.ReadShort(); short PositionY = lea.ReadShort(); var chr = gc.Character; chr.MapX = MapX; chr.MapY = MapY; chr.PlayerX = PositionX; chr.PlayerY = PositionY; if (MapX == 77 && MapY == 1) { CashShopPacket.CashShopList1(gc); // 人物 CashShopPacket.CashShopList2(gc); // 裝備 CashShopPacket.CashShopList3(gc); // 能力 CashShopPacket.CashShopList4(gc); // 靈物 CashShopPacket.CashShopList5(gc); // 寶牌 CashShopPacket.CashShopList6(gc); CashShopPacket.CashShopList7(gc); // 紅利積點 CashShopPacket.CashShopList8(gc); CashShopPacket.CashShopList9(gc); CashShopPacket.MgameCash(gc); CashShopPacket.GuiHonCash(gc); // 接收禮物 List <int> Gifts = new List <int>(); foreach (dynamic datum in new Datums("Gifts").Populate()) { if (chr.Name.Equals(datum.name) && datum.receive == 0) { Gifts.Add(datum.itemID); datum.receive = 1; datum.Update("id = '{0}'", datum.id); } } foreach (int ItemID in Gifts) { chr.Items.Add(new Item(ItemID, true, 0, -1, (byte)InventoryType.ItemType.Cash, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Cash))); chr.Items.Save(); } InventoryPacket.getInvenCash(gc); MapPacket.warpToMap(gc, chr, CharacterID, MapX, MapY, PositionX, PositionY); return; } Map Map = MapFactory.GetMap(MapX, MapY); MapPacket.warpToMap(gc, chr, CharacterID, MapX, MapY, PositionX, PositionY); if (Map.GetMapCharactersTotal() > 0) { foreach (Character All in Map.Characters) { MapPacket.warpToMap(All.Client, chr, CharacterID, MapX, MapY, PositionX, PositionY); } MapPacket.createUser(gc, Map); } Map.Characters.Add(chr); //if ((MapX == 1 && MapY == 53) || (MapX == 1 && MapY == 54) || (MapX == 1 && MapY == 55)) // return; //if ((MapX == 10 && MapY == 63) || (MapX == 10 && MapY == 64)) //{ // Monster Monster = new Monster(0, 1020001, 200, 10000, 10000, 0, 0, 1, 0xFF, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1408, 659, true); // Map.Monster.Add(Monster); //} MonsterPacket.createAllMonster(gc, Map, Map.Monster); int j = 0; for (int i = 0; i < 50; i++) { if (Map.Monster[i] != null) { j++; } } //for (int i = 0; i < j; i++) //{ // foreach (Character All in map.Characters) // { // if (map.Monster[i].IsAlive == true) // MonsterPacket.spawnMonster(All.Client, map.Monster[i], 0, 0, 0, 0); // } //} //if (map.GetMapCharactersTotal() < 1) //{ Map.ControlMonster(gc, j); //} //if (chr.IsFuring == true) //{ // foreach (Character All in Map.Characters) // { // StatusPacket.Fury(All.Client, chr, chr.FuringType); // } //} }
public override int Id => 0x19;//25 = 내가방 버튼 public override void Handle(EzClient client, EzPacket packet) { IBuffer showInventoryPacket = InventoryPacket.ShowInventoryPacket(client.Inventory); Send(client, 0x24, showInventoryPacket);//36 = 가방 열림,목록 }
public static void Buy_Req(InPacket lea, Client gc) { lea.ReadInt(); int ItemID = lea.ReadInt(); int Quantity = lea.ReadInt(); int money = 0; switch (ItemID / 100000) { case 75: // 耳環 money = ItemFactory.earringData[ItemID].Price; break; case 79: // 武器 case 80: // 武器 money = ItemFactory.weaponData[ItemID].Price; break; case 81: // 衣服 money = ItemFactory.topData[ItemID].Price; break; case 84: // 披風 money = ItemFactory.capeData[ItemID].Price; break; case 86: // 帽子 money = ItemFactory.hatData[ItemID].Price; break; case 87: // 面具 money = ItemFactory.maskData[ItemID].Price; break; case 93: // 武器 money = ItemFactory.weaponData[ItemID].Price; break; case 94: // 鬍子 money = ItemFactory.beardData[ItemID].Price; break; case 95: // 服裝 money = ItemFactory.clothingData[ItemID].Price; break; case 82: // 戒指 money = ItemFactory.ringData[ItemID].Price; break; case 83: // 項鍊 money = ItemFactory.necklaceData[ItemID].Price; break; case 85: // 封印箱 money = ItemFactory.soulData[ItemID].Price; break; case 11: // 拼圖 money = ItemFactory.jigsawData[ItemID].Price; break; case 88: // 消耗 money = ItemFactory.useData[ItemID].Price; break; case 89: // 其他 money = ItemFactory.etcData[ItemID].Price; break; default: Log.Error("未知的物品型態:" + ItemID / 100000); break; } if (gc.Character.Money >= (money * Quantity)) { byte Type = (byte)InventoryType.getItemType(ItemID); if (ItemID >= 8880011 && ItemID <= 8880101) // 飛鏢 { Quantity *= 100; } Item finditem = null; foreach (Item it in gc.Character.Items) { if (it.ItemID == ItemID) { finditem = it; } } if (((Type == (byte)InventoryType.ItemType.Spend3) || (Type == (byte)InventoryType.ItemType.Other4)) && (finditem != null)) { // 合併消費物品跟其他物品 if ((finditem.Quantity + Quantity) > 100) { int newqu = Quantity - (100 - finditem.Quantity); gc.Character.Items[(InventoryType.ItemType)finditem.Type, finditem.Slot].Quantity = (short)100; byte Slot = gc.Character.Items.GetNextFreeSlot((InventoryType.ItemType)Type); Item oItem = new Item(ItemID, Type, Slot, (short)newqu); gc.Character.Items.Add(oItem); } else { gc.Character.Items[(InventoryType.ItemType)finditem.Type, finditem.Slot].Quantity += (short)Quantity; } } else { byte Slot = gc.Character.Items.GetNextFreeSlot((InventoryType.ItemType)Type); Item oItem = new Item(ItemID, Type, Slot, (short)Quantity); gc.Character.Items.Add(oItem); } gc.Character.Money -= (money * Quantity); InventoryPacket.getInvenMoney(gc, gc.Character.Money, -(money * Quantity)); InventoryHandler.UpdateInventory(gc, Type); } }
public static void MoveItem_Req(InPacket lea, Client gc) { byte SourceType = lea.ReadByte(); byte SourceSlot = lea.ReadByte(); byte TargetType = lea.ReadByte(); byte TargetSlot = lea.ReadByte(); int Quantity = lea.ReadInt(); Item Source = gc.Character.Items.getItem(SourceType, SourceSlot); Item Target = gc.Character.Items.getItem(TargetType, TargetSlot); var chr = gc.Character; if (SourceType != (byte)InventoryType.ItemType.Pet5 && Source.IsLocked == 1 && TargetType == (byte)InventoryType.ItemType.Equip) { Source.IsLocked = 0; } if (TargetType == 0x63 && TargetSlot == 0x63) { if (SourceType == 0xFF && SourceSlot == 0xFF) { return; } Map Map = MapFactory.GetMap(chr.MapX, chr.MapY); foreach (Character All in Map.Characters) { InventoryPacket.CharDropItem(All.Client, Map.ObjectID, Source.ItemID, chr.PlayerX, (short)(chr.PlayerY - 50), Quantity == 0 ? 1 : Quantity); } Map.Item.Add(Map.ObjectID, new Drop(Map.ObjectID, Source.ItemID, Quantity == 0 ? (short)1 : (short)Quantity)); Map.ObjectID++; chr.Items.Remove(SourceType, SourceSlot, Quantity == 0 ? 1 : Quantity); } else { if (chr.Items.getItem(TargetType, TargetSlot) == null) { if (SourceType != 5 && TargetType != 5) { // 普通物品 Source.Type = TargetType; Source.Slot = TargetSlot; if (TargetType == (byte)InventoryType.ItemType.Equip || SourceType == (byte)InventoryType.ItemType.Equip) { UpdateCharacterInventoryStatus(gc, Source, SourceType > 0); } } else { // 寵物 Pet Src = chr.Pets.Pet(SourceType, SourceSlot); Pet Tar = chr.Pets.Pet(TargetType, TargetSlot); if (SourceType == 5) { chr.UseSlot[(byte)InventoryType.ItemType.Pet5] = Src.Slot; } else if (TargetType == 5) { chr.UseSlot[(byte)InventoryType.ItemType.Pet5] = 0xFF; } if (chr.Pets.Pet(TargetType, TargetSlot) == null) { Src.Type = TargetType; Src.Slot = TargetSlot; } else { // 交換位置(swap) chr.Pets.Remove(SourceType, SourceSlot); chr.Pets.Remove(TargetType, TargetSlot); // 類型 byte swapType = Src.Type; Src.Type = Tar.Type; Tar.Type = swapType; // 欄位 byte swapSlot = Src.Slot; Src.Slot = Tar.Slot; Tar.Slot = swapSlot; // chr.Pets.Add(Src); chr.Pets.Add(Tar); } } } else { if ((SourceType == TargetType) && ((TargetType == (byte)InventoryType.ItemType.Spend3) || (TargetType == (byte)InventoryType.ItemType.Other4)) && (Source.ItemID == Target.ItemID)) { // 合併消費物品跟其他物品 if (chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity + Source.Quantity > 100) { short newqu = (short)(Source.Quantity - (100 - chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity)); chr.Items[(InventoryType.ItemType)Source.Type, Source.Slot].Quantity = newqu; chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity = 100; } else { chr.Items.Remove(SourceType, SourceSlot); chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity += Source.Quantity; } } else { // 交換位置(swap) chr.Items.Remove(SourceType, SourceSlot); chr.Items.Remove(TargetType, TargetSlot); // 類型 byte swapType = Source.Type; Source.Type = Target.Type; Target.Type = swapType; // 欄位 byte swapSlot = Source.Slot; Source.Slot = Target.Slot; Target.Slot = swapSlot; // chr.Items.Add(Source); chr.Items.Add(Target); } if (SourceType == (byte)InventoryType.ItemType.Equip && TargetType == (byte)InventoryType.ItemType.Equip1) { UpdateCharacterInventoryStatus(gc, Source, false); UpdateCharacterInventoryStatus(gc, Target, true); } else if (SourceType == (byte)InventoryType.ItemType.Equip || TargetType == (byte)InventoryType.ItemType.Equip) { UpdateCharacterInventoryStatus(gc, Target, false); UpdateCharacterInventoryStatus(gc, Source, true); } } } UpdateInventory(gc, SourceType, TargetType); }
public static void TradeConfirm(InPacket lea, Client c) { var chr = c.Character; int j = 0; int k = 0; int m = 0; int l = 0; try { // 交易成功 // Item // 個人接收 foreach (Item Item in chr.Trader.Trade.Item) { byte Type = Item.Type; byte Slot = chr.Items.GetNextFreeSlot((InventoryType.ItemType)Type); chr.Items.Add(new Item(Item.ItemID, chr.Trader.Trade.TargetQuantity[m], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Type, Slot)); InventoryHandler.UpdateInventory(c, Item.Type); m++; } // 對方接收 foreach (Item Item in chr.Trade.Item) { byte Type = Item.Type; byte Slot = chr.Trader.Items.GetNextFreeSlot((InventoryType.ItemType)Type); chr.Trader.Items.Add(new Item(Item.ItemID, chr.Trade.TargetQuantity[l], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Type, Slot)); InventoryHandler.UpdateInventory(chr.Trader.Client, Item.Type); l++; } // Money // 個人 chr.Money += chr.Trader.Trade.Money; // 對方 chr.Trader.Money += chr.Trade.Money; // 個人 if (chr.Trader.Trade.Money > 0) { InventoryPacket.getInvenMoney(c, chr.Money, chr.Trader.Trade.Money); } // 對方 if (chr.Trade.Money > 0) { InventoryPacket.getInvenMoney(chr.Trader.Client, chr.Trader.Money, chr.Trade.Money); } } catch { // 交易失敗 // Item // 個人 foreach (Item Item in chr.Trade.Item) { Item i = chr.Items.getItem(Item.Type, Item.Slot); if (i != null) { // 合併消費物品、其他物品 if (chr.Trade.SourceQuantity[j] + chr.Trade.TargetQuantity[j] <= 100) { chr.Items.Remove(Item.Type, Item.Slot); chr.Items.Add(new Item(Item.ItemID, chr.Trade.SourceQuantity[j], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Item.Type, Item.Slot)); } else { chr.Items.Add(Item); } } else { chr.Items.Add(Item); } InventoryHandler.UpdateInventory(c, Item.Type); j++; } // 對方 foreach (Item Item in chr.Trader.Trade.Item) { Item i = chr.Trader.Items.getItem(Item.Type, Item.Slot); if (i != null) { // 合併消費物品、其他物品 if (chr.Trader.Trade.SourceQuantity[k] + chr.Trader.Trade.TargetQuantity[k] <= 100) { chr.Trader.Items.Remove(Item.Type, Item.Slot); chr.Trader.Items.Add(new Item(Item.ItemID, chr.Trader.Trade.SourceQuantity[k], Item.Spirit, Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Item.Type, Item.Slot)); } else { chr.Trader.Items.Add(Item); } } else { chr.Trader.Items.Add(Item); } InventoryHandler.UpdateInventory(chr.Trader.Client, Item.Type); k++; } // Money // 個人 chr.Money += chr.Trade.Money; // 對方 chr.Trader.Money += chr.Trader.Trade.Money; // 個人 if (chr.Trade.Money > 0) { InventoryPacket.getInvenMoney(c, chr.Money, chr.Trade.Money); } // 對方 if (chr.Trader.Trade.Money > 0) { InventoryPacket.getInvenMoney(chr.Trader.Client, chr.Trader.Money, chr.Trader.Trade.Money); } TradePacket.TradeFail(c); TradePacket.TradeFail(chr.Trader.Client); return; } TradePacket.TradeSuccessful(c); TradePacket.TradeSuccessful(chr.Trader.Client); }
public static void Game_Log_Req(InPacket lea, Client gc) { //int re = SearchBytes(lea.Content, new byte[] { 0x0 }); string[] data = lea.ReadString(0x100 /*re*/).Split(new[] { (char)0x20 }, StringSplitOptions.None); int encryptKey = int.Parse(data[1]); string username = data[2]; string password = data[4]; int selectCharacter = lea.ReadByte(); IPAddress hostid = lea.ReadIPAddress(); gc.SetAccount(new Account(gc)); try { gc.Account.Load(username); //var pe = new PasswordEncrypt(encryptKey); //string encryptPassword = pe.encrypt(gc.Account.Password, gc.RetryLoginCount > 0 ? password.ToCharArray() : null); if (password.Equals(gc.Account.Password)) { gc.Dispose(); Log.Error("Login Fail!"); } else { gc.Account.Characters = new List <Character>(); foreach (dynamic datum in new Datums("Characters").PopulateWith("id", "accountId = '{0}' ORDER BY position ASC", gc.Account.ID)) { Character character = new Character(datum.id, gc); character.Load(false); character.IP = hostid; gc.Account.Characters.Add(character); } gc.SetCharacter(gc.Account.Characters[selectCharacter]); } Log.Inform("Password = {0}", password); //Log.Inform("encryptKey = {0}", encryptKey); //Log.Inform("encryptPassword = {0}", encryptPassword); } catch (NoAccountException) { gc.Dispose(); Log.Error("Login Fail!"); } Character chr = gc.Character; chr.CharacterID = gc.CharacterID; MapFactory.AllCharacters.Add(chr); StatusPacket.UpdateHpMp(gc, 0, 0, 0, 0); GamePacket.FW_DISCOUNTFACTION(gc); StatusPacket.getStatusInfo(gc); InventoryPacket.getCharacterEquip(gc); SkillPacket.getSkillInfo(gc, chr.Skills.getSkills()); QuestPacket.getQuestInfo(gc, chr.Quests.getQuests()); GamePacket.getQuickSlot(gc, chr.Keymap); StoragePacket.getStoreInfo(gc); StoragePacket.getStoreMoney(gc); MapPacket.enterMapStart(gc); InventoryPacket.getInvenCash(gc); CashShopPacket.MgameCash(gc); CashShopPacket.GuiHonCash(gc); InventoryPacket.getInvenEquip(gc); InventoryPacket.getInvenEquip1(gc); InventoryPacket.getInvenEquip2(gc); InventoryPacket.getInvenSpend3(gc); InventoryPacket.getInvenOther4(gc); InventoryPacket.getInvenPet5(gc); }