diff --git a/src/main/java/serverutils/command/tp/CmdBack.java b/src/main/java/serverutils/command/tp/CmdBack.java index e7fa63dc..020f2ab6 100644 --- a/src/main/java/serverutils/command/tp/CmdBack.java +++ b/src/main/java/serverutils/command/tp/CmdBack.java @@ -1,5 +1,7 @@ package serverutils.command.tp; +import static serverutils.data.TeleportType.BACK; + import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; @@ -41,7 +43,7 @@ public void processCommand(ICommandSender sender, String[] args) throws CommandE throw ServerUtilities.error(sender, "serverutilities.lang.warps.no_pos_found"); } - data.checkTeleportCooldown(sender, ServerUtilitiesPlayerData.Timer.BACK); + data.checkTeleportCooldown(sender, BACK); Task task = new Task() { @@ -55,6 +57,6 @@ public void execute(Universe universe) { } }; - ServerUtilitiesPlayerData.Timer.BACK.teleport(player, playerMP -> lastTeleportLog.teleporter(), task); + data.teleport(lastTeleportLog.teleporter(), BACK, task); } } diff --git a/src/main/java/serverutils/command/tp/CmdHome.java b/src/main/java/serverutils/command/tp/CmdHome.java index d5b1950d..7a9ab19f 100644 --- a/src/main/java/serverutils/command/tp/CmdHome.java +++ b/src/main/java/serverutils/command/tp/CmdHome.java @@ -17,6 +17,7 @@ import serverutils.ServerUtilities; import serverutils.ServerUtilitiesPermissions; import serverutils.data.ServerUtilitiesPlayerData; +import serverutils.data.TeleportType; import serverutils.lib.command.CmdBase; import serverutils.lib.command.CommandUtils; import serverutils.lib.data.ForgePlayer; @@ -113,7 +114,7 @@ public void processCommand(ICommandSender sender, String[] args0) throws Command } Task task = new NotifyTask(-1, player, TELEPORT.createNotification("serverutilities.lang.warps.tp", args[0])); - data.checkTeleportCooldown(sender, ServerUtilitiesPlayerData.Timer.HOME); - ServerUtilitiesPlayerData.Timer.HOME.teleport(player, playerMP -> pos.teleporter(), task); + data.checkTeleportCooldown(sender, TeleportType.HOME); + data.teleport(pos.teleporter(), TeleportType.HOME, task); } } diff --git a/src/main/java/serverutils/command/tp/CmdRTP.java b/src/main/java/serverutils/command/tp/CmdRTP.java index 17565df4..3aa94ac8 100644 --- a/src/main/java/serverutils/command/tp/CmdRTP.java +++ b/src/main/java/serverutils/command/tp/CmdRTP.java @@ -16,6 +16,7 @@ import serverutils.ServerUtilitiesConfig; import serverutils.data.ClaimedChunks; import serverutils.data.ServerUtilitiesPlayerData; +import serverutils.data.TeleportType; import serverutils.lib.command.CmdBase; import serverutils.lib.command.CommandUtils; import serverutils.lib.math.ChunkDimPos; @@ -34,14 +35,12 @@ public CmdRTP() { public void processCommand(ICommandSender sender, String[] args) throws CommandException { EntityPlayerMP player = getCommandSenderAsPlayer(sender); ServerUtilitiesPlayerData data = ServerUtilitiesPlayerData.get(CommandUtils.getForgePlayer(player)); - data.checkTeleportCooldown(sender, ServerUtilitiesPlayerData.Timer.RTP); - ServerUtilitiesPlayerData.Timer.RTP.teleport( + data.checkTeleportCooldown(sender, TeleportType.RTP); + TeleporterDimPos pos = findBlockPos( + player.mcServer.worldServerForDimension(ServerUtilitiesConfig.world.spawn_dimension), player, - playerMP -> findBlockPos( - playerMP.mcServer.worldServerForDimension(ServerUtilitiesConfig.world.spawn_dimension), - player, - 0), - null); + 0); + data.teleport(pos, TeleportType.RTP, null); } private TeleporterDimPos findBlockPos(World world, EntityPlayerMP player, int depth) { diff --git a/src/main/java/serverutils/command/tp/CmdSpawn.java b/src/main/java/serverutils/command/tp/CmdSpawn.java index cb134a35..23790249 100644 --- a/src/main/java/serverutils/command/tp/CmdSpawn.java +++ b/src/main/java/serverutils/command/tp/CmdSpawn.java @@ -5,12 +5,15 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.ChunkCoordinates; import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; import serverutils.ServerUtilitiesConfig; import serverutils.data.ServerUtilitiesPlayerData; +import serverutils.data.TeleportType; import serverutils.lib.command.CmdBase; import serverutils.lib.command.CommandUtils; import serverutils.lib.math.BlockDimPos; +import serverutils.lib.math.TeleporterDimPos; public class CmdSpawn extends CmdBase { @@ -22,16 +25,18 @@ public CmdSpawn() { public void processCommand(ICommandSender sender, String[] args) throws CommandException { EntityPlayerMP player = getCommandSenderAsPlayer(sender); ServerUtilitiesPlayerData data = ServerUtilitiesPlayerData.get(CommandUtils.getForgePlayer(player)); - data.checkTeleportCooldown(sender, ServerUtilitiesPlayerData.Timer.SPAWN); - ServerUtilitiesPlayerData.Timer.SPAWN.teleport(player, playerMP -> { - World w = playerMP.mcServer.worldServerForDimension(ServerUtilitiesConfig.world.spawn_dimension); - ChunkCoordinates spawnpoint = w.getSpawnPoint(); + data.checkTeleportCooldown(sender, TeleportType.SPAWN); + data.teleport(getSpawnTeleporter(), TeleportType.SPAWN, null); + } + + private TeleporterDimPos getSpawnTeleporter() { + World w = DimensionManager.getWorld(ServerUtilitiesConfig.world.spawn_dimension); + ChunkCoordinates spawnpoint = w.getSpawnPoint(); - while (w.getBlock(spawnpoint.posX, spawnpoint.posY, spawnpoint.posZ).isNormalCube()) { - spawnpoint.posY += 2; - } + while (w.getBlock(spawnpoint.posX, spawnpoint.posY, spawnpoint.posZ).isNormalCube()) { + spawnpoint.posY += 2; + } - return new BlockDimPos(spawnpoint, ServerUtilitiesConfig.world.spawn_dimension).teleporter(); - }, null); + return new BlockDimPos(spawnpoint, ServerUtilitiesConfig.world.spawn_dimension).teleporter(); } } diff --git a/src/main/java/serverutils/command/tp/CmdTPA.java b/src/main/java/serverutils/command/tp/CmdTPA.java index a3882aa7..da2e1d55 100644 --- a/src/main/java/serverutils/command/tp/CmdTPA.java +++ b/src/main/java/serverutils/command/tp/CmdTPA.java @@ -10,6 +10,7 @@ import serverutils.ServerUtilities; import serverutils.data.ServerUtilitiesPlayerData; +import serverutils.data.TeleportType; import serverutils.lib.command.CmdBase; import serverutils.lib.command.CommandUtils; import serverutils.lib.data.Universe; @@ -33,7 +34,7 @@ public void processCommand(ICommandSender sender, String[] args) throws CommandE checkArgs(sender, args, 1); ServerUtilitiesPlayerData self = ServerUtilitiesPlayerData.get(CommandUtils.getForgePlayer(sender)); - self.checkTeleportCooldown(sender, ServerUtilitiesPlayerData.Timer.TPA); + self.checkTeleportCooldown(sender, TeleportType.TPA); ServerUtilitiesPlayerData other = ServerUtilitiesPlayerData.get(CommandUtils.getForgePlayer(sender, args[0])); diff --git a/src/main/java/serverutils/command/tp/CmdTPAccept.java b/src/main/java/serverutils/command/tp/CmdTPAccept.java index 979c9d3c..fe3ce133 100644 --- a/src/main/java/serverutils/command/tp/CmdTPAccept.java +++ b/src/main/java/serverutils/command/tp/CmdTPAccept.java @@ -11,6 +11,7 @@ import serverutils.ServerUtilities; import serverutils.ServerUtilitiesPermissions; import serverutils.data.ServerUtilitiesPlayerData; +import serverutils.data.TeleportType; import serverutils.lib.command.CmdBase; import serverutils.lib.command.CommandUtils; import serverutils.lib.math.TeleporterDimPos; @@ -72,8 +73,6 @@ public void processCommand(ICommandSender sender, String[] args) throws CommandE otherName, selfName))); other.player.getPlayer().addChatMessage(component); - - ServerUtilitiesPlayerData.Timer.TPA - .teleport(other.player.getPlayer(), playerMP -> TeleporterDimPos.of(selfPlayer), null); + other.teleport(TeleporterDimPos.of(selfPlayer), TeleportType.TPA, null); } } diff --git a/src/main/java/serverutils/command/tp/CmdWarp.java b/src/main/java/serverutils/command/tp/CmdWarp.java index ee688f08..0c7e7437 100644 --- a/src/main/java/serverutils/command/tp/CmdWarp.java +++ b/src/main/java/serverutils/command/tp/CmdWarp.java @@ -15,6 +15,7 @@ import serverutils.ServerUtilitiesPermissions; import serverutils.data.ServerUtilitiesPlayerData; import serverutils.data.ServerUtilitiesUniverseData; +import serverutils.data.TeleportType; import serverutils.lib.command.CmdBase; import serverutils.lib.command.CommandUtils; import serverutils.lib.math.BlockDimPos; @@ -67,7 +68,7 @@ public void processCommand(ICommandSender sender, String[] args) throws CommandE } ServerUtilitiesPlayerData data = ServerUtilitiesPlayerData.get(CommandUtils.getForgePlayer(player)); - data.checkTeleportCooldown(sender, ServerUtilitiesPlayerData.Timer.WARP); + data.checkTeleportCooldown(sender, TeleportType.WARP); if (player.dimension != p.dim && !PermissionAPI.hasPermission(player, ServerUtilitiesPermissions.WARPS_CROSS_DIM)) { @@ -75,6 +76,6 @@ public void processCommand(ICommandSender sender, String[] args) throws CommandE } Task task = new NotifyTask(-1, player, TELEPORT.createNotification("serverutilities.lang.warps.tp", args[0])); - ServerUtilitiesPlayerData.Timer.WARP.teleport(player, playerMP -> p.teleporter(), task); + data.teleport(p.teleporter(), TeleportType.WARP, task); } } diff --git a/src/main/java/serverutils/data/ServerUtilitiesPlayerData.java b/src/main/java/serverutils/data/ServerUtilitiesPlayerData.java index 7b50441e..6694bbc7 100644 --- a/src/main/java/serverutils/data/ServerUtilitiesPlayerData.java +++ b/src/main/java/serverutils/data/ServerUtilitiesPlayerData.java @@ -4,7 +4,6 @@ import java.util.Collection; import java.util.HashSet; -import java.util.function.Function; import javax.annotation.Nullable; @@ -45,45 +44,6 @@ public class ServerUtilitiesPlayerData extends PlayerData { public static final String TAG_MUTED = "muted"; public static final String TAG_LAST_CHUNK = "serveru_lchunk"; - public enum Timer { - - HOME(TeleportType.HOME), - WARP(TeleportType.WARP), - BACK(TeleportType.BACK), - SPAWN(TeleportType.SPAWN), - TPA(TeleportType.TPA), - RTP(TeleportType.RTP), - VANILLA_TP(TeleportType.VANILLA_TP); - - public static final Timer[] VALUES = values(); - - private final String cooldown; - private final String warmup; - private final TeleportType teleportType; - - Timer(TeleportType teleportType) { - this.teleportType = teleportType; - this.cooldown = teleportType.getCooldownPermission(); - this.warmup = teleportType.getWarmupPermission(); - } - - public void teleport(EntityPlayerMP player, Function pos, - @Nullable Task extraTask) { - Universe universe = Universe.get(); - int seconds = (int) RankConfigAPI.get(player, warmup).getTimer().seconds(); - - if (seconds > 0) { - IChatComponent component = StringUtils.color( - ServerUtilities.lang("stand_still", seconds).appendText(" [" + seconds + "]"), - EnumChatFormatting.GOLD); - TELEPORT_WARMUP.createNotification(component).setVanilla(true).send(player); - universe.scheduleTask(new TeleportTask(teleportType, player, this, seconds, pos, extraTask)); - } else { - new TeleportTask(teleportType, player, this, 0, pos, extraTask).execute(universe); - } - } - } - public static ServerUtilitiesPlayerData get(ForgePlayer player) { return player.getData().get(ServerUtilities.MOD_ID); } @@ -97,7 +57,6 @@ public static ServerUtilitiesPlayerData get(ForgePlayer player) { private IChatComponent cachedNameForChat; private BlockDimPos lastSafePos; - public final long[] lastTeleport; public final BlockDimPosStorage homes; private final TeleportTracker teleportTracker; @@ -105,7 +64,6 @@ public ServerUtilitiesPlayerData(ForgePlayer player) { super(player); homes = new BlockDimPosStorage(); tpaRequestsFrom = new HashSet<>(); - lastTeleport = new long[Timer.VALUES.length]; teleportTracker = new TeleportTracker(); } @@ -191,10 +149,13 @@ public BlockDimPos getLastSafePos() { return lastSafePos; } - public void checkTeleportCooldown(ICommandSender sender, Timer timer) throws CommandException { - long cooldown = lastTeleport[timer.ordinal()] + player.getRankConfig(timer.cooldown).getTimer().millis() - - System.currentTimeMillis(); + public void checkTeleportCooldown(ICommandSender sender, TeleportType teleportType) throws CommandException { + String cooldownPermission = teleportType.getCooldownPermission(); + if (cooldownPermission == null) return; + long cooldown = teleportTracker.getLastTeleportTime(teleportType) + + player.getRankConfig(cooldownPermission).getTimer().millis() + - System.currentTimeMillis(); if (cooldown > 0) { throw ServerUtilities.error(sender, "cant_use_now_cooldown", StringUtils.getTimeString(cooldown)); } @@ -266,6 +227,24 @@ public IChatComponent getNameForChat() { return cachedNameForChat.createCopy(); } + public void teleport(TeleporterDimPos pos, TeleportType teleportType, @Nullable Task extraTask) { + EntityPlayerMP player = this.player.getPlayer(); + Universe universe = Universe.get(); + String warmup = teleportType.getWarmupPermission(); + int seconds = warmup == null ? 0 : (int) RankConfigAPI.get(player, warmup).getTimer().seconds(); + + if (seconds > 0) { + IChatComponent component = StringUtils.color( + ServerUtilities.lang(player, "stand_still", seconds).appendText(" [" + seconds + "]"), + EnumChatFormatting.GOLD); + TELEPORT_WARMUP.createNotification(component).setVanilla(true).send(player); + + universe.scheduleTask(new TeleportTask(teleportType, player, seconds, pos, extraTask)); + } else { + new TeleportTask(teleportType, player, 0, pos, extraTask).execute(universe); + } + } + public TeleportLog getLastTeleportLog() { return teleportTracker.getLastAvailableLog(player.getProfile()); } diff --git a/src/main/java/serverutils/data/TeleportLog.java b/src/main/java/serverutils/data/TeleportLog.java index a955fc0e..f64809f9 100644 --- a/src/main/java/serverutils/data/TeleportLog.java +++ b/src/main/java/serverutils/data/TeleportLog.java @@ -17,7 +17,7 @@ public class TeleportLog implements INBTSerializable, Comparable private static final String NBT_KEY_TELEPORT_TYPE = "teleport_type"; private static final String NBT_KEY_CREATED_AT = "created_at"; - private static Comparator comparator = Comparator + private static final Comparator comparator = Comparator .comparing((log) -> log == null ? null : log.getCreatedAt(), Comparator.nullsFirst(Long::compareTo)); public TeleportType teleportType; @@ -55,6 +55,7 @@ public void deserializeNBT(NBTTagCompound nbt) { posZ = nbt.getInteger(NBT_KEY_Z); dimension = nbt.getInteger(NBT_KEY_DIMENSION); teleportType = nbt.getInteger(NBT_KEY_TELEPORT_TYPE); + this.createdAt = nbt.getLong(NBT_KEY_CREATED_AT); this.from = new BlockDimPos(posX, posY, posZ, dimension); this.teleportType = TeleportType.values()[teleportType]; } diff --git a/src/main/java/serverutils/data/TeleportTracker.java b/src/main/java/serverutils/data/TeleportTracker.java index 3269bb03..17fdfefe 100644 --- a/src/main/java/serverutils/data/TeleportTracker.java +++ b/src/main/java/serverutils/data/TeleportTracker.java @@ -56,6 +56,11 @@ public TeleportLog getLastLog() { return logs[0]; } + public long getLastTeleportTime(TeleportType teleportType) { + TeleportLog log = logs[teleportType.ordinal()]; + return log == null ? -1 : log.getCreatedAt(); + } + public void clearLog(TeleportType teleportType) { logs[teleportType.ordinal()] = null; } @@ -73,7 +78,10 @@ public NBTTagCompound serializeNBT() { @Override public void deserializeNBT(NBTTagCompound nbt) { for (int i = 0; i < logs.length; i++) { - logs[i] = new TeleportLog(nbt.getCompoundTag(String.valueOf(i))); + String key = String.valueOf(i); + if (nbt.hasKey(key)) { + logs[i] = new TeleportLog(nbt.getCompoundTag(key)); + } } } diff --git a/src/main/java/serverutils/task/TeleportTask.java b/src/main/java/serverutils/task/TeleportTask.java index f026799d..ce2a0d50 100644 --- a/src/main/java/serverutils/task/TeleportTask.java +++ b/src/main/java/serverutils/task/TeleportTask.java @@ -2,8 +2,6 @@ import static serverutils.ServerUtilitiesNotifications.TELEPORT_WARMUP; -import java.util.function.Function; - import javax.annotation.Nullable; import net.minecraft.entity.Entity; @@ -23,24 +21,22 @@ public class TeleportTask extends Task { private final EntityPlayerMP player; - private final ServerUtilitiesPlayerData.Timer timer; private final BlockDimPos startPos; - private final Function pos; + private final TeleporterDimPos teleporter; private final float startHP; private final int startSeconds; private int secondsLeft; private final Task extraTask; private final TeleportType teleportType; - public TeleportTask(TeleportType teleportType, EntityPlayerMP player, ServerUtilitiesPlayerData.Timer ticks, - int secStart, Function to, @Nullable Task task) { + public TeleportTask(TeleportType teleportType, EntityPlayerMP player, int secStart, TeleporterDimPos to, + @Nullable Task task) { super(0); this.teleportType = teleportType; this.player = player; - this.timer = ticks; this.startPos = new BlockDimPos(player); this.startHP = player.getHealth(); - this.pos = to; + this.teleporter = to; this.startSeconds = secStart; this.secondsLeft = secStart; this.extraTask = task; @@ -51,27 +47,22 @@ public void execute(Universe universe) { if (!startPos.equalsPos(new BlockDimPos(player)) || startHP > player.getHealth()) { player.addChatMessage(StringUtils.color("serverutilities.lang.warps.cancelled", EnumChatFormatting.RED)); } else if (secondsLeft <= 1) { - TeleporterDimPos teleporter = pos.apply(player); - if (teleporter != null) { - Entity mount = player.ridingEntity; - player.mountEntity(null); - if (mount != null) { - teleporter.teleport(mount); - } - - ServerUtilitiesPlayerData data = ServerUtilitiesPlayerData.get(universe.getPlayer(player)); - data.setLastTeleport(teleportType, new BlockDimPos(player)); - teleporter.teleport(player); + Entity mount = player.ridingEntity; + player.mountEntity(null); + if (mount != null) { + teleporter.teleport(mount); + } - data.lastTeleport[timer.ordinal()] = System.currentTimeMillis(); + ServerUtilitiesPlayerData data = ServerUtilitiesPlayerData.get(universe.getPlayer(player)); + data.setLastTeleport(teleportType, new BlockDimPos(player)); + teleporter.teleport(player); - if (secondsLeft != 0) { - player.addChatMessage(ServerUtilities.lang(player, "teleporting")); - } + if (secondsLeft != 0) { + player.addChatMessage(ServerUtilities.lang(player, "teleporting")); + } - if (extraTask != null) { - extraTask.execute(universe); - } + if (extraTask != null) { + extraTask.execute(universe); } } else { secondsLeft -= 1;