aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/BucketItem.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/BucketItem.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/BucketItem.cpp')
-rw-r--r--Minecraft.World/BucketItem.cpp261
1 files changed, 261 insertions, 0 deletions
diff --git a/Minecraft.World/BucketItem.cpp b/Minecraft.World/BucketItem.cpp
new file mode 100644
index 00000000..d3570cd7
--- /dev/null
+++ b/Minecraft.World/BucketItem.cpp
@@ -0,0 +1,261 @@
+#include "stdafx.h"
+#include "JavaMath.h"
+#include "net.minecraft.world.entity.player.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.level.dimension.h"
+#include "net.minecraft.world.level.material.h"
+#include "net.minecraft.world.level.tile.h"
+#include "net.minecraft.world.phys.h"
+#include "net.minecraft.world.level.tile.h"
+#include "net.minecraft.world.entity.animal.h"
+#include "net.minecraft.stats.h"
+#include "Material.h"
+#include "ItemInstance.h"
+#include "BucketItem.h"
+#include "..\Minecraft.Client\LocalPlayer.h"
+#include "..\Minecraft.Client\ServerPlayer.h"
+#include "..\Minecraft.Client\PlayerConnection.h"
+#include "..\Minecraft.World\ChatPacket.h"
+#include "SoundTypes.h"
+
+BucketItem::BucketItem(int id, int content) : Item( id )
+{
+ maxStackSize = 1;
+ this->content = content;
+}
+
+bool BucketItem::TestUse(Level *level, shared_ptr<Player> player)
+{
+// double x = player->xo + (player->x - player->xo);
+// double y = player->yo + (player->y - player->yo) + 1.62 - player->heightOffset;
+// double z = player->zo + (player->z - player->zo);
+
+ bool pickLiquid = content == 0;
+ HitResult *hr = getPlayerPOVHitResult(level, player, pickLiquid);
+ if (hr == NULL) return false;
+
+ if (hr->type == HitResult::TILE)
+ {
+ int xt = hr->x;
+ int yt = hr->y;
+ int zt = hr->z;
+
+ if (!level->mayInteract(player, xt, yt, zt, content))
+ {
+ delete hr;
+ return false;
+ }
+
+ if (content == 0)
+ {
+ if (!player->mayBuild(xt, yt, zt)) return false;
+ if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0)
+ {
+ delete hr;
+ return true;
+ }
+ if (level->getMaterial(xt, yt, zt) == Material::lava && level->getData(xt, yt, zt) == 0)
+ {
+ delete hr;
+ return true;
+ }
+ }
+ else if (content < 0)
+ {
+ delete hr;
+ return true;
+ }
+ else
+ {
+ if (hr->f == 0) yt--;
+ if (hr->f == 1) yt++;
+ if (hr->f == 2) zt--;
+ if (hr->f == 3) zt++;
+ if (hr->f == 4) xt--;
+ if (hr->f == 5) xt++;
+
+ if (!player->mayBuild(xt, yt, zt)) return false;
+
+ if (level->isEmptyTile(xt, yt, zt) || !level->getMaterial(xt, yt, zt)->isSolid())
+ {
+ delete hr;
+ return true;
+ }
+ }
+ }
+ else
+ {
+ if (content == 0)
+ {
+ if (hr->entity->GetType() == eTYPE_COW)
+ {
+ delete hr;
+ return true;
+ }
+ }
+ }
+ delete hr;
+
+ return false;
+}
+
+shared_ptr<ItemInstance> BucketItem::use(shared_ptr<ItemInstance> itemInstance, Level *level, shared_ptr<Player> player)
+{
+ float a = 1;
+
+ double x = player->xo + (player->x - player->xo) * a;
+ double y = player->yo + (player->y - player->yo) * a + 1.62 - player->heightOffset;
+ double z = player->zo + (player->z - player->zo) * a;
+
+ bool pickLiquid = content == 0;
+ HitResult *hr = getPlayerPOVHitResult(level, player, pickLiquid);
+ if (hr == NULL) return itemInstance;
+
+ if (hr->type == HitResult::TILE)
+ {
+ int xt = hr->x;
+ int yt = hr->y;
+ int zt = hr->z;
+
+ if (!level->mayInteract(player, xt, yt, zt,content))
+ {
+ app.DebugPrintf("!!!!!!!!!!! Can't place that here\n");
+ shared_ptr<ServerPlayer> servPlayer = dynamic_pointer_cast<ServerPlayer>(player);
+ if( servPlayer != NULL )
+ {
+ app.DebugPrintf("Sending ChatPacket::e_ChatCannotPlaceLava to player\n");
+ servPlayer->connection->send( shared_ptr<ChatPacket>( new ChatPacket(L"", ChatPacket::e_ChatCannotPlaceLava ) ) );
+ }
+
+ delete hr;
+ return itemInstance;
+ }
+
+ if (content == 0)
+ {
+ if (!player->mayBuild(xt, yt, zt)) return itemInstance;
+ if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0)
+ {
+ level->setTile(xt, yt, zt, 0);
+ delete hr;
+ if (player->abilities.instabuild)
+ {
+ return itemInstance;
+ }
+
+ if (--itemInstance->count <= 0)
+ {
+ return shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_water) );
+ }
+ else
+ {
+ if (!player->inventory->add(shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_water))))
+ {
+ player->drop(shared_ptr<ItemInstance>(new ItemInstance(Item::bucket_water_Id, 1, 0)));
+ }
+ return itemInstance;
+ }
+ }
+ if (level->getMaterial(xt, yt, zt) == Material::lava && level->getData(xt, yt, zt) == 0)
+ {
+ if( level->dimension->id == -1 )
+ player->awardStat(
+ GenericStats::netherLavaCollected(),
+ GenericStats::param_noArgs()
+ );
+
+ level->setTile(xt, yt, zt, 0);
+ delete hr;
+ if (player->abilities.instabuild)
+ {
+ return itemInstance;
+ }
+ if (--itemInstance->count <= 0)
+ {
+ return shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_lava) );
+ }
+ else
+ {
+ if (!player->inventory->add(shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_lava))))
+ {
+ player->drop(shared_ptr<ItemInstance>(new ItemInstance(Item::bucket_lava_Id, 1, 0)));
+ }
+ return itemInstance;
+ }
+ }
+ }
+ else if (content < 0)
+ {
+ delete hr;
+ return shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_empty) );
+ }
+ else
+ {
+ if (hr->f == 0) yt--;
+ if (hr->f == 1) yt++;
+ if (hr->f == 2) zt--;
+ if (hr->f == 3) zt++;
+ if (hr->f == 4) xt--;
+ if (hr->f == 5) xt++;
+
+ if (!player->mayBuild(xt, yt, zt)) return itemInstance;
+
+
+ if (emptyBucket(level, x, y, z, xt, yt, zt) && !player->abilities.instabuild)
+ {
+ return shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_empty) );
+ }
+
+ }
+ }
+ else
+ {
+ if (content == 0)
+ {
+ if (hr->entity->GetType() == eTYPE_COW)
+ {
+ delete hr;
+ if (--itemInstance->count <= 0)
+ {
+ return shared_ptr<ItemInstance>( new ItemInstance(Item::milk) );
+ }
+ else
+ {
+ if (!player->inventory->add(shared_ptr<ItemInstance>( new ItemInstance(Item::milk))))
+ {
+ player->drop(shared_ptr<ItemInstance>(new ItemInstance(Item::milk_Id, 1, 0)));
+ }
+ return itemInstance;
+ }
+ }
+ }
+ }
+ delete hr;
+ return itemInstance;
+}
+
+bool BucketItem::emptyBucket(Level *level, double x, double y, double z, int xt, int yt, int zt)
+{
+ if (content <= 0) return false;
+
+ if (level->isEmptyTile(xt, yt, zt) || !level->getMaterial(xt, yt, zt)->isSolid())
+ {
+ if (level->dimension->ultraWarm && content == Tile::water_Id)
+ {
+ level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f);
+
+ for (int i = 0; i < 8; i++)
+ {
+ level->addParticle(eParticleType_largesmoke, xt + Math::random(), yt + Math::random(), zt + Math::random(), 0, 0, 0);
+ }
+ }
+ else
+ {
+ level->setTileAndData(xt, yt, zt, content, 0);
+ }
+
+ return true;
+ }
+
+ return false;
+}