diff --git a/src/main/java/org/ultramine/commands/CommandContext.java b/src/main/java/org/ultramine/commands/CommandContext.java index 3a025cb..bee11e4 100644 --- a/src/main/java/org/ultramine/commands/CommandContext.java +++ b/src/main/java/org/ultramine/commands/CommandContext.java @@ -4,6 +4,7 @@ import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; +import net.minecraft.command.PlayerNotFoundException; import net.minecraft.command.WrongUsageException; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -18,6 +19,7 @@ import org.ultramine.server.PermissionHandler; import org.ultramine.server.data.ServerDataLoader; +import org.ultramine.server.data.player.PlayerData; import java.util.HashMap; import java.util.List; @@ -129,6 +131,12 @@ throw new CommandException("commands.generic.permission"); } + public void checkPermissionIfArg(String arg, String permission, String msg) + { + if(contains(arg)) + checkSenderPermission(permission, msg); + } + public void sendMessage(EnumChatFormatting tplColor, EnumChatFormatting argsColor, String msg, Object... args) { for(int i = 0; i < args.length; i++) @@ -289,6 +297,14 @@ return CommandBase.getPlayer(sender, value); } + public PlayerData asPlayerData() + { + PlayerData data = getServerData().getPlayerData(value); + if(data == null) + throw new PlayerNotFoundException(); + return data; + } + public WorldServer asWorld() { WorldServer world = MinecraftServer.getServer().getMultiWorld().getWorldByNameOrID(value); diff --git a/src/main/java/org/ultramine/commands/basic/BasicCommands.java b/src/main/java/org/ultramine/commands/basic/BasicCommands.java index 19014ea..02d1440 100644 --- a/src/main/java/org/ultramine/commands/basic/BasicCommands.java +++ b/src/main/java/org/ultramine/commands/basic/BasicCommands.java @@ -10,6 +10,7 @@ import org.ultramine.commands.Command; import org.ultramine.commands.CommandContext; import org.ultramine.server.Teleporter; +import org.ultramine.server.data.player.PlayerData; import org.ultramine.server.util.WarpLocation; public class BasicCommands @@ -18,43 +19,45 @@ name = "home", group = "player", aliases = {"дом", "хата"}, - permissions = {"command.home", "command.home.multi"}, - syntax = {"", "<%name>"} + permissions = {"command.home", "command.home.multi", "command.home.other"}, + syntax = { + "", + "<%name>", + " <%name>", + " <%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.checkPermissionIfArg("name", "command.home.multi", "command.home.multi.fail"); + ctx.checkPermissionIfArg("dst", "command.home.other", "command.home.other.fail"); + EntityPlayerMP target = ctx.contains("target") ? ctx.get("target").asPlayer() : ctx.getSenderAsPlayer(); + PlayerData data = ctx.contains("dst") ? ctx.get("dst").asPlayerData() : ctx.getSenderAsPlayer().getData(); + WarpLocation home = data.core().getHome(ctx.contains("name") ? ctx.get("name").asString() : "home"); ctx.check(home != null, "command.home.fail.notset"); - Teleporter.tpLater(ctx.getSenderAsPlayer(), home); + Teleporter.tpLater(target, home); } @Command( name = "sethome", group = "player", aliases = {"здесьдом"}, - permissions = {"command.home", "command.home.multi"}, - syntax = {"", "<%name>"} + permissions = {"command.home", "command.home.multi", "command.home.other"}, + syntax = { + "", + "<%name>", + " <%name>", + " <%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.checkPermissionIfArg("name", "command.home.multi", "command.home.multi.fail"); + ctx.checkPermissionIfArg("target", "command.home.other", "command.home.other.fail"); + PlayerData data = ctx.contains("target") ? ctx.get("target").asPlayerData() : ctx.getSenderAsPlayer().getData(); + WarpLocation dst = ctx.contains("dst") ? ctx.getServerData().getWarp(ctx.get("dst").asString()) : WarpLocation.getFromPlayer(ctx.getSenderAsPlayer()); + ctx.check(dst != null, "command.warp.fail"); + data.core().setHome(ctx.contains("name") ? ctx.get("name").asString() : "home", dst); ctx.sendMessage("command.sethome.success"); } @@ -90,14 +93,20 @@ @Command( name = "warp", group = "player", - permissions = {"command.warp"}, - syntax = {"<%name>"} + permissions = {"command.warp", "command.warp.other"}, + syntax = { + "", + " " + } ) public static void warp(CommandContext ctx) { + if(ctx.contains("player")) + ctx.checkSenderPermission("command.warp.other", "command.warp.noperm.other"); + EntityPlayerMP target = ctx.contains("player") ? ctx.get("player").asPlayer() : ctx.getSenderAsPlayer(); WarpLocation warp = ctx.getServerData().getWarp(ctx.get("name").asString()); ctx.check(warp != null, "command.warp.fail"); - Teleporter.tpLater(ctx.getSenderAsPlayer(), warp); + Teleporter.tpLater(target, warp); } @Command( @@ -161,6 +170,18 @@ } @Command( + name = "back", + group = "player", + permissions = {"command.back"} + ) + public static void back(CommandContext ctx) + { + WarpLocation loc = ctx.getSenderAsPlayer().getData().core().getLastLocation(); + ctx.check(loc != null, "command.back.fail"); + Teleporter.tpLater(ctx.getSenderAsPlayer(), loc); + } + + @Command( name = "fastwarp", group = "admin", permissions = {"command.fastwarp"}, diff --git a/src/main/java/org/ultramine/commands/syntax/DefaultCompleters.java b/src/main/java/org/ultramine/commands/syntax/DefaultCompleters.java index 6f925ab..935e5a1 100644 --- a/src/main/java/org/ultramine/commands/syntax/DefaultCompleters.java +++ b/src/main/java/org/ultramine/commands/syntax/DefaultCompleters.java @@ -47,6 +47,12 @@ { return filterCollection(val, MinecraftServer.getServer().getMultiWorld().getAllNames()); } + + @ArgumentCompleter("warp") + public static List warp(String val, String[] args) + { + return filterCollection(val, MinecraftServer.getServer().getConfigurationManager().getDataLoader().getWarps().keySet()); + } @ArgumentValidator("world") public static boolean world_validator(String val, String[] args) diff --git a/src/main/java/org/ultramine/server/UMEventHandler.java b/src/main/java/org/ultramine/server/UMEventHandler.java index ce27177..6c6fd80 100644 --- a/src/main/java/org/ultramine/server/UMEventHandler.java +++ b/src/main/java/org/ultramine/server/UMEventHandler.java @@ -2,6 +2,7 @@ import org.ultramine.server.data.player.io.PlayerDataIOExecutor; import org.ultramine.server.util.BasicTypeParser; +import org.ultramine.server.util.WarpLocation; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; @@ -11,6 +12,7 @@ import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.event.ServerChatEvent; +import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.player.PlayerEvent; public class UMEventHandler @@ -49,4 +51,17 @@ ((EntityPlayerMP)e.entityPlayer).setData(((EntityPlayerMP)e.original).getData()); } } + + @SubscribeEvent + public void onLivingDeath(LivingDeathEvent e) + { + if(e.entityLiving.isEntityPlayerMP()) + { + EntityPlayerMP player = (EntityPlayerMP)e.entityLiving; + Teleporter tp = player.getData().core().getTeleporter(); + if(tp != null) + tp.cancel(); + player.getData().core().setLastLocation(WarpLocation.getFromPlayer(player)); + } + } } diff --git a/src/main/java/org/ultramine/server/data/ServerDataLoader.java b/src/main/java/org/ultramine/server/data/ServerDataLoader.java index 892e6cf..d6e7ec5 100644 --- a/src/main/java/org/ultramine/server/data/ServerDataLoader.java +++ b/src/main/java/org/ultramine/server/data/ServerDataLoader.java @@ -34,6 +34,7 @@ private final IDataProvider dataProvider; private final List dataExtinfos = new ArrayList(); private final Map playerDataCache = new HashMap(); + private final Map namedPlayerDataCache = new HashMap(); private final Map warps = new HashMap(); private final List fastWarps = new ArrayList(); @@ -60,7 +61,7 @@ public PlayerData getPlayerData(String username) { - return playerDataCache.get(mgr.getServerInstance().func_152358_ax().func_152655_a(username)); + return namedPlayerDataCache.get(username); } public WarpLocation getWarp(String name) @@ -117,7 +118,10 @@ public void loadCache() { for(PlayerData data : dataProvider.loadAllPlayerData()) + { playerDataCache.put(data.getProfile().getId(), data); + namedPlayerDataCache.put(data.getProfile().getName(), data); + } warps.putAll(dataProvider.loadWarps()); fastWarps.addAll(dataProvider.loadFastWarps()); } @@ -163,6 +167,7 @@ { player.setData(data); playerDataCache.put(data.getProfile().getId(), data); + namedPlayerDataCache.put(data.getProfile().getName(), data); } else { diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang index 17d1efb..32d0b63 100644 --- a/src/main/resources/assets/ultramine/lang/en_US.lang +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -53,7 +53,8 @@ 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.home.multi.fail=You don't have permissions to use multiple homes +command.home.other.fail=You don't have permissions to use homes of other players command.sethome.usage=/sethome [name] command.sethome.description=Sets your /home teleportation point @@ -72,6 +73,7 @@ command.warp.usage=/warp command.warp.description=Teleports you to specified warp point command.warp.fail=Warp not found +command.warp.noperm.other=You don't have permissions to teleport other players command.setwarp.usage=/setwarp [randomradius] command.setwarp.description=Sets new warp ar current location @@ -92,6 +94,10 @@ command.warplist.description=Displays list of all server warps command.warplist.head=Warp list: +command.back.usage=/back +command.back.description=Teleport to last location +command.back.fail=Last location not found + command.fastwarp.usage=/fastwarp command.fastwarp.description=Add fastwarp command.fastwarp.fail.spawn=Can't change spawn fastwarp