diff --git a/Minecraft.Client/PlayerConnection.cpp b/Minecraft.Client/PlayerConnection.cpp index b710bf22..35cecd7c 100644 --- a/Minecraft.Client/PlayerConnection.cpp +++ b/Minecraft.Client/PlayerConnection.cpp @@ -2059,6 +2059,40 @@ void PlayerConnection::handleCustomPayload(shared_ptr custo player->inventory->setItem(player->inventory->selected, sentItem); } } + else if (CustomPayloadPacket::QUICK_EQUIP_PACKET.compare(customPayloadPacket->identifier) == 0) { + ByteArrayInputStream bais(customPayloadPacket->data); + DataInputStream input(&bais); + shared_ptr sentItem = Packet::readItem(&input); + //->connection->send(std::make_shared(e->entityId, i, item)); + int slot = Mob::getEquipmentSlotForItem(sentItem) - 1; + + // If player is in survival mode (not creative) + if(!player->abilities.instabuild) { // + // Equip the armor to the appropriate slot + if (player->inventory->armor[slot] == nullptr) { + player->setEquippedSlot(slot, sentItem); + player->inventory->removeItemNoUpdate(player->inventory->selected); + // Remove the item from hand (set count to 0) + sentItem->count = 0; + } + else { + player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); + player->setEquippedSlot(slot, sentItem); + } + } + else { + if (player->inventory->armor[slot] == nullptr) { + player->setEquippedSlot(slot, sentItem); + } + else { + player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); + player->setEquippedSlot(slot, sentItem); + } + } + PlayerList* playerList = MinecraftServer::getInstance()->getPlayers(); + playerList->broadcastAll(std::make_shared(player->entityId, slot, sentItem)); + + } else if (CustomPayloadPacket::TRADER_SELECTION_PACKET.compare(customPayloadPacket->identifier) == 0) { ByteArrayInputStream bais(customPayloadPacket->data); diff --git a/Minecraft.World/ArmorItem.cpp b/Minecraft.World/ArmorItem.cpp index d1f01208..d16c0551 100644 --- a/Minecraft.World/ArmorItem.cpp +++ b/Minecraft.World/ArmorItem.cpp @@ -9,6 +9,8 @@ #include "net.minecraft.world.level.h" #include "com.mojang.nbt.h" #include "ArmorItem.h" +#include "../Minecraft.Client/MultiPlayerLocalPlayer.h" +#include "../Minecraft.Client/ClientConnection.h" const int ArmorItem::healthPerSlot[] = { 11, 16, 15, 13 @@ -128,35 +130,45 @@ ArmorItem::ArmorItem(int id, const ArmorMaterial *armorType, int icon, int slot) maxStackSize = 1; DispenserTile::REGISTRY.add(this, new ArmorDispenseItemBehavior()); } +int ArmorItem::getUseDuration(shared_ptr itemInstance) +{ + return 1; +} shared_ptr ArmorItem::use(shared_ptr instance, Level* level, shared_ptr player) { - //int slot = Mob::getEquipmentSlotForItem(instance) - 1; + int slot = Mob::getEquipmentSlotForItem(instance) - 1; //// If player is in survival mode (not creative) - //if (!player->abilities.instabuild) { // - // // Equip the armor to the appropriate slot - // ItemInstance copy = *instance->copy_not_shared(); - // if (player->inventory->armor[slot] == nullptr) { - // player->inventory->armor[slot] = make_shared(copy); - // player->inventory->removeItemNoUpdate(player->inventory->selected); - // // Remove the item from hand (set count to 0) - // instance->count = 0; - // } - // else { - // player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); - // player->inventory->armor[slot] = make_shared(copy); - // } - //} - //else { - // ItemInstance copy = *instance->copy_not_shared(); - // if (player->inventory->armor[slot] == nullptr) { - // player->inventory->armor[slot] = make_shared(copy); - // } - // else { - // player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); - // player->inventory->armor[slot] = make_shared(copy); - // } - //} + if (!player->abilities.instabuild) { // + // Equip the armor to the appropriate slot + if (player->inventory->armor[slot] == nullptr) { + //player->setEquippedSlot(slot, instance); + //player->inventory->removeItemNoUpdate(player->inventory->selected); + // Remove the item from hand (set count to 0) + //instance->count = 0; + } + else { + //player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); + //player->setEquippedSlot(slot, instance); + } + } + else { + if (player->inventory->armor[slot] == nullptr) { + //player->setEquippedSlot(slot, instance); + } + else { + //player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); + //player->setEquippedSlot(slot, instance); + } + } + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + Packet::writeItem(instance, &dos); + for (int i = 0; i < XUSER_MAX_COUNT; i++) { + if (Minecraft::GetInstance()->localplayers[i] == player) { + Minecraft::GetInstance()->localplayers[i]->connection->send(std::make_shared(CustomPayloadPacket::QUICK_EQUIP_PACKET, baos.toByteArray())); + } + } int material = Item::items[instance->id]->getMaterial(); int lo, hi; diff --git a/Minecraft.World/ArmorItem.h b/Minecraft.World/ArmorItem.h index 7d976aee..90b69e6b 100644 --- a/Minecraft.World/ArmorItem.h +++ b/Minecraft.World/ArmorItem.h @@ -88,6 +88,7 @@ public: virtual void registerIcons(IconRegister *iconRegister); virtual shared_ptr use(shared_ptr instance, Level* level, shared_ptr player); + virtual int getUseDuration(shared_ptr itemInstance); static Icon *getEmptyIcon(int slot); }; \ No newline at end of file