1 |
torben |
1525 |
package dk.thoerup.bukkit.hoeruputils; |
2 |
|
|
|
3 |
|
|
import java.util.HashMap; |
4 |
|
|
import java.util.Map; |
5 |
|
|
|
6 |
|
|
import org.bukkit.Effect; |
7 |
|
|
import org.bukkit.Location; |
8 |
|
|
import org.bukkit.Material; |
9 |
|
|
import org.bukkit.World; |
10 |
|
|
import org.bukkit.block.Block; |
11 |
|
|
import org.bukkit.entity.Player; |
12 |
|
|
import org.bukkit.event.block.BlockBreakEvent; |
13 |
|
|
import org.bukkit.event.block.BlockListener; |
14 |
|
|
import org.bukkit.event.block.SignChangeEvent; |
15 |
|
|
import org.bukkit.event.player.PlayerListener; |
16 |
|
|
import org.bukkit.event.player.PlayerInteractEvent; |
17 |
|
|
|
18 |
|
|
import org.bukkit.plugin.Plugin; |
19 |
|
|
|
20 |
|
|
public class SecretDoor extends BlockListener { |
21 |
|
|
|
22 |
|
|
HashMap<Location,Door> doormap = new HashMap<Location,Door>(); |
23 |
|
|
|
24 |
|
|
private PlayerHandler handler = new PlayerHandler(); |
25 |
|
|
|
26 |
|
|
Plugin plugin; |
27 |
|
|
|
28 |
|
|
public SecretDoor(Plugin plugin) { |
29 |
|
|
this.plugin = plugin; |
30 |
|
|
} |
31 |
|
|
|
32 |
|
|
public PlayerListener getPlayerListener() { |
33 |
|
|
return handler; |
34 |
|
|
} |
35 |
|
|
|
36 |
|
|
@Override |
37 |
|
|
public void onBlockBreak(BlockBreakEvent event) { |
38 |
|
|
Door door = doormap.get( event.getBlock().getLocation() ); |
39 |
|
|
if (door != null) { |
40 |
|
|
event.getPlayer().sendMessage("Secret door broken"); |
41 |
|
|
door.unregisterMap(doormap); |
42 |
|
|
} |
43 |
|
|
} |
44 |
|
|
|
45 |
|
|
@Override |
46 |
|
|
public void onSignChange(SignChangeEvent event) { |
47 |
|
|
|
48 |
|
|
Block sign = event.getBlock(); |
49 |
|
|
World world = sign.getWorld(); |
50 |
|
|
|
51 |
|
|
if (sign.getTypeId() == 63) { |
52 |
|
|
// don't react on floor signs |
53 |
|
|
return; |
54 |
|
|
} |
55 |
|
|
|
56 |
|
|
if (event.getLine(0).toLowerCase().equals("secretdoor") ) { |
57 |
|
|
Door door = new Door(sign); |
58 |
|
|
door.registerMap(doormap); |
59 |
|
|
|
60 |
|
|
event.getPlayer().sendMessage("Secret door created"); |
61 |
|
|
|
62 |
|
|
sign.setTypeId(0); |
63 |
|
|
} |
64 |
|
|
} |
65 |
|
|
|
66 |
|
|
|
67 |
|
|
class PlayerHandler extends PlayerListener { |
68 |
|
|
@Override |
69 |
|
|
public void onPlayerInteract(PlayerInteractEvent event) { |
70 |
|
|
|
71 |
|
|
final Player player = event.getPlayer(); |
72 |
|
|
|
73 |
|
|
if ( player.getItemInHand().getType() != Material.AIR ) { |
74 |
|
|
return; |
75 |
|
|
} |
76 |
|
|
|
77 |
|
|
if ( event.hasBlock() == false ) { |
78 |
|
|
return; |
79 |
|
|
} |
80 |
|
|
|
81 |
|
|
final Door door = doormap.get( event.getClickedBlock().getLocation() ); |
82 |
|
|
|
83 |
|
|
if (door == null) { |
84 |
|
|
return; |
85 |
|
|
} |
86 |
|
|
|
87 |
|
|
door.open( player.getWorld() ); |
88 |
|
|
|
89 |
|
|
player.playEffect( player.getLocation(), Effect.DOOR_TOGGLE, 0); |
90 |
|
|
|
91 |
|
|
Runnable doorCloser = new Runnable() { |
92 |
|
|
public void run() { |
93 |
|
|
door.close( player.getWorld() ); |
94 |
|
|
player.playEffect( player.getLocation(), Effect.DOOR_TOGGLE, 0); |
95 |
|
|
} |
96 |
|
|
}; |
97 |
|
|
|
98 |
|
|
player.getServer().getScheduler().scheduleSyncDelayedTask(plugin, doorCloser, 4*20); |
99 |
|
|
|
100 |
|
|
|
101 |
|
|
} |
102 |
|
|
} |
103 |
|
|
|
104 |
|
|
class Door { |
105 |
|
|
Location leftUpper; |
106 |
|
|
Location rightUpper; |
107 |
|
|
Location leftLower; |
108 |
|
|
Location rightLower; |
109 |
|
|
|
110 |
|
|
int material; |
111 |
|
|
|
112 |
|
|
public Door(Block sign) { |
113 |
|
|
leftUpper = sign.getLocation().clone(); |
114 |
|
|
rightUpper = sign.getLocation().clone(); |
115 |
|
|
|
116 |
|
|
switch ( sign.getData() ) { |
117 |
|
|
case 2: //facing east |
118 |
|
|
leftUpper.setZ( leftUpper.getZ() + 1 ); |
119 |
|
|
rightUpper.setZ( rightUpper.getZ() + 1 ); |
120 |
|
|
rightUpper.setX( rightUpper.getX() - 1 ); |
121 |
|
|
break; |
122 |
|
|
case 3: //facing west |
123 |
|
|
leftUpper.setZ( leftUpper.getZ() - 1 ); |
124 |
|
|
rightUpper.setZ( rightUpper.getZ() - 1 ); |
125 |
|
|
rightUpper.setX( rightUpper.getX() + 1 ); |
126 |
|
|
break; |
127 |
|
|
case 4: //facing north |
128 |
|
|
leftUpper.setX( leftUpper.getX() + 1); |
129 |
|
|
rightUpper.setX( rightUpper.getX() + 1); |
130 |
|
|
rightUpper.setZ( rightUpper.getZ() + 1); |
131 |
|
|
break; |
132 |
|
|
case 5: //facing south |
133 |
|
|
leftUpper.setX( leftUpper.getX() - 1); |
134 |
|
|
rightUpper.setX( rightUpper.getX() - 1); |
135 |
|
|
rightUpper.setZ( rightUpper.getZ() - 1); |
136 |
|
|
break; |
137 |
|
|
} |
138 |
|
|
|
139 |
|
|
material = sign.getWorld().getBlockAt( leftUpper ).getTypeId(); |
140 |
|
|
|
141 |
|
|
leftLower = leftUpper.clone(); |
142 |
|
|
rightLower = rightUpper.clone(); |
143 |
|
|
|
144 |
|
|
leftLower.setY( leftLower.getY() - 1); |
145 |
|
|
rightLower.setY( rightLower.getY() - 1); |
146 |
|
|
} |
147 |
|
|
|
148 |
|
|
public void registerMap(Map<Location,Door> map) { |
149 |
|
|
map.put(leftUpper, this ); |
150 |
|
|
map.put(rightUpper, this ); |
151 |
|
|
map.put(leftLower, this ); |
152 |
|
|
map.put(rightLower, this ); |
153 |
|
|
} |
154 |
|
|
|
155 |
|
|
public void unregisterMap(Map<Location,Door> map) { |
156 |
|
|
map.remove(leftUpper); |
157 |
|
|
map.remove(rightUpper); |
158 |
|
|
map.remove(leftLower); |
159 |
|
|
map.remove(rightLower); |
160 |
|
|
} |
161 |
|
|
|
162 |
|
|
public void open(World world) { |
163 |
|
|
world.getBlockAt( leftUpper ).setTypeId( 0 ); |
164 |
|
|
world.getBlockAt( rightUpper ).setTypeId( 0 ); |
165 |
|
|
world.getBlockAt( leftLower ).setTypeId( 0 ); |
166 |
|
|
world.getBlockAt( rightLower ).setTypeId( 0 ); |
167 |
|
|
} |
168 |
|
|
|
169 |
|
|
public void close(World world) { |
170 |
|
|
world.getBlockAt( leftUpper ).setTypeId( material ); |
171 |
|
|
world.getBlockAt( rightUpper ).setTypeId( material ); |
172 |
|
|
world.getBlockAt( leftLower ).setTypeId( material ); |
173 |
|
|
world.getBlockAt( rightLower ).setTypeId( material ); |
174 |
|
|
} |
175 |
|
|
|
176 |
|
|
} |
177 |
|
|
|
178 |
|
|
} |