Finally got a handle on reliably teleportation at gates. Death sucks though. I'm going to revert back to the old system until player_death event makes it in.

This commit is contained in:
taoneill 2011-01-22 12:50:46 -05:00
parent 06ba048797
commit 9704598f39
5 changed files with 92 additions and 71 deletions

View File

@ -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;
}

View File

@ -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."));

View File

@ -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."));
}

View File

@ -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);
}

View File

@ -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;
}
}