diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/BowItem.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.World/BowItem.cpp')
| -rw-r--r-- | Minecraft.World/BowItem.cpp | 109 |
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 |
