diff --git a/war/src/main/java/bukkit/tommytony/war/War.java b/war/src/main/java/bukkit/tommytony/war/War.java index 848b2f8..665ac37 100644 --- a/war/src/main/java/bukkit/tommytony/war/War.java +++ b/war/src/main/java/bukkit/tommytony/war/War.java @@ -98,10 +98,11 @@ public class War extends JavaPlugin { pm.registerEvent(Event.Type.PLAYER_LOGIN, playerListener, Priority.Monitor, this); pm.registerEvent(Event.Type.PLAYER_QUIT, playerListener, Priority.Monitor, this); - pm.registerEvent(Event.Type.PLAYER_MOVE, playerListener, Priority.Highest, this); + pm.registerEvent(Event.Type.PLAYER_MOVE, playerListener, Priority.Normal, this); - pm.registerEvent(Event.Type.ENTITY_DAMAGEDBY_ENTITY, entityListener, Priority.Highest, this); - pm.registerEvent(Event.Type.ENTITY_DAMAGED, entityListener, Priority.Highest, this); + pm.registerEvent(Event.Type.ENTITY_DAMAGEDBY_ENTITY, entityListener, Priority.High, this); + pm.registerEvent(Event.Type.ENTITY_DAMAGED, entityListener, Priority.High, this); + pm.registerEvent(Event.Type.ENTITY_DAMAGEDBY_PROJECTILE, entityListener, Priority.High, this); pm.registerEvent(Event.Type.BLOCK_PLACED, blockListener, Priority.Normal, this); pm.registerEvent(Event.Type.BLOCK_DAMAGED, blockListener, Priority.Normal, this); @@ -867,7 +868,6 @@ public class War extends JavaPlugin { getZoneMakersImpersonatingPlayers().add(player.getName()); } } - zoneMakerNames.remove(player.getName()); player.sendMessage(str("You are now impersonating a regular player. Type /zonemaker again to toggle back to war maker mode.")); } @@ -1108,11 +1108,17 @@ public class War extends JavaPlugin { } public boolean isZoneMaker(Player player) { - for(String zoneMaker : zoneMakerNames) { - if(zoneMaker.equals(player.getName())) return true; + boolean isPlayerImpersonator = false; + for(String disguised : zoneMakersImpersonatingPlayers) { + if(disguised.equals(player.getName())) isPlayerImpersonator = true; } - if(Permissions != null && Permissions.Security.permission(player, "war.*")) { - return true; + if(!isPlayerImpersonator) { + for(String zoneMaker : zoneMakerNames) { + if(zoneMaker.equals(player.getName())) return true; + } + if(Permissions != null && Permissions.Security.permission(player, "war.*")) { + return true; + } } return false; } diff --git a/war/src/main/java/bukkit/tommytony/war/WarEntityListener.java b/war/src/main/java/bukkit/tommytony/war/WarEntityListener.java index 0b0462f..1950751 100644 --- a/war/src/main/java/bukkit/tommytony/war/WarEntityListener.java +++ b/war/src/main/java/bukkit/tommytony/war/WarEntityListener.java @@ -7,6 +7,7 @@ import java.util.List; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageByProjectileEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityListener; @@ -64,6 +65,8 @@ public class WarEntityListener extends EntityListener { if(attackerTeam != null && defenderTeam != null && attackerTeam != defenderTeam && attackerWarzone == defenderWarzone) { + // Make sure one of the players isn't in the spawn + if(!defenderTeam.getVolume().contains(d.getLocation())){ // A real attack: handle death scenario. ==> now handled in entity damage as well //synchronized(d) { if(d.getHealth() <= 0) { @@ -87,6 +90,11 @@ public class WarEntityListener extends EntityListener { handleDeath(d, defenderWarzone, defenderTeam); event.setCancelled(true); } + } + else { // attacking person in spawn + a.sendMessage(war.str("Can't attack a player that's inside his team's spawn.")); + event.setCancelled(true); + } //} } else if (attackerTeam != null && defenderTeam != null && attackerTeam == defenderTeam @@ -122,6 +130,9 @@ public class WarEntityListener extends EntityListener { } } + public void onEntityDamageByProjectile(EntityDamageByProjectileEvent event) { + } + private void handleDeath(Player player, Warzone playerWarzone, Team playerTeam) { // teleport to team spawn upon death player.sendMessage(war.str("You died.")); diff --git a/war/src/main/java/bukkit/tommytony/war/WarPlayerListener.java b/war/src/main/java/bukkit/tommytony/war/WarPlayerListener.java index 19eeb5f..b83f107 100644 --- a/war/src/main/java/bukkit/tommytony/war/WarPlayerListener.java +++ b/war/src/main/java/bukkit/tommytony/war/WarPlayerListener.java @@ -59,21 +59,22 @@ public class WarPlayerListener extends PlayerListener { public void onPlayerMove(PlayerMoveEvent event) { Player player = event.getPlayer(); - Location from = event.getFrom(); + Location playerLoc = event.getFrom(); // same as player.getLoc. Don't call again we need same result. + //Location from = event.getFrom(); Warzone locZone = null; ZoneLobby locLobby = null; - if(from != null) { - locZone = war.warzone(from); - locLobby = war.lobby(from); - } + //if(from != null) { + locZone = war.warzone(playerLoc); + locLobby = war.lobby(playerLoc); + //} // synchronized(player) { - Location to = event.getTo(); + //Location to = event.getTo(); boolean canPlay = war.canPlayWar(player); boolean isMaker = war.isZoneMaker(player); // Zone walls - if(!isMaker && to != null) { // zone makers don't get bothered with guard walls - Warzone nearbyZone = war.zoneOfZoneWallAtProximity(to); + if(!isMaker) { // zone makers don't get bothered with guard walls + Warzone nearbyZone = war.zoneOfZoneWallAtProximity(playerLoc); if(nearbyZone != null) { nearbyZone.protectZoneWallAgainstPlayer(player); } else { @@ -89,7 +90,7 @@ public class WarPlayerListener extends PlayerListener { boolean enteredGate = false; // Warzone lobby gates - if(locLobby != null && to != null) { + if(locLobby != null) { Warzone zone = locLobby.getZone(); Team oldTeam = war.getPlayerTeam(player.getName()); boolean isAutoAssignGate = false; @@ -97,7 +98,7 @@ public class WarPlayerListener extends PlayerListener { boolean isIronGate = false; boolean isGoldGate = false; if(oldTeam == null && canPlay) { // trying to counter spammy player move - isAutoAssignGate = zone.getLobby().isAutoAssignGate(to); + isAutoAssignGate = zone.getLobby().isAutoAssignGate(playerLoc); if(isAutoAssignGate) { enteredGate = true; dropFromOldTeamIfAny(player); @@ -110,15 +111,15 @@ public class WarPlayerListener extends PlayerListener { //zone.autoAssign(player); //event.setCancelled(true); } else { - event.setTo(zone.getTeleport()); - //player.teleportTo(zone.getTeleport()); - //event.setCancelled(true); + event.setFrom(zone.getTeleport()); + player.teleportTo(zone.getTeleport()); + event.setCancelled(true); player.sendMessage("All teams are full."); } return; } - isDiamondGate = zone.getLobby().isInTeamGate(TeamMaterials.TEAMDIAMOND, to); + isDiamondGate = zone.getLobby().isInTeamGate(TeamMaterials.TEAMDIAMOND, playerLoc); if (isDiamondGate){ enteredGate = true; dropFromOldTeamIfAny(player); @@ -135,15 +136,15 @@ public class WarPlayerListener extends PlayerListener { team.teamcast(war.str("" + player.getName() + " joined team diamond.")); } } else { - event.setTo(zone.getTeleport()); - //player.teleportTo(zone.getTeleport()); - //event.setCancelled(true); + event.setFrom(zone.getTeleport()); + player.teleportTo(zone.getTeleport()); + event.setCancelled(true); player.sendMessage("Team diamond is full."); } return; } - isIronGate = zone.getLobby().isInTeamGate(TeamMaterials.TEAMIRON, to); + isIronGate = zone.getLobby().isInTeamGate(TeamMaterials.TEAMIRON, playerLoc); if (isIronGate){ enteredGate = true; dropFromOldTeamIfAny(player); @@ -160,15 +161,15 @@ public class WarPlayerListener extends PlayerListener { team.teamcast(war.str("" + player.getName() + " joined team iron.")); } } else { - event.setTo(zone.getTeleport()); -// player.teleportTo(zone.getTeleport()); -// event.setCancelled(true); + event.setFrom(zone.getTeleport()); + player.teleportTo(zone.getTeleport()); + event.setCancelled(true); player.sendMessage("Team iron is full."); } return; } - isGoldGate = zone.getLobby().isInTeamGate(TeamMaterials.TEAMGOLD, to); + isGoldGate = zone.getLobby().isInTeamGate(TeamMaterials.TEAMGOLD, playerLoc); if (isGoldGate){ enteredGate = true; dropFromOldTeamIfAny(player); @@ -185,28 +186,28 @@ public class WarPlayerListener extends PlayerListener { team.teamcast(war.str("" + player.getName() + " joined team gold.")); } } else { - event.setTo(zone.getTeleport()); -// player.teleportTo(zone.getTeleport()); -// event.setCancelled(true); + event.setFrom(zone.getTeleport()); + player.teleportTo(zone.getTeleport()); + event.setCancelled(true); player.sendMessage("Team gold is full."); } return; } - if (zone.getLobby().isInWarHubLinkGate(to)){ + if (zone.getLobby().isInWarHubLinkGate(playerLoc)){ enteredGate = true; dropFromOldTeamIfAny(player); - event.setTo(war.getWarHub().getLocation()); -// player.teleportTo(war.getWarHub().getLocation()); -// event.setCancelled(true); + event.setFrom(war.getWarHub().getLocation()); + player.teleportTo(war.getWarHub().getLocation()); + event.setCancelled(true); player.sendMessage(war.str("Welcome to the War hub.")); return; } } else if ((isAutoAssignGate || isDiamondGate || isGoldGate || isIronGate) && !canPlay) { - event.setTo(zone.getTeleport()); -// player.teleportTo(zone.getTeleport()); -// event.setCancelled(true); + event.setFrom(zone.getTeleport()); + player.teleportTo(zone.getTeleport()); + event.setCancelled(true); player.sendMessage(war.str("You don't have permission to play War. Ask a mod, please.")); return; } @@ -215,32 +216,32 @@ public class WarPlayerListener extends PlayerListener { // Warhub zone gates WarHub hub = war.getWarHub(); - if(hub != null && from != null && to != null && hub.getVolume().contains(from)) { - Warzone zone = hub.getDestinationWarzoneForLocation(to); + if(hub != null && hub.getVolume().contains(playerLoc)) { + Warzone zone = hub.getDestinationWarzoneForLocation(playerLoc); //synchronized(player) { if(zone != null) { enteredGate = true; - event.setTo(zone.getTeleport()); -// player.teleportTo(zone.getTeleport()); + event.setFrom(zone.getTeleport()); + player.teleportTo(zone.getTeleport()); // -// event.setCancelled(true); + event.setCancelled(true); player.sendMessage(war.str("Welcome to warzone " + zone.getName() + ".")); return; } //} } - if(locZone != null && to != null && locZone.getLobby() != null - && locZone.getLobby().isLeavingZone(to)) { // already in a team and in warzone, leaving + if(locZone != null && locZone.getLobby() != null + && locZone.getLobby().isLeavingZone(playerLoc)) { // already in a team and in warzone, leaving enteredGate = true; - // same as leave, except event.setTo + // same as leave, except using event.setFrom and cancelling even .. don't ask me, see NetServerHandler code Team playerTeam = war.getPlayerTeam(player.getName()); if(playerTeam != null) { playerTeam.removePlayer(player.getName()); playerTeam.resetSign(); - event.setTo(playerWarzone.getTeleport()); - // player.teleportTo(zone.getTeleport()); - // event.setCancelled(true); + event.setFrom(playerWarzone.getTeleport()); + player.teleportTo(playerWarzone.getTeleport()); + event.setCancelled(true); playerWarzone.restorePlayerInventory(player); if(playerWarzone.getLobby() != null) { playerWarzone.getLobby().resetTeamGateSign(playerTeam); @@ -259,27 +260,27 @@ public class WarPlayerListener extends PlayerListener { // Player belongs to a warzone team but is outside: he snuck out!. if(locZone == null && team != null) { //player.sendMessage(war.str("Teleporting you back to spawn. Please /leave your team if you want to exit the zone.")); - event.setTo(team.getTeamSpawn()); + event.setFrom(team.getTeamSpawn()); //playerWarzone.respawnPlayer(team, player); - //player.teleportTo(team.getTeamSpawn()); - //event.setCancelled(true); + player.teleportTo(team.getTeamSpawn()); + event.setCancelled(true); } // Monuments - if(to != null && team != null - && playerWarzone.nearAnyOwnedMonument(to, team) + if(team != null + && playerWarzone.nearAnyOwnedMonument(playerLoc, team) && player.getHealth() < 20 && random.nextInt(42) == 3 ) { // one chance out of many of getting healed player.setHealth(20); player.sendMessage(war.str("Your dance pleases the monument's voodoo. You gain full health!")); } } else if (locZone != null && locZone.getLobby() != null - && locZone.getLobby().isLeavingZone(to) && !isMaker) { + && locZone.getLobby().isLeavingZone(playerLoc) && !isMaker) { // player is not in any team, but inside warzone boundaries, get him out - Warzone zone = war.warzone(to); - event.setTo(zone.getTeleport()); -// player.teleportTo(zone.getTeleport()); -// event.setCancelled(true); + Warzone zone = war.warzone(playerLoc); + event.setFrom(zone.getTeleport()); + player.teleportTo(zone.getTeleport()); + event.setCancelled(true); //player.sendMessage(war.str("You can't be inside a warzone without a team.")); } diff --git a/war/src/main/java/com/tommytony/war/Warzone.java b/war/src/main/java/com/tommytony/war/Warzone.java index b2117b0..3dc5489 100644 --- a/war/src/main/java/com/tommytony/war/Warzone.java +++ b/war/src/main/java/com/tommytony/war/Warzone.java @@ -344,7 +344,9 @@ public class Warzone { } public void respawnPlayer(PlayerMoveEvent event, Team team, Player player) { - event.setTo(team.getTeamSpawn()); + event.setFrom(team.getTeamSpawn()); + player.teleportTo(team.getTeamSpawn()); + event.setCancelled(true); handleRespawn(team, player); } diff --git a/war/src/main/java/com/tommytony/war/ZoneLobby.java b/war/src/main/java/com/tommytony/war/ZoneLobby.java index 58a5d8b..c643397 100644 --- a/war/src/main/java/com/tommytony/war/ZoneLobby.java +++ b/war/src/main/java/com/tommytony/war/ZoneLobby.java @@ -617,22 +617,23 @@ public class ZoneLobby { Block out = gate.getFace(inside); Block outL = out.getFace(left); Block outR = out.getFace(right); - Block out2 = gate.getFace(inside, 2); - Block out2L = out2.getFace(left); - Block out2R = out2.getFace(right); +// Block out2 = gate.getFace(inside, 2); +// Block out2L = out2.getFace(left); +// Block out2R = out2.getFace(right); if(out.getX() == x && out.getY() == y && out.getZ() == z) { return true; } else if(outL.getX() == x && outL.getY() == y && outL.getZ() == z) { return true; } else if(outR.getX() == x && outR.getY() == y && outR.getZ() == z) { return true; - } else if(out2.getX() == x && out2.getY() == y && out2.getZ() == z) { - return true; - } else if(out2L.getX() == x && out2L.getY() == y && out2L.getZ() == z) { - return true; - } else if(out2R.getX() == x && out2R.getY() == y && out2R.getZ() == z) { - return true; } +// } else if(out2.getX() == x && out2.getY() == y && out2.getZ() == z) { +// return true; +// } else if(out2L.getX() == x && out2L.getY() == y && out2L.getZ() == z) { +// return true; +// } else if(out2R.getX() == x && out2R.getY() == y && out2R.getZ() == z) { +// return true; +// } return false; } }