From 18c1b498fbfed0b08a69f6cc4ff90ff7c07aa47f Mon Sep 17 00:00:00 2001 From: taoneill Date: Sun, 6 Feb 2011 12:49:22 -0500 Subject: [PATCH] Closes 23. Closes 24. Closes 30. Death by lava seems to work ok on my side. Inventories get reset and signs as well. Fixed tp error with drowning deaths - weird workaround. Fire is extinguished back at the player spawn. --- war/.classpath | 2 + war/pom.xml | 42 +++++++++----- .../main/java/bukkit/tommytony/war/War.java | 2 + .../tommytony/war/WarEntityListener.java | 56 +++++++++++++++++++ .../main/java/com/tommytony/war/Warzone.java | 25 ++++++++- 5 files changed, 111 insertions(+), 16 deletions(-) diff --git a/war/.classpath b/war/.classpath index 9b0cd72..5c03e74 100644 --- a/war/.classpath +++ b/war/.classpath @@ -5,5 +5,7 @@ + + diff --git a/war/pom.xml b/war/pom.xml index 7876079..3b8c196 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -1,25 +1,39 @@ - + 4.0.0 com.tommytony war - 0.0.1-SNAPSHOT + 0.8 jar - war - http://maven.apache.org - - - UTF-8 - - + War + http://war.tommytony.com + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0.2 + + 1.5 + 1.5 + + + + - junit - junit - 3.8.1 - test + org.bukkit + bukkit + 0.0.1-SNAPSHOT + jar + compile + + + org.bukkit + craftbukkit + 0.0.1-SNAPSHOT + compile diff --git a/war/src/main/java/bukkit/tommytony/war/War.java b/war/src/main/java/bukkit/tommytony/war/War.java index 34660bd..eb15ec5 100644 --- a/war/src/main/java/bukkit/tommytony/war/War.java +++ b/war/src/main/java/bukkit/tommytony/war/War.java @@ -105,6 +105,8 @@ public class War extends JavaPlugin { pm.registerEvent(Event.Type.ENTITY_DAMAGEDBY_PROJECTILE, entityListener, Priority.Normal, this); pm.registerEvent(Event.Type.ENTITY_EXPLODE, entityListener, Priority.Normal, this); pm.registerEvent(Event.Type.ENTITY_DEATH, entityListener, Priority.Normal, this); + pm.registerEvent(Event.Type.ENTITY_DAMAGED, entityListener, Priority.Normal, this); + pm.registerEvent(Event.Type.ENTITY_COMBUST, entityListener, Priority.Normal, this); pm.registerEvent(Event.Type.BLOCK_PLACED, blockListener, Priority.Normal, this); pm.registerEvent(Event.Type.BLOCK_DAMAGED, blockListener, Priority.Normal, this); diff --git a/war/src/main/java/bukkit/tommytony/war/WarEntityListener.java b/war/src/main/java/bukkit/tommytony/war/WarEntityListener.java index 8bcc681..0dd37e7 100644 --- a/war/src/main/java/bukkit/tommytony/war/WarEntityListener.java +++ b/war/src/main/java/bukkit/tommytony/war/WarEntityListener.java @@ -4,13 +4,17 @@ import java.util.ArrayList; import java.util.List; import org.bukkit.block.Block; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByProjectileEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityListener; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerMoveEvent; import com.tommytony.war.Team; @@ -260,6 +264,58 @@ public class WarEntityListener extends EntityListener { // } //} } + + public void onEntityDamage(EntityDamageEvent event) { + if(event.getCause() == DamageCause.FIRE_TICK) { + Entity entity = event.getEntity(); + if(entity instanceof Player) { + Player player = (Player) entity; + Team team = war.getPlayerTeam(player.getName()); + if(team != null && team.getSpawnVolume().contains(player.getLocation())) { + // smother out the fire that didn't burn out when you respawned + // Stop fire (upcast, watch out!) + if(player instanceof CraftPlayer) { + net.minecraft.server.Entity playerEntity = ((CraftPlayer)player).getHandle(); + playerEntity.fireTicks = 0; +// playerEntity.r(); // force refresh (?) + } + event.setCancelled(true); + } + + } + + } else if (event.getCause() == DamageCause.DROWNING) { + Entity entity = event.getEntity(); + if(entity instanceof Player) { + Player player = (Player) entity; + Team team = war.getPlayerTeam(player.getName()); + if(team != null && player.getHealth() <= 0) { + // don't keep killing drowing player: trying to stop "Player moved wrongly!" error at respawn. + event.setCancelled(true); + } + + } + } + } + + public void onEntityCombust(EntityCombustEvent event) { + Entity entity = event.getEntity(); + if(entity instanceof Player) { + Player player = (Player) entity; + Team team = war.getPlayerTeam(player.getName()); + if(team != null && team.getSpawnVolume().contains(player.getLocation())) { + // smother out the fire that didn't burn out when you respawned + //Stop fire (upcast, watch out!) + if(player instanceof CraftPlayer) { + net.minecraft.server.Entity playerEntity = ((CraftPlayer)player).getHandle(); + playerEntity.fireTicks = 0; +// playerEntity.r(); // force refresh (?) + } + event.setCancelled(true); + } + + } + } // private void handleDeath(Player player, Warzone playerWarzone, Team playerTeam) { diff --git a/war/src/main/java/com/tommytony/war/Warzone.java b/war/src/main/java/com/tommytony/war/Warzone.java index 14fbbcd..885d47d 100644 --- a/war/src/main/java/com/tommytony/war/Warzone.java +++ b/war/src/main/java/com/tommytony/war/Warzone.java @@ -3,11 +3,14 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import net.minecraft.server.Entity; + import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.inventory.ItemStack; @@ -358,13 +361,13 @@ public class Warzone { public void respawnPlayer(Team team, Player player) { handleRespawn(team, player); - player.teleportTo(team.getTeamSpawn()); + } public void respawnPlayer(PlayerMoveEvent event, Team team, Player player) { event.setFrom(team.getTeamSpawn()); handleRespawn(team, player); - player.teleportTo(team.getTeamSpawn()); + event.setCancelled(true); } @@ -400,7 +403,25 @@ public class Warzone { playerInv.setHelmet(new ItemStack(Material.IRON_HELMET)); } } + + // Fill hp player.setHealth(20); + + // Teleport the player back to spawn + Location playerLoc = player.getLocation(); + int x = playerLoc.getBlockX(); + int y = playerLoc.getBlockY(); + int z = playerLoc.getBlockZ(); + Block playerBlock = world.getBlockAt(x, y, z).getFace(BlockFace.UP); + Material playerBlockType = playerBlock.getType(); + if(playerBlockType.getId() == Material.WATER.getId() + || playerBlockType.getId() == Material.STATIONARY_WATER.getId()) { + // If in water, make arbitrary adjustments to fix drowning deaths causing "Player moved wrongly!" error + player.teleportTo(new Location(playerLoc.getWorld(), + team.getTeamSpawn().getX(), team.getTeamSpawn().getY() + 3, team.getTeamSpawn().getZ())); + } else { + player.teleportTo(team.getTeamSpawn()); + } } public boolean isMonumentCenterBlock(Block block) {