Recoded chat system; resolves #207

This commit is contained in:
Daniel Saukel 2017-02-20 18:05:03 +01:00
parent b3eac538d5
commit c506405a01
12 changed files with 293 additions and 91 deletions

View File

@ -20,7 +20,8 @@ import io.github.dre2n.commons.command.BRCommand;
import io.github.dre2n.commons.util.messageutil.MessageUtil; import io.github.dre2n.commons.util.messageutil.MessageUtil;
import io.github.dre2n.dungeonsxl.DungeonsXL; import io.github.dre2n.dungeonsxl.DungeonsXL;
import io.github.dre2n.dungeonsxl.config.DMessages; import io.github.dre2n.dungeonsxl.config.DMessages;
import io.github.dre2n.dungeonsxl.player.DGamePlayer; import io.github.dre2n.dungeonsxl.player.DGlobalPlayer;
import io.github.dre2n.dungeonsxl.player.DGroup;
import io.github.dre2n.dungeonsxl.player.DPermissions; import io.github.dre2n.dungeonsxl.player.DPermissions;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -42,21 +43,15 @@ public class ChatCommand extends BRCommand {
@Override @Override
public void onExecute(String[] args, CommandSender sender) { public void onExecute(String[] args, CommandSender sender) {
Player player = (Player) sender; Player player = (Player) sender;
DGamePlayer dPlayer = DGamePlayer.getByPlayer(player); DGlobalPlayer dPlayer = DungeonsXL.getDPlayers().getByPlayer(player);
if (dPlayer == null) { if (DGroup.getByPlayer(player) == null) {
MessageUtil.sendMessage(player, DMessages.ERROR_JOIN_GROUP.getMessage()); MessageUtil.sendMessage(player, DMessages.ERROR_JOIN_GROUP.getMessage());
return; return;
} }
if (dPlayer.isInDungeonChat()) { dPlayer.setInGroupChat(!dPlayer.isInGroupChat());
dPlayer.setInDungeonChat(false); MessageUtil.sendMessage(player, (dPlayer.isInGroupChat() ? DMessages.CMD_CHAT_DUNGEON_CHAT : DMessages.CMD_CHAT_NORMAL_CHAT).getMessage());
MessageUtil.sendMessage(player, DMessages.CMD_CHAT_NORMAL_CHAT.getMessage());
} else {
dPlayer.setInDungeonChat(true);
MessageUtil.sendMessage(player, DMessages.CMD_CHAT_DUNGEON_CHAT.getMessage());
}
} }
} }

View File

