Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
at develop 278 lines 12 kB view raw
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}