public void Move(NecServer server, NecClient client) { InventoryItem fromInvItem = client.Character.GetInventoryItem(fromStoreType, fromBagId, fromSlot); InventoryItem toInvItem = client.Character.GetInventoryItem(toStoreType, toBagId, toSlot); if (toInvItem != null && (fromInvItem.StorageCount + toInvItem.StorageCount > 255)) { RecvNormalSystemMessage unlikeItems = new RecvNormalSystemMessage("The move would place too many items in destination slot!"); server.Router.Send(unlikeItems, client); return; } if (fromInvItem.StorageCount == itemCount) { if (toInvItem != null) { toInvItem.StorageCount = (byte)(fromInvItem.StorageCount + toInvItem.StorageCount); // huh??? byte - byte is cast as int???? RecvItemUpdateNum itemNum = new RecvItemUpdateNum(toInvItem.InstanceId, toInvItem.StorageCount); server.Router.Send(itemNum, client); RecvItemRemove removeItem = new RecvItemRemove(fromInvItem.InstanceId); server.Router.Send(removeItem, client); client.Character.RemoveInventoryItem(fromInvItem); client.Character.UpdateInventoryItem(toInvItem); } else { fromInvItem.StorageType = toStoreType; fromInvItem.StorageId = toBagId; fromInvItem.StorageSlot = toSlot; RecvItemUpdatePlace itemPlace = new RecvItemUpdatePlace(fromInvItem.InstanceId, fromInvItem.StorageType, fromInvItem.StorageId, fromInvItem.StorageSlot); server.Router.Send(itemPlace, client); client.Character.UpdateInventoryItem(fromInvItem); } } else { byte remainCount = (byte)(fromInvItem.StorageCount - itemCount); // huh??? byte - byte is cast as int???? if (toInvItem != null) { toInvItem.StorageCount = (byte)(itemCount + toInvItem.StorageCount); // huh??? byte - byte is cast as int???? fromInvItem.StorageCount = remainCount; RecvItemUpdateNum toItemNum = new RecvItemUpdateNum(toInvItem.InstanceId, toInvItem.StorageCount); server.Router.Send(toItemNum, client); RecvItemUpdateNum fromItemNum = new RecvItemUpdateNum(fromInvItem.InstanceId, fromInvItem.StorageCount); server.Router.Send(fromItemNum, client); client.Character.RemoveInventoryItem(fromInvItem); client.Character.UpdateInventoryItem(toInvItem); } else { RecvItemUpdateNum updateNum = new RecvItemUpdateNum(fromInvItem.InstanceId, remainCount); server.Router.Send(updateNum, client); InventoryItem newInvItem = client.Character.GetNextInventoryItem(server); newInvItem.StorageCount = (byte)itemCount; newInvItem.StorageType = toStoreType; newInvItem.StorageId = toBagId; newInvItem.StorageSlot = toSlot; newInvItem.StorageItem = item; RecvItemInstanceUnidentified itemUnidentified = new RecvItemInstanceUnidentified(newInvItem); server.Router.Send(itemUnidentified, client); fromInvItem.StorageCount = remainCount; client.Character.UpdateInventoryItem(fromInvItem); } } }
public Item SendItemInstance(NecClient client, int itemId, int itemType, string name) { IBuffer res = BufferProvider.Provide(); //Item item = _server.Instances64.CreateInstance<Item>(); invItem = client.Character.GetNextInventoryItem(_server); if (invItem == null) { res = BufferProvider.Provide(); res.WriteInt32(-207); Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area); RecvNormalSystemMessage noSpace = new RecvNormalSystemMessage("Inventory is full!!!!"); _server.Router.Send(noSpace, client); return(null); } Item item = invItem.StorageItem = _server.Instances64.CreateInstance <Item>(); Logger.Debug($"invItem.StorageId [{invItem.StorageId}] invItem.StorageSlot [{invItem.StorageSlot}]"); item.Id = itemId; item.IconType = itemType; item.Name = name; invItem.StorageType = 0; invItem.StorageCount = (byte)1; //ulong instanceId = invItem.InstanceId << 32 | 0xffffffff; Logger.Debug($"instanceId [{invItem.InstanceId}]"); //res.WriteInt32(instanceId); //InstanceId // res.WriteInt32(10200101); //ItemID res.WriteUInt64(invItem.InstanceId); //ItemID res.WriteInt32(invItem.StorageItem.IconType); // 0 does not display icon res.WriteByte((byte)1); //Number of "items" res.WriteInt32(0); //Item status, in multiples of numbers, 8 = blessed/cursed/both res.WriteFixedString(name + " ", 0x10); res.WriteByte(invItem.StorageType); // 0 = adventure bag. 1 = character equipment res.WriteByte(invItem.StorageId); // 0~2 // maybe.. more bag index? res.WriteInt16(invItem.StorageSlot); // bag index res.WriteInt32(0); //Slot spots? 10200101 here caused certain spots to have an item, -1 for all slots(avatar included) /13 res.WriteInt32(invItem.StorageItem .Id); //Percentage stat, 9 max i think /12 res.WriteByte(36); //1 res.WriteByte(37); // Dest slot res.WriteCString( name); // find max size //11 10 byte fixed string res.WriteInt16(38); //10 res.WriteInt16(39); //9 res.WriteInt32( 32); //Divides max % by this number //8 res.WriteByte(40); //7 res.WriteInt32(33); //6 int numEntries = 0; res.WriteInt32(numEntries); // less than or equal to 2 for (int i = 0; i < numEntries; i++) { res.WriteInt32(34 + i); } //res.WriteInt32(0); numEntries = 0; res.WriteInt32(numEntries); // less than or equal to 3 for (int i = 0; i < numEntries; i++) { res.WriteByte(0); //bool res.WriteInt32(0); res.WriteInt32(0); res.WriteInt32(0); } res.WriteInt32(34); //4 res.WriteInt32(35); //5 res.WriteInt16(41); res.WriteInt32( 43); //Guard protection toggle, 1 = on, everything else is off //3 res.WriteInt16(42); //2 Router.Send(client, (ushort)AreaPacketId.recv_item_instance, res, ServerType.Area); //ConfigureItem(client, item.InstanceId); //client.Character.inventoryItems.Add(invItem); return(invItem.StorageItem); }
public Item SendItemInstanceUnidentified(NecClient client, int itemId, int count, int itemType, string name) { IBuffer res = null; invItem = client.Character.GetNextInventoryItem(_server); if (invItem == null) { res = BufferProvider.Provide(); res.WriteInt32(-207); Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area); RecvNormalSystemMessage noSpace = new RecvNormalSystemMessage("Inventory is full!!!!"); _server.Router.Send(noSpace, client); return(null); } Item item = invItem.StorageItem = _server.Instances64.CreateInstance <Item>(); Logger.Debug($"invItem.StorageId [{invItem.StorageId}] invItem.StorageSlot [{invItem.StorageSlot}]"); item.Id = itemId; item.IconType = itemType; item.Name = name; invItem.StorageType = 0; invItem.StorageCount = (byte)count; res = null; res = BufferProvider.Provide(); //res.WriteInt64(dropItem.Item.Id); //Item Object Instance ID res.WriteUInt64(invItem.InstanceId); //Item Object Instance ID res.WriteCString(name); //Name //res.WriteInt32(dropItem.Item.IconType); res.WriteInt32(item.IconType); //item type res.WriteInt32(1); res.WriteByte(invItem.StorageCount); //Number of items res.WriteInt32(0); //Item status 0 = identified res.WriteInt32(item.Id); //Item icon 50100301 = camp res.WriteByte(1); res.WriteByte(1); res.WriteByte(1); res.WriteInt32(1); res.WriteByte(1); res.WriteByte(1); res.WriteByte(1); res.WriteByte(1); res.WriteByte(1); res.WriteByte(1); // bool res.WriteByte(1); res.WriteByte(1); res.WriteByte(1); res.WriteByte(1); res.WriteByte(0); res.WriteByte(invItem.StorageType); // 0 = adventure bag. 1 = character equipment res.WriteByte(invItem.StorageId); // 0~2 res.WriteInt16(invItem.StorageSlot); // bag index res.WriteInt32(0); //bit mask. This indicates where to put items. e.g. 01 head 010 arm 0100 feet etc (0 for not equipped) res.WriteInt64(0); res.WriteInt32(0); Router.Send(client, (ushort)AreaPacketId.recv_item_instance_unidentified, res, ServerType.Area); ConfigureItem(client, invItem.InstanceId); //client.Character.inventoryItems.Add(invItem); //client.Character.EquipId[0] = 10200101; //RecvDataNotifyCharaData myCharacterData = new RecvDataNotifyCharaData(client.Character, client.Soul.Name,false); //Router.Send(myCharacterData, client); //UpdateEqMask(client); return(item); }
public override void Handle(NecClient client, NecPacket packet) { int instanceID = packet.Data.ReadInt32(); Logger.Debug($"{client.Character.Name} is {client.Character.Alignmentid}"); IBuffer res = null; //res2.WriteInt32(instanceID); //Router.Send(client, (ushort) AreaPacketId.recv_loot_access_object_r, res2, ServerType.Area); res = BufferProvider.Provide(); res.WriteInt32(instanceID); Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area); MonsterSpawn monster = client.Map.GetMonsterByInstanceId((uint)instanceID); DropTables dropTable = new DropTables(_server); DropItem dropItem = dropTable.GetLoot(monster.MonsterId); if (dropItem == null) { return; } InventoryItem invItem = client.Character.GetNextInventoryItem(_server, (byte)dropItem.NumItems, dropItem.Item); if (invItem == null) { res = BufferProvider.Provide(); res.WriteInt32(-207); Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area); RecvNormalSystemMessage noSpace = new RecvNormalSystemMessage("Inventory is full!!!!"); _server.Router.Send(noSpace, client); return; } string lootMsg = $"Looted {dropItem.NumItems} {dropItem.Item.Name} from {monster.Name}."; Logger.Debug($"Loot is {dropItem.NumItems} of {dropItem.Item.Id}"); if (dropItem.Item.Id == 1) { client.Character.AdventureBagGold += dropItem.NumItems; RecvSelfMoneyNotify addMoney = new RecvSelfMoneyNotify(client.Character.AdventureBagGold); Router.Send(addMoney, client); } else { res = null; res = BufferProvider.Provide(); //res.WriteInt64(dropItem.Item.Id); //Item Object Instance ID res.WriteUInt64(dropItem.Item.InstanceId); //Item Object Instance ID res.WriteCString(dropItem.Item.Name); //Name //res.WriteInt32(dropItem.Item.IconType); res.WriteInt32(dropItem.Item.IconType); //item type res.WriteInt32(0); res.WriteByte((byte)dropItem.NumItems); //Number of items res.WriteInt32(0); //Item status 0 = identified res.WriteInt32(dropItem.Item.Id); //Item icon 50100301 = camp res.WriteByte(0); res.WriteByte(0); res.WriteByte(0); res.WriteInt32(0); res.WriteByte(0); res.WriteByte(0); res.WriteByte(0); res.WriteByte(0); res.WriteByte(0); res.WriteByte(1); // bool res.WriteByte(0); res.WriteByte(0); res.WriteByte(0); res.WriteByte(0); res.WriteByte(0); res.WriteByte(invItem.StorageType); // 0 = adventure bag. 1 = character equipment res.WriteByte(invItem.StorageId); // 0~2 res.WriteInt16(invItem.StorageSlot); // bag index res.WriteInt32( 0); //bit mask. This indicates where to put items. e.g. 01 head 010 arm 0100 feet etc (0 for not equipped) res.WriteInt64(0); res.WriteInt32(0); Router.Send(client, (ushort)AreaPacketId.recv_item_instance_unidentified, res, ServerType.Area); } RecvMonsterStateUpdateNotify monsterState = new RecvMonsterStateUpdateNotify((uint)instanceID, 1); Router.Send(client.Map, monsterState); if (dropItem.Item.Id != 1) { //RecvPartyNotifyGetItem itemMsg = new RecvPartyNotifyGetItem(dropItem.Item.Id, dropItem.Item.Name, (byte)dropItem.NumItems); RecvPartyNotifyAddDrawItem itemMsg = new RecvPartyNotifyAddDrawItem(dropItem.Item.InstanceId, 30.0F, 0); _server.Router.Send(itemMsg, client); } }
public Item SendItemInstance(NecClient client) { IBuffer res = null; InventoryItem invItem = client.Character.GetNextInventoryItem(_server); if (invItem == null) { res = BufferProvider.Provide(); res.WriteInt32(-207); Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area); RecvNormalSystemMessage noSpace = new RecvNormalSystemMessage("Inventory is full!!!!"); _server.Router.Send(noSpace, client); return(null); } Item item = invItem.StorageItem = _server.Instances64.CreateInstance <Item>(); item.Id = 50100501; item.IconType = 47; item.Name = "bag"; invItem.StorageType = 0; Logger.Debug($"instanceId [{invItem.InstanceId}]"); res = BufferProvider.Provide(); res.WriteUInt64(item.InstanceId); //ItemID res.WriteInt32(2); // 0 does not display icon res.WriteByte((byte)1); //Number of "items" res.WriteInt32(0); //Item status, in multiples of numbers, 8 = blessed/cursed/both res.WriteFixedString("Wolfzen", 0x10); res.WriteByte(invItem.StorageType); // 0 = adventure bag. 1 = character equipment res.WriteByte(invItem.StorageId); // 0~2 // maybe.. more bag index? res.WriteInt16(invItem.StorageSlot); // bag index res.WriteInt32(0); //Equip bitmask res.WriteInt32(item.Id); //Percentage stat, 9 max i think res.WriteByte(0); res.WriteByte(0); // Dest slot res.WriteCString(item.Name); // find max size res.WriteInt16(0); res.WriteInt16(0); res.WriteInt32(item.IconType); //Divides max % by this number res.WriteByte(0); res.WriteInt32(item.IconType); int numEntries = 2; res.WriteInt32(numEntries); // less than or equal to 2 for (int i = 0; i < numEntries; i++) { res.WriteInt32(0); } //res.WriteInt32(0); numEntries = 3; res.WriteInt32(numEntries); // less than or equal to 3 for (int i = 0; i < numEntries; i++) { res.WriteByte(0); //bool res.WriteInt32(0); res.WriteInt32(0); res.WriteInt32(0); } res.WriteInt32(0); res.WriteInt32(0); res.WriteInt16(0); res.WriteInt32(0); //Guard protection toggle, 1 = on, everything else is off res.WriteInt16(0); Router.Send(client, (ushort)AreaPacketId.recv_item_instance, res, ServerType.Area); return(item); }
public override void Handle(NecClient client, NecPacket packet) { byte toStoreType = packet.Data .ReadByte(); // [0 = adventure bag. 1 = character equipment], [then unknown byte], [then slot], [then unknown] byte toBagId = packet.Data.ReadByte(); short fromSlot = packet.Data.ReadInt16(); byte fromStoreType = packet.Data.ReadByte(); byte fromBagId = packet.Data.ReadByte(); short toSlot = packet.Data.ReadInt16(); Logger.Debug($"fromStoreType byte [{fromStoreType}]"); Logger.Debug($"fromBagId byte [{fromBagId}]"); Logger.Debug($"fromSlot byte [{fromSlot}]"); Logger.Debug($"toStoreType byte [{toStoreType}]"); Logger.Debug($"toBagId byte [{toBagId}]"); Logger.Debug($"toSlot [{toSlot}]"); int itemCount = packet.Data.ReadByte(); //last byte is stack count? Logger.Debug($"itemCount [{itemCount}]"); IBuffer res = BufferProvider.Provide(); res.WriteInt32(0); //error check. 0 to work /* * ITEMUSE GENERIC Unable to use this item right now * ITEMUSE -201 Store location is incorrect * ITEMUSE -204 Item amount is incorrect * ITEMUSE -205 The target to use this item is incorrect * ITEMUSE -206 Unable to use due to delay time * ITEMUSE -207 No space available in inventory * ITEMUSE -208 Unable to use this item since it is cursed * ITEMUSE -209 Unable to use this item since it is broken * ITEMUSE -210 You do not meet the requirements to equip this item * ITEMUSE -211 Unable to use this item * ITEMUSE -212 You are not in the right status to use this item * ITEMUSE -230 Unable to use since it is on cool down. * ITEMUSE -2601 You've already received this scrap * ITEMUSE -2708 Cannot be used outside of town * ITEMUSE -3001 Unable to move items when you have a shop open * */ Router.Send(client, (ushort)AreaPacketId.recv_item_move_r, res, ServerType.Area); InventoryItem fromInvItem = client.Character.GetInventoryItem(fromStoreType, fromBagId, fromSlot); InventoryItem toInvItem = client.Character.GetInventoryItem(toStoreType, toBagId, toSlot); if (toInvItem != null && (fromInvItem.StorageItem != toInvItem.StorageItem)) { RecvNormalSystemMessage unlikeItems = new RecvNormalSystemMessage("You can only stack like items!"); _server.Router.Send(unlikeItems, client); return; } if (toInvItem != null && (toInvItem.StorageCount >= 255)) { RecvNormalSystemMessage unlikeItems = new RecvNormalSystemMessage("The move would place too many items in destination slot!"); _server.Router.Send(unlikeItems, client); return; } if (fromInvItem.StorageCount > 1) { if (client.Character.currentEvent != null) { Logger.Error( $"Trying to start new event with another outstanding event active! Outstanding event type [{client.Character.currentEvent.EventType}]"); client.Character.currentEvent = null; } MoveItem moveItem = _server.Instances.CreateInstance <MoveItem>(); moveItem.toStoreType = toStoreType; moveItem.toBagId = toBagId; moveItem.toSlot = toSlot; moveItem.fromStoreType = fromStoreType; moveItem.fromBagId = moveItem.fromBagId; moveItem.fromSlot = fromSlot; moveItem.itemCount = (byte)itemCount; moveItem.item = fromInvItem.StorageItem; client.Character.currentEvent = moveItem; RecvEventStart eventStart = new RecvEventStart(0, 0); Router.Send(eventStart, client); RecvEventRequestInt getCount = new RecvEventRequestInt("Select number to move.", 1, fromInvItem.StorageCount, fromInvItem.StorageCount); Router.Send(getCount, client); } else { if (toInvItem == null) { fromInvItem.StorageType = toStoreType; fromInvItem.StorageId = toBagId; fromInvItem.StorageSlot = toSlot; client.Character.UpdateInventoryItem(fromInvItem); RecvItemUpdatePlace changePlace = new RecvItemUpdatePlace(fromInvItem.InstanceId, toStoreType, toBagId, toSlot); _server.Router.Send(changePlace, client); client.Character.UpdateInventoryItem(fromInvItem); } else { toInvItem.StorageCount += 1; RecvItemUpdateNum updateNum = new RecvItemUpdateNum(toInvItem.InstanceId, toInvItem.StorageCount); _server.Router.Send(updateNum, client); RecvItemRemove removeitem = new RecvItemRemove(fromInvItem.InstanceId); _server.Router.Send(removeitem, client); client.Character.UpdateInventoryItem(toInvItem); client.Character.RemoveInventoryItem(fromInvItem); } } //SendItemPlace(client); //SendItemPlaceChange(client); }