2011-04-08 15:51:07 +02:00
|
|
|
package org.mcteam.factions.listeners;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-22 18:48:09 +01:00
|
|
|
import java.util.List;
|
2011-02-12 18:05:05 +01:00
|
|
|
import java.util.logging.Logger;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-30 12:11:06 +02:00
|
|
|
import org.bukkit.ChatColor;
|
2011-03-23 17:39:56 +01:00
|
|
|
import org.bukkit.Location;
|
2011-03-23 12:00:38 +01:00
|
|
|
import org.bukkit.Material;
|
2011-03-08 13:06:52 +01:00
|
|
|
import org.bukkit.block.Block;
|
2011-03-22 18:48:09 +01:00
|
|
|
import org.bukkit.command.CommandSender;
|
|
|
|
import org.bukkit.entity.Player;
|
2011-03-30 06:37:32 +02:00
|
|
|
import org.bukkit.event.block.Action;
|
2011-03-30 11:23:20 +02:00
|
|
|
import org.bukkit.event.player.PlayerBucketEmptyEvent;
|
|
|
|
import org.bukkit.event.player.PlayerBucketFillEvent;
|
2011-02-06 13:36:11 +01:00
|
|
|
import org.bukkit.event.player.PlayerChatEvent;
|
2011-03-30 06:37:32 +02:00
|
|
|
import org.bukkit.event.player.PlayerInteractEvent;
|
|
|
|
import org.bukkit.event.player.PlayerJoinEvent;
|
2011-02-06 13:36:11 +01:00
|
|
|
import org.bukkit.event.player.PlayerListener;
|
|
|
|
import org.bukkit.event.player.PlayerMoveEvent;
|
2011-03-23 17:39:56 +01:00
|
|
|
import org.bukkit.event.player.PlayerRespawnEvent;
|
2011-04-08 15:51:07 +02:00
|
|
|
import org.mcteam.factions.Board;
|
|
|
|
import org.mcteam.factions.Conf;
|
|
|
|
import org.mcteam.factions.FLocation;
|
|
|
|
import org.mcteam.factions.FPlayer;
|
|
|
|
import org.mcteam.factions.Faction;
|
|
|
|
import org.mcteam.factions.Factions;
|
|
|
|
import org.mcteam.factions.util.TextUtil;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-02-13 17:02:51 +01:00
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
|
|
|
|
public class FactionsPlayerListener extends PlayerListener{
|
2011-03-08 13:06:52 +01:00
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
@Override
|
2011-03-22 18:48:09 +01:00
|
|
|
public void onPlayerChat(PlayerChatEvent event) {
|
|
|
|
if ((event.getMessage().startsWith(Factions.instance.getBaseCommand()+" ") || event.getMessage().equals(Factions.instance.getBaseCommand())) && Conf.allowNoSlashCommand) {
|
|
|
|
List<String> parameters = TextUtil.split(event.getMessage().trim());
|
|
|
|
parameters.remove(0);
|
|
|
|
CommandSender sender = event.getPlayer();
|
|
|
|
Factions.instance.handleCommand(sender, parameters);
|
2011-02-06 13:36:11 +01:00
|
|
|
event.setCancelled(true);
|
2011-03-22 18:48:09 +01:00
|
|
|
return;
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
2011-03-22 18:48:09 +01:00
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
if (event.isCancelled()) {
|
2011-03-22 18:48:09 +01:00
|
|
|
return;
|
2011-02-12 18:05:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Player talkingPlayer = event.getPlayer();
|
2011-02-06 13:36:11 +01:00
|
|
|
String msg = event.getMessage();
|
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
// ... it was not a command. This means that it is a chat message!
|
2011-03-18 17:33:23 +01:00
|
|
|
FPlayer me = FPlayer.get(talkingPlayer);
|
2011-02-13 09:08:20 +01:00
|
|
|
|
|
|
|
// Is it a faction chat message?
|
|
|
|
if (me.isFactionChatting()) {
|
|
|
|
String message = String.format(Conf.factionChatFormat, me.getNameAndRelevant(me), msg);
|
2011-03-22 18:48:09 +01:00
|
|
|
me.getFaction().sendMessage(message);
|
2011-02-13 09:08:20 +01:00
|
|
|
Logger.getLogger("Minecraft").info("FactionChat "+me.getFaction().getTag()+": "+message);
|
|
|
|
event.setCancelled(true);
|
|
|
|
return;
|
|
|
|
}
|
2011-02-12 18:05:05 +01:00
|
|
|
|
|
|
|
// Are we to insert the Faction tag into the format?
|
|
|
|
// If we are not to insert it - we are done.
|
|
|
|
if ( ! Conf.chatTagEnabled) {
|
|
|
|
return;
|
|
|
|
}
|
2011-04-26 03:29:47 +02:00
|
|
|
|
|
|
|
int InsertIndex = Conf.chatTagInsertIndex;
|
|
|
|
if (InsertIndex > event.getFormat().length())
|
|
|
|
return;
|
|
|
|
|
|
|
|
String formatStart = event.getFormat().substring(0, InsertIndex);
|
|
|
|
String formatEnd = event.getFormat().substring(InsertIndex);
|
2011-02-12 18:05:05 +01:00
|
|
|
|
|
|
|
String nonColoredMsgFormat = formatStart + me.getChatTag() + formatEnd;
|
|
|
|
|
|
|
|
// Relation Colored?
|
|
|
|
if (Conf.chatTagRelationColored) {
|
|
|
|
// We must choke the standard message and send out individual messages to all players
|
|
|
|
// Why? Because the relations will differ.
|
|
|
|
event.setCancelled(true);
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
for (Player listeningPlayer : Factions.instance.getServer().getOnlinePlayers()) {
|
|
|
|
FPlayer you = FPlayer.get(listeningPlayer);
|
2011-02-12 18:05:05 +01:00
|
|
|
String yourFormat = formatStart + me.getChatTag(you) + formatEnd;
|
|
|
|
listeningPlayer.sendMessage(String.format(yourFormat, talkingPlayer.getDisplayName(), msg));
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
2011-02-12 18:05:05 +01:00
|
|
|
|
|
|
|
// Write to the log... We will write the non colored message.
|
2011-03-30 12:11:06 +02:00
|
|
|
String nonColoredMsg = ChatColor.stripColor(String.format(nonColoredMsgFormat, talkingPlayer.getDisplayName(), msg));
|
2011-02-12 18:05:05 +01:00
|
|
|
Logger.getLogger("Minecraft").info(nonColoredMsg);
|
|
|
|
} else {
|
|
|
|
// No relation color.
|
|
|
|
event.setFormat(nonColoredMsgFormat);
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2011-03-30 06:37:32 +02:00
|
|
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
2011-03-22 18:48:09 +01:00
|
|
|
// Make sure that all online players do have a fplayer.
|
2011-03-22 20:36:33 +01:00
|
|
|
FPlayer me = FPlayer.get(event.getPlayer());
|
|
|
|
|
|
|
|
// Update the lastLoginTime for this fplayer
|
|
|
|
me.setLastLoginTime(System.currentTimeMillis());
|
|
|
|
|
2011-03-23 12:00:38 +01:00
|
|
|
// Run the member auto kick routine. Twice to get to the admins...
|
2011-03-22 20:36:33 +01:00
|
|
|
FPlayer.autoLeaveOnInactivityRoutine();
|
|
|
|
FPlayer.autoLeaveOnInactivityRoutine();
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onPlayerMove(PlayerMoveEvent event) {
|
2011-03-18 17:33:23 +01:00
|
|
|
FPlayer me = FPlayer.get(event.getPlayer());
|
2011-02-13 17:04:06 +01:00
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
// Did we change coord?
|
2011-03-22 18:48:09 +01:00
|
|
|
FLocation from = me.getLastStoodAt();
|
|
|
|
FLocation to = new FLocation(event.getTo());
|
|
|
|
|
|
|
|
if (from.equals(to)) {
|
2011-02-06 13:36:11 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Yes we did change coord (:
|
2011-03-22 18:48:09 +01:00
|
|
|
|
|
|
|
me.setLastStoodAt(to);
|
2011-02-13 11:18:08 +01:00
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
if (me.isMapAutoUpdating()) {
|
2011-03-22 18:48:09 +01:00
|
|
|
me.sendMessage(Board.getMap(me.getFaction(), to, me.getPlayer().getLocation().getYaw()));
|
2011-02-06 13:36:11 +01:00
|
|
|
} else {
|
|
|
|
// Did we change "host"(faction)?
|
2011-03-22 18:48:09 +01:00
|
|
|
Faction factionFrom = Board.getFactionAt(from);
|
|
|
|
Faction factionTo = Board.getFactionAt(to);
|
2011-02-06 13:36:11 +01:00
|
|
|
if ( factionFrom != factionTo) {
|
|
|
|
me.sendFactionHereMessage();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-03-08 13:06:52 +01:00
|
|
|
|
|
|
|
@Override
|
2011-03-30 06:37:32 +02:00
|
|
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
2011-03-22 18:48:09 +01:00
|
|
|
if (event.isCancelled()) {
|
2011-03-08 13:06:52 +01:00
|
|
|
return;
|
2011-03-22 18:48:09 +01:00
|
|
|
}
|
2011-03-10 01:21:17 +01:00
|
|
|
|
2011-03-30 06:37:32 +02:00
|
|
|
Block block = event.getClickedBlock();
|
|
|
|
Player player = event.getPlayer();
|
|
|
|
|
2011-04-04 15:34:32 +02:00
|
|
|
if (block == null) {
|
|
|
|
return; // clicked in air, apparently
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! canPlayerUseBlock(player, block)) {
|
2011-03-30 06:37:32 +02:00
|
|
|
event.setCancelled(true);
|
|
|
|
return;
|
|
|
|
}
|
2011-04-04 15:34:32 +02:00
|
|
|
|
|
|
|
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
|
|
|
|
return; // only interested on right-clicks for below
|
|
|
|
}
|
|
|
|
|
2011-03-30 11:23:20 +02:00
|
|
|
// this check below might no longer be needed... bucket detection is now necessarily handled separately in onPlayerBucketXXX() events, and
|
|
|
|
// Flint&Steel is somehow detected before this in onBlockPlace(), and that's currently it for the default territoryDenyUseageMaterials
|
2011-03-30 06:37:32 +02:00
|
|
|
if ( ! this.playerCanUseItemHere(player, block, event.getMaterial())) {
|
2011-03-08 13:06:52 +01:00
|
|
|
event.setCancelled(true);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2011-03-30 06:37:32 +02:00
|
|
|
|
2011-03-23 12:00:38 +01:00
|
|
|
public boolean playerCanUseItemHere(Player player, Block block, Material material) {
|
2011-03-08 13:06:52 +01:00
|
|
|
|
2011-04-06 12:04:57 +02:00
|
|
|
if (Conf.adminBypassPlayers.contains(player.getName())) {
|
2011-04-04 14:16:53 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-03-23 12:00:38 +01:00
|
|
|
if ( ! Conf.territoryDenyUseageMaterials.contains(material)) {
|
2011-03-08 13:06:52 +01:00
|
|
|
return true; // Item isn't one we're preventing.
|
|
|
|
}
|
|
|
|
|
2011-03-22 18:48:09 +01:00
|
|
|
Faction otherFaction = Board.getFactionAt(new FLocation(block));
|
2011-03-08 13:06:52 +01:00
|
|
|
|
2011-03-23 17:39:56 +01:00
|
|
|
if (otherFaction.isNone()) {
|
2011-03-08 13:06:52 +01:00
|
|
|
return true; // This is not faction territory. Use whatever you like here.
|
|
|
|
}
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
FPlayer me = FPlayer.get(player);
|
2011-03-24 15:49:33 +01:00
|
|
|
|
New boolean config options territoryBlockTNT (default false), safeZoneDenyBuild (default true), safeZoneDenyUseage (default true), safeZoneBlockTNT (default true). territoryBlockTNT prevents TNT explosions inside faction territory, which defaults to false (same as before). It prevents TNT cannons from being a viable tactic, and I think for most people it would be an undesirable option. safeZoneBlockTNT prevents TNT explosions inside safe zone areas, which defaults to true (new behavior). I think most server operators would prefer safe zones to be safe from TNT, from TNT cannons or otherwise. safeZoneDenyBuild prevents players from building inside safe zone areas, which defaults to true (same as before). This option is added for server admins who, for whatever reason, want to let their players build and break inside safe zone areas. safeZoneDenyUseage prevents players from using items in the territoryDenyUseageMaterials list, which defaults to true (new behavior). This will (with the default list) prevent players from dumping/using buckets inside safe zone areas.
2011-04-04 13:31:48 +02:00
|
|
|
if (otherFaction.isSafeZone() && Conf.safeZoneDenyUseage) {
|
2011-03-24 15:49:33 +01:00
|
|
|
if (Factions.hasPermManageSafeZone(player)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in a safe zone.");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2011-03-08 13:06:52 +01:00
|
|
|
Faction myFaction = me.getFaction();
|
|
|
|
|
|
|
|
// Cancel if we are not in our own territory
|
|
|
|
if (myFaction != otherFaction) {
|
2011-03-24 15:49:33 +01:00
|
|
|
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in the territory of "+otherFaction.getTag(myFaction));
|
2011-03-08 13:06:52 +01:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2011-03-30 06:37:32 +02:00
|
|
|
|
2011-04-04 15:34:32 +02:00
|
|
|
public boolean canPlayerUseBlock(Player player, Block block) {
|
2011-04-04 14:16:53 +02:00
|
|
|
|
2011-04-06 12:04:57 +02:00
|
|
|
if (Conf.adminBypassPlayers.contains(player.getName())) {
|
2011-04-04 14:16:53 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-03-30 06:37:32 +02:00
|
|
|
Material material = block.getType();
|
|
|
|
|
|
|
|
// We only care about some material types.
|
|
|
|
if ( ! Conf.territoryProtectedMaterials.contains(material)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
FPlayer me = FPlayer.get(player);
|
|
|
|
Faction myFaction = me.getFaction();
|
|
|
|
Faction otherFaction = Board.getFactionAt(new FLocation(block));
|
|
|
|
|
|
|
|
// In safe zones you may use any block...
|
|
|
|
if (otherFaction.isNormal() && myFaction != otherFaction) {
|
|
|
|
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in the territory of "+otherFaction.getTag(myFaction));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// You may use doors in both safeZone and wilderness
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-03-23 17:39:56 +01:00
|
|
|
@Override
|
|
|
|
public void onPlayerRespawn(PlayerRespawnEvent event) {
|
|
|
|
FPlayer me = FPlayer.get(event.getPlayer());
|
|
|
|
Location home = me.getFaction().getHome();
|
|
|
|
if (Conf.homesEnabled && Conf.homesTeleportToOnDeath && home != null) {
|
|
|
|
event.setRespawnLocation(home);
|
|
|
|
}
|
|
|
|
}
|
2011-03-30 11:23:20 +02:00
|
|
|
|
|
|
|
// For some reason onPlayerInteract() sometimes misses bucket events depending on distance (something like 2-3 blocks away isn't detected),
|
|
|
|
// but these separate bucket events below always fire without fail
|
|
|
|
@Override
|
|
|
|
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) {
|
|
|
|
if (event.isCancelled()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Block block = event.getBlockClicked();
|
|
|
|
Player player = event.getPlayer();
|
|
|
|
|
|
|
|
if ( ! this.playerCanUseItemHere(player, block, event.getBucket())) {
|
|
|
|
event.setCancelled(true);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@Override
|
|
|
|
public void onPlayerBucketFill(PlayerBucketFillEvent event) {
|
|
|
|
if (event.isCancelled()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Block block = event.getBlockClicked();
|
|
|
|
Player player = event.getPlayer();
|
|
|
|
|
|
|
|
if ( ! this.playerCanUseItemHere(player, block, event.getBucket())) {
|
|
|
|
event.setCancelled(true);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|