the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "net.minecraft.world.level.h"
3#include "net.minecraft.world.entity.player.h"
4#include "net.minecraft.world.entity.projectile.h"
5#include "net.minecraft.world.entity.item.h"
6#include "net.minecraft.world.item.enchantment.h"
7#include "net.minecraft.world.h"
8#include "BowItem.h"
9#include "SoundTypes.h"
10
11const wstring BowItem::TEXTURE_PULL[] = {L"bow_pull_0", L"bow_pull_1", L"bow_pull_2"};
12
13BowItem::BowItem(int id) : Item( id )
14{
15 maxStackSize = 1;
16 setMaxDamage(384);
17
18 icons = NULL;
19}
20
21void BowItem::releaseUsing(shared_ptr<ItemInstance> itemInstance, Level *level, shared_ptr<Player> player, int durationLeft)
22{
23 bool infiniteArrows = player->abilities.instabuild || EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowInfinite->id, itemInstance) > 0;
24
25 if (infiniteArrows || player->inventory->hasResource(Item::arrow_Id))
26 {
27 int timeHeld = getUseDuration(itemInstance) - durationLeft;
28 float pow = timeHeld / (float) MAX_DRAW_DURATION;
29 pow = ((pow * pow) + pow * 2) / 3;
30 if (pow < 0.1) return;
31 if (pow > 1) pow = 1;
32
33 shared_ptr<Arrow> arrow = shared_ptr<Arrow>( new Arrow(level, player, pow * 2.0f) );
34 if (pow == 1) arrow->setCritArrow(true);
35 int damageBonus = EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowBonus->id, itemInstance);
36 if (damageBonus > 0)
37 {
38 arrow->setBaseDamage(arrow->getBaseDamage() + (double) damageBonus * .5 + .5);
39 }
40 int knockbackBonus = EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowKnockback->id, itemInstance);
41 if (knockbackBonus > 0)
42 {
43 arrow->setKnockback(knockbackBonus);
44 }
45 if (EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowFire->id, itemInstance) > 0)
46 {
47 arrow->setOnFire(100);
48 }
49 itemInstance->hurtAndBreak(1, player);
50
51 level->playEntitySound(player, eSoundType_RANDOM_BOW, 1.0f, 1 / (random->nextFloat() * 0.4f + 1.2f) + pow * 0.5f);
52
53 if (infiniteArrows)
54 {
55 arrow->pickup = Arrow::PICKUP_CREATIVE_ONLY;
56 }
57 else
58 {
59 player->inventory->removeResource(Item::arrow_Id);
60 }
61 if (!level->isClientSide) level->addEntity(arrow);
62 }
63}
64
65shared_ptr<ItemInstance> BowItem::useTimeDepleted(shared_ptr<ItemInstance> instance, Level *level, shared_ptr<Player> player)
66{
67 return instance;
68}
69
70int BowItem::getUseDuration(shared_ptr<ItemInstance> itemInstance)
71{
72 return 20 * 60 * 60;
73}
74
75UseAnim BowItem::getUseAnimation(shared_ptr<ItemInstance> itemInstance)
76{
77 return UseAnim_bow;
78}
79
80shared_ptr<ItemInstance> BowItem::use(shared_ptr<ItemInstance> instance, Level *level, shared_ptr<Player> player)
81{
82 if (player->abilities.instabuild || player->inventory->hasResource(Item::arrow_Id))
83 {
84 player->startUsingItem(instance, getUseDuration(instance));
85 }
86 return instance;
87}
88
89int BowItem::getEnchantmentValue()
90{
91 return 1;
92}
93
94void BowItem::registerIcons(IconRegister *iconRegister)
95{
96 Item::registerIcons(iconRegister);
97
98 icons = new Icon *[BOW_ICONS_COUNT];
99
100 for (int i = 0; i < BOW_ICONS_COUNT; i++)
101 {
102 icons[i] = iconRegister->registerIcon(TEXTURE_PULL[i]);
103 }
104}
105
106Icon *BowItem::getDrawnIcon(int amount)
107{
108 return icons[amount];
109}