Closes gh-81. Closes gh-77. Closes gh-87. Temporarily closing these issue because volume resets and some player respawns are now delayed tasks handed off to the scheduler, which makes everything faster for the person who just died. There's a short delay to the zone reset now, though. Sign spam should be fixed in the same swoop.

This commit is contained in:
taoneill 2011-03-20 14:25:01 -04:00
parent 07ad330083
commit 08ca02cbad
11 changed files with 172 additions and 267 deletions

View File

@ -1,9 +1,9 @@
War add team deathmatch and capture-the-flag to Minecraft SMP. War adds team deathmatch and capture-the-flag to Minecraft SMP.
The plugin started on hMod but was ported to bukkit from v0.3 on. The plugin started on hMod but was ported to Bukkit from v0.3 on.
Grab your copy in the Downloads section. Grab your copy in the Downloads section.
Go to http://war.tommytony.com for more. Go to http://war.tommytony.com for more.
All credit goes to Mojang, hey0 and the bukkit team for being so awesome. All credit goes to Mojang, hey0 and the Bukkit team for being so awesome.

View File

@ -102,7 +102,6 @@ public class War extends JavaPlugin {
public void onEnable() { public void onEnable() {
desc = this.getDescription(); desc = this.getDescription();
//this.log = Logger.getLogger("Minecraft");
this.log = this.getServer().getLogger(); this.log = this.getServer().getLogger();
this.setupPermissions(); this.setupPermissions();
@ -193,7 +192,7 @@ public class War extends JavaPlugin {
performSetZoneLobby(player, arguments); performSetZoneLobby(player, arguments);
} else if(command.equals("savezone")) { } else if(command.equals("savezone")) {
performSaveZone(player, arguments); performSaveZone(player, arguments);
} else if(command.equals("setzoneconfig")) { } else if(command.equals("setzoneconfig") || command.equals("zonecfg")) {
performSetZoneConfig(player, arguments); performSetZoneConfig(player, arguments);
} else if(command.equals("resetzone")) { } else if(command.equals("resetzone")) {
performResetZone(player, arguments); performResetZone(player, arguments);
@ -213,7 +212,7 @@ public class War extends JavaPlugin {
performSetWarhub(player); performSetWarhub(player);
} else if(command.equals("deletewarhub")) { } else if(command.equals("deletewarhub")) {
performDeleteWarhub(player); performDeleteWarhub(player);
} else if(command.equals("setwarconfig")) { } else if(command.equals("setwarconfig") || command.equals("warcfg")) {
performSetWarConfig(player, arguments); performSetWarConfig(player, arguments);
} else if(command.equals("zonemaker")) { } else if(command.equals("zonemaker")) {
performZonemakerAsZonemaker(player, arguments); performZonemakerAsZonemaker(player, arguments);
@ -588,22 +587,22 @@ public class War extends JavaPlugin {
this.getWarzones().remove(warzone); this.getWarzones().remove(warzone);
resetWarzone = WarzoneMapper.load(this, warzone.getName(), true); resetWarzone = WarzoneMapper.load(this, warzone.getName(), true);
this.getWarzones().add(resetWarzone); this.getWarzones().add(resetWarzone);
resetBlocks = warzone.getVolume().resetBlocks(); warzone.getVolume().resetBlocksAsJob();
if(lobby!=null) { if(lobby!=null) {
lobby.getVolume().resetBlocks(); lobby.getVolume().resetBlocksAsJob();
} }
resetWarzone.initializeZone(); resetWarzone.initializeZoneAsJob();
} else { } else {
resetBlocks = warzone.getVolume().resetBlocks(); warzone.getVolume().resetBlocksAsJob();
if(lobby!=null) { if(lobby!=null) {
lobby.getVolume().resetBlocks(); lobby.getVolume().resetBlocksAsJob();
} }
warzone.initializeZone(); warzone.initializeZoneAsJob();
} }
this.msg(player, "Warzone and teams reset. " + resetBlocks + " blocks reset."); // this.msg(player, "Warzone and teams reset. " + resetBlocks + " blocks reset.");
logInfo(resetBlocks + " blocks reset in warzone " + warzone.getName() + "."); // logInfo(resetBlocks + " blocks reset in warzone " + warzone.getName() + ".");
} }
} }
@ -864,10 +863,10 @@ public class War extends JavaPlugin {
for(Team team: warzone.getTeams()) { for(Team team: warzone.getTeams()) {
team.teamcast("The battle was interrupted. " + playerListener.getAllTeamsMsg(player) + " Resetting warzone " + warzone.getName() + " and life pools..."); team.teamcast("The battle was interrupted. " + playerListener.getAllTeamsMsg(player) + " Resetting warzone " + warzone.getName() + " and life pools...");
} }
int resetBlocks = warzone.getVolume().resetBlocks(); warzone.getVolume().resetBlocksAsJob();
warzone.initializeZone(); warzone.initializeZoneAsJob();
this.msg(player, "Warzone reset. " + resetBlocks + " blocks reset."); // this.msg(player, "Warzone reset. " + resetBlocks + " blocks reset.");
logInfo(resetBlocks + " blocks reset in warzone " + warzone.getName() + "."); // logInfo(resetBlocks + " blocks reset in warzone " + warzone.getName() + ".");
} }
} }

