aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/BowItem.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/BowItem.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/BowItem.cpp')
-rw-r--r--Minecraft.World/BowItem.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/Minecraft.World/BowItem.cpp b/Minecraft.World/BowItem.cpp
new file mode 100644
index 00000000..ed2376b0
--- /dev/null
+++ b/Minecraft.World/BowItem.cpp
@@ -0,0 +1,109 @@
+#include "stdafx.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.entity.player.h"
+#include "net.minecraft.world.entity.projectile.h"
+#include "net.minecraft.world.entity.item.h"
+#include "net.minecraft.world.item.enchantment.h"
+#include "net.minecraft.world.h"
+#include "BowItem.h"
+#include "SoundTypes.h"
+
+const wstring BowItem::TEXTURE_PULL[] = {L"bow_pull_0", L"bow_pull_1", L"bow_pull_2"};
+
+BowItem::BowItem(int id) : Item( id )
+{
+ maxStackSize = 1;
+ setMaxDamage(384);
+
+ icons = NULL;
+}
+
+void BowItem::releaseUsing(shared_ptr<ItemInstance> itemInstance, Level *level, shared_ptr<Player> player, int durationLeft)
+{
+ bool infiniteArrows = player->abilities.instabuild || EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowInfinite->id, itemInstance) > 0;
+
+ if (infiniteArrows || player->inventory->hasResource(Item::arrow_Id))
+ {
+ int timeHeld = getUseDuration(itemInstance) - durationLeft;
+ float pow = timeHeld / (float) MAX_DRAW_DURATION;
+ pow = ((pow * pow) + pow * 2) / 3;
+ if (pow < 0.1) return;
+ if (pow > 1) pow = 1;
+
+ shared_ptr<Arrow> arrow = shared_ptr<Arrow>( new Arrow(level, player, pow * 2.0f) );
+ if (pow == 1) arrow->setCritArrow(true);
+ int damageBonus = EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowBonus->id, itemInstance);
+ if (damageBonus > 0)
+ {
+ arrow->setBaseDamage(arrow->getBaseDamage() + (double) damageBonus * .5 + .5);
+ }
+ int knockbackBonus = EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowKnockback->id, itemInstance);
+ if (knockbackBonus > 0)
+ {
+ arrow->setKnockback(knockbackBonus);
+ }
+ if (EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowFire->id, itemInstance) > 0)
+ {
+ arrow->setOnFire(100);
+ }
+ itemInstance->hurt(1, player);
+
+ level->playSound(player, eSoundType_RANDOM_BOW, 1.0f, 1 / (random->nextFloat() * 0.4f + 1.2f) + pow * 0.5f);
+
+ if (infiniteArrows)
+ {
+ arrow->pickup = Arrow::PICKUP_CREATIVE_ONLY;
+ }
+ else
+ {
+ player->inventory->removeResource(Item::arrow_Id);
+ }
+ if (!level->isClientSide) level->addEntity(arrow);
+ }
+}
+
+shared_ptr<ItemInstance> BowItem::useTimeDepleted(shared_ptr<ItemInstance> instance, Level *level, shared_ptr<Player> player)
+{
+ return instance;
+}
+
+int BowItem::getUseDuration(shared_ptr<ItemInstance> itemInstance)
+{
+ return 20 * 60 * 60;
+}
+
+UseAnim BowItem::getUseAnimation(shared_ptr<ItemInstance> itemInstance)
+{
+ return UseAnim_bow;
+}
+
+shared_ptr<ItemInstance> BowItem::use(shared_ptr<ItemInstance> instance, Level *level, shared_ptr<Player> player)
+{
+ if (player->abilities.instabuild || player->inventory->hasResource(Item::arrow_Id))
+ {
+ player->startUsingItem(instance, getUseDuration(instance));
+ }
+ return instance;
+}
+
+int BowItem::getEnchantmentValue()
+{
+ return 1;
+}
+
+void BowItem::registerIcons(IconRegister *iconRegister)
+{
+ Item::registerIcons(iconRegister);
+
+ icons = new Icon *[BOW_ICONS_COUNT];
+
+ for (int i = 0; i < BOW_ICONS_COUNT; i++)
+ {
+ icons[i] = iconRegister->registerIcon(TEXTURE_PULL[i]);
+ }
+}
+
+Icon *BowItem::getDrawnIcon(int amount)
+{
+ return icons[amount];
+} \ No newline at end of file