the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 223 lines 6.7 kB view raw
1#include "stdafx.h" 2#include "net.minecraft.world.level.h" 3#include "net.minecraft.world.level.tile.h" 4#include "net.minecraft.world.level.levelgen.h" 5#include "net.minecraft.world.level.dimension.h" 6#include "net.minecraft.world.entity.projectile.h" 7#include "net.minecraft.world.phys.h" 8#include "EnderEyeItem.h" 9#include "SoundTypes.h" 10#include "LevelData.h" 11 12EnderEyeItem::EnderEyeItem(int id) : Item(id) 13{ 14} 15 16bool EnderEyeItem::useOn(shared_ptr<ItemInstance> instance, shared_ptr<Player> player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) 17{ 18 int targetType = level->getTile(x, y, z); 19 int targetData = level->getData(x, y, z); 20 21 if (player->mayUseItemAt(x, y, z, face, instance) && targetType == Tile::endPortalFrameTile_Id && !TheEndPortalFrameTile::hasEye(targetData)) 22 { 23 if(bTestUseOnOnly) return true; 24 if (level->isClientSide) return true; 25 level->setData(x, y, z, targetData + TheEndPortalFrameTile::EYE_BIT, Tile::UPDATE_CLIENTS); 26 level->updateNeighbourForOutputSignal(x, y, z, Tile::endPortalFrameTile_Id); 27 instance->count--; 28 29 for (int i = 0; i < 16; i++) 30 { 31 double xp = x + (5.0f + random->nextFloat() * 6.0f) / 16.0f; 32 double yp = y + 13.0f / 16.0f; 33 double zp = z + (5.0f + random->nextFloat() * 6.0f) / 16.0f; 34 double xa = 0; 35 double ya = 0; 36 double za = 0; 37 38 level->addParticle(eParticleType_smoke, xp, yp, zp, xa, ya, za); 39 } 40 41 // scan if the circle is complete 42 int direction = targetData & 3; 43 44 // find borders 45 int min = 0; 46 int max = 0; 47 bool firstFound = false; 48 bool valid = true; 49 int rightHandDirection = Direction::DIRECTION_CLOCKWISE[direction]; 50 for (int offset = -2; offset <= 2; offset++) 51 { 52 int testX = x + Direction::STEP_X[rightHandDirection] * offset; 53 int testZ = z + Direction::STEP_Z[rightHandDirection] * offset; 54 55 int tile = level->getTile(testX, y, testZ); 56 if (tile == Tile::endPortalFrameTile->id) 57 { 58 int data = level->getData(testX, y, testZ); 59 if (!TheEndPortalFrameTile::hasEye(data)) 60 { 61 valid = false; 62 break; 63 } 64 max = offset; 65 if (!firstFound) 66 { 67 min = offset; 68 firstFound = true; 69 } 70 } 71 } 72 73 // got a full frame? 74 if (valid && max == min + 2) 75 { 76 77 // check if other edge is valid 78 for (int offset = min; offset <= max; offset++) 79 { 80 int testX = x + Direction::STEP_X[rightHandDirection] * offset; 81 int testZ = z + Direction::STEP_Z[rightHandDirection] * offset; 82 testX += Direction::STEP_X[direction] * 4; 83 testZ += Direction::STEP_Z[direction] * 4; 84 85 int tile = level->getTile(testX, y, testZ); 86 int data = level->getData(testX, y, testZ); 87 if (tile != Tile::endPortalFrameTile_Id || !TheEndPortalFrameTile::hasEye(data)) 88 { 89 valid = false; 90 break; 91 } 92 } 93 // check if edges on the sides are valid 94 for (int side = (min - 1); side <= (max + 1); side += 4) 95 { 96 for (int offset = 1; offset <= 3; offset++) 97 { 98 int testX = x + Direction::STEP_X[rightHandDirection] * side; 99 int testZ = z + Direction::STEP_Z[rightHandDirection] * side; 100 testX += Direction::STEP_X[direction] * offset; 101 testZ += Direction::STEP_Z[direction] * offset; 102 103 int tile = level->getTile(testX, y, testZ); 104 int data = level->getData(testX, y, testZ); 105 if (tile != Tile::endPortalFrameTile_Id || !TheEndPortalFrameTile::hasEye(data)) 106 { 107 valid = false; 108 break; 109 } 110 } 111 } 112 if (valid) 113 { 114 115 // fill portal 116 for (int px = min; px <= max; px++) 117 { 118 for (int pz = 1; pz <= 3; pz++) 119 { 120 int targetX = x + Direction::STEP_X[rightHandDirection] * px; 121 int targetZ = z + Direction::STEP_Z[rightHandDirection] * px; 122 targetX += Direction::STEP_X[direction] * pz; 123 targetZ += Direction::STEP_Z[direction] * pz; 124 125 level->setTileAndData(targetX, y, targetZ, Tile::endPortalTile_Id, 0, Tile::UPDATE_CLIENTS); 126 } 127 } 128 } 129 } 130 131 return true; 132 } 133 return false; 134} 135 136bool EnderEyeItem::TestUse(shared_ptr<ItemInstance> itemInstance, Level *level, shared_ptr<Player> player) 137{ 138 HitResult *hr = getPlayerPOVHitResult(level, player, false); 139 if (hr != NULL && hr->type == HitResult::TILE) 140 { 141 int tile = level->getTile(hr->x, hr->y, hr->z); 142 delete hr; 143 if (tile == Tile::endPortalFrameTile_Id) 144 { 145 return false; 146 } 147 } 148 else if( hr != NULL ) 149 { 150 delete hr; 151 } 152 153 //if (!level->isClientSide) 154 { 155 if((level->dimension->id==LevelData::DIMENSION_OVERWORLD) && level->getLevelData()->getHasStronghold()) 156 { 157 return true; 158 } 159 else 160 { 161// int x,z; 162// if(app.GetTerrainFeaturePosition(eTerrainFeature_Stronghold,&x,&z)) 163// { 164// level->getLevelData()->setXStronghold(x); 165// level->getLevelData()->setZStronghold(z); 166// level->getLevelData()->setHasStronghold(); 167// 168// app.DebugPrintf("=== FOUND stronghold in terrain features list\n"); 169// 170// app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_StrongholdPosition); 171// } 172// else 173 { 174 // can't find the stronghold position in the terrain feature list. Do we have to run a post-process? 175 app.DebugPrintf("=== Can't find stronghold in terrain features list\n"); 176 } 177 178 } 179// TilePos *nearestMapFeature = level->findNearestMapFeature(LargeFeature::STRONGHOLD, (int) player->x, (int) player->y, (int) player->z); 180// if (nearestMapFeature != NULL) 181// { 182// delete nearestMapFeature; 183// return true; 184// } 185 } 186 return false; 187} 188 189shared_ptr<ItemInstance> EnderEyeItem::use(shared_ptr<ItemInstance> instance, Level *level, shared_ptr<Player> player) 190{ 191 HitResult *hr = getPlayerPOVHitResult(level, player, false); 192 if (hr != NULL && hr->type == HitResult::TILE) 193 { 194 int tile = level->getTile(hr->x, hr->y, hr->z); 195 delete hr; 196 if (tile == Tile::endPortalFrameTile_Id) 197 { 198 return instance; 199 } 200 } 201 else if( hr != NULL ) 202 { 203 delete hr; 204 } 205 206 if (!level->isClientSide) 207 { 208 if((level->dimension->id==LevelData::DIMENSION_OVERWORLD) && level->getLevelData()->getHasStronghold()) 209 { 210 shared_ptr<EyeOfEnderSignal> eyeOfEnderSignal = shared_ptr<EyeOfEnderSignal>( new EyeOfEnderSignal(level, player->x, player->y + 1.62 - player->heightOffset, player->z) ); 211 eyeOfEnderSignal->signalTo(level->getLevelData()->getXStronghold()<<4, player->y + 1.62 - player->heightOffset, level->getLevelData()->getZStronghold()<<4); 212 level->addEntity(eyeOfEnderSignal); 213 214 level->playEntitySound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); 215 level->levelEvent(nullptr, LevelEvent::SOUND_LAUNCH, (int) player->x, (int) player->y, (int) player->z, 0); 216 if (!player->abilities.instabuild) 217 { 218 instance->count--; 219 } 220 } 221 } 222 return instance; 223}