/[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 1527 - (hide annotations) (download)
Sun Jun 26 16:01:09 2011 UTC (12 years, 11 months ago) by torben
File size: 7036 byte(s)
add persistance
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 1525 }
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 torben 1527 doors.add(door);
72    
73 torben 1525 event.getPlayer().sendMessage("Secret door created");
74    
75     sign.setTypeId(0);
76 torben 1527
77     saveAll();
78 torben 1525 }
79     }
80    
81 torben 1527 private void saveAll() {
82     try {
83 torben 1525
84 torben 1527 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 torben 1525 class PlayerHandler extends PlayerListener {
125     @Override
126     public void onPlayerInteract(PlayerInteractEvent event) {
127    
128 torben 1526 Player player = event.getPlayer();
129 torben 1525
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 torben 1526 final World world = player.getWorld();
145     final Location loc = event.getClickedBlock().getLocation();
146    
147 torben 1525 door.open( player.getWorld() );
148    
149 torben 1526 world.playEffect( loc, Effect.DOOR_TOGGLE, 0);
150 torben 1525
151     Runnable doorCloser = new Runnable() {
152     public void run() {
153 torben 1526 door.close( world );
154     world.playEffect( loc, Effect.DOOR_TOGGLE, 0);
155 torben 1525 }
156     };
157    
158     player.getServer().getScheduler().scheduleSyncDelayedTask(plugin, doorCloser, 4*20);
159    
160     }
161     }
162    
163 torben 1527
164 torben 1525 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 torben 1527 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 torben 1525 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