/[projects]/miscJava/bukkit-minecraft-plugins/HoerupUtils/src/dk/thoerup/bukkit/hoeruputils/SecretDoor.java
ViewVC logotype

Contents of /miscJava/bukkit-minecraft-plugins/HoerupUtils/src/dk/thoerup/bukkit/hoeruputils/SecretDoor.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1528 - (show annotations) (download)
Sun Jun 26 19:00:17 2011 UTC (12 years, 10 months ago) by torben
File size: 7050 byte(s)
save after doors are removed
1 package dk.thoerup.bukkit.hoeruputils;
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.IOException;
6 import java.io.RandomAccessFile;
7
8 import java.util.HashMap;
9 import java.util.LinkedList;
10 import java.util.Map;
11
12 import org.bukkit.Effect;
13 import org.bukkit.Location;
14 import org.bukkit.Material;
15 import org.bukkit.Server;
16 import org.bukkit.World;
17 import org.bukkit.block.Block;
18 import org.bukkit.entity.Player;
19 import org.bukkit.event.block.BlockBreakEvent;
20 import org.bukkit.event.block.BlockListener;
21 import org.bukkit.event.block.SignChangeEvent;
22 import org.bukkit.event.player.PlayerListener;
23 import org.bukkit.event.player.PlayerInteractEvent;
24
25 import org.bukkit.plugin.Plugin;
26
27 public class SecretDoor extends BlockListener {
28
29 HashMap<Location,Door> doormap = new HashMap<Location,Door>();
30 LinkedList<Door> doors = new LinkedList<Door>();
31
32 private PlayerHandler handler = new PlayerHandler();
33
34 Plugin plugin;
35
36 public SecretDoor(Plugin plugin) {
37 this.plugin = plugin;
38
39 loadAll();
40 }
41
42 public PlayerListener getPlayerListener() {
43 return handler;
44 }
45
46 @Override
47 public void onBlockBreak(BlockBreakEvent event) {
48 Door door = doormap.get( event.getBlock().getLocation() );
49 if (door != null) {
50 event.getPlayer().sendMessage("Secret door broken");
51 door.unregisterMap(doormap);
52 doors.remove(door);
53 saveAll();
54 }
55 }
56
57 @Override
58 public void onSignChange(SignChangeEvent event) {
59
60 Block sign = event.getBlock();
61 World world = sign.getWorld();
62
63 if (sign.getTypeId() == 63) {
64 // don't react on floor signs
65 return;
66 }
67
68 if (event.getLine(0).toLowerCase().equals("secretdoor") ) {
69 Door door = new Door(sign);
70 door.registerMap(doormap);
71
72 doors.add(door);
73
74 event.getPlayer().sendMessage("Secret door created");
75
76 sign.setTypeId(0);
77
78 saveAll();
79 }
80 }
81
82 private void saveAll() {
83 try {
84
85 File f = new File( plugin.getDataFolder(), "secretdoors.csv");
86 RandomAccessFile out = new RandomAccessFile( f, "rw" );
87 out.setLength(0);
88
89 for (Door door : doors) {
90 out.writeBytes( door.toCsv() );
91 out.writeBytes( "\n");
92 }
93
94 out.close();
95 } catch (IOException e) {
96 System.out.println(e.getMessage() );
97 e.printStackTrace();
98 }
99 }
100
101 private void loadAll() {
102 try {
103 File f = new File( plugin.getDataFolder(), "secretdoors.csv");
104 RandomAccessFile in = new RandomAccessFile( f, "r" );
105
106 String line;
107 while ( (line = in.readLine() ) != null ) {
108 Door door = new Door(line, plugin.getServer() );
109 doors.add( door );
110 door.registerMap( doormap );
111 }
112 in.close();
113
114 }
115 catch (FileNotFoundException fnfe) {
116 return;
117 }
118 catch (IOException e) {
119 System.out.println(e.getMessage() );
120 e.printStackTrace();
121 }
122 }
123
124
125 class PlayerHandler extends PlayerListener {
126 @Override
127 public void onPlayerInteract(PlayerInteractEvent event) {
128
129 Player player = event.getPlayer();
130
131 if ( player.getItemInHand().getType() != Material.AIR ) {
132 return;
133 }
134
135 if ( event.hasBlock() == false ) {
136 return;
137 }
138
139 final Door door = doormap.get( event.getClickedBlock().getLocation() );
140
141 if (door == null) {
142 return;
143 }
144
145 final World world = player.getWorld();
146 final Location loc = event.getClickedBlock().getLocation();
147
148 door.open( player.getWorld() );
149
150 world.playEffect( loc, Effect.DOOR_TOGGLE, 0);
151
152 Runnable doorCloser = new Runnable() {
153 public void run() {
154 door.close( world );
155 world.playEffect( loc, Effect.DOOR_TOGGLE, 0);
156 }
157 };
158
159 player.getServer().getScheduler().scheduleSyncDelayedTask(plugin, doorCloser, 4*20);
160
161 }
162 }
163
164
165 class Door {
166 Location leftUpper;
167 Location rightUpper;
168 Location leftLower;
169 Location rightLower;
170
171 int material;
172
173 public Door(Block sign) {
174 leftUpper = sign.getLocation().clone();
175 rightUpper = sign.getLocation().clone();
176
177 switch ( sign.getData() ) {
178 case 2: //facing east
179 leftUpper.setZ( leftUpper.getZ() + 1 );
180 rightUpper.setZ( rightUpper.getZ() + 1 );
181 rightUpper.setX( rightUpper.getX() - 1 );
182 break;
183 case 3: //facing west
184 leftUpper.setZ( leftUpper.getZ() - 1 );
185 rightUpper.setZ( rightUpper.getZ() - 1 );
186 rightUpper.setX( rightUpper.getX() + 1 );
187 break;
188 case 4: //facing north
189 leftUpper.setX( leftUpper.getX() + 1);
190 rightUpper.setX( rightUpper.getX() + 1);
191 rightUpper.setZ( rightUpper.getZ() + 1);
192 break;
193 case 5: //facing south
194 leftUpper.setX( leftUpper.getX() - 1);
195 rightUpper.setX( rightUpper.getX() - 1);
196 rightUpper.setZ( rightUpper.getZ() - 1);
197 break;
198 }
199
200 material = sign.getWorld().getBlockAt( leftUpper ).getTypeId();
201
202 leftLower = leftUpper.clone();
203 rightLower = rightUpper.clone();
204
205 leftLower.setY( leftLower.getY() - 1);
206 rightLower.setY( rightLower.getY() - 1);
207 }
208
209 public Door(String input, Server server) {
210 String parts[] = input.split(":");
211
212 World w = server.getWorld( parts[0] );
213
214 leftUpper = new Location(w, Integer.parseInt(parts[1]), Integer.parseInt(parts[2]), Integer.parseInt(parts[3]) );
215 rightUpper = new Location(w, Integer.parseInt(parts[4]), Integer.parseInt(parts[5]), Integer.parseInt(parts[6]) );
216 leftLower = new Location(w, Integer.parseInt(parts[7]), Integer.parseInt(parts[8]), Integer.parseInt(parts[9]) );
217 rightLower = new Location(w, Integer.parseInt(parts[10]), Integer.parseInt(parts[11]), Integer.parseInt(parts[12]) );
218 material = Integer.parseInt( parts[13] );
219 }
220
221 public String toCsv() {
222 StringBuilder sb = new StringBuilder();
223 sb.append( leftUpper.getWorld().getName() );
224
225 sb.append( ":" + leftUpper.getBlockX() );
226 sb.append( ":" + leftUpper.getBlockY() );
227 sb.append( ":" + leftUpper.getBlockZ() );
228
229 sb.append( ":" + rightUpper.getBlockX() );
230 sb.append( ":" + rightUpper.getBlockY() );
231 sb.append( ":" + rightUpper.getBlockZ() );
232
233
234 sb.append( ":" + leftLower.getBlockX() );
235 sb.append( ":" + leftLower.getBlockY() );
236 sb.append( ":" + leftLower.getBlockZ() );
237
238
239 sb.append( ":" + rightLower.getBlockX() );
240 sb.append( ":" + rightLower.getBlockY() );
241 sb.append( ":" + rightLower.getBlockZ() );
242
243 sb.append( ":" + material );
244
245 return sb.toString();
246 }
247
248
249 public void registerMap(Map<Location,Door> map) {
250 map.put(leftUpper, this );
251 map.put(rightUpper, this );
252 map.put(leftLower, this );
253 map.put(rightLower, this );
254 }
255
256 public void unregisterMap(Map<Location,Door> map) {
257 map.remove(leftUpper);
258 map.remove(rightUpper);
259 map.remove(leftLower);
260 map.remove(rightLower);
261 }
262
263 public void open(World world) {
264 world.getBlockAt( leftUpper ).setTypeId( 0 );
265 world.getBlockAt( rightUpper ).setTypeId( 0 );
266 world.getBlockAt( leftLower ).setTypeId( 0 );
267 world.getBlockAt( rightLower ).setTypeId( 0 );
268 }
269
270 public void close(World world) {
271 world.getBlockAt( leftUpper ).setTypeId( material );
272 world.getBlockAt( rightUpper ).setTypeId( material );
273 world.getBlockAt( leftLower ).setTypeId( material );
274 world.getBlockAt( rightLower ).setTypeId( material );
275 }
276
277 }
278
279 }

  ViewVC Help
Powered by ViewVC 1.1.20