View File

@ -70,31 +70,6 @@ public class WarEntityListener extends EntityListener {
&& attackerTeam != defenderTeam && attackerTeam != defenderTeam
&& attackerWarzone == defenderWarzone) { && attackerWarzone == defenderWarzone) {
// Make sure one of the players isn't in the spawn // Make sure one of the players isn't in the spawn
// if(!){
// // A real attack: handle death scenario. ==> now handled in entity damage as well
// //synchronized(d) {
//// if(d.getHealth() <= 0) {
////// // Player died, loot him!
////// PlayerInventory attackerInv = a.getInventory();
////// PlayerInventory defenderInv = d.getInventory();
////// HashMap<Integer, ItemStack> noMorePlace = new HashMap<Integer, ItemStack>();
////// for(ItemStack stack : defenderInv.getContents()) {
////// HashMap<Integer, ItemStack> newNoMorePlace = attackerInv.addItem(stack);
////// noMorePlace.putAll(newNoMorePlace);
////// }
//////
////// // attacker inventory is full, drop the rest.
////// if(!noMorePlace.isEmpty()) {
////// for(Integer key : noMorePlace.keySet()) {
////// ItemStack toDrop = noMorePlace.get(key);
////// defender.getWorld().dropItem(defender.getLocation(), toDrop);
////// }
////// }
////
//// handleDeath(d, defenderWarzone, defenderTeam);
//// event.setCancelled(true);
// //}
// }
if(defenderTeam.getSpawnVolume().contains(d.getLocation())) { // attacking person in spawn if(defenderTeam.getSpawnVolume().contains(d.getLocation())) { // attacking person in spawn
war.badMsg(a, "Can't attack a player that's inside his team's spawn."); war.badMsg(a, "Can't attack a player that's inside his team's spawn.");
event.setCancelled(true); event.setCancelled(true);

View File

@ -400,16 +400,17 @@ public class WarPlayerListener extends PlayerListener {
return; return;
} }
// DEADMAN
// The guy whose death caused the game to end // The guy whose death caused the game to end
// He dies for real (no quick respawn) becasue his ENTITY_DEATH takes too long (everyones warping) // He dies for real (no quick respawn) becasue his ENTITY_DEATH takes too long (everyones warping)
if(locZone == null && locLobby == null) { // if(locZone == null && locLobby == null) {
for(Warzone zone : war.getWarzones()) { // for(Warzone zone : war.getWarzones()) {
if(zone.isDeadMan(player.getName())) { // if(zone.isDeadMan(player.getName())) {
RestoreDeadmanInventoryJob job = new RestoreDeadmanInventoryJob(player, zone); // RestoreDeadmanInventoryJob job = new RestoreDeadmanInventoryJob(player, zone);
war.getServer().getScheduler().scheduleAsyncDelayedTask(war, job, 3); // war.getServer().getScheduler().scheduleAsyncDelayedTask(war, job, 3);
} // }
} // }
} // }
} }

View File

