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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1528 - (hide annotations) (download)
Sun Jun 26 19:00:17 2011 UTC (12 years, 11 months ago) by torben
File size: 7050 byte(s)
save after doors are removed
1 torben 1525 package dk.thoerup.bukkit.hoeruputils;
2    
3 torben 1527 import java.io.File;
4     import java.io.FileNotFoundException;
5     import java.io.IOException;
6     import java.io.RandomAccessFile;
7    
8 torben 1525 import java.util.HashMap;
9 torben 1527 import java.util.LinkedList;
10 torben 1525 import java.util.Map;
11    
12     import org.bukkit.Effect;
13     import org.bukkit.Location;
14     import org.bukkit.Material;
15 torben 1527 import org.bukkit.Server;
16 torben 1525 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 torben 1527 LinkedList<Door> doors = new LinkedList<Door>();
31 torben 1525
32     private PlayerHandler handler = new PlayerHandler();
33    
34     Plugin plugin;
35    
36     public SecretDoor(Plugin plugin) {
37     this.plugin = plugin;
38 torben 1527
39     loadAll();
40 torben 1525 }
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 torben 1527 doors.remove(door);
53 torben 1528 saveAll();
54 torben 1525 }
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 torben 1527 doors.add(door);
73    
74 torben 1525 event.getPlayer().sendMessage("Secret door created");
75    
76     sign.setTypeId(0);
77 torben 1527
78     saveAll();
79 torben 1525 }
80     }
81    
82 torben 1527 private void saveAll() {
83     try {
84 torben 1525
85 torben 1527 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 torben 1525 class PlayerHandler extends PlayerListener {
126     @Override
127     public void onPlayerInteract(PlayerInteractEvent event) {
128    
129 torben 1526 Player player = event.getPlayer();
130 torben 1525
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 torben 1526 final World world = player.getWorld();
146     final Location loc = event.getClickedBlock().getLocation();
147    
148 torben 1525 door.open( player.getWorld() );
149    
150 torben 1526 world.playEffect( loc, Effect.DOOR_TOGGLE, 0);
151 torben 1525
152     Runnable doorCloser = new Runnable() {
153     public void run() {
154 torben 1526 door.close( world );
155     world.playEffect( loc, Effect.DOOR_TOGGLE, 0);
156 torben 1525 }
157     };
158    
159     player.getServer().getScheduler().scheduleSyncDelayedTask(plugin, doorCloser, 4*20);
160    
161     }
162     }
163    
164 torben 1527
165 torben 1525 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 torben 1527 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 torben 1525 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