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

  ViewVC Help
Powered by ViewVC 1.1.20