@ -3,15 +3,12 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import net.minecraft.server.Entity;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -19,7 +16,9 @@ import org.bukkit.inventory.PlayerInventory;
import bukkit.tommytony.war.War; import bukkit.tommytony.war.War;
import com.tommytony.war.jobs.InitZoneJob;
import com.tommytony.war.jobs.ResetCursorJob; import com.tommytony.war.jobs.ResetCursorJob;
import com.tommytony.war.jobs.ScoreCapReachedJob;
import com.tommytony.war.utils.InventoryStash; import com.tommytony.war.utils.InventoryStash;
import com.tommytony.war.volumes.VerticalVolume; import com.tommytony.war.volumes.VerticalVolume;
@ -132,7 +131,7 @@ public class Warzone {
topNWBlock.setType(Material.GLASS); topNWBlock.setType(Material.GLASS);
topNWBlock.getFace(BlockFace.EAST).setType(Material.GLASS); topNWBlock.getFace(BlockFace.EAST).setType(Material.GLASS);
topNWBlock.getFace(BlockFace.SOUTH).setType(Material.GLASS); topNWBlock.getFace(BlockFace.SOUTH).setType(Material.GLASS);
this.war.getServer().getScheduler().scheduleAsyncDelayedTask(this.war, new ResetCursorJob(topNWBlock, originalNorthwestBlocks, false), 85); this.war.getServer().getScheduler().scheduleSyncDelayedTask(this.war, new ResetCursorJob(topNWBlock, originalNorthwestBlocks, false), 40);
} }
public Location getNorthwest() { public Location getNorthwest() {
@ -154,7 +153,7 @@ public class Warzone {
topSEBlock.setType(Material.GLASS); topSEBlock.setType(Material.GLASS);
topSEBlock.getFace(BlockFace.WEST).setType(Material.GLASS); topSEBlock.getFace(BlockFace.WEST).setType(Material.GLASS);
topSEBlock.getFace(BlockFace.NORTH).setType(Material.GLASS); topSEBlock.getFace(BlockFace.NORTH).setType(Material.GLASS);
this.war.getServer().getScheduler().scheduleAsyncDelayedTask(this.war, new ResetCursorJob(topSEBlock, originalSoutheastBlocks, true), 85); this.war.getServer().getScheduler().scheduleSyncDelayedTask(this.war, new ResetCursorJob(topSEBlock, originalSoutheastBlocks, true), 40);
} }
@ -208,11 +207,15 @@ public class Warzone {
* @return * @return
*/ */
public void initializeZone() { public void initializeZone() {
initializeZone(null);
}
public void initializeZone(Player respawnExempted) {
if(ready() && volume.isSaved()){ if(ready() && volume.isSaved()){
// everyone back to team spawn with full health // everyone back to team spawn with full health
for(Team team : teams) { for(Team team : teams) {
for(Player player : team.getPlayers()) { for(Player player : team.getPlayers()) {
respawnPlayer(team, player); if(player != respawnExempted) respawnPlayer(team, player);
} }
team.setRemainingLives(lifePool); team.setRemainingLives(lifePool);
team.initializeTeamSpawn(); team.initializeTeamSpawn();
@ -230,8 +233,6 @@ public class Warzone {
for(Team team : teams) { for(Team team : teams) {
if(team.getPlayers().size() > 0) { if(team.getPlayers().size() > 0) {
craftWorld.refreshChunk(team.getTeamSpawn().getBlockX(), team.getTeamSpawn().getBlockZ()); craftWorld.refreshChunk(team.getTeamSpawn().getBlockX(), team.getTeamSpawn().getBlockZ());
craftWorld.refreshChunk(team.getSpawnVolume().getCornerOne().getX(), team.getSpawnVolume().getCornerOne().getZ());
craftWorld.refreshChunk(team.getSpawnVolume().getCornerTwo().getX(), team.getSpawnVolume().getCornerTwo().getZ());
} }
} }
// dont do all the zone chunks for now // dont do all the zone chunks for now
@ -239,6 +240,17 @@ public class Warzone {
} }
} }
public void initializeZoneAsJob(Player respawnExempted) {
InitZoneJob job = new InitZoneJob(this, respawnExempted);
war.getServer().getScheduler().scheduleSyncDelayedTask(war, job);
}
public void initializeZoneAsJob() {
InitZoneJob job = new InitZoneJob(this);
war.getServer().getScheduler().scheduleSyncDelayedTask(war, job);
}
private void initZone() { private void initZone() {
// add wall outlines // add wall outlines
if(isDrawZoneOutline()) { if(isDrawZoneOutline()) {
@ -388,20 +400,20 @@ public class Warzone {
player.setHealth(20); player.setHealth(20);
// Teleport the player back to spawn // Teleport the player back to spawn
Location playerLoc = player.getLocation(); // Location playerLoc = player.getLocation();
int x = playerLoc.getBlockX(); // int x = playerLoc.getBlockX();
int y = playerLoc.getBlockY(); // int y = playerLoc.getBlockY();
int z = playerLoc.getBlockZ(); // int z = playerLoc.getBlockZ();
Block playerBlock = world.getBlockAt(x, y, z).getFace(BlockFace.UP); // Block playerBlock = world.getBlockAt(x, y, z).getFace(BlockFace.UP);
Material playerBlockType = playerBlock.getType(); // Material playerBlockType = playerBlock.getType();
if(playerBlockType.getId() == Material.WATER.getId() // if(playerBlockType.getId() == Material.WATER.getId()
|| playerBlockType.getId() == Material.STATIONARY_WATER.getId()) { // || playerBlockType.getId() == Material.STATIONARY_WATER.getId()) {
// If in water, make arbitrary adjustments to fix drowning deaths causing "Player moved wrongly!" error // // If in water, make arbitrary adjustments to fix drowning deaths causing "Player moved wrongly!" error
player.teleportTo(new Location(playerLoc.getWorld(), // player.teleportTo(new Location(playerLoc.getWorld(),
team.getTeamSpawn().getX(), team.getTeamSpawn().getY() + 3, team.getTeamSpawn().getZ())); // team.getTeamSpawn().getX(), team.getTeamSpawn().getY() + 3, team.getTeamSpawn().getZ()));
} else { // } else {
player.teleportTo(team.getTeamSpawn()); player.teleportTo(team.getTeamSpawn());
} // }
} }
public boolean isMonumentCenterBlock(Block block) { public boolean isMonumentCenterBlock(Block block) {
@ -895,10 +907,10 @@ public class Warzone {
} else { } else {
// A new battle starts. Reset the zone but not the teams. // A new battle starts. Reset the zone but not the teams.
for(Team t : teams) { for(Team t : teams) {
t.teamcast("A new battle begins. Warzone reset."); t.teamcast("A new battle begins. Resetting warzone...");
} }
playerWarzone.getVolume().resetBlocks(); playerWarzone.getVolume().resetBlocksAsJob();
playerWarzone.initializeZone(); playerWarzone.initializeZoneAsJob(player);
newBattle = true; newBattle = true;
} }
} else { } else {
@ -920,17 +932,9 @@ public class Warzone {
} }
} }
} }
//} //if(!newBattle /*&& !scoreCapReached*/) {
//}
//synchronized(player) {
if(!newBattle && !scoreCapReached) {
playerTeam.resetSign(); playerTeam.resetSign();
playerWarzone.respawnPlayer(playerTeam, player); playerWarzone.respawnPlayer(playerTeam, player);
}
// war.info(player.getName() + " died and enemy team reached score cap");
// } else if (newBattle){
// war.info(player.getName() + " died and battle ended in team " + playerTeam.getName() + "'s disfavor");
// }
//} //}
} }
} }
@ -973,13 +977,13 @@ public class Warzone {
} }
if(zoneEmpty) { if(zoneEmpty) {
// reset the zone for a new game when the last player leaves // reset the zone for a new game when the last player leaves
int resetBlocks = this.getVolume().resetBlocks();
this.initializeZone();
for(Team team : this.getTeams()) { for(Team team : this.getTeams()) {
team.setPoints(0); team.setPoints(0);
team.setRemainingLives(this.getLifePool()); team.setRemainingLives(this.getLifePool());
} }
war.logInfo("Last player left warzone " + this.getName() + ". " + resetBlocks + " blocks reset automatically."); this.getVolume().resetBlocksAsJob();
this.initializeZoneAsJob();
war.logInfo("Last player left warzone " + this.getName() + ". Warzone blocks resetting automatically...");
} }
} }
} }
@ -1035,46 +1039,50 @@ public class Warzone {
public void handleScoreCapReached(Player player, String winnersStr) { public void handleScoreCapReached(Player player, String winnersStr) {
winnersStr = "Score cap reached! Winning team(s): " + winnersStr; winnersStr = "Score cap reached! Winning team(s): " + winnersStr;
winnersStr += ". Your inventory has (hopefully) been reset. The warzone is being reset... Please choose a new team."; winnersStr += ". The warzone and your inventory are being reset....";
if(this.hasPlayerInventory(player.getName())){ // DEADMAN
InventoryStash stash = inventories.remove(player.getName()); // if(this.hasPlayerInventory(player.getName())){
deadMenInventories.put(player.getName(), stash); // InventoryStash stash = inventories.remove(player.getName());
} // deadMenInventories.put(player.getName(), stash);
// }
// Score cap reached. Reset everything. // Score cap reached. Reset everything.
for(Team t : this.getTeams()) { ScoreCapReachedJob job = new ScoreCapReachedJob(this, winnersStr);
t.teamcast(winnersStr); war.getServer().getScheduler().scheduleSyncDelayedTask(war, job);
for(Player tp : t.getPlayers()) { // for(Team t : this.getTeams()) {
PlayerInventory inv = player.getInventory(); // t.teamcast(winnersStr);
// for(Player tp : t.getPlayers()) {
if(!tp.getName().equals(player.getName())) { // PlayerInventory inv = player.getInventory();
//
// if(!tp.getName().equals(player.getName())) {
// ScoreCapReachedJob job = new ScoreCapReachedJob(tp, this); // ScoreCapReachedJob job = new ScoreCapReachedJob(tp, this);
// if(winnersStr.contains(t.getName())) { // if(winnersStr.contains(t.getName())) {
// job.giveReward(true); // job.giveReward(true);
// } // }
// war.getServer().getScheduler().scheduleAsyncDelayedTask(war, job, 1); // war.getServer().getScheduler().scheduleAsyncDelayedTask(war, job, 1);
// fail //
tp.teleportTo(this.getTeleport()); // tp.teleportTo(this.getTeleport());
// don't reset inv of dead guy who caused this, he's gonna die becasue this takes too long so we'll restore inv at PLAYER_MOVE // // don't reset inv of dead guy who caused this, he's gonna die becasue this takes too long so we'll restore inv at PLAYER_MOVE
if(this.hasPlayerInventory(tp.getName())){ // if(this.hasPlayerInventory(tp.getName())){
this.restorePlayerInventory(tp); // this.restorePlayerInventory(tp);
} // }
} // }
if(winnersStr.contains(t.getName())) { // if(winnersStr.contains(t.getName())) {
// give reward // // give reward
for(Integer slot : getReward().keySet()){ // for(Integer slot : getReward().keySet()){
tp.getInventory().addItem(getReward().get(slot)); // tp.getInventory().addItem(getReward().get(slot));
} // }
} // }
} // }
t.setPoints(0); // t.setPoints(0);
t.getPlayers().clear(); // empty the team // t.getPlayers().clear(); // empty the team
} // }
if(this.getLobby() != null) { if(this.getLobby() != null) {
this.getLobby().getVolume().resetBlocks(); this.getLobby().getVolume().resetBlocksAsJob();
} }
this.getVolume().resetBlocks(); this.getVolume().resetBlocksAsJob();
this.initializeZone(); this.initializeZoneAsJob(player);
if(war.getWarHub() != null) { if(war.getWarHub() != null) {
// TODO: test if warhub sign give the correct info despite the jobs
war.getWarHub().resetZoneSign(this); war.getWarHub().resetZoneSign(this);
} }
} }
@ -1150,6 +1158,7 @@ public class Warzone {
} }
// public Team getTeamByName(String name) { // public Team getTeamByName(String name) {
// for(Team team : getTeams()) { // for(Team team : getTeams()) {
// if(team.getName().startsWith(name)) { // if(team.getName().startsWith(name)) {

