1 |
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 |
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 |
final World world = player.getWorld(); |
88 |
final Location loc = event.getClickedBlock().getLocation(); |
89 |
|
90 |
door.open( player.getWorld() ); |
91 |
|
92 |
world.playEffect( loc, Effect.DOOR_TOGGLE, 0); |
93 |
|
94 |
Runnable doorCloser = new Runnable() { |
95 |
public void run() { |
96 |
door.close( world ); |
97 |
world.playEffect( loc, Effect.DOOR_TOGGLE, 0); |
98 |
} |
99 |
}; |
100 |
|
101 |
player.getServer().getScheduler().scheduleSyncDelayedTask(plugin, doorCloser, 4*20); |
102 |
|
103 |
} |
104 |
} |
105 |
|
106 |
class Door { |
107 |
Location leftUpper; |
108 |
Location rightUpper; |
109 |
Location leftLower; |
110 |
Location rightLower; |
111 |
|
112 |
int material; |
113 |
|
114 |
public Door(Block sign) { |
115 |
leftUpper = sign.getLocation().clone(); |
116 |
rightUpper = sign.getLocation().clone(); |
117 |
|
118 |
switch ( sign.getData() ) { |
119 |
case 2: //facing east |
120 |
leftUpper.setZ( leftUpper.getZ() + 1 ); |
121 |
rightUpper.setZ( rightUpper.getZ() + 1 ); |
122 |
rightUpper.setX( rightUpper.getX() - 1 ); |
123 |
break; |
124 |
case 3: //facing west |
125 |
leftUpper.setZ( leftUpper.getZ() - 1 ); |
126 |
rightUpper.setZ( rightUpper.getZ() - 1 ); |
127 |
rightUpper.setX( rightUpper.getX() + 1 ); |
128 |
break; |
129 |
case 4: //facing north |
130 |
leftUpper.setX( leftUpper.getX() + 1); |
131 |
rightUpper.setX( rightUpper.getX() + 1); |
132 |
rightUpper.setZ( rightUpper.getZ() + 1); |
133 |
break; |
134 |
case 5: //facing south |
135 |
leftUpper.setX( leftUpper.getX() - 1); |
136 |
rightUpper.setX( rightUpper.getX() - 1); |
137 |
rightUpper.setZ( rightUpper.getZ() - 1); |
138 |
break; |
139 |
} |
140 |
|
141 |
material = sign.getWorld().getBlockAt( leftUpper ).getTypeId(); |
142 |
|
143 |
leftLower = leftUpper.clone(); |
144 |
rightLower = rightUpper.clone(); |
145 |
|
146 |
leftLower.setY( leftLower.getY() - 1); |
147 |
rightLower.setY( rightLower.getY() - 1); |
148 |
} |
149 |
|
150 |
public void registerMap(Map<Location,Door> map) { |
151 |
map.put(leftUpper, this ); |
152 |
map.put(rightUpper, this ); |
153 |
map.put(leftLower, this ); |
154 |
map.put(rightLower, this ); |
155 |
} |
156 |
|
157 |
public void unregisterMap(Map<Location,Door> map) { |
158 |
map.remove(leftUpper); |
159 |
map.remove(rightUpper); |
160 |
map.remove(leftLower); |
161 |
map.remove(rightLower); |
162 |
} |
163 |
|
164 |
public void open(World world) { |
165 |
world.getBlockAt( leftUpper ).setTypeId( 0 ); |
166 |
world.getBlockAt( rightUpper ).setTypeId( 0 ); |
167 |
world.getBlockAt( leftLower ).setTypeId( 0 ); |
168 |
world.getBlockAt( rightLower ).setTypeId( 0 ); |
169 |
} |
170 |
|
171 |
public void close(World world) { |
172 |
world.getBlockAt( leftUpper ).setTypeId( material ); |
173 |
world.getBlockAt( rightUpper ).setTypeId( material ); |
174 |
world.getBlockAt( leftLower ).setTypeId( material ); |
175 |
world.getBlockAt( rightLower ).setTypeId( material ); |
176 |
} |
177 |
|
178 |
} |
179 |
|
180 |
} |