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 "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}