1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
#include "stdafx.h"
#include "EggTile.h"
#include "net.minecraft.world.level.h"
#include "net.minecraft.world.level.tile.h"
#include "net.minecraft.world.entity.item.h"
EggTile::EggTile(int id) : Tile(id, Material::egg, isSolidRender())
{
}
void EggTile::onPlace(Level *level, int x, int y, int z)
{
level->addToTickNextTick(x, y, z, id, getTickDelay(level));
}
void EggTile::neighborChanged(Level *level, int x, int y, int z, int type)
{
level->addToTickNextTick(x, y, z, id, getTickDelay(level));
}
void EggTile::tick(Level *level, int x, int y, int z, Random *random)
{
checkSlide(level, x, y, z);
}
void EggTile::checkSlide(Level *level, int x, int y, int z)
{
if (HeavyTile::isFree(level, x, y - 1, z) && y >= 0)
{
int r = 32;
if (HeavyTile::instaFall || !level->hasChunksAt(x - r, y - r, z - r, x + r, y + r, z + r))
{
level->removeTile(x, y, z);
while (HeavyTile::isFree(level, x, y - 1, z) && y > 0)
y--;
if (y > 0)
{
level->setTileAndData(x, y, z, id, 0, Tile::UPDATE_CLIENTS);
}
}
else
{
shared_ptr<FallingTile> e = std::make_shared<FallingTile>(level, x + 0.5f, y + 0.5f, z + 0.5f, id);
level->addEntity(e);
}
}
}
bool EggTile::use(Level *level, int x, int y, int z, shared_ptr<Player> player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param
{
if(soundOnly) return false;
teleport(level, x, y, z);
return true;
}
void EggTile::attack(Level *level, int x, int y, int z, shared_ptr<Player> player)
{
teleport(level, x, y, z);
}
void EggTile::teleport(Level *level, int x, int y, int z)
{
if (level->getTile(x, y, z) != id) return;
for (int i = 0; i < 1000; i++)
{
int xt = x + level->random->nextInt(16) - level->random->nextInt(16);
int yt = y + level->random->nextInt(8) - level->random->nextInt(8);
int zt = z + level->random->nextInt(16) - level->random->nextInt(16);
if (level->getTile(xt, yt, zt) == 0)
{
// Fix for TU9: Content: Art: Dragon egg teleport particle effect isn't present.
// Don't set tiles on client, and don't create particles on the server (matches later change in Java)
if(!level->isClientSide)
{
level->setTileAndData(xt, yt, zt, id, level->getData(x, y, z), Tile::UPDATE_CLIENTS);
level->removeTile(x, y, z);
// 4J Stu - The PC version is wrong as the particles calculated on the client side will point towards a different
// location to the one where the egg has actually moved. As the deltas are all small we can pack them into an int
// See generateTeleportParticles for unpacking
char deltaX = x-xt;
char deltaY = y-yt;
char deltaZ = z-zt;
int deltas = 0|(deltaX&0xFF)|((deltaY&0xFF)<<8)|((deltaZ&0xFF)<<16);
level->levelEvent(LevelEvent::END_EGG_TELEPORT,xt,yt,zt,deltas);
}
// 4J Stu - This code will not work correctly on the client as it will show the particles going in the wrong direction
// and only for the player who attacks the egg
// else
// {
// int count = 128;
// for (int j = 0; j < count; j++)
// {
// double d = level->random->nextDouble(); // j < count / 2 ? 0 :
//// 1;
// float xa = (level->random->nextFloat() - 0.5f) * 0.2f;
// float ya = (level->random->nextFloat() - 0.5f) * 0.2f;
// float za = (level->random->nextFloat() - 0.5f) * 0.2f;
// double _x = xt + (x - xt) * d + (level->random->nextDouble() - 0.5) * 1 + 0.5f;
// double _y = yt + (y - yt) * d + level->random->nextDouble() * 1 - 0.5f;
// double _z = zt + (z - zt) * d + (level->random->nextDouble() - 0.5) * 1 + 0.5f;
// level->addParticle(eParticleType_ender, _x, _y, _z, xa, ya, za);
// }
// }
return;
}
}
}
int EggTile::getTickDelay(Level *level)
{
return 5;
}
bool EggTile::blocksLight()
{
return false;
}
bool EggTile::isSolidRender(bool isServerLevel)
{
return false;
}
bool EggTile::isCubeShaped()
{
return false;
}
bool EggTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face)
{
return true;
}
int EggTile::getRenderShape()
{
return Tile::SHAPE_EGG;
}
int EggTile::cloneTileId(Level *level, int x, int y, int z)
{
return 0;
}
// 4J Added for Fix for #77475 - TU9: Content: Art: Dragon egg teleport particle effect isn't present.
void EggTile::generateTeleportParticles(Level *level,int xt,int yt, int zt,int deltas)
{
int count = 128;
// See above for packing
char deltaX = deltas&0xFF;
char deltaY = (deltas>>8)&0xFF;
char deltaZ = (deltas>>16)&0xFF;
for (int j = 0; j < count; j++)
{
double d = level->random->nextDouble(); // j < count / 2 ? 0 :
// 1;
float xa = (level->random->nextFloat() - 0.5f) * 0.2f;
float ya = (level->random->nextFloat() - 0.5f) * 0.2f;
float za = (level->random->nextFloat() - 0.5f) * 0.2f;
double _x = xt + deltaX * d + (level->random->nextDouble() - 0.5) * 1 + 0.5f;
double _y = yt + deltaY * d + level->random->nextDouble() * 1 - 0.5f;
double _z = zt + deltaZ * d + (level->random->nextDouble() - 0.5) * 1 + 0.5f;
level->addParticle(eParticleType_ender, _x, _y, _z, xa, ya, za);
}
}
|