aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/MinecartHopper.cpp
diff options
context:
space:
mode:
authorLoki Rautio <lokirautio@gmail.com>2026-03-04 03:56:03 -0600
committerLoki Rautio <lokirautio@gmail.com>2026-03-04 03:56:03 -0600
commit42aec6dac53dffa6afe072560a7e1d4986112538 (patch)
tree0836426857391df1b6a83f6368a183f83ec9b104 /Minecraft.World/MinecartHopper.cpp
parentc9d58eeac7c72f0b3038e084667b4d89a6249fce (diff)
parentef9b6fd500dfabd9463267b0dd9e29577eea8a2b (diff)
Merge branch 'main' into pr/win64-world-saves
# Conflicts: # Minecraft.Client/MinecraftServer.cpp # README.md
Diffstat (limited to 'Minecraft.World/MinecartHopper.cpp')
-rw-r--r--Minecraft.World/MinecartHopper.cpp165
1 files changed, 165 insertions, 0 deletions
diff --git a/Minecraft.World/MinecartHopper.cpp b/Minecraft.World/MinecartHopper.cpp
new file mode 100644
index 00000000..8bf02f8f
--- /dev/null
+++ b/Minecraft.World/MinecartHopper.cpp
@@ -0,0 +1,165 @@
+#include "stdafx.h"
+#include "net.minecraft.world.entity.h"
+#include "net.minecraft.world.entity.player.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.level.tile.h"
+#include "net.minecraft.world.level.tile.entity.h"
+#include "net.minecraft.world.entity.item.h"
+#include "net.minecraft.world.phys.h"
+#include "MinecartHopper.h"
+
+const int MinecartHopper::MOVE_ITEM_SPEED = HopperTileEntity::MOVE_ITEM_SPEED / 2;
+
+void MinecartHopper::_init()
+{
+ enabled = true;
+ cooldownTime = -1;
+
+ // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that
+ // the derived version of the function is called
+ this->defineSynchedData();
+}
+
+MinecartHopper::MinecartHopper(Level *level) : MinecartContainer(level)
+{
+ _init();
+}
+
+MinecartHopper::MinecartHopper(Level *level, double x, double y, double z) : MinecartContainer(level, x, y, z)
+{
+ _init();
+}
+
+int MinecartHopper::getType()
+{
+ return TYPE_HOPPER;
+}
+
+Tile *MinecartHopper::getDefaultDisplayTile()
+{
+ return Tile::hopper;
+}
+
+int MinecartHopper::getDefaultDisplayOffset()
+{
+ return 1;
+}
+
+unsigned int MinecartHopper::getContainerSize()
+{
+ return 5;
+}
+
+bool MinecartHopper::interact(shared_ptr<Player> player)
+{
+ if (!level->isClientSide)
+ {
+ player->openHopper(dynamic_pointer_cast<MinecartHopper>(shared_from_this()));
+ }
+
+ return true;
+}
+
+void MinecartHopper::activateMinecart(int xt, int yt, int zt, bool state)
+{
+ bool newEnabled = !state;
+
+ if (newEnabled != isEnabled())
+ {
+ setEnabled(newEnabled);
+ }
+}
+
+bool MinecartHopper::isEnabled()
+{
+ return enabled;
+}
+
+void MinecartHopper::setEnabled(bool enabled)
+{
+ this->enabled = enabled;
+}
+
+Level *MinecartHopper::getLevel()
+{
+ return level;
+}
+
+double MinecartHopper::getLevelX()
+{
+ return x;
+}
+
+double MinecartHopper::getLevelY()
+{
+ return y;
+}
+
+double MinecartHopper::getLevelZ()
+{
+ return z;
+}
+
+void MinecartHopper::tick()
+{
+ MinecartContainer::tick();
+
+ if (!level->isClientSide && isAlive() && isEnabled())
+ {
+ cooldownTime--;
+ if (!isOnCooldown())
+ {
+ setCooldown(0);
+
+ if (suckInItems())
+ {
+ setCooldown(MOVE_ITEM_SPEED);
+ MinecartContainer::setChanged();
+ }
+ }
+ }
+}
+
+bool MinecartHopper::suckInItems()
+{
+ if (HopperTileEntity::suckInItems(this)) return true;
+
+ vector<shared_ptr<Entity> > *items = level->getEntitiesOfClass(typeid(ItemEntity), bb->grow(0.25f, 0, 0.25f), EntitySelector::ENTITY_STILL_ALIVE);
+
+ if (items->size() > 0)
+ {
+ HopperTileEntity::addItem( this, dynamic_pointer_cast<ItemEntity>(items->at(0)) );
+ }
+ delete items;
+
+ return false;
+}
+
+void MinecartHopper::destroy(DamageSource *source)
+{
+ MinecartContainer::destroy(source);
+
+ spawnAtLocation(Tile::hopper_Id, 1, 0);
+}
+
+void MinecartHopper::addAdditonalSaveData(CompoundTag *base)
+{
+ MinecartContainer::addAdditonalSaveData(base);
+ base->putInt(L"TransferCooldown", cooldownTime);
+}
+
+void MinecartHopper::readAdditionalSaveData(CompoundTag *base)
+{
+ MinecartContainer::readAdditionalSaveData(base);
+ cooldownTime = base->getInt(L"TransferCooldown");
+}
+
+void MinecartHopper::setCooldown(int time)
+{
+ cooldownTime = time;
+}
+
+bool MinecartHopper::isOnCooldown()
+{
+ return cooldownTime > 0;
+} \ No newline at end of file