@ -31,7 +31,7 @@ import org.bukkit.entity.Player;
public class ChatSpyCommand extends BRCommand { public class ChatSpyCommand extends BRCommand {
public ChatSpyCommand() { public ChatSpyCommand() {
setCommand("chatspy"); setCommand("chatSpy");
setMinArgs(0); setMinArgs(0);
setMaxArgs(0); setMaxArgs(0);
setHelp(DMessages.HELP_CMD_CHATSPY.getMessage()); setHelp(DMessages.HELP_CMD_CHATSPY.getMessage());
@ -42,16 +42,10 @@ public class ChatSpyCommand extends BRCommand {
@Override @Override
public void onExecute(String[] args, CommandSender sender) { public void onExecute(String[] args, CommandSender sender) {
Player player = (Player) sender; Player player = (Player) sender;
DGlobalPlayer dGlobalPlayer = DungeonsXL.getDPlayers().getByPlayer(player); DGlobalPlayer dPlayer = DungeonsXL.getDPlayers().getByPlayer(player);
if (dGlobalPlayer.isInChatSpyMode()) { dPlayer.setInChatSpyMode(!dPlayer.isInChatSpyMode());
dGlobalPlayer.setInChatSpyMode(false); MessageUtil.sendMessage(player, (dPlayer.isInChatSpyMode() ? DMessages.CMD_CHATSPY_START : DMessages.CMD_CHATSPY_STOPPED).getMessage());
MessageUtil.sendMessage(player, DMessages.CMD_CHATSPY_STOPPED.getMessage());
} else {
dGlobalPlayer.setInChatSpyMode(true);
MessageUtil.sendMessage(player, DMessages.CMD_CHATSPY_START.getMessage());
}
} }
} }

View File

@ -18,6 +18,7 @@ package io.github.dre2n.dungeonsxl.command;
import io.github.dre2n.commons.command.BRCommands; import io.github.dre2n.commons.command.BRCommands;
import io.github.dre2n.commons.javaplugin.BRPlugin; import io.github.dre2n.commons.javaplugin.BRPlugin;
import io.github.dre2n.dungeonsxl.DungeonsXL;
/** /**
* An enumeration of all command instances. * An enumeration of all command instances.
@ -60,8 +61,6 @@ public class DCommands extends BRCommands {
public DCommands(BRPlugin plugin) { public DCommands(BRPlugin plugin) {
super("dungeonsxl", plugin, super("dungeonsxl", plugin,
BREAK, BREAK,
CHAT,
CHAT_SPY,
CREATE, CREATE,
DELETE, DELETE,
EDIT, EDIT,
@ -91,6 +90,10 @@ public class DCommands extends BRCommands {
UNINVITE, UNINVITE,
new DeletePortalCommand() new DeletePortalCommand()
); );
if (DungeonsXL.getMainConfig().isChatEnabled()) {
addCommand(CHAT);
addCommand(CHAT_SPY);
}
} }
} }

View File

@ -47,11 +47,17 @@ public class MainConfig extends BRConfig {
NEVER NEVER
} }
public static final int CONFIG_VERSION = 13; public static final int CONFIG_VERSION = 14;
private String language = "english"; private String language = "english";
private boolean enableEconomy = false; private boolean enableEconomy = false;
/* Chat */
private boolean chatEnabled = true;
private String chatFormatGame = "&2[Game] %group_color%%player_name%: &r";
private String chatFormatGroup = "&2%group_color%[%group_name%] %player_name%: &r";
private String chatFormatSpy = "&2[Chat Spy] %player_name%: &r";
/* Tutorial */ /* Tutorial */
private boolean tutorialActivated = false; private boolean tutorialActivated = false;
private String tutorialDungeon = "tutorial"; private String tutorialDungeon = "tutorial";
@ -140,6 +146,70 @@ public class MainConfig extends BRConfig {
enableEconomy = enabled; enableEconomy = enabled;
} }
/**
* @return
* if the dungeon chat is enabled
*/
public boolean isChatEnabled() {
return chatEnabled;
}
/**
* @param enabled
* if the dungeon chat is enabled
*/
public void setChatEnabled(boolean enabled) {
chatEnabled = enabled;
}
/**
* @return
* the game chat format
*/
public String getChatFormatGame() {
return chatFormatGame;
}
/**
* @param string
* the game chat format to set
*/
public void setChatFormatGame(String string) {
chatFormatGame = string;
}
/**
* @return
* the group chat format
*/
public String getChatFormatGroup() {
return chatFormatGroup;
}
/**
* @param string
* the group chat format to set
*/
public void setChatFormatGroup(String string) {
chatFormatGroup = string;
}
/**
* @return
* the chat spy format
*/
public String getChatFormatSpy() {
return chatFormatSpy;
}
/**
* @param string
* the chat spy format to set
*/
public void setChatFormatSpy(String string) {
chatFormatSpy = string;
}
/** /**
* @return if the tutorial is activated * @return if the tutorial is activated
*/ */
@ -396,6 +466,22 @@ public class MainConfig extends BRConfig {
config.set("enableEconomy", enableEconomy); config.set("enableEconomy", enableEconomy);
} }
if (!config.contains("chatEnabled")) {
config.set("chatEnabled", chatEnabled);
}
if (!config.contains("chatFormatGame")) {
config.set("chatFormatGame", chatFormatGame);
}
if (!config.contains("chatFormatGroup")) {
config.set("chatFormatGroup", chatFormatGroup);
}
if (!config.contains("chatFormatSpy")) {
config.set("chatFormatSpy", chatFormatSpy);
}
if (!config.contains("tutorial.activated")) { if (!config.contains("tutorial.activated")) {
config.set("tutorial.activated", tutorialActivated); config.set("tutorial.activated", tutorialActivated);
} }
@ -491,6 +577,26 @@ public class MainConfig extends BRConfig {
enableEconomy = config.getBoolean("enableEconomy"); enableEconomy = config.getBoolean("enableEconomy");
} }
if (config.contains("chatEnabled")) {
chatEnabled = config.getBoolean("chatEnabled");
}
if (config.contains("chatFormatGame")) {
chatFormatGame = config.getString("chatFormatGame");
}
if (config.contains("chatFormatGroup")) {
chatFormatGroup = config.getString("chatFormatGroup");
}
if (config.contains("chatFormatSpy")) {
chatFormatSpy = config.getString("chatFormatSpy");
}
if (config.contains("chatEnabled")) {
chatEnabled = config.getBoolean("chatEnabled");
}
if (config.contains("tutorial.activated")) { if (config.contains("tutorial.activated")) {
tutorialActivated = config.getBoolean("tutorial.activated"); tutorialActivated = config.getBoolean("tutorial.activated");
} }

