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
|
#include "stdafx.h"
#include "net.minecraft.h"
#include "net.minecraft.world.item.h"
#include "net.minecraft.world.level.h"
#include "net.minecraft.world.level.redstone.h"
#include "RepeaterTile.h"
const double RepeaterTile::DELAY_RENDER_OFFSETS[4] = {-1.0f / 16.0f, 1.0f / 16.0f, 3.0f / 16.0f, 5.0f / 16.0f};
const int RepeaterTile::DELAYS[4]= {1, 2, 3, 4};
RepeaterTile::RepeaterTile(int id, bool on) : DiodeTile(id, on)
{
}
bool RepeaterTile::use(Level *level, int x, int y, int z, shared_ptr<Player> player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly)
{
if (soundOnly) return false;
int data = level->getData(x, y, z);
int delay = (data & DELAY_MASK) >> DELAY_SHIFT;
delay = ((delay + 1) << DELAY_SHIFT) & DELAY_MASK;
level->setData(x, y, z, delay | (data & DIRECTION_MASK), Tile::UPDATE_ALL);
return true;
}
int RepeaterTile::getTurnOnDelay(int data)
{
return DELAYS[(data & DELAY_MASK) >> DELAY_SHIFT] * 2;
}
DiodeTile *RepeaterTile::getOnTile()
{
return Tile::diode_on;
}
DiodeTile *RepeaterTile::getOffTile()
{
return Tile::diode_off;
}
int RepeaterTile::getResource(int data, Random *random, int playerBonusLevel)
{
return Item::repeater_Id;
}
int RepeaterTile::cloneTileId(Level *level, int x, int y, int z)
{
return Item::repeater_Id;
}
int RepeaterTile::getRenderShape()
{
return SHAPE_REPEATER;
}
bool RepeaterTile::isLocked(LevelSource *level, int x, int y, int z, int data)
{
return getAlternateSignal(level, x, y, z, data) > Redstone::SIGNAL_NONE;
}
bool RepeaterTile::isAlternateInput(int tile)
{
return isDiode(tile);
}
void RepeaterTile::animateTick(Level *level, int xt, int yt, int zt, Random *random)
{
if (!on) return;
int data = level->getData(xt, yt, zt);
int dir = getDirection(data);
double x = xt + 0.5f + (random->nextFloat() - 0.5f) * 0.2;
double y = yt + 0.4f + (random->nextFloat() - 0.5f) * 0.2;
double z = zt + 0.5f + (random->nextFloat() - 0.5f) * 0.2;
double xo = 0;
double zo = 0;
if (random->nextInt(2) == 0)
{
// spawn on receiver
switch (dir)
{
case Direction::SOUTH:
zo = -5.0f / 16.0f;
break;
case Direction::NORTH:
zo = 5.0f / 16.0f;
break;
case Direction::EAST:
xo = -5.0f / 16.0f;
break;
case Direction::WEST:
xo = 5.0f / 16.0f;
break;
}
}
else
{
// spawn on transmitter
int delay = (data & DELAY_MASK) >> DELAY_SHIFT;
switch (dir)
{
case Direction::SOUTH:
zo = DELAY_RENDER_OFFSETS[delay];
break;
case Direction::NORTH:
zo = -DELAY_RENDER_OFFSETS[delay];
break;
case Direction::EAST:
xo = DELAY_RENDER_OFFSETS[delay];
break;
case Direction::WEST:
xo = -DELAY_RENDER_OFFSETS[delay];
break;
}
}
level->addParticle(eParticleType_reddust, x + xo, y, z + zo, 0, 0, 0);
}
void RepeaterTile::onRemove(Level *level, int x, int y, int z, int id, int data)
{
DiodeTile::onRemove(level, x, y, z, id, data);
updateNeighborsInFront(level, x, y, z);
}
bool RepeaterTile::TestUse()
{
return true;
}
|