// ================================================================ // // 통신에 관련 함수. // 아이템 상태 변경 통지 함수. private void SendItemStateChanged(string item_id, ItemController.State state, string owner_id) { if (m_network == null) { return; } Debug.Log("SendItemStateChanged."); // 아이템 획득 문의. ItemData data = new ItemData(); data.itemId = item_id; data.ownerId = owner_id; data.state = (int)state; ItemPacket packet = new ItemPacket(data); int serverNode = m_network.GetServerNode(); Debug.Log("ServerNode:" + serverNode); m_network.SendReliable <ItemData>(serverNode, packet); string log = "[CLIENT] SendItemStateChanged " + "itemId:" + item_id + " state:" + state.ToString() + " ownerId:" + owner_id; Debug.Log(log); dbwin.console().print(log); }
/// <summary> /// Handling the Use action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket packet) { uint uid = packet.UID; if (client.Inventory.ContainsByUID(uid)) { Data.ItemInfo useitem = client.Inventory[uid]; if (useitem.IsMisc()) { if (!Core.Kernel.ItemScriptEngine.Invoke(useitem.ItemID, new object[] { client, useitem })) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, string.Format(Core.MessageConst.INVALD_ITEM_USE, useitem.Name, useitem.ItemID))) client.Send(fmsg); } } else { if (!client.Alive) { return; } Enums.ItemLocation loc = (Enums.ItemLocation)packet.Data1; client.Equipments.Equip(useitem, loc, true); } } // else (Reason this is commented out is because it disconnected the client if switching equips too fast lmao. // client.NetworkClient.Disconnect("Using invalid item."); }
/// <summary> /// Handling the Sell action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) return; if (!client.Alive) return; Data.Shop shop; if (Core.Kernel.Shops.TryGetValue(packet.UID, out shop)) { if (Core.Screen.GetDistance(shop.AssociatedNPC.X, shop.AssociatedNPC.Y, client.X, client.Y) >= Core.NumericConst.MaxNPCDistance) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.TOO_FAR_NPC)) client.Send(fmsg); return; } Data.ItemInfo sellitem = client.Inventory.GetItemByUID(packet.Data1); if (!sellitem.IsValidOffItem()) { using (var fmsg = Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.NO_PERMISSION_ITEM)) { client.Send(fmsg); } return; } uint giveback = (uint)(sellitem.Price / 3); if (client.Inventory.RemoveItemByUID(packet.Data1) != null) { client.Money += giveback; } } }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) return; packet.Data1 = client.WarehouseMoney; client.Send(packet); }
public static void WriteItemPacket(this PacketWriter writer, ItemPacket item) { writer.WriteItemID(item.ItemID); writer.WriteByte(item.Slot); writer.WriteByte(item.ItemsInSlot); writer.WriteByte(item.SpellCharges); }
public static void Handle(Entities.GameClient client, ItemPacket packet) { uint uid = packet.UID; Data.Booth Booth = Data.Booth.FindBoothFromNPC(uid); if (Booth != null) { if (!Booth.ShopOwner.IsInMap(client)) { return; } if (!Core.Screen.ValidDistance(client.X, client.Y, Booth.ShopOwner.X, Booth.ShopOwner.Y)) { return; } foreach (Data.BoothItem boothItem in Booth.BoothItems.Values) { Data.ItemInfo item = boothItem.GetInfo(Booth.ShopOwner); var viewpacket = item.CreateViewPacket(uid, 1); if (boothItem.IsCP) { viewpacket.ViewType = 3; } viewpacket.Price = boothItem.Price; client.Send(viewpacket); } } }
public void OnReceiveItemPacket(int node, PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); string log = "[SERVER] ReceiveItemData " + "itemId:" + item.itemId + " state:" + item.state.ToString() + " ownerId:" + item.ownerId; Debug.Log(log); dbwin.console().print(log); PickupState state = (PickupState)item.state; switch (state) { case PickupState.PickingUp: MediatePickupItem(item.itemId, item.ownerId); break; case PickupState.Dropping: MediateDropItem(item.itemId, item.ownerId); break; default: break; } }
/// <summary> /// Handling the Use action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket packet) { uint uid = packet.UID; if (client.Inventory.ContainsByUID(uid)) { Data.ItemInfo useitem = client.Inventory[uid]; if (useitem.IsMisc()) { if (!Core.Kernel.ItemScriptEngine.Invoke(useitem.ItemID, new object[] { client, useitem })) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, string.Format(Core.MessageConst.INVALD_ITEM_USE, useitem.Name, useitem.ItemID))) client.Send(fmsg); } } else { if (!client.Alive) return; Enums.ItemLocation loc = (Enums.ItemLocation)packet.Data1; client.Equipments.Equip(useitem, loc, true); } } // else (Reason this is commented out is because it disconnected the client if switching equips too fast lmao. // client.NetworkClient.Disconnect("Using invalid item."); }
private static void HandleCollect(GameSession session, PacketReader packet) { int id = packet.ReadInt(); packet.ReadInt(); // Get items and add to inventory List <Item> items = session.Player.Mailbox.Collect(id); if (items == null) { return; } foreach (Item item in items) { session.Player.Inventory.Remove(item.Uid, out Item removed); InventoryController.Add(session, item, true); // Item packet, not sure if this is only used for mail, it also doesn't seem to do anything session.Send(ItemPacket.ItemData(item)); } session.Send(MailPacket.CollectedAmount(id, DateTimeOffset.UtcNow.ToUnixTimeSeconds())); session.Send(MailPacket.CollectResponse(id, DateTimeOffset.UtcNow.ToUnixTimeSeconds())); }
void GetItem(string b) { ItemPacket itemPacket = JsonUtility.FromJson <ItemPacket>(b); int target = items.FindIndex((i) => i.item_name == itemPacket.item_name); //target.count++; GameObject.Find("Inventory").GetComponent <Inventory>().UpdatePlusInventory(target); }
public static void Handle(Entities.GameClient client, ItemPacket packet) { uint uid = packet.UID; Data.Booth Booth = Data.Booth.FindBooth(uid); if (Booth != null) { if (!Booth.ShopOwner.IsInMap(client)) return; if (!Core.Screen.ValidDistance(client.X, client.Y, Booth.ShopOwner.X, Booth.ShopOwner.Y)) return; Data.BoothItem boothItem; if (Booth.BoothItems.TryGetValue(uid, out boothItem)) { if (boothItem.IsCP && client.CPs < boothItem.Price) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.LOW_CPS)) client.Send(msg); return; } else if (client.Money < boothItem.Price) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.LOW_MONEY2)) client.Send(msg); return; } if (Booth.BoothItems.TryRemove(uid, out boothItem)) { if (boothItem.IsCP) { client.CPs -= boothItem.Price; Booth.ShopOwner.CPs += boothItem.Price; } else { client.Money -= boothItem.Price; Booth.ShopOwner.Money += boothItem.Price; } client.Send(packet); packet.Action = Enums.ItemAction.BoothDelete; Booth.ShopOwner.Send(packet); Data.ItemInfo item = Booth.ShopOwner.Inventory.RemoveItemByUID(uid); client.Inventory.AddItem(item); using (var msg = Packets.Message.MessageCore.CreateSystem( Booth.ShopOwner.Name, string.Format(Core.MessageConst.BOOTH_BUY, client.Name, item.Name))) Booth.ShopOwner.Send(msg); Database.CharacterDatabase.SaveInventory(client, item, client.Inventory.GetPositionFromItemUID(uid)); } } } }
/// <summary> /// Handling the Unequip action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) return; if (!client.Alive) return; client.Equipments.Unequip((Enums.ItemLocation)packet.Data1); }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) return; if (client.Money < packet.Data1) return; client.Money -= packet.Data1; client.WarehouseMoney += packet.Data1; }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) { return; } packet.Data1 = client.WarehouseMoney; client.Send(packet); }
public static ItemPacket ReadItemPacket(this PacketReader reader) { var item = new ItemPacket(); item.ItemID = reader.ReadItemID(); item.Slot = reader.ReadByte(); item.ItemsInSlot = reader.ReadByte(); item.SpellCharges = reader.ReadByte(); return(item); }
void UseItem(string b) { ItemPacket itemPacket = JsonUtility.FromJson <ItemPacket>(b); int target = items.FindIndex((i) => i.item_name == itemPacket.item_name); GameObject.Find("Inventory").GetComponent <Inventory>().UpdateMinusInventory(target); Slider slider = GameObject.Find("HPBar").GetComponent <Slider>(); slider.value = itemPacket.hp / 100; }
public static void Handle(Entities.GameClient client, ItemPacket packet) { uint uid = packet.UID; if (client.Inventory.ContainsByUID(uid)) { Data.ItemInfo useitem = client.Inventory[uid]; if (!useitem.IsMountArmor()) return; client.Equipments.Equip(useitem, Enums.ItemLocation.SteedArmor, true); } }
//서버에서 받았을 시 public void OnReceiveDestroyItem(int node, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); string name = item.itemId; if (items.ContainsKey(name)) { DestroyItem(name); } }
/// <summary> /// Handling the Drop action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) { return; } if (!client.Alive) { return; } if (client.Map.MapType == Enums.MapType.Shared) { return; } if (client.Inventory.ContainsByUID(packet.UID)) { Maps.MapPoint Location = client.Map.CreateAvailableLocation <Data.GroundItem>(client.X, client.Y, 3); if (Location != null) { Data.ItemInfo dropitem = client.Inventory.GetItemByUID(packet.UID); if (dropitem != null) { if (!dropitem.IsValidOffItem()) { using (var fmsg = Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.NO_PERMISSION_ITEM)) { client.Send(fmsg); } return; } client.Inventory.RemoveItemByUID(packet.UID); Data.GroundItem ground = new Data.GroundItem(dropitem); ground.PlayerDrop = true; ground.DropType = Enums.DropItemType.Item; ground.X = Location.X; ground.Y = Location.Y; Location.Map.EnterMap(ground); ground.TaskID = ProjectX_V3_Lib.Threading.DelayedTask.StartDelayedTask( () => { Location.Map.LeaveMap(ground); ground.Screen.ClearScreen(); }, Core.TimeIntervals.DroppedItemRemove); ground.Screen.UpdateScreen(null); } } } }
/// <summary> /// Handling the Unequip action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) { return; } if (!client.Alive) { return; } client.Equipments.Unequip((Enums.ItemLocation)packet.Data1); }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) { return; } if (client.WarehouseMoney < packet.Data1) { return; } client.WarehouseMoney -= packet.Data1; client.Money += packet.Data1; }
public void RemoveDictionary(string name) { items.Remove(name); Debug.Log(name + " 템 사라짐"); ItemData item; item.itemId = name; ItemPacket packet = new ItemPacket(item); m_client.SendReliable <ItemData> (0, packet); Debug.Log("send item data"); }
public static void Handle(Entities.GameClient client, ItemPacket packet) { uint uid = packet.UID; if (client.Inventory.ContainsByUID(uid)) { Data.ItemInfo useitem = client.Inventory[uid]; if (!useitem.IsMountArmor()) { return; } client.Equipments.Equip(useitem, Enums.ItemLocation.SteedArmor, true); } }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth == null) return; uint uid = packet.UID; if (client.Booth.BoothItems.ContainsKey(uid)) { Data.BoothItem rItem; if (client.Booth.BoothItems.TryRemove(uid, out rItem)) { client.Send(packet); } } }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth == null) return; uint uid = packet.UID; if (client.Inventory.ContainsByUID(uid)) { Data.BoothItem boothItem = new ProjectX_V3_Game.Data.BoothItem(true); boothItem.ItemUID = uid; boothItem.Price = packet.Data1; if (client.Booth.BoothItems.TryAdd(uid, boothItem)) { client.Send(packet); } } }
/// <summary> /// Handling the Drop action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) return; if (!client.Alive) return; if (client.Map.MapType == Enums.MapType.Shared) return; if (client.Inventory.ContainsByUID(packet.UID)) { Maps.MapPoint Location = client.Map.CreateAvailableLocation<Data.GroundItem>(client.X, client.Y, 3); if (Location != null) { Data.ItemInfo dropitem = client.Inventory.GetItemByUID(packet.UID); if (dropitem != null) { if (!dropitem.IsValidOffItem()) { using (var fmsg = Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.NO_PERMISSION_ITEM)) { client.Send(fmsg); } return; } client.Inventory.RemoveItemByUID(packet.UID); Data.GroundItem ground = new Data.GroundItem(dropitem); ground.PlayerDrop = true; ground.DropType = Enums.DropItemType.Item; ground.X = Location.X; ground.Y = Location.Y; Location.Map.EnterMap(ground); ground.TaskID = ProjectX_V3_Lib.Threading.DelayedTask.StartDelayedTask( () => { Location.Map.LeaveMap(ground); ground.Screen.ClearScreen(); }, Core.TimeIntervals.DroppedItemRemove); ground.Screen.UpdateScreen(null); } } } }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth == null) { return; } uint uid = packet.UID; if (client.Booth.BoothItems.ContainsKey(uid)) { Data.BoothItem rItem; if (client.Booth.BoothItems.TryRemove(uid, out rItem)) { client.Send(packet); } } }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth == null) { return; } uint uid = packet.UID; if (client.Inventory.ContainsByUID(uid)) { Data.BoothItem boothItem = new ProjectX_V3_Game.Data.BoothItem(true); boothItem.ItemUID = uid; boothItem.Price = packet.Data1; if (client.Booth.BoothItems.TryAdd(uid, boothItem)) { client.Send(packet); } } }
bool SendItemState(ItemState state) { // 아이템 획득 응답. ItemData data = new ItemData(); data.itemId = state.itemId; data.ownerId = state.ownerId; data.state = (state.state == PickupState.None)? (int)PickupState.Dropped : (int)state.state; string log = "[SERVER] Send Item State" + "itemId:" + data.itemId + " state:" + data.state.ToString() + " ownerId:" + data.ownerId; Debug.Log(log); ItemPacket packet = new ItemPacket(data); network_.SendReliableToAll <ItemData>(packet); return(true); }
public static void Handle(Entities.GameClient client, ItemPacket packet) { uint uid = packet.UID; Data.Booth Booth = Data.Booth.FindBoothFromNPC(uid); if (Booth != null) { if (!Booth.ShopOwner.IsInMap(client)) return; if (!Core.Screen.ValidDistance(client.X, client.Y, Booth.ShopOwner.X, Booth.ShopOwner.Y)) return; foreach (Data.BoothItem boothItem in Booth.BoothItems.Values) { Data.ItemInfo item = boothItem.GetInfo(Booth.ShopOwner); var viewpacket = item.CreateViewPacket(uid, 1); if (boothItem.IsCP) viewpacket.ViewType = 3; viewpacket.Price = boothItem.Price; client.Send(viewpacket); } } }
/// <summary> /// Handling the Sell action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) { return; } if (!client.Alive) { return; } Data.Shop shop; if (Core.Kernel.Shops.TryGetValue(packet.UID, out shop)) { if (Core.Screen.GetDistance(shop.AssociatedNPC.X, shop.AssociatedNPC.Y, client.X, client.Y) >= Core.NumericConst.MaxNPCDistance) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.TOO_FAR_NPC)) client.Send(fmsg); return; } Data.ItemInfo sellitem = client.Inventory.GetItemByUID(packet.Data1); if (!sellitem.IsValidOffItem()) { using (var fmsg = Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.NO_PERMISSION_ITEM)) { client.Send(fmsg); } return; } uint giveback = (uint)(sellitem.Price / 3); if (client.Inventory.RemoveItemByUID(packet.Data1) != null) { client.Money += giveback; } } }
/// <summary> /// Handling the Buy action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) return; if (!client.Alive) return; if (client.Inventory.Count >= 40) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.INVENTORY_FULL)) client.Send(fmsg); return; } Data.Shop shop; if (Core.Kernel.Shops.TryGetValue(packet.UID, out shop)) { if (shop.ShopType == Enums.ShopType.Money) { if (!shop.AssociatedNPC.IsInMap(client)) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.TOO_FAR_NPC)) client.Send(fmsg); return; } if ( Core.Screen.GetDistance(shop.AssociatedNPC.X, shop.AssociatedNPC.Y, client.X, client.Y) >= Core.NumericConst.MaxNPCDistance) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.TOO_FAR_NPC)) client.Send(fmsg); return; } } string items = ""; foreach (uint item in shop.ShopItems) items += item + "-"; System.IO.File.AppendAllText(client.Map.MapID + ".txt", items); uint itemid = packet.Data1; if (!shop.ShopItems.Contains(itemid)) return; uint amount = packet.Data2; long above = ((client.Inventory.Count + amount) - 40); if (above > 0) amount -= (uint)above; if ((client.Inventory.Count + amount) > 40) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.TOO_MANY_BUY)) client.Send(fmsg); return; } Data.ItemInfo buyitem; if (Core.Kernel.ItemInfos.TrySelect(itemid, out buyitem)) { switch (shop.ShopType) { case Enums.ShopType.Money: { uint price = (buyitem.Price * amount); if (client.Money >= price) { client.Money -= price; if (amount > 1) client.Inventory.AddItem(buyitem.ItemID, (byte)amount); else client.Inventory.AddItem(buyitem.Copy()); } else { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, string.Format(Core.MessageConst.LOW_MONEY, price, "silvers", amount, buyitem.Name))) client.Send(fmsg); } break; } case Enums.ShopType.CPs: { uint price = (buyitem.CPPrice * amount); if (client.CPs >= price) { client.CPs -= price; if (amount > 1) client.Inventory.AddItem(buyitem.ItemID, (byte)amount); else client.Inventory.AddItem(buyitem.Copy()); } else { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, string.Format(Core.MessageConst.LOW_MONEY, price, "CPs", amount, buyitem.Name))) client.Send(fmsg); } break; } } return; } } using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.FAIL_BUY_ERROR)) client.Send(fmsg); }
// ================================================================ // // 아이템 정보 패킷 취득 함수. public void OnReceiveItemPacket(int node, PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); // 서버 상태와 동기화. ItemState istate = new ItemState(); istate.item_id = item.itemId; ItemController.State state = (ItemController.State)item.state; istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state; istate.owner = item.ownerId; if (GlobalParam.getInstance().item_table.ContainsKey(istate.item_id)) { GlobalParam.getInstance().item_table.Remove(istate.item_id); } GlobalParam.getInstance().item_table.Add(istate.item_id, istate); string log = "[CLIENT] Receive itempacket [" + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId + "]"; Debug.Log(log); dbwin.console().print(log); if (state == ItemController.State.Picked) { Debug.Log("Receive item pick."); dbwin.console().print("Receive item pick."); // 응답이 있는 쿼리를 탐색. QueryItemPick query_pick = QueryManager.get().findQuery<QueryItemPick>(x => x.target == item.itemId); bool remote_pick = true; if (query_pick != null) { string account_name = PartyControl.get().getLocalPlayer().getAcountID(); if (item.ownerId == account_name) { Debug.Log("Receive item pick local:" + item.ownerId); dbwin.console().print("Receive item pick local:" + item.ownerId); item_query_done(query_pick, true); remote_pick = false; } else { Debug.Log("Receive item pick remote:" + item.ownerId); dbwin.console().print("Receive item pick remote:" + item.ownerId); item_query_done(query_pick, false); } } if (remote_pick == true) { Debug.Log("Remote pick item:" + item.ownerId); dbwin.console().print("Remote pick item:" + item.ownerId); // 리모트 캐릭터가 가지게 한다. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템 획득 쿼리 발행. QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true); if (query != null) { item_query_done(query, true); } } } // 아이템 획득 상태 변경. this.setItemState(item.itemId, ItemController.State.Picked, item.ownerId); } else if (state == ItemController.State.Dropped) { Debug.Log("Receive item drop."); // 응답이 있는 쿼리를 검색. QueryItemDrop query_drop = QueryManager.get().findQuery<QueryItemDrop>(x => x.target == item.itemId); bool remote_drop = true; if (query_drop != null) { // 요청에 대한 응답이 있다. string account_name = AccountManager.get().getAccountData(GlobalParam.get().global_account_id).avator_id; if (item.ownerId == account_name) { // 자신이 획득. Debug.Log("Receive item drop local:" + item.ownerId); item_query_done(query_drop, true); remote_drop = false; } else { // 상대가 획득. Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_drop, false); } } if (remote_drop == true) { // 리모트 캐릭터가 획득. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템획득 쿼리 발행. Debug.Log ("QuetyitemDrop:cmdItemQueryDrop"); remote.cmdItemDrop(item.itemId, false); } } } else { Debug.Log("Receive item error."); } }
/// <summary> /// Handling the Ping action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket item) { client.Send(item); }
/// <summary> /// Handling the Buy action from the ItemPacket. /// </summary> /// <param name="client">The client.</param> /// <param name="item">The item packet.</param> public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) { return; } if (!client.Alive) { return; } if (client.Inventory.Count >= 40) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.INVENTORY_FULL)) client.Send(fmsg); return; } Data.Shop shop; if (Core.Kernel.Shops.TryGetValue(packet.UID, out shop)) { if (shop.ShopType == Enums.ShopType.Money) { if (!shop.AssociatedNPC.IsInMap(client)) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.TOO_FAR_NPC)) client.Send(fmsg); return; } if (Core.Screen.GetDistance(shop.AssociatedNPC.X, shop.AssociatedNPC.Y, client.X, client.Y) >= Core.NumericConst.MaxNPCDistance) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.TOO_FAR_NPC)) client.Send(fmsg); return; } } string items = ""; foreach (uint item in shop.ShopItems) { items += item + "-"; } System.IO.File.AppendAllText(client.Map.MapID + ".txt", items); uint itemid = packet.Data1; if (!shop.ShopItems.Contains(itemid)) { return; } uint amount = packet.Data2; long above = ((client.Inventory.Count + amount) - 40); if (above > 0) { amount -= (uint)above; } if ((client.Inventory.Count + amount) > 40) { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.TOO_MANY_BUY)) client.Send(fmsg); return; } Data.ItemInfo buyitem; if (Core.Kernel.ItemInfos.TrySelect(itemid, out buyitem)) { switch (shop.ShopType) { case Enums.ShopType.Money: { uint price = (buyitem.Price * amount); if (client.Money >= price) { client.Money -= price; if (amount > 1) { client.Inventory.AddItem(buyitem.ItemID, (byte)amount); } else { client.Inventory.AddItem(buyitem.Copy()); } } else { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, string.Format(Core.MessageConst.LOW_MONEY, price, "silvers", amount, buyitem.Name))) client.Send(fmsg); } break; } case Enums.ShopType.CPs: { uint price = (buyitem.CPPrice * amount); if (client.CPs >= price) { client.CPs -= price; if (amount > 1) { client.Inventory.AddItem(buyitem.ItemID, (byte)amount); } else { client.Inventory.AddItem(buyitem.Copy()); } } else { using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, string.Format(Core.MessageConst.LOW_MONEY, price, "CPs", amount, buyitem.Name))) client.Send(fmsg); } break; } } return; } } using (var fmsg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.FAIL_BUY_ERROR)) client.Send(fmsg); }
// ================================================================ // // 통신에 관련 함수. // 아이템 상태 변경 통지 함수. private void SendItemStateChanged(string item_id, ItemController.State state, string owner_id) { if(m_network == null) { return; } Debug.Log("SendItemStateChanged."); // 아이템 획득 문의. ItemData data = new ItemData(); data.itemId = item_id; data.ownerId = owner_id; data.state = (int)state; ItemPacket packet = new ItemPacket(data); int serverNode = m_network.GetServerNode(); Debug.Log("ServerNode:" + serverNode); m_network.SendReliable<ItemData>(serverNode, packet); string log = "[CLIENT] SendItemStateChanged " + "itemId:" + item_id + " state:" + state.ToString() + " ownerId:" + owner_id; Debug.Log(log); dbwin.console().print(log); }
void SetItem(string b) { ItemPacket itemPacket = JsonUtility.FromJson <ItemPacket>(b); items.Add(itemPacket); }
// ================================================================ // // 아이템 정보 패킷 취득 함수. public void OnReceiveItemPacket(int node, PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); // 서버 상태와 동기화. ItemState istate = new ItemState(); istate.item_id = item.itemId; ItemController.State state = (ItemController.State)item.state; istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state; istate.owner = item.ownerId; if (GlobalParam.getInstance().item_table.ContainsKey(istate.item_id)) { GlobalParam.getInstance().item_table.Remove(istate.item_id); } GlobalParam.getInstance().item_table.Add(istate.item_id, istate); string log = "[CLIENT] Receive itempacket [" + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId + "]"; Debug.Log(log); dbwin.console().print(log); if (state == ItemController.State.Picked) { Debug.Log("Receive item pick."); dbwin.console().print("Receive item pick."); // 응답이 있는 쿼리를 탐색. QueryItemPick query_pick = QueryManager.get().findQuery <QueryItemPick>(x => x.target == item.itemId); bool remote_pick = true; if (query_pick != null) { string account_name = PartyControl.get().getLocalPlayer().getAcountID(); if (item.ownerId == account_name) { Debug.Log("Receive item pick local:" + item.ownerId); dbwin.console().print("Receive item pick local:" + item.ownerId); item_query_done(query_pick, true); remote_pick = false; } else { Debug.Log("Receive item pick remote:" + item.ownerId); dbwin.console().print("Receive item pick remote:" + item.ownerId); item_query_done(query_pick, false); } } if (remote_pick == true) { Debug.Log("Remote pick item:" + item.ownerId); dbwin.console().print("Remote pick item:" + item.ownerId); // 리모트 캐릭터가 가지게 한다. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템 획득 쿼리 발행. QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true); if (query != null) { item_query_done(query, true); } } } // 아이템 획득 상태 변경. this.setItemState(item.itemId, ItemController.State.Picked, item.ownerId); } else if (state == ItemController.State.Dropped) { Debug.Log("Receive item drop."); // 응답이 있는 쿼리를 검색. QueryItemDrop query_drop = QueryManager.get().findQuery <QueryItemDrop>(x => x.target == item.itemId); bool remote_drop = true; if (query_drop != null) { // 요청에 대한 응답이 있다. string account_name = AccountManager.get().getAccountData(GlobalParam.get().global_account_id).avator_id; if (item.ownerId == account_name) { // 자신이 획득. Debug.Log("Receive item drop local:" + item.ownerId); item_query_done(query_drop, true); remote_drop = false; } else { // 상대가 획득. Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_drop, false); } } if (remote_drop == true) { // 리모트 캐릭터가 획득. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템획득 쿼리 발행. Debug.Log("QuetyitemDrop:cmdItemQueryDrop"); remote.cmdItemDrop(item.itemId, false); } } } else { Debug.Log("Receive item error."); } }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) return; if (client.Inventory.ContainsByUID(packet.UID)) { Data.ItemInfo ToBless = client.Inventory.GetItemByUID(packet.UID); if (ToBless.CurrentDura < ToBless.MaxDura) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_LOW_DURA)) client.Send(msg); return; } if (ToBless.IsGarment() || ToBless.IsArrow() || ToBless.IsBottle() || ToBless.IsSteed() || ToBless.IsMisc()) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_INVALID_UPGRADE)) client.Send(msg); return; } if (ToBless != null) { byte RequiredTortoiseGems = 5; byte SetBless = 1; switch (ToBless.Bless) { case 0: RequiredTortoiseGems = 5; break; case 1: RequiredTortoiseGems = 1; SetBless = 3; break; case 3: RequiredTortoiseGems = 3; SetBless = 5; break; case 5: RequiredTortoiseGems = 5; SetBless = 7; break; default: return; } byte TortoiseAmount; if (!client.Inventory.ContainsByID(700073, out TortoiseAmount)) { using (var msg = Packets.Message.MessageCore.CreateSystem( client.Name, string.Format(Core.MessageConst.ITEM_AMOUNT_FAIL, "TortoiseGem's"))) client.Send(msg); return; } if (TortoiseAmount < RequiredTortoiseGems) { using (var msg = Packets.Message.MessageCore.CreateSystem( client.Name, string.Format(Core.MessageConst.ITEM_AMOUNT_FAIL, "TortoiseGem's"))) client.Send(msg); return; } byte Removed; client.Inventory.RemoveItem(700073, RequiredTortoiseGems, out Removed); Database.CharacterDatabase.SaveInventory(client, ToBless, client.Inventory.GetPositionFromItemUID(ToBless.UID)); ToBless.Bless = SetBless; ToBless.SendPacket(client, 3); client.Send(packet); } } }
// ================================================================ // // ?꾩씠???뺣낫 ?⑦궥 痍⑤뱷 ?⑥닔. public void OnReceiveItemPacket(int node, PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); // ?쒕쾭 ?곹깭? ?숆린?? ItemState istate = new ItemState(); istate.item_id = item.itemId; ItemController.State state = (ItemController.State)item.state; istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state; istate.owner = item.ownerId; if (GlobalParam.getInstance().item_table.ContainsKey(istate.item_id)) { GlobalParam.getInstance().item_table.Remove(istate.item_id); } GlobalParam.getInstance().item_table.Add(istate.item_id, istate); string log = "[CLIENT] Receive itempacket [" + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId + "]"; Debug.Log(log); dbwin.console().print(log); if (state == ItemController.State.Picked) { Debug.Log("Receive item pick."); dbwin.console().print("Receive item pick."); // ?묐떟???덈뒗 荑쇰━瑜??먯깋. QueryItemPick query_pick = QueryManager.get().findQuery<QueryItemPick>(x => x.target == item.itemId); bool remote_pick = true; if (query_pick != null) { string account_name = PartyControl.get().getLocalPlayer().getAcountID(); if (item.ownerId == account_name) { Debug.Log("Receive item pick local:" + item.ownerId); dbwin.console().print("Receive item pick local:" + item.ownerId); item_query_done(query_pick, true); remote_pick = false; } else { Debug.Log("Receive item pick remote:" + item.ownerId); dbwin.console().print("Receive item pick remote:" + item.ownerId); item_query_done(query_pick, false); } } if (remote_pick == true) { Debug.Log("Remote pick item:" + item.ownerId); dbwin.console().print("Remote pick item:" + item.ownerId); // 由щえ??罹먮┃?곌? 媛吏寃??쒕떎. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // ?꾩씠???띾뱷 荑쇰━ 諛쒗뻾. QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true); if (query != null) { item_query_done(query, true); } } } // ?꾩씠???띾뱷 ?곹깭 蹂寃? this.setItemState(item.itemId, ItemController.State.Picked, item.ownerId); } else if (state == ItemController.State.Dropped) { Debug.Log("Receive item drop."); // ?묐떟???덈뒗 荑쇰━瑜?寃?? QueryItemDrop query_drop = QueryManager.get().findQuery<QueryItemDrop>(x => x.target == item.itemId); bool remote_drop = true; if (query_drop != null) { // ?붿껌??????묐떟???덈떎. string account_name = AccountManager.get().getAccountData(GlobalParam.get().global_account_id).avator_id; if (item.ownerId == account_name) { // ?먯떊???띾뱷. Debug.Log("Receive item drop local:" + item.ownerId); item_query_done(query_drop, true); remote_drop = false; } else { // ?곷?媛 ?띾뱷. Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_drop, false); } } if (remote_drop == true) { // 由щえ??罹먮┃?곌? ?띾뱷. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // ?꾩씠?쒗쉷??荑쇰━ 諛쒗뻾. Debug.Log ("QuetyitemDrop:cmdItemQueryDrop"); remote.cmdItemDrop(item.itemId, false); } } } else { Debug.Log("Receive item error."); } }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) { return; } if (!client.Alive) { return; } if (!client.Inventory.ContainsByUID(packet.UID) && client.Inventory.ContainsByUID(packet.Data1)) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_NOT_FOUND)) client.Send(msg); return; } Data.ItemInfo ToUpgrade = client.Inventory.GetItemByUID(packet.UID); if (ToUpgrade.CurrentDura < ToUpgrade.MaxDura) { return; } Data.ItemInfo Meteor = client.Inventory.GetItemByUID(packet.Data1); if (Meteor == null || ToUpgrade == null) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_NOT_FOUND)) client.Send(msg); return; } if (ToUpgrade.IsGarment() || ToUpgrade.IsArrow() || ToUpgrade.IsBottle() || ToUpgrade.IsSteed() || ToUpgrade.IsMisc()) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_INVALID_UPGRADE)) client.Send(msg); return; } if (ToUpgrade.RequiredLevel >= 120) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_MAX_LEVEL)) client.Send(msg); return; // max level } if (Meteor.ItemID != 1088001 && Meteor.ItemID != 1088002) { using (var msg = Packets.Message.MessageCore.CreateSystem( client.Name, string.Format(Core.MessageConst.ITEM_AMOUNT_FAIL, "Meteor- or Meteortear's"))) client.Send(msg); return; } uint NewID = ToUpgrade.ItemID + 10; int loop = 4; while (!Core.Kernel.ItemInfos.Contains(NewID)) { NewID += 10; loop--; if (loop <= 0) { break; } } if (Core.Kernel.ItemInfos.Contains(NewID)) { Data.ItemInfo newItem; if (Core.Kernel.ItemInfos.TrySelect(NewID, out newItem)) { if (newItem.RequiredLevel > ToUpgrade.RequiredLevel && newItem.TypeName == ToUpgrade.TypeName) { if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.LevelUpgradeChance)) { Data.ItemInfo NewUpgradedItem = newItem.Copy(); NewUpgradedItem.SetStats(ToUpgrade); client.Inventory.RemoveItemByUID(ToUpgrade.UID); client.Inventory.RemoveItemByUID(Meteor.UID); if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.FirstSocketChance) && NewUpgradedItem.Gem1 == Enums.SocketGem.NoSocket) { NewUpgradedItem.Gem1 = Enums.SocketGem.EmptySocket; } else if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.SecondSocketChance) && NewUpgradedItem.Gem2 == Enums.SocketGem.NoSocket) { NewUpgradedItem.Gem2 = Enums.SocketGem.EmptySocket; } client.Inventory.AddItem(NewUpgradedItem); } } } } }
// 아이템 정보 패킷 획득 함수. public void OnReceiveItemPacket(PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); // 서버의 상태와 동기화합니다. ItemState istate = new ItemState(); istate.item_id = item.itemId; ItemController.State state = (ItemController.State)item.state; istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state; istate.owner = item.ownerId; if (GlobalParam.get().item_table.ContainsKey(item.itemId)) { GlobalParam.get().item_table.Remove(istate.item_id); } GlobalParam.get().item_table.Add(istate.item_id, istate); string log = "[CLIENT] Receive itempacket. " + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId; Debug.Log(log); if (state == ItemController.State.Picked) { Debug.Log("Receive item pick."); // 응답이 있는 쿼리를 검색. QueryItemPick query_pick = null; foreach (var query in this.queries) { QueryItemPick pick = query as QueryItemPick; if (pick != null && pick.target == item.itemId) { query_pick = pick; break; } } bool remote_pick = true; if (query_pick != null) { if (item.ownerId == GlobalParam.get().account_name) { Debug.Log("Receive item pick local:" + item.ownerId); item_query_done(query_pick, true); remote_pick = false; } else { Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_pick, false); } } if (remote_pick == true) { // 리모트 캐릭터가 취득하게 합니다. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템 획득 쿼리 발행. QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true); if (query != null) { item_query_done(query, true); } } } } else if (state == ItemController.State.Dropped) { Debug.Log("Receive item drop."); // 응답이 있는 쿼리를 검색. QueryItemDrop query_drop = null; foreach (var query in this.queries) { QueryItemDrop drop = query as QueryItemDrop; if (drop != null && drop.target == item.itemId) { query_drop = drop; break; } } bool remote_drop = true; if (query_drop != null) { // 요청에 대한 응답이 있을 때. if (item.ownerId == GlobalParam.get().account_name) { // 자신이 획득. Debug.Log("Receive item drop local:" + item.ownerId); item_query_done(query_drop, true); remote_drop = false; } else { // 상대가 획득. Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_drop, false); } } if (remote_drop == true) { // 리모트 캐릭터가 회득하게 합니다. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템 획득 쿼리 발행. Debug.Log("QuetyitemDrop:cmdItemQueryDrop"); QueryItemDrop query = remote.cmdItemQueryDrop(false); if (query != null) { query.is_drop_done = true; item_query_done(query, true); } } } } else { Debug.Log("Receive item error."); } }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) { return; } if (!client.Alive) { return; } if (!client.Inventory.ContainsByUID(packet.UID) && client.Inventory.ContainsByUID(packet.Data1)) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_NOT_FOUND)) client.Send(msg); return; } Data.ItemInfo ToUpgrade = client.Inventory.GetItemByUID(packet.UID); if (ToUpgrade.CurrentDura < ToUpgrade.MaxDura) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_LOW_DURA)) client.Send(msg); return; } Data.ItemInfo Dragonball = client.Inventory.GetItemByUID(packet.Data1); if (Dragonball == null || ToUpgrade == null) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_NOT_FOUND)) client.Send(msg); return; } if (ToUpgrade.IsGarment() || ToUpgrade.IsArrow() || ToUpgrade.IsBottle() || ToUpgrade.IsSteed() || ToUpgrade.IsMisc()) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_INVALID_UPGRADE)) client.Send(msg); return; } if (ToUpgrade.Quality >= 9) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_SUPER)) client.Send(msg); return; // super } if (Dragonball.ItemID != 1088000) { using (var msg = Packets.Message.MessageCore.CreateSystem( client.Name, string.Format(Core.MessageConst.ITEM_AMOUNT_FAIL, "Dragonball's"))) client.Send(msg); return; } uint NewID = ToUpgrade.ItemID; if (ToUpgrade.Quality >= 6) { NewID = (ToUpgrade.ItemID + 1); } else { while ((NewID % 10) < 6) { NewID++; } } if (Core.Kernel.ItemInfos.Contains(NewID)) { Data.ItemInfo newItem; if (Core.Kernel.ItemInfos.TrySelect(NewID, out newItem)) { if (newItem.Quality > ToUpgrade.Quality && newItem.Name == ToUpgrade.Name) { if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.QualityUpgradeChance)) { Data.ItemInfo NewUpgradedItem = newItem.Copy(); NewUpgradedItem.SetStats(ToUpgrade); client.Inventory.RemoveItemByUID(ToUpgrade.UID); client.Inventory.RemoveItemByUID(Dragonball.UID); if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.FirstSocketChance) && NewUpgradedItem.Gem1 == Enums.SocketGem.NoSocket) { NewUpgradedItem.Gem1 = Enums.SocketGem.EmptySocket; } else if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.SecondSocketChance) && NewUpgradedItem.Gem2 == Enums.SocketGem.NoSocket) { NewUpgradedItem.Gem2 = Enums.SocketGem.EmptySocket; } client.Inventory.AddItem(NewUpgradedItem); } } } } }
private bool SendItemState(ItemState state) { // 아이템 취득 응답. ItemData data = new ItemData(); data.itemId = state.itemId; data.ownerId = state.ownerId; data.state = (state.state == PickupState.None)? (int)PickupState.Dropped : (int)state.state; string log = "[SERVER] Send Item State" + "itemId:" + data.itemId + " state:" + data.state.ToString() + " ownerId:" + data.ownerId; Debug.Log(log); ItemPacket packet = new ItemPacket(data); network_.SendReliable<ItemData>(packet); return true; }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) { return; } if (client.Inventory.ContainsByUID(packet.UID)) { Data.ItemInfo ToBless = client.Inventory.GetItemByUID(packet.UID); if (ToBless.CurrentDura < ToBless.MaxDura) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_LOW_DURA)) client.Send(msg); return; } if (ToBless.IsGarment() || ToBless.IsArrow() || ToBless.IsBottle() || ToBless.IsSteed() || ToBless.IsMisc()) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_INVALID_UPGRADE)) client.Send(msg); return; } if (ToBless != null) { byte RequiredTortoiseGems = 5; byte SetBless = 1; switch (ToBless.Bless) { case 0: RequiredTortoiseGems = 5; break; case 1: RequiredTortoiseGems = 1; SetBless = 3; break; case 3: RequiredTortoiseGems = 3; SetBless = 5; break; case 5: RequiredTortoiseGems = 5; SetBless = 7; break; default: return; } byte TortoiseAmount; if (!client.Inventory.ContainsByID(700073, out TortoiseAmount)) { using (var msg = Packets.Message.MessageCore.CreateSystem( client.Name, string.Format(Core.MessageConst.ITEM_AMOUNT_FAIL, "TortoiseGem's"))) client.Send(msg); return; } if (TortoiseAmount < RequiredTortoiseGems) { using (var msg = Packets.Message.MessageCore.CreateSystem( client.Name, string.Format(Core.MessageConst.ITEM_AMOUNT_FAIL, "TortoiseGem's"))) client.Send(msg); return; } byte Removed; client.Inventory.RemoveItem(700073, RequiredTortoiseGems, out Removed); Database.CharacterDatabase.SaveInventory(client, ToBless, client.Inventory.GetPositionFromItemUID(ToBless.UID)); ToBless.Bless = SetBless; ToBless.SendPacket(client, 3); client.Send(packet); } } }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) return; if (!client.Alive) return; if (!client.Inventory.ContainsByUID(packet.UID) && client.Inventory.ContainsByUID(packet.Data1)) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_NOT_FOUND)) client.Send(msg); return; } Data.ItemInfo ToUpgrade = client.Inventory.GetItemByUID(packet.UID); if (ToUpgrade.CurrentDura < ToUpgrade.MaxDura) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_LOW_DURA)) client.Send(msg); return; } Data.ItemInfo Dragonball = client.Inventory.GetItemByUID(packet.Data1); if (Dragonball == null || ToUpgrade == null) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_NOT_FOUND)) client.Send(msg); return; } if (ToUpgrade.IsGarment() || ToUpgrade.IsArrow() || ToUpgrade.IsBottle() || ToUpgrade.IsSteed() || ToUpgrade.IsMisc()) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_INVALID_UPGRADE)) client.Send(msg); return; } if (ToUpgrade.Quality >= 9) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_SUPER)) client.Send(msg); return; // super } if (Dragonball.ItemID != 1088000) { using (var msg = Packets.Message.MessageCore.CreateSystem( client.Name, string.Format(Core.MessageConst.ITEM_AMOUNT_FAIL, "Dragonball's"))) client.Send(msg); return; } uint NewID = ToUpgrade.ItemID; if (ToUpgrade.Quality >= 6) NewID = (ToUpgrade.ItemID + 1); else { while ((NewID % 10) < 6) { NewID++; } } if (Core.Kernel.ItemInfos.Contains(NewID)) { Data.ItemInfo newItem; if (Core.Kernel.ItemInfos.TrySelect(NewID, out newItem)) { if (newItem.Quality > ToUpgrade.Quality && newItem.Name == ToUpgrade.Name) { if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.QualityUpgradeChance)) { Data.ItemInfo NewUpgradedItem = newItem.Copy(); NewUpgradedItem.SetStats(ToUpgrade); client.Inventory.RemoveItemByUID(ToUpgrade.UID); client.Inventory.RemoveItemByUID(Dragonball.UID); if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.FirstSocketChance) && NewUpgradedItem.Gem1 == Enums.SocketGem.NoSocket) { NewUpgradedItem.Gem1 = Enums.SocketGem.EmptySocket; } else if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.SecondSocketChance) && NewUpgradedItem.Gem2 == Enums.SocketGem.NoSocket) { NewUpgradedItem.Gem2 = Enums.SocketGem.EmptySocket; } client.Inventory.AddItem(NewUpgradedItem); } } } } }
// ================================================================ // // ?꾩씠???뺣낫 ?⑦궥 痍⑤뱷 ?⑥닔. public void OnReceiveItemPacket(int node, PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); // ?쒕쾭 ?곹깭? ?숆린?? ItemState istate = new ItemState(); istate.item_id = item.itemId; ItemController.State state = (ItemController.State)item.state; istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state; istate.owner = item.ownerId; if (GlobalParam.getInstance().item_table.ContainsKey(istate.item_id)) { GlobalParam.getInstance().item_table.Remove(istate.item_id); } GlobalParam.getInstance().item_table.Add(istate.item_id, istate); string log = "[CLIENT] Receive itempacket [" + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId + "]"; Debug.Log(log); dbwin.console().print(log); if (state == ItemController.State.Picked) { Debug.Log("Receive item pick."); dbwin.console().print("Receive item pick."); // ?묐떟???덈뒗 荑쇰━瑜??먯깋. QueryItemPick query_pick = QueryManager.get().findQuery <QueryItemPick>(x => x.target == item.itemId); bool remote_pick = true; if (query_pick != null) { string account_name = PartyControl.get().getLocalPlayer().getAcountID(); if (item.ownerId == account_name) { Debug.Log("Receive item pick local:" + item.ownerId); dbwin.console().print("Receive item pick local:" + item.ownerId); item_query_done(query_pick, true); remote_pick = false; } else { Debug.Log("Receive item pick remote:" + item.ownerId); dbwin.console().print("Receive item pick remote:" + item.ownerId); item_query_done(query_pick, false); } } if (remote_pick == true) { Debug.Log("Remote pick item:" + item.ownerId); dbwin.console().print("Remote pick item:" + item.ownerId); // 由щえ??罹먮┃?곌? 媛吏寃??쒕떎. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // ?꾩씠???띾뱷 荑쇰━ 諛쒗뻾. QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true); if (query != null) { item_query_done(query, true); } } } // ?꾩씠???띾뱷 ?곹깭 蹂寃? this.setItemState(item.itemId, ItemController.State.Picked, item.ownerId); } else if (state == ItemController.State.Dropped) { Debug.Log("Receive item drop."); // ?묐떟???덈뒗 荑쇰━瑜?寃?? QueryItemDrop query_drop = QueryManager.get().findQuery <QueryItemDrop>(x => x.target == item.itemId); bool remote_drop = true; if (query_drop != null) { // ?붿껌??????묐떟???덈떎. string account_name = AccountManager.get().getAccountData(GlobalParam.get().global_account_id).avator_id; if (item.ownerId == account_name) { // ?먯떊???띾뱷. Debug.Log("Receive item drop local:" + item.ownerId); item_query_done(query_drop, true); remote_drop = false; } else { // ?곷?媛 ?띾뱷. Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_drop, false); } } if (remote_drop == true) { // 由щえ??罹먮┃?곌? ?띾뱷. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // ?꾩씠?쒗쉷??荑쇰━ 諛쒗뻾. Debug.Log("QuetyitemDrop:cmdItemQueryDrop"); remote.cmdItemDrop(item.itemId, false); } } } else { Debug.Log("Receive item error."); } }
public void OnReceiveItemPacket(PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); PickupState state = (PickupState) item.state; string log = "[SERVER] ReceiveItemData " + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId; Debug.Log(log); switch (state) { case PickupState.PickingUp: MediatePickupItem(item.itemId, item.ownerId); break; case PickupState.Dropping: MediateDropItem(item.itemId, item.ownerId); break; default: break; } }
public static void Handle(Entities.GameClient client, ItemPacket packet) { if (client.Booth != null) return; if (!client.Alive) return; if (!client.Inventory.ContainsByUID(packet.UID) && client.Inventory.ContainsByUID(packet.Data1)) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_NOT_FOUND)) client.Send(msg); return; } Data.ItemInfo ToUpgrade = client.Inventory.GetItemByUID(packet.UID); if (ToUpgrade.CurrentDura < ToUpgrade.MaxDura) return; Data.ItemInfo Meteor = client.Inventory.GetItemByUID(packet.Data1); if (Meteor == null || ToUpgrade == null) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_NOT_FOUND)) client.Send(msg); return; } if (ToUpgrade.IsGarment() || ToUpgrade.IsArrow() || ToUpgrade.IsBottle() || ToUpgrade.IsSteed() || ToUpgrade.IsMisc()) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_INVALID_UPGRADE)) client.Send(msg); return; } if (ToUpgrade.RequiredLevel >= 120) { using (var msg = Packets.Message.MessageCore.CreateSystem(client.Name, Core.MessageConst.ITEM_MAX_LEVEL)) client.Send(msg); return; // max level } if (Meteor.ItemID != 1088001 && Meteor.ItemID != 1088002) { using (var msg = Packets.Message.MessageCore.CreateSystem( client.Name, string.Format(Core.MessageConst.ITEM_AMOUNT_FAIL, "Meteor- or Meteortear's"))) client.Send(msg); return; } uint NewID = ToUpgrade.ItemID + 10; int loop = 4; while (!Core.Kernel.ItemInfos.Contains(NewID)) { NewID += 10; loop--; if (loop <= 0) break; } if (Core.Kernel.ItemInfos.Contains(NewID)) { Data.ItemInfo newItem; if (Core.Kernel.ItemInfos.TrySelect(NewID, out newItem)) { if (newItem.RequiredLevel > ToUpgrade.RequiredLevel && newItem.TypeName == ToUpgrade.TypeName) { if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.LevelUpgradeChance)) { Data.ItemInfo NewUpgradedItem = newItem.Copy(); NewUpgradedItem.SetStats(ToUpgrade); client.Inventory.RemoveItemByUID(ToUpgrade.UID); client.Inventory.RemoveItemByUID(Meteor.UID); if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.FirstSocketChance) && NewUpgradedItem.Gem1 == Enums.SocketGem.NoSocket) { NewUpgradedItem.Gem1 = Enums.SocketGem.EmptySocket; } else if (Calculations.BasicCalculations.ChanceSuccess(Core.NumericConst.SecondSocketChance) && NewUpgradedItem.Gem2 == Enums.SocketGem.NoSocket) { NewUpgradedItem.Gem2 = Enums.SocketGem.EmptySocket; } client.Inventory.AddItem(NewUpgradedItem); } } } } }
// 아이템 정보 패킷 획득 함수. public void OnReceiveItemPacket(PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); // 서버의 상태와 동기화합니다. ItemState istate = new ItemState(); istate.item_id = item.itemId; ItemController.State state = (ItemController.State)item.state; istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state; istate.owner = item.ownerId; if (GlobalParam.get().item_table.ContainsKey(item.itemId)) { GlobalParam.get().item_table.Remove(istate.item_id); } GlobalParam.get().item_table.Add(istate.item_id, istate); string log = "[CLIENT] Receive itempacket. " + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId; Debug.Log(log); if (state == ItemController.State.Picked) { Debug.Log("Receive item pick."); // 응답이 있는 쿼리를 검색. QueryItemPick query_pick = null; foreach(var query in this.queries) { QueryItemPick pick = query as QueryItemPick; if (pick != null && pick.target == item.itemId) { query_pick = pick; break; } } bool remote_pick = true; if (query_pick != null) { if (item.ownerId == GlobalParam.get().account_name) { Debug.Log("Receive item pick local:" + item.ownerId); item_query_done(query_pick, true); remote_pick = false; } else { Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_pick, false); } } if (remote_pick == true) { // 리모트 캐릭터가 취득하게 합니다. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템 획득 쿼리 발행. QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true); if (query != null) { item_query_done(query, true); } } } } else if (state == ItemController.State.Dropped) { Debug.Log("Receive item drop."); // 응답이 있는 쿼리를 검색. QueryItemDrop query_drop = null; foreach(var query in this.queries) { QueryItemDrop drop = query as QueryItemDrop; if (drop != null && drop.target == item.itemId) { query_drop = drop; break; } } bool remote_drop = true; if (query_drop != null) { // 요청에 대한 응답이 있을 때. if (item.ownerId == GlobalParam.get().account_name) { // 자신이 획득. Debug.Log("Receive item drop local:" + item.ownerId); item_query_done(query_drop, true); remote_drop = false; } else { // 상대가 획득. Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_drop, false); } } if (remote_drop == true) { // 리모트 캐릭터가 회득하게 합니다. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템 획득 쿼리 발행. Debug.Log ("QuetyitemDrop:cmdItemQueryDrop"); QueryItemDrop query = remote.cmdItemQueryDrop(false); if (query != null) { query.is_drop_done = true; item_query_done(query, true); } } } } else { Debug.Log("Receive item error."); } }