diff --git a/src/main/java/org/ultramine/commands/CommandContext.java b/src/main/java/org/ultramine/commands/CommandContext.java index 83cd0c9..8e1e85e 100644 --- a/src/main/java/org/ultramine/commands/CommandContext.java +++ b/src/main/java/org/ultramine/commands/CommandContext.java @@ -95,6 +95,11 @@ { return !(sender instanceof EntityPlayer); } + + public boolean senderIsPlayer() + { + return sender instanceof EntityPlayer; + } public EntityPlayerMP getSenderAsPlayer() { diff --git a/src/main/java/org/ultramine/commands/basic/VanillaCommands.java b/src/main/java/org/ultramine/commands/basic/VanillaCommands.java index 7801a80..b2c5458 100644 --- a/src/main/java/org/ultramine/commands/basic/VanillaCommands.java +++ b/src/main/java/org/ultramine/commands/basic/VanillaCommands.java @@ -1,13 +1,19 @@ package org.ultramine.commands.basic; +import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.ChatComponentStyle; +import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChatStyle; +import static net.minecraft.util.EnumChatFormatting.*; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.WorldServer; import org.ultramine.commands.Command; import org.ultramine.commands.CommandContext; +import org.ultramine.server.PermissionHandler; import org.ultramine.server.Teleporter; import org.ultramine.server.util.BasicTypeParser; @@ -71,4 +77,44 @@ else world.difficultySetting = difficulty; } + + private static void sendMessage(ICommandSender from, ICommandSender to, String message) + { + ChatComponentStyle msg = new ChatComponentText(message); + msg.getChatStyle().setColor(BasicTypeParser.parseColor(PermissionHandler.getInstance().getMeta(from, "textcolor"))); + + from.addChatMessage(new ChatComponentTranslation("command.msg.display.outgoing", to.func_145748_c_(), msg).setChatStyle(new ChatStyle().setColor(GOLD))); + to.addChatMessage(new ChatComponentTranslation("command.msg.display.incoming", from.func_145748_c_(), msg).setChatStyle(new ChatStyle().setColor(GOLD))); + + if(from instanceof EntityPlayerMP) ((EntityPlayerMP)from).getData().core().setLastMessagedPlayer(to.getCommandSenderName()); + if(to instanceof EntityPlayerMP) ((EntityPlayerMP)to).getData().core().setLastMessagedPlayer(from.getCommandSenderName()); + } + + @Command( + name = "msg", + aliases={"tell", "t", "w"}, + group = "vanilla", + permissions = {"command.vanilla.msg"}, + syntax = {" <%msg>..."} + ) + public static void msg(CommandContext ctx) + { + ICommandSender to = ctx.get("player").asString().equalsIgnoreCase("server") ? MinecraftServer.getServer() : ctx.get("player").asPlayer(); + sendMessage(ctx.getSender(), to, ctx.get("msg").asString()); + } + + @Command( + name = "reply", + aliases={"r"}, + group = "vanilla", + permissions = {"command.vanilla.reply"}, + syntax = {"<%msg>..."} + ) + public static void reply(CommandContext ctx) + { + String name = ctx.getSenderAsPlayer().getData().core().getLastMessagedPlayer(); + ctx.check(name != null, "command.reply.fail"); + ICommandSender to = name.equalsIgnoreCase("server") ? MinecraftServer.getServer() : MinecraftServer.getServer().getConfigurationManager().func_152612_a(name); + sendMessage(ctx.getSender(), to, ctx.get("msg").asString()); + } } diff --git a/src/main/java/org/ultramine/server/UMEventHandler.java b/src/main/java/org/ultramine/server/UMEventHandler.java index 3abeeab..ce27177 100644 --- a/src/main/java/org/ultramine/server/UMEventHandler.java +++ b/src/main/java/org/ultramine/server/UMEventHandler.java @@ -1,6 +1,7 @@ package org.ultramine.server; import org.ultramine.server.data.player.io.PlayerDataIOExecutor; +import org.ultramine.server.util.BasicTypeParser; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; @@ -20,29 +21,12 @@ String prefix = PermissionHandler.getInstance().getMeta(e.player, "prefix").replace('&', '\u00A7'); String postfix = PermissionHandler.getInstance().getMeta(e.player, "postfix").replace('&', '\u00A7'); - String namecolor = PermissionHandler.getInstance().getMeta(e.player, "color"); - String msgcolor = PermissionHandler.getInstance().getMeta(e.player, "textcolor"); - ChatComponentStyle username = (ChatComponentStyle) e.player.func_145748_c_(); ChatComponentStyle msg = new ChatComponentText(e.message); - if(!namecolor.isEmpty()) - { - EnumChatFormatting color = EnumChatFormatting.getByColorCode(namecolor.charAt(0)); - if(color != null) - username.getChatStyle().setColor(color); - } - - if(!msgcolor.isEmpty()) - { - EnumChatFormatting color = EnumChatFormatting.getByColorCode(msgcolor.charAt(0)); - if(color != null) - msg.getChatStyle().setColor(color); - } - else - { - msg.getChatStyle().setColor(EnumChatFormatting.WHITE); - } + username.getChatStyle().setColor(BasicTypeParser.parseColor(PermissionHandler.getInstance().getMeta(e.player, "color"))); + EnumChatFormatting color = BasicTypeParser.parseColor(PermissionHandler.getInstance().getMeta(e.player, "textcolor")); + msg.getChatStyle().setColor(color != null ? color : EnumChatFormatting.WHITE); e.component = new ChatComponentTranslation("%s%s%s\u00A77: %s", prefix, username, postfix, msg); } 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 4ae21e4..4b98a09 100644 --- a/src/main/java/org/ultramine/server/data/player/PlayerCoreData.java +++ b/src/main/java/org/ultramine/server/data/player/PlayerCoreData.java @@ -17,6 +17,7 @@ private Teleporter teleporter; private long nextTeleportationTime; private WarpLocation lastLocation; + private String lastMessagedPlayer; public WarpLocation getHome(String name) { @@ -63,6 +64,16 @@ this.lastLocation = lastLocation; } + public String getLastMessagedPlayer() + { + return lastMessagedPlayer; + } + + public void setLastMessagedPlayer(String lastMessagedPlayer) + { + this.lastMessagedPlayer = lastMessagedPlayer; + } + @Override public void writeToNBT(NBTTagCompound nbt) { diff --git a/src/main/java/org/ultramine/server/util/BasicTypeParser.java b/src/main/java/org/ultramine/server/util/BasicTypeParser.java index 76badff..10eed9f 100644 --- a/src/main/java/org/ultramine/server/util/BasicTypeParser.java +++ b/src/main/java/org/ultramine/server/util/BasicTypeParser.java @@ -1,5 +1,6 @@ package org.ultramine.server.util; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.EnumDifficulty; public class BasicTypeParser @@ -82,4 +83,15 @@ return null; } + + public static EnumChatFormatting parseColor(String str) + { + if(!str.isEmpty()) + { + char c = str.charAt(0); + return EnumChatFormatting.getByColorCode(str.length() == 1 ? c : c == '&' ? str.charAt(1) : c); + } + + return null; + } } diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang index 0055ebf..9c9045d 100644 --- a/src/main/resources/assets/ultramine/lang/en_US.lang +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -16,6 +16,15 @@ command.difficulty.description=Changes difficulty setting of selected world command.difficulty.success=Difficulty of world %s changed from %s to %s +command.msg.usage=/msg +command.msg.description=Send private message to player +command.msg.display.outgoing=[me -> %s] %s +command.msg.display.incoming=[%s -> me] %s + +command.reply.usage=/reply +command.reply.description=Send private message to the last player which you sent message with /msg +command.reply.fail=Use /msg command first + # Permissions command.pconfig.usage=/pconfig command.pconfig.description=Save or reload all permissions configs