diff --git a/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java b/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java index 077c3c4..ee6bfeb 100644 --- a/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java +++ b/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java @@ -103,6 +103,7 @@ import org.apache.commons.io.Charsets; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.ultramine.server.PermissionHandler; import org.ultramine.server.chunk.ChunkSendManager; import org.ultramine.server.data.player.PlayerData; @@ -1019,6 +1020,11 @@ this.playerData = playerData; } + public boolean hasPermission(String permission) + { + return PermissionHandler.getInstance().has(this, permission); + } + /** * Переносит игрока в другой мир без использования порталов. Обратите * внимение: сначала нужно установить координаты назначения diff --git a/src/main/java/org/ultramine/commands/CommandContext.java b/src/main/java/org/ultramine/commands/CommandContext.java index 4b795c0..0810fd5 100644 --- a/src/main/java/org/ultramine/commands/CommandContext.java +++ b/src/main/java/org/ultramine/commands/CommandContext.java @@ -107,8 +107,13 @@ public void checkSenderPermission(String permission) { + checkSenderPermission(permission, "commands.generic.permission"); + } + + public void checkSenderPermission(String permission, String msg) + { if (!senderIsServer() && !PermissionHandler.getInstance().has(sender, permission)) - throw new CommandException("commands.generic.permission"); + throw new CommandException(msg); } public void checkSenderPermissionInWorld(String world, String permission) @@ -123,11 +128,27 @@ comp.getChatStyle().setColor(color); sender.addChatMessage(comp); } + + public void sendMessage(String msg, Object... args) + { + sendMessage(EnumChatFormatting.GOLD, msg, args); + } public void throwBadUsage() { throw new WrongUsageException(command.getCommandUsage(sender)); } + + public void failure(String msg) + { + throw new CommandException(msg); + } + + public void check(boolean flag, String msg) + { + if(!flag) + throw new CommandException(msg); + } public String[] getArgs() { diff --git a/src/main/java/org/ultramine/commands/basic/BasicCommands.java b/src/main/java/org/ultramine/commands/basic/BasicCommands.java new file mode 100644 index 0000000..9853e10 --- /dev/null +++ b/src/main/java/org/ultramine/commands/basic/BasicCommands.java @@ -0,0 +1,53 @@ +package org.ultramine.commands.basic; + +import org.ultramine.commands.Command; +import org.ultramine.commands.CommandContext; +import org.ultramine.server.Teleporter; +import org.ultramine.server.util.WarpLocation; + +public class BasicCommands +{ + @Command( + name = "home", + group = "player", + aliases = {"дом", "хата"}, + permissions = {"command.home", "command.home.multi"}, + syntax = {"", "<%name>"} + ) + public static void home(CommandContext ctx) + { + WarpLocation home; + if(ctx.contains("name")) + { + ctx.checkSenderPermission("command.home.multi", "command.home.multi.fail"); + home = ctx.getSenderAsPlayer().getData().core().getHome(ctx.get("name").asString()); + } + else + { + home = ctx.getSenderAsPlayer().getData().core().getHome("home"); + } + ctx.check(home != null, "command.home.fail.notset"); + Teleporter.tpLater(ctx.getSenderAsPlayer(), home); + } + + @Command( + name = "sethome", + group = "player", + aliases = {"здесьдом"}, + permissions = {"command.home", "command.home.multi"}, + syntax = {"", "<%name>"} + ) + public static void sethome(CommandContext ctx) + { + if(ctx.contains("name")) + { + ctx.checkSenderPermission("command.home.multi", "command.sethome.multi.fail"); + ctx.getSenderAsPlayer().getData().core().setHome(ctx.get("name").asString(), WarpLocation.getFromPlayer(ctx.getSenderAsPlayer())); + } + else + { + ctx.getSenderAsPlayer().getData().core().setHome("home", WarpLocation.getFromPlayer(ctx.getSenderAsPlayer())); + } + ctx.sendMessage("command.sethome.success"); + } +} diff --git a/src/main/java/org/ultramine/server/Teleporter.java b/src/main/java/org/ultramine/server/Teleporter.java index fa12e5e..f3aa229 100644 --- a/src/main/java/org/ultramine/server/Teleporter.java +++ b/src/main/java/org/ultramine/server/Teleporter.java @@ -1,11 +1,21 @@ package org.ultramine.server; +import java.util.Iterator; +import java.util.LinkedList; + import org.ultramine.server.util.WarpLocation; +import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; public class Teleporter { + private static final boolean isServer = FMLCommonHandler.instance().getSide().isServer(); + private static final LinkedList teleporters = new LinkedList(); + public static void tpNow(EntityPlayerMP target, EntityPlayerMP dst) { if(target == null || dst == null) return; @@ -30,18 +40,96 @@ doTeleportation(target, dst.dimension, dst.x, dst.y, dst.z, dst.yaw, dst.pitch); } + public static void tpLater(EntityPlayerMP target, WarpLocation dst) + { + long timeto = target.getData().core().getNextTeleportationTime() - System.currentTimeMillis(); + if(timeto > 0 && !target.hasPermission("admin.abilities.skipteleportcooldown")) + { + target.addChatMessage(new ChatComponentTranslation("teleporter.fail.cooldownd", timeto/1000).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + return; + } + + if(!isServer || target.hasPermission("admin.abilities.skipteleportdelay")) + { + tpNow(target, dst); + } + else + { + Teleporter tel = target.getData().core().getTeleporter(); + if(tel != null) + { + if(tel.dst.equals(dst)) + return; + else + tel.cancel(); + } + + tel = new Teleporter(target, dst); + teleporters.add(tel); + target.getData().core().setTeleporter(tel); + } + } + private static void doTeleportation(EntityPlayerMP player, int dimension, double x, double y, double z, float yaw, float pitch) { - //player.getPlayerData().lastLocation = WarpLocation.getFromPlayer(player); - - player.playerNetServerHandler.setPlayerLocation(x, y, z, yaw, pitch); + player.getData().core().setLastLocation(WarpLocation.getFromPlayer(player)); if(player.dimension != dimension) { + player.setPositionAndRotation(x, y, z, yaw, pitch); player.transferToDimension(dimension); } + else + { + player.playerNetServerHandler.setPlayerLocation(x, y, z, yaw, pitch); + } - //player.getPlayerData().onTeleport(); - //player.getPlayerData().teleport = null; + if(isServer) + { + player.getData().core().setNextTeleportationTime(System.currentTimeMillis() + ConfigurationHandler.getServerConfig().teleportation.cooldown*1000); + player.getData().core().setTeleporter(null); + } + } + + static void tick() + { + for(Iterator it = teleporters.iterator();it.hasNext();) + { + if(it.next().update()) + it.remove(); + } + } + + private final EntityPlayerMP target; + private final WarpLocation dst; + private final long timeEnd; + + private Teleporter(EntityPlayerMP target, WarpLocation dst) + { + this.target = target; + this.dst = dst; + int delay = ConfigurationHandler.getServerConfig().teleportation.delay; + timeEnd = System.currentTimeMillis() + delay*1000; + target.addChatMessage(new ChatComponentTranslation("teleporter.delay", delay).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GOLD))); + + } + + private boolean update() + { + if(timeEnd - System.currentTimeMillis() <= 0) + { + doTeleportation(target, dst.dimension, dst.x, dst.y, dst.z, dst.yaw, dst.pitch); + return true; + } + + return false; + } + + public void cancel() + { + teleporters.remove(this); + target.getData().core().setTeleporter(null); + target.addChatMessage(new ChatComponentTranslation("teleporter.canceled").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + } } diff --git a/src/main/java/org/ultramine/server/UMEventHandler.java b/src/main/java/org/ultramine/server/UMEventHandler.java index c2052ed..65449dc 100644 --- a/src/main/java/org/ultramine/server/UMEventHandler.java +++ b/src/main/java/org/ultramine/server/UMEventHandler.java @@ -51,6 +51,7 @@ if(e.phase == TickEvent.Phase.START) { PlayerDataIOExecutor.tick(); + Teleporter.tick(); } } } diff --git a/src/main/java/org/ultramine/server/UltramineServerConfig.java b/src/main/java/org/ultramine/server/UltramineServerConfig.java index ce50893..e22d08e 100644 --- a/src/main/java/org/ultramine/server/UltramineServerConfig.java +++ b/src/main/java/org/ultramine/server/UltramineServerConfig.java @@ -6,6 +6,7 @@ public class UltramineServerConfig { public WatchdogThreadConfig watchdogThread = new WatchdogThreadConfig(); + public Teleportation teleportation = new Teleportation(); public VanillaConfig vanilla = new VanillaConfig(); public static class WatchdogThreadConfig @@ -14,6 +15,12 @@ public boolean restart = true; } + public static class Teleportation + { + public int cooldown = 60; + public int delay = 5; + } + public static class VanillaConfig diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index df3ebba..7294075 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -27,6 +27,7 @@ import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; +import org.ultramine.commands.basic.BasicCommands; import org.ultramine.commands.basic.VanillaCommands; import org.ultramine.commands.syntax.DefaultCompleters; import org.ultramine.permission.commands.BasicPermissionCommands; @@ -92,6 +93,7 @@ e.registerArgumentHandlers(DefaultCompleters.class); e.registerCommands(BasicPermissionCommands.class); e.registerCommands(VanillaCommands.class); + e.registerCommands(BasicCommands.class); e.getPermissionHandler().createGroup(OpPermissionProxySet.OP_GROUP, "*"); } diff --git a/src/main/java/org/ultramine/server/data/player/PlayerCoreData.java b/src/main/java/org/ultramine/server/data/player/PlayerCoreData.java index 6afb2bd..4ae21e4 100644 --- a/src/main/java/org/ultramine/server/data/player/PlayerCoreData.java +++ b/src/main/java/org/ultramine/server/data/player/PlayerCoreData.java @@ -3,6 +3,7 @@ import java.util.HashMap; import java.util.Map; +import org.ultramine.server.Teleporter; import org.ultramine.server.util.WarpLocation; import net.minecraft.nbt.NBTTagCompound; @@ -12,6 +13,11 @@ { private Map homes = new HashMap(); + //undatabased + private Teleporter teleporter; + private long nextTeleportationTime; + private WarpLocation lastLocation; + public WarpLocation getHome(String name) { return homes.get(name); @@ -22,6 +28,41 @@ homes.put(name, home); } + public Map getHomes() + { + return homes; + } + + public Teleporter getTeleporter() + { + return teleporter; + } + + public void setTeleporter(Teleporter teleporter) + { + this.teleporter = teleporter; + } + + public long getNextTeleportationTime() + { + return nextTeleportationTime; + } + + public void setNextTeleportationTime(long nextTeleportationTime) + { + this.nextTeleportationTime = nextTeleportationTime; + } + + public WarpLocation getLastLocation() + { + return lastLocation; + } + + public void setLastLocation(WarpLocation lastLocation) + { + this.lastLocation = lastLocation; + } + @Override public void writeToNBT(NBTTagCompound nbt) { diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang index 571ac98..5e76d21 100644 --- a/src/main/resources/assets/ultramine/lang/en_US.lang +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -1,3 +1,8 @@ +#Server core +teleporter.fail.cooldownd=You will be able to teleport in %s seconds +teleporter.delay=You will be teleported in %s seconds +teleporter.canceled=Teleportation canceled + #Command generic commands.generic.world.invalid=Can't find world '%s' @@ -33,4 +38,15 @@ command.pgroup.description=Add/remove permissions OR set meta for group command.pgroup.success.add=Add permission <%s> to group <%s> command.pgroup.success.remove=Remove permission <%s> from group <%s> -command.pgroup.success.meta=Set meta <%s> to <%s> for group <%s> \ No newline at end of file +command.pgroup.success.meta=Set meta <%s> to <%s> for group <%s> + +#Basic commands +command.home.usage=/home [name] +command.home.description=Teleports you to your home, sets with /sethome +command.home.fail.notset=Home is not set +command.home.multi.fail=You have no rights tp use multiple homes + +command.sethome.usage=/sethome [name] +command.sethome.description=Sets your /home teleportation point +command.sethome.success=Home set +command.sethome.multi.fail=You have no rights tp set multiple homes \ No newline at end of file