View File

@ -24,7 +24,6 @@ import io.github.dre2n.dungeonsxl.event.dplayer.instance.DInstancePlayerUpdateEv
import io.github.dre2n.dungeonsxl.world.DEditWorld; import io.github.dre2n.dungeonsxl.world.DEditWorld;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
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.World; import org.bukkit.World;
@ -168,20 +167,6 @@ public class DEditPlayer extends DInstancePlayer {
} }
} }
@Override
public void sendMessage(String message) {
DEditWorld editWorld = DEditWorld.getByWorld(getWorld());
editWorld.sendMessage(message);
for (DGlobalPlayer player : DungeonsXL.getDPlayers().getDGlobalPlayers()) {
if (player.isInChatSpyMode()) {
if (!editWorld.getWorld().getPlayers().contains(player.getPlayer())) {
MessageUtil.sendMessage(player.getPlayer(), ChatColor.GREEN + "[Chatspy] " + ChatColor.WHITE + message);
}
}
}
}
@Override @Override
public void update(boolean updateSecond) { public void update(boolean updateSecond) {
boolean locationValid = true; boolean locationValid = true;

View File

@ -41,7 +41,6 @@ import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
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;
@ -800,20 +799,6 @@ public class DGamePlayer extends DInstancePlayer {
} }
} }
@Override
public void sendMessage(String message) {
DGameWorld gameWorld = DGameWorld.getByWorld(getWorld());
gameWorld.sendMessage(message);
for (DGlobalPlayer player : DungeonsXL.getDPlayers().getDGlobalPlayers()) {
if (player.isInChatSpyMode()) {
if (!gameWorld.getWorld().getPlayers().contains(player.getPlayer())) {
MessageUtil.sendMessage(player.getPlayer(), ChatColor.GREEN + "[Chatspy] " + ChatColor.WHITE + message);
}
}
}
}
public void onDeath(PlayerDeathEvent event) { public void onDeath(PlayerDeathEvent event) {
DGameWorld gameWorld = DGameWorld.getByWorld(player.getLocation().getWorld()); DGameWorld gameWorld = DGameWorld.getByWorld(player.getLocation().getWorld());
if (gameWorld == null) { if (gameWorld == null) {

View File

@ -47,8 +47,9 @@ public class DGlobalPlayer {
private DPlayerData data; private DPlayerData data;
private boolean breakMode; private boolean breakMode = false;
private boolean chatSpyMode; private boolean groupChat = false;
private boolean chatSpyMode = false;
private DPortal creatingPortal; private DPortal creatingPortal;
private boolean announcerEnabled = true; private boolean announcerEnabled = true;
@ -127,10 +128,31 @@ public class DGlobalPlayer {
this.breakMode = breakMode; this.breakMode = breakMode;
} }
/**
* @return if the player is in group chat
*/
public boolean isInGroupChat() {
if (!DungeonsXL.getMainConfig().isChatEnabled()) {
return false;
}
return groupChat;
}
/**
* @param groupChat
* set if the player is in group chat
*/
public void setInGroupChat(boolean groupChat) {
this.groupChat = groupChat;
}
/** /**
* @return if the player spies the DXL chat channels * @return if the player spies the DXL chat channels
*/ */
public boolean isInChatSpyMode() { public boolean isInChatSpyMode() {
if (!DungeonsXL.getMainConfig().isChatEnabled()) {
return false;
}
return chatSpyMode; return chatSpyMode;
} }
@ -264,6 +286,16 @@ public class DGlobalPlayer {
} }
/* Actions */ /* Actions */
/**
* Sends a message to the player
*
* @param message
* the message to send
*/
public void sendMessage(String message) {
MessageUtil.sendMessage(player, message);
}
/** /**
* Respawns the player at his old position before he was in a dungeon * Respawns the player at his old position before he was in a dungeon
*/ */

View File

@ -17,6 +17,9 @@
package io.github.dre2n.dungeonsxl.player; package io.github.dre2n.dungeonsxl.player;
import io.github.dre2n.dungeonsxl.DungeonsXL; import io.github.dre2n.dungeonsxl.DungeonsXL;
import io.github.dre2n.dungeonsxl.config.MainConfig;
import io.github.dre2n.dungeonsxl.util.ParsingUtil;
import io.github.dre2n.dungeonsxl.world.DInstanceWorld;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
@ -28,8 +31,9 @@ import org.bukkit.potion.PotionEffect;
*/ */
public abstract class DInstancePlayer extends DGlobalPlayer { public abstract class DInstancePlayer extends DGlobalPlayer {
MainConfig config = DungeonsXL.getMainConfig();
private World world; private World world;
private boolean inDungeonChat = false;
DInstancePlayer(Player player, World world) { DInstancePlayer(Player player, World world) {
super(player, false); super(player, false);
@ -54,21 +58,6 @@ public abstract class DInstancePlayer extends DGlobalPlayer {
world = instance; world = instance;
} }
/**
* @return the inDungeonChat
*/
public boolean isInDungeonChat() {
return inDungeonChat;
}
/**
* @param inDungeonChat
* the inDungeonChat to set
*/
public void setInDungeonChat(boolean inDungeonChat) {
this.inDungeonChat = inDungeonChat;
}
// Players in dungeons never get announcer messages // Players in dungeons never get announcer messages
@Override @Override
public boolean isAnnouncerEnabled() { public boolean isAnnouncerEnabled() {
@ -105,17 +94,34 @@ public abstract class DInstancePlayer extends DGlobalPlayer {
} }
} }
/**
* Makes the player send a message to the world.
*
* @param message
* the message to send
*/
public void chat(String message) {
DInstanceWorld instance = DungeonsXL.getDWorlds().getInstanceByWorld(world);
if (instance == null) {
return;
}
instance.sendMessage(ParsingUtil.replaceChatPlaceholders(config.getChatFormatGame(), this) + message);
for (DGlobalPlayer player : DungeonsXL.getDPlayers().getDGlobalPlayers()) {
if (player.isInChatSpyMode()) {
if (!instance.getWorld().getPlayers().contains(player.getPlayer())) {
player.sendMessage(ParsingUtil.replaceChatPlaceholders(config.getChatFormatSpy(), this) + message);
}
}
}
}
/* Abstracts */ /* Abstracts */
/** /**
* The player leaves the dungeon and / or his group. * The player leaves the dungeon and / or his group.
*/ */
public abstract void leave(); public abstract void leave();
/**
* Sends a message to the player and the world.
*/
public abstract void sendMessage(String message);
/** /**
* Repeating checks for the player. * Repeating checks for the player.
* *

View File

@ -25,6 +25,7 @@ import io.github.dre2n.dungeonsxl.global.DPortal;
import io.github.dre2n.dungeonsxl.global.GlobalProtection; import io.github.dre2n.dungeonsxl.global.GlobalProtection;
import io.github.dre2n.dungeonsxl.mob.DMob; import io.github.dre2n.dungeonsxl.mob.DMob;
import io.github.dre2n.dungeonsxl.trigger.UseItemTrigger; import io.github.dre2n.dungeonsxl.trigger.UseItemTrigger;
import io.github.dre2n.dungeonsxl.util.ParsingUtil;
import io.github.dre2n.dungeonsxl.world.DEditWorld; import io.github.dre2n.dungeonsxl.world.DEditWorld;
import io.github.dre2n.dungeonsxl.world.DGameWorld; import io.github.dre2n.dungeonsxl.world.DGameWorld;
import io.github.dre2n.dungeonsxl.world.block.LockedDoor; import io.github.dre2n.dungeonsxl.world.block.LockedDoor;
@ -65,6 +66,9 @@ public class DPlayerListener implements Listener {
DungeonsXL plugin; DungeonsXL plugin;
DPlayers dPlayers; DPlayers dPlayers;
MainConfig config = DungeonsXL.getMainConfig();
public static final String ALL = "@all ";
public DPlayerListener(DPlayers dPlayers) { public DPlayerListener(DPlayers dPlayers) {
this.plugin = DungeonsXL.getInstance(); this.plugin = DungeonsXL.getInstance();
@ -216,14 +220,24 @@ public class DPlayerListener implements Listener {
if (isCitizensNPC(player)) { if (isCitizensNPC(player)) {
return; return;
} }
DGamePlayer dPlayer = DGamePlayer.getByPlayer(player); DGlobalPlayer dPlayer = dPlayers.getByPlayer(player);
if (dPlayer == null) { if (dPlayer == null) {
return; return;
} }
if (!dPlayer.isInGroupChat()) {
return;
}
DGroup dGroup = DGroup.getByPlayer(player);
if (dGroup == null) {
return;
}
if (dPlayer.isInDungeonChat()) { boolean game = event.getMessage().startsWith(ALL) && dPlayer instanceof DInstancePlayer;
dPlayer.sendMessage(player.getDisplayName() + ": " + event.getMessage()); event.setCancelled(true);
event.setCancelled(true); if (game) {
((DInstancePlayer) dPlayer).chat(event.getMessage().substring(ALL.length()));
} else {
dGroup.sendMessage(ParsingUtil.replaceChatPlaceholders(config.getChatFormatGroup(), dPlayer) + event.getMessage());
} }
} }
@ -253,7 +267,7 @@ public class DPlayerListener implements Listener {
return; return;
} else { } else {
commandWhitelist.addAll(DungeonsXL.getMainConfig().getEditCommandWhitelist()); commandWhitelist.addAll(config.getEditCommandWhitelist());
} }
} else if (game != null) { } else if (game != null) {
@ -304,7 +318,7 @@ public class DPlayerListener implements Listener {
return; return;
} }
if (dPlayer instanceof DEditPlayer && !DungeonsXL.getMainConfig().getDropItems() && !DPermissions.hasPermission(player, DPermissions.INSECURE)) { if (dPlayer instanceof DEditPlayer && !config.getDropItems() && !DPermissions.hasPermission(player, DPermissions.INSECURE)) {
event.setCancelled(true); event.setCancelled(true);
} }
@ -352,7 +366,7 @@ public class DPlayerListener implements Listener {
return; return;
} }
if (!DungeonsXL.getMainConfig().isTutorialActivated()) { if (!config.isTutorialActivated()) {
return; return;
} }
@ -581,7 +595,8 @@ public class DPlayerListener implements Listener {
if (dGlobalPlayer.isCreatingPortal()) { if (dGlobalPlayer.isCreatingPortal()) {
if (item.getType() == Material.WOOD_SWORD) { if (item.getType() == Material.WOOD_SWORD) {
if (clickedBlock != null) { if (clickedBlock != null) {
for (GlobalProtection protection : DungeonsXL.getGlobalProtections().getProtections(DPortal.class)) { for (GlobalProtection protection : DungeonsXL.getGlobalProtections().getProtections(DPortal.class
)) {
DPortal dPortal = (DPortal) protection; DPortal dPortal = (DPortal) protection;
if (!dPortal.isActive()) { if (!dPortal.isActive()) {
if (dPortal == dGlobalPlayer.getPortal()) { if (dPortal == dGlobalPlayer.getPortal()) {

View File

@ -0,0 +1,68 @@
/*
* Copyright (C) 2012-2017 Frank Baumann
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package io.github.dre2n.dungeonsxl.util;
import io.github.dre2n.dungeonsxl.player.DGlobalPlayer;
import io.github.dre2n.dungeonsxl.player.DGroup;
/**
* @author Daniel Saukel
*/
public enum ParsingUtil {
GROUP_COLOR("%group_color%"),
GROUP_NAME("%group_name%"),
PLAYER_NAME("%player_name%");
private String placeholder;
ParsingUtil(String placeholder) {
this.placeholder = placeholder;
}
/* Getters and setters */
/**
* @return the placeholder
*/
public String getPlaceholder() {
return placeholder;
}
@Override
public String toString() {
return placeholder;
}
/* Statics */
/**
* Replace the placeholders that are relevant for the chat in a String automatically.
*
* @param string
* the String that contains the placeholders
* @param sender
* the DGlobalPlayer who sent the message
*/
public static String replaceChatPlaceholders(String string, DGlobalPlayer sender) {
DGroup group = DGroup.getByPlayer(sender.getPlayer());
string = string.replaceAll(PLAYER_NAME.getPlaceholder(), sender.getName());
string = string.replaceAll(GROUP_COLOR.getPlaceholder(), group.getDColor().getChatColor().toString());
string = string.replaceAll(GROUP_NAME.getPlaceholder(), group.getName());
return string;
}
}

View File

@ -203,11 +203,12 @@ public class DResourceWorld {
*/ */
public DInstanceWorld instantiate(final boolean game) { public DInstanceWorld instantiate(final boolean game) {
int id = worlds.generateId(); int id = worlds.generateId();
String name = worlds.generateName(game); String name = worlds.generateName(game, id);
final File instanceFolder = new File(Bukkit.getWorldContainer(), name); final File instanceFolder = new File(Bukkit.getWorldContainer(), name);
if (Bukkit.getWorld(name) != null) { while (Bukkit.getWorld(name) != null) {
return null; id++;
name = worlds.generateName(game, id);
} }
final DInstanceWorld instance = game ? new DGameWorld(this, instanceFolder, id) : new DEditWorld(this, instanceFolder, id); final DInstanceWorld instance = game ? new DGameWorld(this, instanceFolder, id) : new DEditWorld(this, instanceFolder, id);

View File

@ -263,13 +263,25 @@ public class DWorlds {
} }
/** /**
* @return a name for the instance * @return
* * a name for the instance
* @param game * @param game
* whether the instance is a DGameWorld * whether the instance is a DGameWorld
*/ */
public String generateName(boolean game) { public String generateName(boolean game) {
return "DXL_" + (game ? "Game" : "Edit") + "_" + generateId(); return generateName(game, generateId());
}
/**
* @return
* a name for the instance
* @param game
* whether the instance is a DGameWorld
* @param id
* the id to use
*/
public String generateName(boolean game, int id) {
return "DXL_" + (game ? "Game" : "Edit") + "_" + id;
} }
/** /**