From 39820d961e56106e311a0e180d5e2ba8ecfed39e Mon Sep 17 00:00:00 2001 From: SevenToaster509 Date: Tue, 28 Apr 2026 16:18:31 +0100 Subject: [PATCH] refactor: use existing packet for quick equip --- Minecraft.Client/PlayerConnection.cpp | 100 ++++++++++++++++++-------- Minecraft.World/ArmorItem.cpp | 4 +- Minecraft.World/ElytraItem.cpp | 32 --------- Minecraft.World/Mob.cpp | 3 + 4 files changed, 75 insertions(+), 64 deletions(-) diff --git a/Minecraft.Client/PlayerConnection.cpp b/Minecraft.Client/PlayerConnection.cpp index 2fb30a44..f5bbd87e 100644 --- a/Minecraft.Client/PlayerConnection.cpp +++ b/Minecraft.Client/PlayerConnection.cpp @@ -817,6 +817,42 @@ skipUseItemOn: send(std::make_shared(player->containerMenu->containerId, s->index, player->inventory->getSelected())); } } + + //Migrate QuickEquip packet here instead + if (item != nullptr && (item->getItem()->getBaseItemType() == Item::eBaseItemType_helmet + || item->getItem()->getBaseItemType() == Item::eBaseItemType_chestplate + || item->getItem()->getBaseItemType() == Item::eBaseItemType_leggings + || item->getItem()->getBaseItemType() == Item::eBaseItemType_boots)) { + + int slot = Mob::getEquipmentSlotForItem(item) - 1; + + auto item1 = item->clone(item); + + // If player is in survival mode + if (!player->abilities.instabuild) { // + // Equip the armor to the appropriate slot + if (player->inventory->armor[slot] == nullptr) { + player->inventory->removeItemNoUpdate(player->inventory->selected); + player->inventory->setItem(36 + slot, item); + } + else { + player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); + player->inventory->setItem(36 + slot, item); + } + } + else { + if (player->inventory->armor[slot] == nullptr) { + player->inventory->setItem(36 + slot, item); + //hacky fix for ghost item + player->inventory->setItem(player->inventory->selected, item1); + } + else { + player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); + player->inventory->setItem(36 + slot, item); + } + } + } + } void PlayerConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) @@ -2060,34 +2096,34 @@ void PlayerConnection::handleCustomPayload(shared_ptr custo } } 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; + //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->inventory->setItem(36 + slot, sentItem); - player->inventory->removeItemNoUpdate(player->inventory->selected); - } - else { - player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); - player->inventory->setItem(36 + slot, sentItem); - } - } - else { - if (player->inventory->armor[slot] == nullptr) { - player->inventory->setItem(36 + slot, sentItem); - } - else { - player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); - player->inventory->setItem(36 + slot, sentItem); - } - } - PlayerList* playerList = MinecraftServer::getInstance()->getPlayers(); + //// 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->inventory->setItem(36 + slot, sentItem); + // player->inventory->removeItemNoUpdate(player->inventory->selected); + // } + // else { + // player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); + // player->inventory->setItem(36 + slot, sentItem); + // } + //} + //else { + // if (player->inventory->armor[slot] == nullptr) { + // player->inventory->setItem(36 + slot, sentItem); + // } + // else { + // player->inventory->setItem(player->inventory->selected, player->inventory->armor[slot]); + // player->inventory->setItem(36 + slot, sentItem); + // } + //} + //PlayerList* playerList = MinecraftServer::getInstance()->getPlayers(); //playerList->broadcastAll(std::make_shared(player->entityId, slot, sentItem)); } @@ -2316,20 +2352,24 @@ void PlayerConnection::handleCraftItem(shared_ptr packet) } // handle achievements - switch(pTempItemInst->id ) + switch(pTempItemInst->id) { case Tile::workBench_Id: player->awardStat(GenericStats::buildWorkbench(), GenericStats::param_buildWorkbench()); break; case Item::pickAxe_wood_Id: player->awardStat(GenericStats::buildPickaxe(), GenericStats::param_buildPickaxe()); break; case Tile::furnace_Id: player->awardStat(GenericStats::buildFurnace(), GenericStats::param_buildFurnace()); break; - case Item::hoe_wood_Id: player->awardStat(GenericStats::buildHoe(), GenericStats::param_buildHoe()); break; + //case Item::hoe_wood_Id: player->awardStat(GenericStats::buildHoe(), GenericStats::param_buildHoe()); break; case Item::bread_Id: player->awardStat(GenericStats::makeBread(), GenericStats::param_makeBread()); break; case Item::cake_Id: player->awardStat(GenericStats::bakeCake(), GenericStats::param_bakeCake()); break; case Item::pickAxe_stone_Id: player->awardStat(GenericStats::buildBetterPickaxe(), GenericStats::param_buildBetterPickaxe()); break; - case Item::sword_wood_Id: player->awardStat(GenericStats::buildSword(), GenericStats::param_buildSword()); break; + //case Item::sword_wood_Id: player->awardStat(GenericStats::buildSword(), GenericStats::param_buildSword()); break; case Tile::dispenser_Id: player->awardStat(GenericStats::dispenseWithThis(), GenericStats::param_dispenseWithThis()); break; case Tile::enchantTable_Id: player->awardStat(GenericStats::enchantments(), GenericStats::param_enchantments()); break; case Tile::bookshelf_Id: player->awardStat(GenericStats::bookcase(), GenericStats::param_bookcase()); break; } + switch (pTempItemInst->getItem()->getBaseItemType()) { + case Item::eBaseItemType_hoe: player->awardStat(GenericStats::buildHoe(), GenericStats::param_buildHoe()); break; + case Item::eBaseItemType_sword: player->awardStat(GenericStats::buildSword(), GenericStats::param_buildSword()); break; + } //} // ELSE The server thinks the client was wrong... } diff --git a/Minecraft.World/ArmorItem.cpp b/Minecraft.World/ArmorItem.cpp index c5fc4c02..1850c202 100644 --- a/Minecraft.World/ArmorItem.cpp +++ b/Minecraft.World/ArmorItem.cpp @@ -136,14 +136,14 @@ int ArmorItem::getUseDuration(shared_ptr itemInstance) } shared_ptr ArmorItem::use(shared_ptr instance, Level* level, shared_ptr player) { - ByteArrayOutputStream baos; + /*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/ElytraItem.cpp b/Minecraft.World/ElytraItem.cpp index 26ac7bce..42452048 100644 --- a/Minecraft.World/ElytraItem.cpp +++ b/Minecraft.World/ElytraItem.cpp @@ -25,38 +25,6 @@ bool ElytraItem::TestUse(shared_ptr instance, Level* level, shared shared_ptr ElytraItem::use(shared_ptr instance, Level* level, shared_ptr player) { - // Elytra equips to the chest slot (SLOT_CHEST = 3, armor array index = SLOT_CHEST - 1 = 2) - const int chestSlot = LivingEntity::SLOT_CHEST - 1; - - ItemInstance copy = *instance->copy_not_shared(); - - if (!player->abilities.instabuild) - { - if (player->inventory->armor[chestSlot] == nullptr) - { - player->inventory->armor[chestSlot] = make_shared(copy); - player->inventory->removeItemNoUpdate(player->inventory->selected); - instance->count = 0; - } - else - { - player->inventory->setItem(player->inventory->selected, player->inventory->armor[chestSlot]); - player->inventory->armor[chestSlot] = make_shared(copy); - } - } - else - { - if (player->inventory->armor[chestSlot] == nullptr) - { - player->inventory->armor[chestSlot] = make_shared(copy); - } - else - { - player->inventory->setItem(player->inventory->selected, player->inventory->armor[chestSlot]); - player->inventory->armor[chestSlot] = make_shared(copy); - } - } - // Play cloth armor equip sound (range 194–199) player->playSound(194, 0.5f, 1.0f); diff --git a/Minecraft.World/Mob.cpp b/Minecraft.World/Mob.cpp index c318fe9b..2b5dcb86 100644 --- a/Minecraft.World/Mob.cpp +++ b/Minecraft.World/Mob.cpp @@ -741,6 +741,9 @@ int Mob::getEquipmentSlotForItem(shared_ptr item) { return SLOT_HELM; } + if (item->id == Item::elytra_Id) { + return SLOT_CHEST; + } ArmorItem *armorItem = dynamic_cast(item->getItem()); if (armorItem != nullptr)