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

  ViewVC Help
Powered by ViewVC 1.1.20