the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 372 lines 8.0 kB view raw
1#include "stdafx.h" 2#include "net.minecraft.network.packet.h" 3#include "net.minecraft.world.effect.h" 4#include "net.minecraft.world.entity.player.h" 5#include "net.minecraft.world.item.h" 6#include "net.minecraft.world.level.h" 7#include "net.minecraft.world.level.tile.h" 8#include "net.minecraft.world.phys.h" 9#include "BeaconTileEntity.h" 10 11shared_ptr<TileEntity> BeaconTileEntity::clone() 12{ 13 shared_ptr<BeaconTileEntity> result = shared_ptr<BeaconTileEntity>( new BeaconTileEntity() ); 14 TileEntity::clone(result); 15 16 result->primaryPower = primaryPower; 17 result->secondaryPower = secondaryPower; 18 result->levels = levels; 19 20 return result; 21} 22 23MobEffect *BeaconTileEntity::BEACON_EFFECTS[BeaconTileEntity::BEACON_EFFECTS_TIERS][BeaconTileEntity::BEACON_EFFECTS_EFFECTS]; 24 25void BeaconTileEntity::staticCtor() 26{ 27 for(unsigned int tier = 0; tier < BEACON_EFFECTS_TIERS; ++tier) 28 { 29 for(unsigned int effect = 0; effect < BEACON_EFFECTS_EFFECTS; ++effect) 30 { 31 BEACON_EFFECTS[tier][effect] = NULL; 32 } 33 } 34 BEACON_EFFECTS[0][0] = MobEffect::movementSpeed; 35 BEACON_EFFECTS[0][1] = MobEffect::digSpeed; 36 BEACON_EFFECTS[1][0] = MobEffect::damageResistance; 37 BEACON_EFFECTS[1][1] = MobEffect::jump; 38 BEACON_EFFECTS[2][0] = MobEffect::damageBoost; 39 BEACON_EFFECTS[3][0] = MobEffect::regeneration; 40} 41 42BeaconTileEntity::BeaconTileEntity() 43{ 44 clientSideRenderTick = 0; 45 clientSideRenderScale = 0.0f; 46 47 isActive = false; 48 levels = -1; 49 50 primaryPower = 0; 51 secondaryPower = 0; 52 53 paymentItem = nullptr; 54 name = L""; 55} 56 57void BeaconTileEntity::tick() 58{ 59 // 4J Stu - Added levels check to force an initial tick 60 if ( (!level->isClientSide && levels < 0) || (level->getGameTime() % (SharedConstants::TICKS_PER_SECOND * 4)) == 0) 61 { 62 updateShape(); 63 applyEffects(); 64 } 65 66} 67 68void BeaconTileEntity::applyEffects() 69{ 70 if (isActive && levels > 0 && !level->isClientSide && primaryPower > 0) 71 { 72 73 double range = (levels * 10) + 10; 74 int baseAmp = 0; 75 if (levels >= 4 && primaryPower == secondaryPower) 76 { 77 baseAmp = 1; 78 } 79 80 AABB *bb = AABB::newTemp(x, y, z, x + 1, y + 1, z + 1)->grow(range, range, range); 81 bb->y1 = level->getMaxBuildHeight(); 82 vector<shared_ptr<Entity> > *players = level->getEntitiesOfClass(typeid(Player), bb); 83 for (AUTO_VAR(it,players->begin()); it != players->end(); ++it) 84 { 85 shared_ptr<Player> player = dynamic_pointer_cast<Player>(*it); 86 player->addEffect(new MobEffectInstance(primaryPower, SharedConstants::TICKS_PER_SECOND * 9, baseAmp, true)); 87 } 88 89 if (levels >= 4 && primaryPower != secondaryPower && secondaryPower > 0) 90 { 91 for (AUTO_VAR(it,players->begin()); it != players->end(); ++it) 92 { 93 shared_ptr<Player> player = dynamic_pointer_cast<Player>(*it); 94 player->addEffect(new MobEffectInstance(secondaryPower, SharedConstants::TICKS_PER_SECOND * 9, 0, true)); 95 } 96 } 97 delete players; 98 } 99} 100 101void BeaconTileEntity::updateShape() 102{ 103 104 if (!level->canSeeSky(x, y + 1, z)) 105 { 106 isActive = false; 107 levels = 0; 108 } 109 else 110 { 111 isActive = true; 112 113 levels = 0; 114 for (int step = 1; step <= 4; step++) 115 { 116 117 int ly = y - step; 118 if (ly < 0) 119 { 120 break; 121 } 122 123 bool isOk = true; 124 for (int lx = x - step; lx <= x + step && isOk; lx++) 125 { 126 for (int lz = z - step; lz <= z + step; lz++) 127 { 128 int tile = level->getTile(lx, ly, lz); 129 if (tile != Tile::emeraldBlock_Id && tile != Tile::goldBlock_Id && tile != Tile::diamondBlock_Id && tile != Tile::ironBlock_Id) 130 { 131 isOk = false; 132 break; 133 } 134 } 135 } 136 if (isOk) 137 { 138 levels = step; 139 } 140 else 141 { 142 break; 143 } 144 } 145 if (levels == 0) 146 { 147 isActive = false; 148 } 149 } 150 151} 152 153float BeaconTileEntity::getAndUpdateClientSideScale() 154{ 155 156 if (!isActive) 157 { 158 return 0; 159 } 160 161 int renderDelta = (int) (level->getGameTime() - clientSideRenderTick); 162 clientSideRenderTick = level->getGameTime(); 163 if (renderDelta > 1) 164 { 165 clientSideRenderScale -= ((float) renderDelta / (float) SCALE_TIME); 166 167 if (clientSideRenderScale < 0) 168 { 169 clientSideRenderScale = 0; 170 } 171 } 172 clientSideRenderScale += (1.0f / (float) SCALE_TIME); 173 if (clientSideRenderScale > 1) 174 { 175 clientSideRenderScale = 1; 176 } 177 return clientSideRenderScale; 178} 179 180int BeaconTileEntity::getPrimaryPower() 181{ 182 return primaryPower; 183} 184 185int BeaconTileEntity::getSecondaryPower() 186{ 187 return secondaryPower; 188} 189 190int BeaconTileEntity::getLevels() 191{ 192 return levels; 193} 194 195// client-side method used by GUI 196void BeaconTileEntity::setLevels(int levels) 197{ 198 this->levels = levels; 199} 200 201void BeaconTileEntity::setPrimaryPower(int primaryPower) 202{ 203 this->primaryPower = 0; 204 205 // verify power 206 for (int tier = 0; tier < levels && tier < 3; tier++) 207 { 208 for(unsigned int e = 0; e < BEACON_EFFECTS_EFFECTS; ++e) 209 { 210 MobEffect *effect = BEACON_EFFECTS[tier][e]; 211 if(effect == NULL) break; 212 213 if (effect->id == primaryPower) 214 { 215 this->primaryPower = primaryPower; 216 return; 217 } 218 } 219 } 220} 221 222void BeaconTileEntity::setSecondaryPower(int secondaryPower) 223{ 224 this->secondaryPower = 0; 225 226 // verify power 227 if (levels >= 4) 228 { 229 for (int tier = 0; tier < 4; tier++) 230 { 231 for(unsigned int e = 0; e < BEACON_EFFECTS_EFFECTS; ++e) 232 { 233 MobEffect *effect = BEACON_EFFECTS[tier][e]; 234 if(effect == NULL) break; 235 236 if (effect->id == secondaryPower) 237 { 238 this->secondaryPower = secondaryPower; 239 return; 240 } 241 } 242 } 243 } 244} 245 246shared_ptr<Packet> BeaconTileEntity::getUpdatePacket() 247{ 248 CompoundTag *tag = new CompoundTag(); 249 save(tag); 250 return shared_ptr<TileEntityDataPacket>( new TileEntityDataPacket(x, y, z, TileEntityDataPacket::TYPE_BEACON, tag) ); 251} 252 253double BeaconTileEntity::getViewDistance() 254{ 255 return 256 * 256; 256} 257 258void BeaconTileEntity::load(CompoundTag *tag) 259{ 260 TileEntity::load(tag); 261 262 primaryPower = tag->getInt(L"Primary"); 263 secondaryPower = tag->getInt(L"Secondary"); 264 levels = tag->getInt(L"Levels"); 265} 266 267void BeaconTileEntity::save(CompoundTag *tag) 268{ 269 TileEntity::save(tag); 270 271 tag->putInt(L"Primary", primaryPower); 272 tag->putInt(L"Secondary", secondaryPower); 273 // this value is re-calculated, but save it anyway to avoid update lag 274 tag->putInt(L"Levels", levels); 275} 276 277unsigned int BeaconTileEntity::getContainerSize() 278{ 279 return 1; 280} 281 282shared_ptr<ItemInstance> BeaconTileEntity::getItem(unsigned int slot) 283{ 284 if (slot == 0) 285 { 286 return paymentItem; 287 } 288 return nullptr; 289} 290 291shared_ptr<ItemInstance> BeaconTileEntity::removeItem(unsigned int slot, int count) 292{ 293 if (slot == 0 && paymentItem != NULL) 294 { 295 if (count >= paymentItem->count) 296 { 297 shared_ptr<ItemInstance> returnItem = paymentItem; 298 paymentItem = nullptr; 299 return returnItem; 300 } 301 else 302 { 303 paymentItem->count -= count; 304 return shared_ptr<ItemInstance>( new ItemInstance(paymentItem->id, count, paymentItem->getAuxValue()) ); 305 } 306 } 307 return nullptr; 308} 309 310shared_ptr<ItemInstance> BeaconTileEntity::removeItemNoUpdate(int slot) 311{ 312 if (slot == 0 && paymentItem != NULL) 313 { 314 shared_ptr<ItemInstance> returnItem = paymentItem; 315 paymentItem = nullptr; 316 return returnItem; 317 } 318 return nullptr; 319} 320 321void BeaconTileEntity::setItem(unsigned int slot, shared_ptr<ItemInstance> item) 322{ 323 if (slot == 0) 324 { 325 paymentItem = item; 326 } 327} 328 329wstring BeaconTileEntity::getName() 330{ 331 return hasCustomName() ? name : app.GetString(IDS_CONTAINER_BEACON); 332} 333 334wstring BeaconTileEntity::getCustomName() 335{ 336 return hasCustomName() ? name : L""; 337} 338 339bool BeaconTileEntity::hasCustomName() 340{ 341 return !name.empty(); 342} 343 344void BeaconTileEntity::setCustomName(const wstring &name) 345{ 346 this->name = name; 347} 348 349int BeaconTileEntity::getMaxStackSize() const 350{ 351 return 1; 352} 353 354bool BeaconTileEntity::stillValid(shared_ptr<Player> player) 355{ 356 if (level->getTileEntity(x, y, z) != shared_from_this()) return false; 357 if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; 358 return true; 359} 360 361void BeaconTileEntity::startOpen() 362{ 363} 364 365void BeaconTileEntity::stopOpen() 366{ 367} 368 369bool BeaconTileEntity::canPlaceItem(int slot, shared_ptr<ItemInstance> item) 370{ 371 return (item->id == Item::emerald_Id || item->id == Item::diamond_Id || item->id == Item::goldIngot_Id || item->id == Item::ironIngot_Id); 372}