View File

@ -1,15 +1,5 @@
package com.tommytony.war.jobs; package com.tommytony.war.jobs;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Chest;
import org.bukkit.block.Dispenser;
import org.bukkit.block.Sign;
import org.bukkit.inventory.ItemStack;
import com.tommytony.war.volumes.Volume; import com.tommytony.war.volumes.Volume;
public class BlockResetJob implements Runnable { public class BlockResetJob implements Runnable {
@ -21,123 +11,7 @@ public class BlockResetJob implements Runnable {
} }
public void run() { public void run() {
int visitedBlocks = 0, noOfResetBlocks = 0, x = 0, y = 0, z = 0; volume.resetBlocks();
int currentBlockId = 0;
int oldBlockType = 0;
volume.clearBlocksThatDontFloat();
try {
if(volume.hasTwoCorners() && volume.getBlockTypes() != null) {
x = volume.getMinX();
for(int i = 0; i < volume.getSizeX(); i++){
y = volume.getMinY();
for(int j = 0; j < volume.getSizeY(); j++){
z = volume.getMinZ();
for(int k = 0;k < volume.getSizeZ(); k++) {
try {
oldBlockType = volume.getBlockTypes()[i][j][k];
byte oldBlockData = volume.getBlockDatas()[i][j][k];
Block currentBlock = volume.getWorld().getBlockAt(x, y, z);
currentBlockId = currentBlock.getTypeId();
if(currentBlockId != oldBlockType ||
(currentBlockId == oldBlockType && currentBlock.getData() != oldBlockData ) ||
(currentBlockId == oldBlockType && currentBlock.getData() == oldBlockData &&
(oldBlockType == Material.WALL_SIGN.getId() || oldBlockType == Material.SIGN_POST.getId()
|| oldBlockType == Material.CHEST.getId() || oldBlockType == Material.DISPENSER.getId())
)
) {
if(oldBlockType == Material.WALL_SIGN.getId()
|| oldBlockType == Material.SIGN_POST.getId()) {
// Signs
currentBlock.setType(Material.getMaterial(oldBlockType));
currentBlock.setData(oldBlockData);
BlockState state = currentBlock.getState();
if(state instanceof Sign) {
Sign sign = (Sign)state;
String[] lines = volume.getSignLines().get("sign-" + i + "-" + j + "-" + k);
if(lines != null && sign.getLines() != null) {
if(lines.length>0)sign.setLine(0, lines[0]);
if(lines.length>1)sign.setLine(1, lines[1]);
if(lines.length>2)sign.setLine(2, lines[2]);
if(lines.length>3)sign.setLine(3, lines[3]);
sign.update(true);
}
}
} else if(oldBlockType == Material.CHEST.getId()) {
// Chests
currentBlock.setType(Material.getMaterial(oldBlockType));
currentBlock.setData(oldBlockData);
BlockState state = currentBlock.getState();
if(state instanceof Chest) {
Chest chest = (Chest)state;
List<ItemStack> contents = volume.getInvBlockContents().get("chest-" + i + "-" + j + "-" + k);
if(contents != null) {
int ii = 0;
chest.getInventory().clear();
for(ItemStack item : contents) {
chest.getInventory().setItem(ii, item);
ii++;
}
chest.update(true);
}
}
} else if(oldBlockType == Material.DISPENSER.getId()) {
// Dispensers
currentBlock.setType(Material.getMaterial(oldBlockType));
currentBlock.setData(oldBlockData);
BlockState state = currentBlock.getState();
if(state instanceof Dispenser) {
Dispenser dispenser = (Dispenser)state;
List<ItemStack> contents = volume.getInvBlockContents().get("dispenser-" + i + "-" + j + "-" + k);
if(contents != null) {
int ii = 0;
dispenser.getInventory().clear();
for(ItemStack item : contents) {
dispenser.getInventory().setItem(ii, item);
ii++;
}
dispenser.update(true);
}
}
} else if(oldBlockType == Material.WOODEN_DOOR.getId() || oldBlockType == Material.IRON_DOOR_BLOCK.getId()){
// Door blocks
// Check if is bottom door block
if(j+1 < volume.getSizeY() && volume.getBlockTypes()[i][j+1][k] == oldBlockType) {
// set both door blocks right away
currentBlock.setType(Material.getMaterial(oldBlockType));
currentBlock.setData(oldBlockData);
Block blockAbove = volume.getWorld().getBlockAt(x, y+1, z);
blockAbove.setType(Material.getMaterial(oldBlockType));
blockAbove.setData(volume.getBlockDatas()[i][j+1][k]);
}
} else {
// regular block
currentBlock.setType(Material.getMaterial(oldBlockType));
currentBlock.setData(oldBlockData);
}
noOfResetBlocks++;
}
visitedBlocks++;
} catch (Exception e) {
volume.getWar().getLogger().warning("Failed to reset block in volume " + volume.getName() + ". Visited blocks so far:" + visitedBlocks
+ ". Blocks reset: "+ noOfResetBlocks +
". Error at x:" + x + " y:" + y + " z:" + z + ". Exception:" + e.getClass().toString() + " " + e.getMessage());
e.printStackTrace();
} finally {
z++;
}
}
y++;
}
x++;
}
}
} catch (Exception e) {
volume.getWar().logWarn("Failed to reset volume " + volume.getName() + " blocks. Blocks visited: " + visitedBlocks
+ ". Blocks reset: "+ noOfResetBlocks + ". Error at x:" + x + " y:" + y + " z:" + z
+ ". Current block: " + currentBlockId + ". Old block: " + oldBlockType + ". Exception: " + e.getClass().toString() + " " + e.getMessage());
e.printStackTrace();
}
} }
} }

