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.entity.h"
3#include "net.minecraft.world.entity.player.h"
4#include "net.minecraft.world.level.h"
5#include "net.minecraft.world.level.tile.h"
6#include "net.minecraft.world.level.tile.entity.h"
7#include "net.minecraft.world.entity.item.h"
8#include "net.minecraft.world.phys.h"
9#include "MinecartHopper.h"
10
11const int MinecartHopper::MOVE_ITEM_SPEED = HopperTileEntity::MOVE_ITEM_SPEED / 2;
12
13void MinecartHopper::_init()
14{
15 enabled = true;
16 cooldownTime = -1;
17
18 // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that
19 // the derived version of the function is called
20 this->defineSynchedData();
21}
22
23MinecartHopper::MinecartHopper(Level *level) : MinecartContainer(level)
24{
25 _init();
26}
27
28MinecartHopper::MinecartHopper(Level *level, double x, double y, double z) : MinecartContainer(level, x, y, z)
29{
30 _init();
31}
32
33int MinecartHopper::getType()
34{
35 return TYPE_HOPPER;
36}
37
38Tile *MinecartHopper::getDefaultDisplayTile()
39{
40 return Tile::hopper;
41}
42
43int MinecartHopper::getDefaultDisplayOffset()
44{
45 return 1;
46}
47
48unsigned int MinecartHopper::getContainerSize()
49{
50 return 5;
51}
52
53bool MinecartHopper::interact(shared_ptr<Player> player)
54{
55 if (!level->isClientSide)
56 {
57 player->openHopper(dynamic_pointer_cast<MinecartHopper>(shared_from_this()));
58 }
59
60 return true;
61}
62
63void MinecartHopper::activateMinecart(int xt, int yt, int zt, bool state)
64{
65 bool newEnabled = !state;
66
67 if (newEnabled != isEnabled())
68 {
69 setEnabled(newEnabled);
70 }
71}
72
73bool MinecartHopper::isEnabled()
74{
75 return enabled;
76}
77
78void MinecartHopper::setEnabled(bool enabled)
79{
80 this->enabled = enabled;
81}
82
83Level *MinecartHopper::getLevel()
84{
85 return level;
86}
87
88double MinecartHopper::getLevelX()
89{
90 return x;
91}
92
93double MinecartHopper::getLevelY()
94{
95 return y;
96}
97
98double MinecartHopper::getLevelZ()
99{
100 return z;
101}
102
103void MinecartHopper::tick()
104{
105 MinecartContainer::tick();
106
107 if (!level->isClientSide && isAlive() && isEnabled())
108 {
109 cooldownTime--;
110 if (!isOnCooldown())
111 {
112 setCooldown(0);
113
114 if (suckInItems())
115 {
116 setCooldown(MOVE_ITEM_SPEED);
117 MinecartContainer::setChanged();
118 }
119 }
120 }
121}
122
123bool MinecartHopper::suckInItems()
124{
125 if (HopperTileEntity::suckInItems(this)) return true;
126
127 vector<shared_ptr<Entity> > *items = level->getEntitiesOfClass(typeid(ItemEntity), bb->grow(0.25f, 0, 0.25f), EntitySelector::ENTITY_STILL_ALIVE);
128
129 if (items->size() > 0)
130 {
131 HopperTileEntity::addItem( this, dynamic_pointer_cast<ItemEntity>(items->at(0)) );
132 }
133 delete items;
134
135 return false;
136}
137
138void MinecartHopper::destroy(DamageSource *source)
139{
140 MinecartContainer::destroy(source);
141
142 spawnAtLocation(Tile::hopper_Id, 1, 0);
143}
144
145void MinecartHopper::addAdditonalSaveData(CompoundTag *base)
146{
147 MinecartContainer::addAdditonalSaveData(base);
148 base->putInt(L"TransferCooldown", cooldownTime);
149}
150
151void MinecartHopper::readAdditionalSaveData(CompoundTag *base)
152{
153 MinecartContainer::readAdditionalSaveData(base);
154 cooldownTime = base->getInt(L"TransferCooldown");
155}
156
157void MinecartHopper::setCooldown(int time)
158{
159 cooldownTime = time;
160}
161
162bool MinecartHopper::isOnCooldown()
163{
164 return cooldownTime > 0;
165}