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
|
#include "stdafx.h"
#include "FenceGateTile.h"
#include "AABB.h"
#include "net.minecraft.world.level.h"
#include "net.minecraft.h"
#include "LevelEvent.h"
FenceGateTile::FenceGateTile(int id) : DirectionalTile(id, Material::wood, isSolidRender() )
{
}
Icon *FenceGateTile::getTexture(int face, int data)
{
return Tile::wood->getTexture(face);
}
bool FenceGateTile::mayPlace(Level *level, int x, int y, int z)
{
if (!level->getMaterial(x, y - 1, z)->isSolid()) return false;
return Tile::mayPlace(level, x, y, z);
}
AABB *FenceGateTile::getAABB(Level *level, int x, int y, int z)
{
int data = level->getData(x, y, z);
if (isOpen(data))
{
return nullptr;
}
// 4J Brought forward change from 1.2.3 to fix hit box rotation
if (data == Direction::NORTH || data == Direction::SOUTH)
{
return AABB::newTemp(x, y, z + 6.0f / 16.0f, x + 1, y + 1.5f, z + 10.0f / 16.0f);
}
return AABB::newTemp(x + 6.0f / 16.0f, y, z, x + 10.0f / 16.0f, y + 1.5f, z + 1);
//return AABB::newTemp(x, y, z, x + 1, y + 1.5f, z + 1);
}
// 4J - Brought forward from 1.2.3 to fix hit box rotation
void FenceGateTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr<TileEntity> forceEntity) // 4J added forceData, forceEntity param
{
int data = getDirection(level->getData(x, y, z));
if (data == Direction::NORTH || data == Direction::SOUTH)
{
setShape(0, 0, 6.0f / 16.0f, 1, 1.0f, 10.0f / 16.0f);
}
else
{
setShape(6.0f / 16.0f, 0, 0, 10.0f / 16.0f, 1.0f, 1);
}
}
bool FenceGateTile::blocksLight()
{
return false;
}
bool FenceGateTile::isSolidRender(bool isServerLevel)
{
return false;
}
bool FenceGateTile::isCubeShaped()
{
return false;
}
bool FenceGateTile::isPathfindable(LevelSource *level, int x, int y, int z)
{
return isOpen(level->getData(x, y, z));
}
int FenceGateTile::getRenderShape()
{
return Tile::SHAPE_FENCE_GATE;
}
void FenceGateTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr<LivingEntity> by, shared_ptr<ItemInstance> itemInstance)
{
int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3)) % 4;
level->setData(x, y, z, dir, Tile::UPDATE_CLIENTS);
}
bool FenceGateTile::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)
{
// 4J - added - just do enough to play the sound
level->levelEvent(player, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0); // 4J - changed event to pass player rather than nullptr as the source of the event so we can filter the broadcast properly
return false;
}
int data = level->getData(x, y, z);
if (isOpen(data))
{
level->setData(x, y, z, data & ~OPEN_BIT, Tile::UPDATE_CLIENTS);
}
else
{
// open the door from the player
int dir = (((Mth::floor(player->yRot * 4 / (360) + 0.5)) & 3)) % 4;
int current = getDirection(data);
if (current == ((dir + 2) % 4))
{
data = dir;
}
level->setData(x, y, z, data | OPEN_BIT, Tile::UPDATE_CLIENTS);
}
level->levelEvent(player, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0);
return true;
}
void FenceGateTile::neighborChanged(Level *level, int x, int y, int z, int type)
{
if (level->isClientSide) return;
int data = level->getData(x, y, z);
bool signal = level->hasNeighborSignal(x, y, z);
if (signal || ((type > 0 && Tile::tiles[type]->isSignalSource()) || type == 0))
{
if (signal && !isOpen(data))
{
level->setData(x, y, z, data | OPEN_BIT, Tile::UPDATE_CLIENTS);
level->levelEvent(nullptr, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0);
}
else if (!signal && isOpen(data))
{
level->setData(x, y, z, data & ~OPEN_BIT, Tile::UPDATE_CLIENTS);
level->levelEvent(nullptr, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0);
}
}
}
bool FenceGateTile::isOpen(int data)
{
return (data & OPEN_BIT) != 0;
}
void FenceGateTile::registerIcons(IconRegister *iconRegister)
{
// None
}
bool FenceGateTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face)
{
return true;
}
|