the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 242 lines 6.2 kB view raw
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}