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 "JavaMath.h"
3#include "net.minecraft.world.entity.player.h"
4#include "net.minecraft.world.level.h"
5#include "net.minecraft.world.level.dimension.h"
6#include "net.minecraft.world.level.material.h"
7#include "net.minecraft.world.level.tile.h"
8#include "net.minecraft.world.phys.h"
9#include "net.minecraft.world.level.tile.h"
10#include "net.minecraft.world.entity.animal.h"
11#include "net.minecraft.stats.h"
12#include "Material.h"
13#include "ItemInstance.h"
14#include "BucketItem.h"
15#include "..\Minecraft.Client\LocalPlayer.h"
16#include "..\Minecraft.Client\ServerPlayer.h"
17#include "..\Minecraft.Client\PlayerConnection.h"
18#include "..\Minecraft.World\ChatPacket.h"
19#include "SoundTypes.h"
20
21BucketItem::BucketItem(int id, int content) : Item( id )
22{
23 maxStackSize = 1;
24 this->content = content;
25}
26
27bool BucketItem::TestUse(shared_ptr<ItemInstance> itemInstance, Level *level, shared_ptr<Player> player)
28{
29 bool pickLiquid = content == 0;
30 HitResult *hr = getPlayerPOVHitResult(level, player, pickLiquid);
31 if (hr == NULL) return false;
32
33 if (hr->type == HitResult::TILE)
34 {
35 int xt = hr->x;
36 int yt = hr->y;
37 int zt = hr->z;
38
39 if (!level->mayInteract(player, xt, yt, zt, content))
40 {
41 delete hr;
42 return false;
43 }
44
45 if (content == 0)
46 {
47 if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return false;
48 if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0)
49 {
50 delete hr;
51 return true;
52 }
53 if (level->getMaterial(xt, yt, zt) == Material::lava && level->getData(xt, yt, zt) == 0)
54 {
55 delete hr;
56 return true;
57 }
58 }
59 else if (content < 0)
60 {
61 delete hr;
62 return true;
63 }
64 else
65 {
66 if (hr->f == 0) yt--;
67 if (hr->f == 1) yt++;
68 if (hr->f == 2) zt--;
69 if (hr->f == 3) zt++;
70 if (hr->f == 4) xt--;
71 if (hr->f == 5) xt++;
72
73 if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return false;
74
75 if (level->isEmptyTile(xt, yt, zt) || !level->getMaterial(xt, yt, zt)->isSolid())
76 {
77 delete hr;
78 return true;
79 }
80 }
81 }
82 else
83 {
84 if (content == 0)
85 {
86 if (hr->entity->GetType() == eTYPE_COW)
87 {
88 delete hr;
89 return true;
90 }
91 }
92 }
93 delete hr;
94
95 return false;
96}
97
98shared_ptr<ItemInstance> BucketItem::use(shared_ptr<ItemInstance> itemInstance, Level *level, shared_ptr<Player> player)
99{
100 float a = 1;
101
102 double x = player->xo + (player->x - player->xo) * a;
103 double y = player->yo + (player->y - player->yo) * a + 1.62 - player->heightOffset;
104 double z = player->zo + (player->z - player->zo) * a;
105
106 bool pickLiquid = content == 0;
107 HitResult *hr = getPlayerPOVHitResult(level, player, pickLiquid);
108 if (hr == NULL) return itemInstance;
109
110 if (hr->type == HitResult::TILE)
111 {
112 int xt = hr->x;
113 int yt = hr->y;
114 int zt = hr->z;
115
116 if (!level->mayInteract(player, xt, yt, zt,content))
117 {
118 app.DebugPrintf("!!!!!!!!!!! Can't place that here\n");
119 shared_ptr<ServerPlayer> servPlayer = dynamic_pointer_cast<ServerPlayer>(player);
120 if( servPlayer != NULL )
121 {
122 app.DebugPrintf("Sending ChatPacket::e_ChatCannotPlaceLava to player\n");
123 servPlayer->connection->send( shared_ptr<ChatPacket>( new ChatPacket(L"", ChatPacket::e_ChatCannotPlaceLava ) ) );
124 }
125
126 delete hr;
127 return itemInstance;
128 }
129
130 if (content == 0)
131 {
132 if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return itemInstance;
133 if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0)
134 {
135 level->removeTile(xt, yt, zt);
136 delete hr;
137 if (player->abilities.instabuild)
138 {
139 return itemInstance;
140 }
141
142 if (--itemInstance->count <= 0)
143 {
144 return shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_water) );
145 }
146 else
147 {
148 if (!player->inventory->add(shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_water))))
149 {
150 player->drop(shared_ptr<ItemInstance>(new ItemInstance(Item::bucket_water_Id, 1, 0)));
151 }
152 return itemInstance;
153 }
154 }
155 if (level->getMaterial(xt, yt, zt) == Material::lava && level->getData(xt, yt, zt) == 0)
156 {
157 if( level->dimension->id == -1 )
158 player->awardStat(
159 GenericStats::netherLavaCollected(),
160 GenericStats::param_noArgs()
161 );
162
163 level->removeTile(xt, yt, zt);
164 delete hr;
165 if (player->abilities.instabuild)
166 {
167 return itemInstance;
168 }
169 if (--itemInstance->count <= 0)
170 {
171 return shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_lava) );
172 }
173 else
174 {
175 if (!player->inventory->add(shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_lava))))
176 {
177 player->drop(shared_ptr<ItemInstance>(new ItemInstance(Item::bucket_lava_Id, 1, 0)));
178 }
179 return itemInstance;
180 }
181 }
182 }
183 else if (content < 0)
184 {
185 delete hr;
186 return shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_empty) );
187 }
188 else
189 {
190 if (hr->f == 0) yt--;
191 if (hr->f == 1) yt++;
192 if (hr->f == 2) zt--;
193 if (hr->f == 3) zt++;
194 if (hr->f == 4) xt--;
195 if (hr->f == 5) xt++;
196
197 if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return itemInstance;
198
199
200 if (emptyBucket(level, xt, yt, zt) && !player->abilities.instabuild)
201 {
202 return shared_ptr<ItemInstance>( new ItemInstance(Item::bucket_empty) );
203 }
204
205 }
206 }
207 delete hr;
208 return itemInstance;
209}
210
211bool BucketItem::emptyBucket(Level *level, int xt, int yt, int zt)
212{
213 if (content <= 0) return false;
214
215 Material *material = level->getMaterial(xt, yt, zt);
216 bool nonSolid = !material->isSolid();
217
218 if (level->isEmptyTile(xt, yt, zt) || nonSolid)
219 {
220 if (level->dimension->ultraWarm && content == Tile::water_Id)
221 {
222 level->playSound(xt + 0.5f, yt + 0.5f, zt + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f);
223
224 for (int i = 0; i < 8; i++)
225 {
226 level->addParticle(eParticleType_largesmoke, xt + Math::random(), yt + Math::random(), zt + Math::random(), 0, 0, 0);
227 }
228 }
229 else
230 {
231 if (!level->isClientSide && nonSolid && !material->isLiquid())
232 {
233 level->destroyTile(xt, yt, zt, true);
234 }
235 level->setTileAndData(xt, yt, zt, content, 0, Tile::UPDATE_ALL);
236 }
237
238 return true;
239 }
240
241 return false;
242}