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

  ViewVC Help
Powered by ViewVC 1.1.20