aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/EnchantItemCommand.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/EnchantItemCommand.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/EnchantItemCommand.cpp')
-rw-r--r--Minecraft.World/EnchantItemCommand.cpp85
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