Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
1package org.bukkit.craftbukkit.event;
2
3import net.minecraft.server.*;
4import org.bukkit.Bukkit;
5import org.bukkit.Material;
6import org.bukkit.block.Block;
7import org.bukkit.block.BlockFace;
8import org.bukkit.block.BlockState;
9import org.bukkit.craftbukkit.CraftServer;
10import org.bukkit.craftbukkit.CraftWorld;
11import org.bukkit.craftbukkit.block.CraftBlock;
12import org.bukkit.craftbukkit.inventory.CraftItemStack;
13import org.bukkit.entity.AnimalTamer;
14import org.bukkit.entity.CreatureType;
15import org.bukkit.entity.Player;
16import org.bukkit.event.Event.Type;
17import org.bukkit.event.block.*;
18import org.bukkit.event.entity.CreatureSpawnEvent;
19import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
20import org.bukkit.event.entity.EntityTameEvent;
21import org.bukkit.event.entity.ItemDespawnEvent;
22import org.bukkit.event.entity.ItemSpawnEvent;
23import org.bukkit.event.player.PlayerBucketEmptyEvent;
24import org.bukkit.event.player.PlayerBucketFillEvent;
25import org.bukkit.event.player.PlayerEvent;
26import org.bukkit.event.player.PlayerInteractEvent;
27
28public class CraftEventFactory {
29 private static boolean canBuild(CraftWorld world, Player player, int x, int z) {
30 WorldServer worldServer = world.getHandle();
31 int spawnSize = Bukkit.getServer().getSpawnRadius();
32
33 if (spawnSize <= 0) return true;
34 if (player.isOp()) return true;
35
36 ChunkCoordinates chunkcoordinates = worldServer.getSpawn();
37
38 int distanceFromSpawn = (int) Math.max(Math.abs(x - chunkcoordinates.x), Math.abs(z - chunkcoordinates.z));
39 return distanceFromSpawn > spawnSize;
40 }
41
42 /**
43 * Block place methods
44 */
45 public static BlockPlaceEvent callBlockPlaceEvent(World world, EntityHuman who, BlockState replacedBlockState, int clickedX, int clickedY, int clickedZ, int type) {
46 return callBlockPlaceEvent(world, who, replacedBlockState, clickedX, clickedY, clickedZ, net.minecraft.server.Block.byId[type]);
47 }
48
49 public static BlockBreakEvent callBlockBreakEvent(EntityHuman who, int x, int y, int z) {
50 Player player = (who == null) ? null : (Player) who.getBukkitEntity();
51
52 CraftWorld craftWorld = (CraftWorld) player.getWorld();
53 CraftServer craftServer = (CraftServer) player.getServer();
54
55 Block blockClicked = craftWorld.getBlockAt(x, y, z);
56
57 BlockBreakEvent event = new BlockBreakEvent(blockClicked, player);
58 craftServer.getPluginManager().callEvent(event);
59
60 return event;
61 }
62
63 public static BlockPlaceEvent callBlockPlaceEvent(World world, EntityHuman who, BlockState replacedBlockState, int clickedX, int clickedY, int clickedZ, net.minecraft.server.Block block) {
64 return callBlockPlaceEvent(world, who, replacedBlockState, clickedX, clickedY, clickedZ, new ItemStack(block));
65 }
66
67 public static BlockPlaceEvent callBlockPlaceEvent(World world, EntityHuman who, BlockState replacedBlockState, int clickedX, int clickedY, int clickedZ, ItemStack itemstack) {
68 CraftWorld craftWorld = ((WorldServer) world).getWorld();
69 CraftServer craftServer = ((WorldServer) world).getServer();
70
71 Player player = (who == null) ? null : (Player) who.getBukkitEntity();
72 CraftItemStack itemInHand = new CraftItemStack(itemstack);
73
74 Block blockClicked = craftWorld.getBlockAt(clickedX, clickedY, clickedZ);
75 Block placedBlock = replacedBlockState.getBlock();
76
77 boolean canBuild = canBuild(craftWorld, player, placedBlock.getX(), placedBlock.getZ());
78
79 BlockPlaceEvent event = new BlockPlaceEvent(placedBlock, replacedBlockState, blockClicked, itemInHand, player, canBuild);
80 craftServer.getPluginManager().callEvent(event);
81
82 return event;
83 }
84
85 /**
86 * Bucket methods
87 */
88 public static PlayerBucketEmptyEvent callPlayerBucketEmptyEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemInHand) {
89 return (PlayerBucketEmptyEvent) getPlayerBucketEvent(Type.PLAYER_BUCKET_EMPTY, who, clickedX, clickedY, clickedZ, clickedFace, itemInHand, Item.BUCKET);
90 }
91
92 public static PlayerBucketFillEvent callPlayerBucketFillEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemInHand, net.minecraft.server.Item bucket) {
93 return (PlayerBucketFillEvent) getPlayerBucketEvent(Type.PLAYER_BUCKET_FILL, who, clickedX, clickedY, clickedZ, clickedFace, itemInHand, bucket);
94 }
95
96 private static PlayerEvent getPlayerBucketEvent(Type type, EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemstack, net.minecraft.server.Item item) {
97 Player player = (who == null) ? null : (Player) who.getBukkitEntity();
98 CraftItemStack itemInHand = new CraftItemStack(new ItemStack(item));
99 Material bucket = Material.getMaterial(itemstack.id);
100
101 CraftWorld craftWorld = (CraftWorld) player.getWorld();
102 CraftServer craftServer = (CraftServer) player.getServer();
103
104 Block blockClicked = craftWorld.getBlockAt(clickedX, clickedY, clickedZ);
105 BlockFace blockFace = CraftBlock.notchToBlockFace(clickedFace);
106
107 PlayerEvent event = null;
108 if (type == Type.PLAYER_BUCKET_EMPTY) {
109 event = new PlayerBucketEmptyEvent(player, blockClicked, blockFace, bucket, itemInHand);
110 ((PlayerBucketEmptyEvent) event).setCancelled(!canBuild(craftWorld, player, clickedX, clickedZ));
111 } else if (type == Type.PLAYER_BUCKET_FILL) {
112 event = new PlayerBucketFillEvent(player, blockClicked, blockFace, bucket, itemInHand);
113 ((PlayerBucketFillEvent) event).setCancelled(!canBuild(craftWorld, player, clickedX, clickedZ));
114 }
115
116 craftServer.getPluginManager().callEvent(event);
117
118 return event;
119 }
120
121 /**
122 * Player Interact event
123 */
124
125 public static PlayerInteractEvent callPlayerInteractEvent(EntityHuman who, Action action, ItemStack itemstack) {
126 if (action != Action.LEFT_CLICK_AIR && action != Action.RIGHT_CLICK_AIR) {
127 throw new IllegalArgumentException();
128 }
129 return callPlayerInteractEvent(who, action, 0, 255, 0, 0, itemstack);
130 }
131
132 public static PlayerInteractEvent callPlayerInteractEvent(EntityHuman who, Action action, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemstack) {
133 Player player = (who == null) ? null : (Player) who.getBukkitEntity();
134 CraftItemStack itemInHand = new CraftItemStack(itemstack);
135
136 CraftWorld craftWorld = (CraftWorld) player.getWorld();
137 CraftServer craftServer = (CraftServer) player.getServer();
138
139 Block blockClicked = craftWorld.getBlockAt(clickedX, clickedY, clickedZ);
140 BlockFace blockFace = CraftBlock.notchToBlockFace(clickedFace);
141
142 if (clickedY == 255) {
143 blockClicked = null;
144 switch (action) {
145 case LEFT_CLICK_BLOCK:
146 action = Action.LEFT_CLICK_AIR;
147 break;
148 case RIGHT_CLICK_BLOCK:
149 action = Action.RIGHT_CLICK_AIR;
150 break;
151 }
152 }
153
154 if (itemInHand.getType() == Material.AIR || itemInHand.getAmount() == 0) {
155 itemInHand = null;
156 }
157
158 PlayerInteractEvent event = new PlayerInteractEvent(player, action, itemInHand, blockClicked, blockFace);
159 craftServer.getPluginManager().callEvent(event);
160
161 return event;
162 }
163
164 /**
165 * BlockDamageEvent
166 */
167 public static BlockDamageEvent callBlockDamageEvent(EntityHuman who, int x, int y, int z, ItemStack itemstack, boolean instaBreak) {
168 Player player = (who == null) ? null : (Player) who.getBukkitEntity();
169 CraftItemStack itemInHand = new CraftItemStack(itemstack);
170
171 CraftWorld craftWorld = (CraftWorld) player.getWorld();
172 CraftServer craftServer = (CraftServer) player.getServer();
173
174 Block blockClicked = craftWorld.getBlockAt(x, y, z);
175
176 BlockDamageEvent event = new BlockDamageEvent(player, blockClicked, itemInHand, instaBreak);
177 craftServer.getPluginManager().callEvent(event);
178
179 return event;
180 }
181
182 /**
183 * CreatureSpawnEvent
184 */
185 public static CreatureSpawnEvent callCreatureSpawnEvent(EntityLiving entityliving, SpawnReason spawnReason) {
186 org.bukkit.entity.Entity entity = entityliving.getBukkitEntity();
187 CraftServer craftServer = (CraftServer) entity.getServer();
188
189 CreatureType type = null;
190
191 if (entityliving instanceof EntityChicken) {
192 type = CreatureType.CHICKEN;
193 } else if (entityliving instanceof EntityCow) {
194 type = CreatureType.COW;
195 } else if (entityliving instanceof EntityCreeper) {
196 type = CreatureType.CREEPER;
197 } else if (entityliving instanceof EntityGhast) {
198 type = CreatureType.GHAST;
199 } else if (entityliving instanceof EntityGiantZombie) {
200 type = CreatureType.GIANT;
201 } else if (entityliving instanceof EntityWolf) {
202 type = CreatureType.WOLF;
203 } else if (entityliving instanceof EntityPig) {
204 type = CreatureType.PIG;
205 } else if (entityliving instanceof EntityPigZombie) {
206 type = CreatureType.PIG_ZOMBIE;
207 } else if (entityliving instanceof EntitySheep) {
208 type = CreatureType.SHEEP;
209 } else if (entityliving instanceof EntitySkeleton) {
210 type = CreatureType.SKELETON;
211 } else if (entityliving instanceof EntitySlime) {
212 type = CreatureType.SLIME;
213 } else if (entityliving instanceof EntitySpider) {
214 type = CreatureType.SPIDER;
215 } else if (entityliving instanceof EntitySquid) {
216 type = CreatureType.SQUID;
217 } else if (entityliving instanceof EntityZombie) {
218 type = CreatureType.ZOMBIE;
219 // Supertype of many, last!
220 } else if (entityliving instanceof EntityMonster) {
221 type = CreatureType.MONSTER;
222 }
223
224 CreatureSpawnEvent event = new CreatureSpawnEvent(entity, type, entity.getLocation(), spawnReason);
225 craftServer.getPluginManager().callEvent(event);
226 return event;
227 }
228
229 /**
230 * EntityTameEvent
231 */
232 public static EntityTameEvent callEntityTameEvent(EntityLiving entity, EntityHuman tamer) {
233 org.bukkit.entity.Entity bukkitEntity = entity.getBukkitEntity();
234 org.bukkit.entity.AnimalTamer bukkitTamer = (tamer != null ? (AnimalTamer) tamer.getBukkitEntity() : null);
235 CraftServer craftServer = (CraftServer) bukkitEntity.getServer();
236
237 EntityTameEvent event = new EntityTameEvent(bukkitEntity, bukkitTamer);
238 craftServer.getPluginManager().callEvent(event);
239 return event;
240 }
241
242 /**
243 * ItemSpawnEvent
244 */
245 public static ItemSpawnEvent callItemSpawnEvent(EntityItem entityitem) {
246 org.bukkit.entity.Entity entity = entityitem.getBukkitEntity();
247 CraftServer craftServer = (CraftServer) entity.getServer();
248
249 ItemSpawnEvent event = new ItemSpawnEvent(entity, entity.getLocation());
250
251 craftServer.getPluginManager().callEvent(event);
252 return event;
253 }
254
255 /**
256 * BlockFadeEvent
257 */
258 public static BlockFadeEvent callBlockFadeEvent(Block block, int type) {
259 BlockState state = block.getState();
260 state.setTypeId(type);
261
262 BlockFadeEvent event = new BlockFadeEvent(block, state);
263 Bukkit.getPluginManager().callEvent(event);
264 return event;
265 }
266
267 /**
268 * ItemDespawnEvent
269 */
270 public static ItemDespawnEvent callItemDespawnEvent(EntityItem entityitem) {
271 org.bukkit.entity.Entity entity = entityitem.getBukkitEntity();
272
273 ItemDespawnEvent event = new ItemDespawnEvent(entity, entity.getLocation());
274
275 ((CraftServer) entity.getServer()).getPluginManager().callEvent(event);
276 return event;
277 }
278}