Redo respawning

This commit is contained in:
Sam 2018-07-18 16:09:33 +01:00 committed by Alexander Meech
parent f29b855667
commit 4e3bc018e9
2 changed files with 92 additions and 136 deletions

View File

@ -18,13 +18,13 @@ public class UtilMath
public static double trim(int degree, double d) public static double trim(int degree, double d)
{ {
String format = "#.#"; StringBuilder format = new StringBuilder("#.#");
for (int i = 1; i < degree; i++) for (int i = 1; i < degree; i++)
format += "#"; format.append("#");
DecimalFormatSymbols symb = new DecimalFormatSymbols(Locale.US); DecimalFormatSymbols symb = new DecimalFormatSymbols(Locale.US);
DecimalFormat twoDForm = new DecimalFormat(format, symb); DecimalFormat twoDForm = new DecimalFormat(format.toString(), symb);
return Double.valueOf(twoDForm.format(d)); return Double.valueOf(twoDForm.format(d));
} }

View File

@ -1,12 +1,8 @@
package nautilus.game.arcade.managers; package nautilus.game.arcade.managers;
import java.util.HashMap; import net.minecraft.server.v1_8_R3.EntityPlayer;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@ -44,10 +40,9 @@ import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector; import org.bukkit.scheduler.BukkitRunnable;
import mineplex.core.Managers; import mineplex.core.Managers;
import mineplex.core.account.permissions.Permission; import mineplex.core.account.permissions.Permission;
@ -65,7 +60,6 @@ import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTextBottom;
import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.itemstack.ItemStackFactory;
import mineplex.core.preferences.Preference; import mineplex.core.preferences.Preference;
import mineplex.core.recharge.Recharge; import mineplex.core.recharge.Recharge;
@ -94,8 +88,6 @@ public class GameFlagManager implements Listener
final ArcadeManager Manager; final ArcadeManager Manager;
private SecondaryDamageManager Secondary; private SecondaryDamageManager Secondary;
private final Map<Player, Long> _respawnTimers = new HashMap<>();
private final Map<Player, Integer> _respawnRunnables = new HashMap<>();
public GameFlagManager(ArcadeManager manager) public GameFlagManager(ArcadeManager manager)
{ {
@ -734,117 +726,136 @@ public class GameFlagManager implements Listener
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void PlayerDeath(PlayerDeathEvent event) public void PlayerDeath(PlayerDeathEvent event)
{ {
final Game game = Manager.GetGame(); Game game = Manager.GetGame();
if (game == null) return;
final Player player = event.getEntity(); if (game == null)
{
return;
}
Player player = event.getEntity();
Location location = player.getLocation();
// Remove all conditions // Remove all conditions
Manager.GetCondition().EndCondition(player, null, null); Manager.GetCondition().EndCondition(player, null, null);
for (PotionEffect potion : player.getActivePotionEffects()) for (PotionEffect potion : player.getActivePotionEffects())
{
player.removePotionEffect(potion.getType()); player.removePotionEffect(potion.getType());
}
//Visual
// Manager.GetCondition().Factory().Blind("Ghost", player, player, 2.5, 0, false, false, false);
player.setFireTicks(0);
player.setFallDistance(0);
// Drop Items // Drop Items
if (game.DeathDropItems) if (game.DeathDropItems)
for (ItemStack stack : event.getDrops()) {
player.getWorld().dropItem(player.getLocation(), stack); event.getDrops().forEach(itemStack -> player.getWorld().dropItem(location, itemStack));
}
event.getDrops().clear(); event.getDrops().clear();
//DEATH OUT if (!game.IsLive())
if (game.GetState() == GameState.Live && game.DeathOut) {
return;
}
// Death Out
if (game.DeathOut)
{ {
//Event //Event
PlayerDeathOutEvent outEvent = new PlayerDeathOutEvent(game, player); PlayerDeathOutEvent outEvent = new PlayerDeathOutEvent(game, player);
UtilServer.getServer().getPluginManager().callEvent(outEvent); UtilServer.CallEvent(outEvent);
if (!outEvent.isCancelled()) if (!outEvent.isCancelled())
{ {
game.SetPlayerState(player, PlayerState.OUT); game.SetPlayerState(player, PlayerState.OUT);
Manager.addSpectator(player, game.DeathTeleport);
return;
} }
} }
//RESPAWN double respawnTime = game.DeathSpectateSecs;
if (game.DeathSpectateSecs <= 0 && (game.GetTeam(player) == null || game.GetTeam(player).GetRespawnTime() <= 0)) GameTeam team = game.GetTeam(player);
if (team.GetRespawnTime() > respawnTime)
{ {
//Teleport respawnTime = team.GetRespawnTime();
if (game.AutomaticRespawn && game.IsAlive(player)) }
// Respawn Now
if (respawnTime <= 0)
{
// Auto handle respawning
if (game.AutomaticRespawn)
{ {
game.RespawnPlayer(player); game.RespawnPlayer(player);
} }
else
{
Manager.addSpectator(player, game.DeathTeleport);
}
Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), () -> Manager.runSyncLater(() ->
{ {
player.setFallDistance(0);
player.setFireTicks(0); player.setFireTicks(0);
UtilAction.zeroVelocity(player); UtilAction.zeroVelocity(player);
}, 0); }, 0);
} }
//TIMER // Respawn Later
else else
{ {
double time = game.DeathSpectateSecs;
if (game.GetTeam(player) != null)
if (game.GetTeam(player).GetRespawnTime() > time)
time = game.GetTeam(player).GetRespawnTime();
final double timeF = time;
UtilInv.Clear(player); UtilInv.Clear(player);
Manager.GetCondition().Factory().Cloak("Ghost", player, player, time, false, false); Manager.GetCondition().Factory().Cloak("Ghost", player, player, respawnTime, false, false);
player.setAllowFlight(true); player.setAllowFlight(true);
player.setFlying(true); player.setFlying(true);
((CraftPlayer) player).getHandle().spectating = true;
((CraftPlayer) player).getHandle().setGhost(true);
((CraftPlayer) player).getHandle().k = false;
for (int i = 0; i < 9; i++) EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
player.getInventory().setItem(i, new ItemStack(Material.SKULL)); entityPlayer.spectating = true;
entityPlayer.setGhost(true);
entityPlayer.k = false;
UtilAction.velocity(player, new Vector(0, 0, 0), 1, true, 0.4, 0, 1, true); if (!team.IsAlive(player))
if (!game.IsAlive(player))
{ {
Manager.addSpectator(player, game.DeathTeleport); Manager.addSpectator(player, game.DeathTeleport);
return; return;
} }
if (time > 3) if (respawnTime > 3)
{ {
UtilPlayer.message(player, C.cWhite + C.Bold + "You will respawn in " + time + " seconds..."); UtilTextMiddle.display(null, "Respawning in " + UtilMath.trim(1, respawnTime) + " seconds...", 0, 30, 10, player);
UtilTextMiddle.display(null, "Respawning in " + time + " seconds...", 5, 40, 5, player);
} }
Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), () ->
long start = System.currentTimeMillis();
long length = (long) (respawnTime * 1000);
Manager.runSyncTimer(new BukkitRunnable()
{ {
Long t = Double.valueOf(timeF).longValue(); @Override
_respawnTimers.put(player, System.currentTimeMillis() + UtilTime.convert(t, TimeUnit.SECONDS, TimeUnit.MILLISECONDS)); public void run()
}, 6);
int run = Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), () ->
{ {
//Teleport if (!game.IsLive())
if (game.IsAlive(player))
{ {
game.RespawnPlayer(player); cancel();
return;
} }
else
long left = start + length - System.currentTimeMillis();
double percentage = left / (double) length;
if (left <= 0)
{
cancel();
if (!game.IsAlive(player))
{ {
Manager.addSpectator(player, game.DeathTeleport); Manager.addSpectator(player, game.DeathTeleport);
} }
else if (game.AutomaticRespawn)
player.setFireTicks(0); {
UtilAction.zeroVelocity(player); game.RespawnPlayer(player);
UtilTextBottom.display(C.cGreenB + "Respawned", player);
_respawnRunnables.remove(player); }
}, (int) (time * 20d)); }
_respawnRunnables.put(player, run); else
{
UtilTextBottom.displayProgress("Respawning", percentage, UtilTime.MakeStr(left), player);
}
}
}, 0, 1);
} }
} }
@ -990,7 +1001,7 @@ public class GameFlagManager implements Listener
} }
//Riding a Projectile, edgecase //Riding a Projectile, edgecase
if (player.getVehicle() != null && player.getVehicle() instanceof Projectile) if (player.getVehicle() instanceof Projectile)
{ {
player.getVehicle().remove(); player.getVehicle().remove();
player.leaveVehicle(); player.leaveVehicle();
@ -1029,7 +1040,7 @@ public class GameFlagManager implements Listener
} }
else else
{ {
Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.VOID, 9001, false, false, false, "Border", "Border Damage"); Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.VOID, 9001, false, true, false, "Border", "Border Damage");
} }
} }
} }
@ -1346,59 +1357,4 @@ public class GameFlagManager implements Listener
UtilTextMiddle.display(C.cGold + C.Bold + Manager.GetGame().GetType().getName(), "Make sure you accept the Resource Pack", 20, 120, 20, event.getPlayer()); UtilTextMiddle.display(C.cGold + C.Bold + Manager.GetGame().GetType().getName(), "Make sure you accept the Resource Pack", 20, 120, 20, event.getPlayer());
} }
@EventHandler
public void displayRespawnTimer(UpdateEvent event)
{
if (event.getType() != UpdateType.FASTEST)
return;
if (Manager.GetGame() == null)
{
_respawnTimers.clear();
for (Integer r : _respawnRunnables.values())
{
Bukkit.getScheduler().cancelTask(r);
}
_respawnRunnables.clear();
return;
}
if (!Manager.GetGame().IsLive())
{
_respawnTimers.clear();
for (Integer r : _respawnRunnables.values())
{
Bukkit.getScheduler().cancelTask(r);
}
_respawnRunnables.clear();
return;
}
Iterator<Entry<Player, Long>> respawnIterator = _respawnTimers.entrySet().iterator();
while (respawnIterator.hasNext())
{
Entry<Player, Long> next = respawnIterator.next();
Player player = next.getKey();
if (!player.isOnline())
{
respawnIterator.remove();
continue;
}
if (System.currentTimeMillis() >= next.getValue())
{
respawnIterator.remove();
continue;
}
long sec = UtilTime.convert(next.getValue() - System.currentTimeMillis(), TimeUnit.MILLISECONDS, TimeUnit.SECONDS);
ChatColor color = ChatColor.RED;
if (sec < 8)
{
color = ChatColor.YELLOW;
}
if (sec < 4)
{
color = ChatColor.GREEN;
}
UtilTextBottom.display(color + "Respawning In: " + sec + " Seconds", player);
}
}
} }