diff options
Diffstat (limited to 'Minecraft.World/EnchantItemCommand.cpp')
| -rw-r--r-- | Minecraft.World/EnchantItemCommand.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Minecraft.World/EnchantItemCommand.cpp b/Minecraft.World/EnchantItemCommand.cpp new file mode 100644 index 00000000..aa02b533 --- /dev/null +++ b/Minecraft.World/EnchantItemCommand.cpp @@ -0,0 +1,85 @@ +#include "stdafx.h" +#include "net.minecraft.network.packet.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.item.enchantment.h" +#include "..\Minecraft.Client\ServerPlayer.h" +#include "EnchantItemCommand.h" + +EGameCommand EnchantItemCommand::getId() +{ + return eGameCommand_EnchantItem; +} + +int EnchantItemCommand::getPermissionLevel() +{ + return 0; //aLEVEL_GAMEMASTERS; +} + +void EnchantItemCommand::execute(shared_ptr<CommandSender> source, byteArray commandData) +{ + ByteArrayInputStream bais(commandData); + DataInputStream dis(&bais); + + PlayerUID uid = dis.readPlayerUID(); + int enchantmentId = dis.readInt(); + int enchantmentLevel = dis.readInt(); + + bais.reset(); + + shared_ptr<ServerPlayer> player = getPlayer(uid); + + if(player == NULL) return; + + shared_ptr<ItemInstance> selectedItem = player->getSelectedItem(); + + if(selectedItem == NULL) return; + + Enchantment *e = Enchantment::enchantments[enchantmentId]; + + if(e == NULL) return; + if(!e->canEnchant(selectedItem)) return; + + if(enchantmentLevel < e->getMinLevel()) enchantmentLevel = e->getMinLevel(); + if(enchantmentLevel > e->getMaxLevel()) enchantmentLevel = e->getMaxLevel(); + + if (selectedItem->hasTag()) + { + ListTag<CompoundTag> *enchantmentTags = selectedItem->getEnchantmentTags(); + if (enchantmentTags != NULL) + { + for (int i = 0; i < enchantmentTags->size(); i++) + { + int type = enchantmentTags->get(i)->getShort((wchar_t *)ItemInstance::TAG_ENCH_ID); + + if (Enchantment::enchantments[type] != NULL) + { + Enchantment *other = Enchantment::enchantments[type]; + if (!other->isCompatibleWith(e)) + { + return; + //throw new CommandException("commands.enchant.cantCombine", e.getFullname(level), other.getFullname(enchantmentTags.get(i).getShort(ItemInstance.TAG_ENCH_LEVEL))); + } + } + } + } + } + + selectedItem->enchant(e, enchantmentLevel); + + //logAdminAction(source, "commands.enchant.success"); + logAdminAction(source, ChatPacket::e_ChatCustom, L"commands.enchant.success"); +} + +shared_ptr<GameCommandPacket> EnchantItemCommand::preparePacket(shared_ptr<Player> player, int enchantmentId, int enchantmentLevel) +{ + if(player == NULL) return nullptr; + + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + + dos.writePlayerUID(player->getXuid()); + dos.writeInt(enchantmentId); + dos.writeInt(enchantmentLevel); + + return shared_ptr<GameCommandPacket>( new GameCommandPacket(eGameCommand_EnchantItem, baos.toByteArray() )); +}
\ No newline at end of file |