View File

@ -0,0 +1,27 @@
package com.tommytony.war.jobs;
import org.bukkit.entity.Player;
import com.tommytony.war.Warzone;
public class InitZoneJob implements Runnable {
private final Warzone zone;
private final Player respawnExempted;
public InitZoneJob(Warzone zone) {
this.zone = zone;
respawnExempted = null;
}
public InitZoneJob(Warzone warzone, Player respawnExempted) {
zone = warzone;
this.respawnExempted = respawnExempted;
// TODO Auto-generated constructor stub
}
public void run() {
zone.initializeZone(respawnExempted);
}
}

View File

@ -1,33 +1,41 @@
package com.tommytony.war.jobs; package com.tommytony.war.jobs;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.PlayerInventory;
import com.tommytony.war.Team;
import com.tommytony.war.Warzone; import com.tommytony.war.Warzone;
public class ScoreCapReachedJob implements Runnable { public class ScoreCapReachedJob implements Runnable {
private final Player player;
private final Warzone zone; private final Warzone zone;
private boolean giveReward; private boolean giveReward;
private final String winnersStr;
public ScoreCapReachedJob(Player player, Warzone zone) { public ScoreCapReachedJob(Warzone zone, String winnersStr) {
this.player = player;
this.zone = zone; this.zone = zone;
this.winnersStr = winnersStr;
} }
public void run() { public void run() {
player.teleportTo(zone.getTeleport()); for(Team t : zone.getTeams()) {
// don't reset inv of dead guy who caused this, he's gonna die becasue this takes too long so we'll restore inv at PLAYER_MOVE t.teamcast(winnersStr);
if(zone.hasPlayerInventory(player.getName())){ for(Player tp : t.getPlayers()) {
zone.restorePlayerInventory(player); tp.teleportTo(zone.getTeleport()); // TODO: change this to a more general rally point (which will enable linking zones together)
if(zone.hasPlayerInventory(tp.getName())){
zone.restorePlayerInventory(tp);
} }
if(giveReward) { if(winnersStr.contains(t.getName())) {
// give reward // give reward
for(Integer slot : zone.getReward().keySet()){ for(Integer slot : zone.getReward().keySet()){
player.getInventory().addItem(zone.getReward().get(slot)); tp.getInventory().addItem(zone.getReward().get(slot));
} }
} }
} }
t.setPoints(0);
t.getPlayers().clear(); // empty the team
}
}
public void giveReward(boolean giveReward) { public void giveReward(boolean giveReward) {
this.giveReward = giveReward; this.giveReward = giveReward;

View File

@ -139,10 +139,12 @@ public class Volume {
return noOfSavedBlocks; return noOfSavedBlocks;
} }
public void resetBlocksAsJob() {
BlockResetJob job = new BlockResetJob(this);
war.getServer().getScheduler().scheduleSyncDelayedTask(war, job);
}
public int resetBlocks() { public int resetBlocks() {
// BlockResetJob job = new BlockResetJob(this);
// war.getServer().getScheduler().scheduleSyncDelayedTask(war, job);
// return 0;
int visitedBlocks = 0, noOfResetBlocks = 0, x = 0, y = 0, z = 0; int visitedBlocks = 0, noOfResetBlocks = 0, x = 0, y = 0, z = 0;
int currentBlockId = 0; int currentBlockId = 0;
int oldBlockType = 0; int oldBlockType = 0;
@ -478,8 +480,6 @@ public class Volume {
Material[] toAirMaterials = new Material[22]; Material[] toAirMaterials = new Material[22];
toAirMaterials[0] = Material.SIGN_POST; toAirMaterials[0] = Material.SIGN_POST;
toAirMaterials[1] = Material.WALL_SIGN; toAirMaterials[1] = Material.WALL_SIGN;
//toAirMaterials[2] = Material.IRON_DOOR_BLOCK;
//toAirMaterials[3] = Material.WOODEN_DOOR;
toAirMaterials[2] = Material.IRON_DOOR; toAirMaterials[2] = Material.IRON_DOOR;
toAirMaterials[3] = Material.WOOD_DOOR; toAirMaterials[3] = Material.WOOD_DOOR;
toAirMaterials[4] = Material.LADDER; toAirMaterials[4] = Material.LADDER;

View File

@ -1,5 +1,5 @@
name: War name: War
version: 1.2.1 (Bradley) version: 1.3 (Rokossovsky)
description: Lets you create TDM and CTF (warzones) for a more structured PVP experience. description: Lets you create TDM and CTF (warzones) for a more structured PVP experience.
author: tommytony author: tommytony
website: war.tommytony.com website: war.tommytony.com
@ -108,6 +108,9 @@ commands:
- /setzoneconfig lifepool:8 teamsize:5 maxscore:7 autoassign:on outline:off ff:on blockheads:off spawnstyle:<big/flat/small> unbreakable:on nocreatures:on - /setzoneconfig lifepool:8 teamsize:5 maxscore:7 autoassign:on outline:off ff:on blockheads:off spawnstyle:<big/flat/small> unbreakable:on nocreatures:on
- /setzoneconfig loadout:default => sets the respawn inventory to your current items - /setzoneconfig loadout:default => sets the respawn inventory to your current items
- /setzoneconfig reward:default => sets the winner's reward to your current items - /setzoneconfig reward:default => sets the winner's reward to your current items
zonecfg:
description: (War) Alias for /setzoneconfig
usage:
zonemaker: zonemaker:
description: (War) Toggles between player mode and zone maker mode. Or gives/removes access to zonemaker commands for another player. description: (War) Toggles between player mode and zone maker mode. Or gives/removes access to zonemaker commands for another player.
usage: usage:
@ -120,7 +123,7 @@ commands:
deletewarhub: deletewarhub:
description: (War) Deletes the warhub if it exists. Resets all warzone lobbies. description: (War) Deletes the warhub if it exists. Resets all warzone lobbies.
usage: /deletewarhub usage: /deletewarhub
# 4- Defaults # 4- Defaults and server configuration
setwarconfig: setwarconfig:
description: (War) Change gobal settings and the default warzone configuration values. description: (War) Change gobal settings and the default warzone configuration values.
usage: usage:
@ -128,6 +131,9 @@ commands:
- /setwarconfig lifepool:8 teamsize:5 maxscore:7 autoassign:on outline:off ff:on blockheads:off spawnstyle:<big/flat/small> unbreakable:on nocreatures:on => Warzone defaults - /setwarconfig lifepool:8 teamsize:5 maxscore:7 autoassign:on outline:off ff:on blockheads:off spawnstyle:<big/flat/small> unbreakable:on nocreatures:on => Warzone defaults
- /setwarconfig loadout:default => sets the respawn inventory to your current items - /setwarconfig loadout:default => sets the respawn inventory to your current items
- /setwarconfig reward:default => sets the winner's reward to your current items - /setwarconfig reward:default => sets the winner's reward to your current items
warcfg:
description: (War) Alias for /setwarconfig
usage:
# Fallback # Fallback
war: war:
description: (War) Short War help. Can also be used as a prefix for all War commands as a fallback if they conflict with other plugins. description: (War) Short War help. Can also be used as a prefix for all War commands as a fallback if they conflict with other plugins.

View File

@ -1,5 +1,5 @@
name: War name: War
version: 1.2.1 (Bradley) version: 1.3 (Rokossovsky)
description: Lets you create TDM and CTF (warzones) for a more structured PVP experience. description: Lets you create TDM and CTF (warzones) for a more structured PVP experience.
author: tommytony author: tommytony
website: war.tommytony.com website: war.tommytony.com
@ -108,6 +108,9 @@ commands:
- /setzoneconfig lifepool:8 teamsize:5 maxscore:7 autoassign:on outline:off ff:on blockheads:off spawnstyle:<big/flat/small> unbreakable:on nocreatures:on - /setzoneconfig lifepool:8 teamsize:5 maxscore:7 autoassign:on outline:off ff:on blockheads:off spawnstyle:<big/flat/small> unbreakable:on nocreatures:on
- /setzoneconfig loadout:default => sets the respawn inventory to your current items - /setzoneconfig loadout:default => sets the respawn inventory to your current items
- /setzoneconfig reward:default => sets the winner's reward to your current items - /setzoneconfig reward:default => sets the winner's reward to your current items
zonecfg:
description: (War) Alias for /setzoneconfig
usage:
zonemaker: zonemaker:
description: (War) Toggles between player mode and zone maker mode. Or gives/removes access to zonemaker commands for another player. description: (War) Toggles between player mode and zone maker mode. Or gives/removes access to zonemaker commands for another player.
usage: usage:
@ -120,7 +123,7 @@ commands:
deletewarhub: deletewarhub:
description: (War) Deletes the warhub if it exists. Resets all warzone lobbies. description: (War) Deletes the warhub if it exists. Resets all warzone lobbies.
usage: /deletewarhub usage: /deletewarhub
# 4- Defaults # 4- Defaults and server configuration
setwarconfig: setwarconfig:
description: (War) Change gobal settings and the default warzone configuration values. description: (War) Change gobal settings and the default warzone configuration values.
usage: usage:
@ -128,6 +131,9 @@ commands:
- /setwarconfig lifepool:8 teamsize:5 maxscore:7 autoassign:on outline:off ff:on blockheads:off spawnstyle:<big/flat/small> unbreakable:on nocreatures:on => Warzone defaults - /setwarconfig lifepool:8 teamsize:5 maxscore:7 autoassign:on outline:off ff:on blockheads:off spawnstyle:<big/flat/small> unbreakable:on nocreatures:on => Warzone defaults
- /setwarconfig loadout:default => sets the respawn inventory to your current items - /setwarconfig loadout:default => sets the respawn inventory to your current items
- /setwarconfig reward:default => sets the winner's reward to your current items - /setwarconfig reward:default => sets the winner's reward to your current items
warcfg:
description: (War) Alias for /setwarconfig
usage:
# Fallback # Fallback
war: war:
description: (War) Short War help. Can also be used as a prefix for all War commands as a fallback if they conflict with other plugins. description: (War) Short War help. Can also be used as a prefix for all War commands as a fallback if they conflict with other plugins.