mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2024-06-14 08:51:48 +00:00
709 lines
24 KiB
Java
709 lines
24 KiB
Java
package me.StevenLawson.TotalFreedomMod.Listener;
|
|
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Iterator;
|
|
import java.util.Map.Entry;
|
|
import java.util.regex.Pattern;
|
|
import me.StevenLawson.TotalFreedomMod.*;
|
|
import net.minecraft.server.BanEntry;
|
|
import net.minecraft.server.BanList;
|
|
import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.server.ServerConfigurationManagerAbstract;
|
|
import org.bukkit.*;
|
|
import org.bukkit.block.Block;
|
|
import org.bukkit.entity.LivingEntity;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.entity.TNTPrimed;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.event.block.Action;
|
|
import org.bukkit.event.block.LeavesDecayEvent;
|
|
import org.bukkit.event.player.*;
|
|
import org.bukkit.inventory.ItemStack;
|
|
import org.bukkit.util.Vector;
|
|
|
|
public class TFM_PlayerListener implements Listener
|
|
{
|
|
private static final SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z");
|
|
|
|
|
|
@EventHandler(priority = EventPriority.HIGH)
|
|
public void onPlayerInteract(PlayerInteractEvent event)
|
|
{
|
|
Player player = event.getPlayer();
|
|
|
|
switch (event.getAction())
|
|
{
|
|
case RIGHT_CLICK_AIR:
|
|
case RIGHT_CLICK_BLOCK:
|
|
{
|
|
switch (event.getMaterial())
|
|
{
|
|
case WATER_BUCKET:
|
|
{
|
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
|
player.sendMessage(ChatColor.GRAY + "Water buckets are currently disabled.");
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
case LAVA_BUCKET:
|
|
{
|
|
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemStack(Material.COOKIE, 1));
|
|
player.sendMessage(ChatColor.GRAY + "Lava buckets are currently disabled.");
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case LEFT_CLICK_AIR:
|
|
case LEFT_CLICK_BLOCK:
|
|
{
|
|
switch (event.getMaterial())
|
|
{
|
|
case STICK:
|
|
{
|
|
TFM_UserInfo playerdata = TFM_UserInfo.getPlayerData(player);
|
|
if (playerdata.mobThrowerEnabled())
|
|
{
|
|
Location player_pos = player.getLocation();
|
|
Vector direction = player_pos.getDirection().normalize();
|
|
|
|
LivingEntity rezzed_mob = (LivingEntity) player.getWorld().spawnEntity(player_pos.add(direction.multiply(2.0)), playerdata.mobThrowerCreature());
|
|
rezzed_mob.setVelocity(direction.multiply(playerdata.mobThrowerSpeed()));
|
|
playerdata.enqueueMob(rezzed_mob);
|
|
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
case SULPHUR:
|
|
{
|
|
TFM_UserInfo playerdata = TFM_UserInfo.getPlayerData(player);
|
|
if (playerdata.isMP44Armed())
|
|
{
|
|
if (playerdata.toggleMP44Firing())
|
|
{
|
|
playerdata.startArrowShooter(TotalFreedomMod.plugin);
|
|
}
|
|
else
|
|
{
|
|
playerdata.stopArrowShooter();
|
|
}
|
|
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
case BLAZE_ROD:
|
|
{
|
|
if (TotalFreedomMod.allowExplosions && (player.getName().equals("Madgeek1450") || player.getName().equals("markbyron")))
|
|
{
|
|
Block target_block = null;
|
|
|
|
if (event.getAction().equals(Action.LEFT_CLICK_AIR))
|
|
{
|
|
target_block = player.getTargetBlock(null, 120);
|
|
}
|
|
else
|
|
{
|
|
target_block = event.getClickedBlock();
|
|
}
|
|
|
|
if (target_block != null)
|
|
{
|
|
player.getWorld().createExplosion(target_block.getLocation(), 4F, true);
|
|
player.getWorld().strikeLightning(target_block.getLocation());
|
|
}
|
|
else
|
|
{
|
|
player.sendMessage("Can't resolve target block.");
|
|
}
|
|
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.NORMAL)
|
|
public void onPlayerMove(PlayerMoveEvent event)
|
|
{
|
|
Player p = event.getPlayer();
|
|
TFM_UserInfo playerdata = TFM_UserInfo.getPlayerData(p);
|
|
|
|
for (Entry<Player, Double> fuckoff : TotalFreedomMod.fuckoffEnabledFor.entrySet())
|
|
{
|
|
Player fuckoff_player = fuckoff.getKey();
|
|
|
|
if (fuckoff_player.equals(p) || !fuckoff_player.isOnline())
|
|
{
|
|
continue;
|
|
}
|
|
|
|
double fuckoff_range = fuckoff.getValue().doubleValue();
|
|
|
|
Location mover_pos = p.getLocation();
|
|
Location fuckoff_pos = fuckoff_player.getLocation();
|
|
|
|
double distance;
|
|
try
|
|
{
|
|
distance = mover_pos.distance(fuckoff_pos);
|
|
}
|
|
catch (IllegalArgumentException ex)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (distance < fuckoff_range)
|
|
{
|
|
event.setTo(fuckoff_pos.clone().add(mover_pos.subtract(fuckoff_pos).toVector().normalize().multiply(fuckoff_range * 1.1)));
|
|
break;
|
|
}
|
|
}
|
|
|
|
boolean do_freeze = false;
|
|
if (TotalFreedomMod.allPlayersFrozen)
|
|
{
|
|
if (!TFM_Util.isUserSuperadmin(p))
|
|
{
|
|
do_freeze = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (playerdata.isFrozen())
|
|
{
|
|
do_freeze = true;
|
|
}
|
|
}
|
|
|
|
if (do_freeze)
|
|
{
|
|
Location from = event.getFrom();
|
|
Location to = event.getTo().clone();
|
|
|
|
to.setX(from.getX());
|
|
to.setY(from.getY());
|
|
to.setZ(from.getZ());
|
|
|
|
event.setTo(to);
|
|
}
|
|
|
|
if (playerdata.isCaged())
|
|
{
|
|
Location target_pos = p.getLocation().add(0, 1, 0);
|
|
|
|
boolean out_of_cage = false;
|
|
if (!target_pos.getWorld().equals(playerdata.getCagePos().getWorld()))
|
|
{
|
|
out_of_cage = true;
|
|
}
|
|
else
|
|
{
|
|
out_of_cage = target_pos.distance(playerdata.getCagePos()) > 2.5;
|
|
}
|
|
|
|
if (out_of_cage)
|
|
{
|
|
playerdata.setCaged(true, target_pos, playerdata.getCageMaterial(TFM_UserInfo.CageLayer.INNER), playerdata.getCageMaterial(TFM_UserInfo.CageLayer.OUTER));
|
|
playerdata.regenerateHistory();
|
|
playerdata.clearHistory();
|
|
TFM_Util.buildHistory(target_pos, 2, playerdata);
|
|
TFM_Util.generateCube(target_pos, 2, playerdata.getCageMaterial(TFM_UserInfo.CageLayer.OUTER));
|
|
TFM_Util.generateCube(target_pos, 1, playerdata.getCageMaterial(TFM_UserInfo.CageLayer.INNER));
|
|
}
|
|
}
|
|
|
|
if (playerdata.isOrbiting())
|
|
{
|
|
if (p.getVelocity().length() < playerdata.orbitStrength() * (2.0 / 3.0))
|
|
{
|
|
p.setVelocity(new Vector(0, playerdata.orbitStrength(), 0));
|
|
}
|
|
}
|
|
|
|
// if (p.getItemInHand().getType() == Material.SPECKLED_MELON)
|
|
// {
|
|
// if (TFM_Util.isUserSuperadmin(p))
|
|
// {
|
|
// Location from_pos = event.getFrom().clone();
|
|
// Location to_pos = event.getTo().clone();
|
|
//
|
|
// /*
|
|
// Block block_pos = user_pos.clone().add(user_pos.getDirection().multiply(-2.0)).getBlock();
|
|
//
|
|
// if ((block_pos.isEmpty() || block_pos.isLiquid()))
|
|
// {
|
|
// block_pos.setTypeIdAndData(Material.WOOL.getId(), DyeColor.values()[randomGenerator.nextInt(DyeColor.values().length)].getData(), false);
|
|
// }
|
|
// */
|
|
// }
|
|
// }
|
|
|
|
if (TotalFreedomMod.landminesEnabled && TotalFreedomMod.allowExplosions)
|
|
{
|
|
Iterator<TFM_LandmineData> landmines = TFM_LandmineData.landmines.iterator();
|
|
while (landmines.hasNext())
|
|
{
|
|
TFM_LandmineData landmine = landmines.next();
|
|
|
|
Location landmine_pos = landmine.landmine_pos;
|
|
if (landmine_pos.getBlock().getType() != Material.TNT)
|
|
{
|
|
landmines.remove();
|
|
continue;
|
|
}
|
|
|
|
if (!landmine.player.equals(p))
|
|
{
|
|
if (p.getWorld().equals(landmine_pos.getWorld()))
|
|
{
|
|
if (p.getLocation().distance(landmine_pos) <= landmine.radius)
|
|
{
|
|
landmine.landmine_pos.getBlock().setType(Material.AIR);
|
|
|
|
TNTPrimed tnt1 = landmine_pos.getWorld().spawn(landmine_pos, TNTPrimed.class);
|
|
tnt1.setFuseTicks(40);
|
|
tnt1.setPassenger(p);
|
|
tnt1.setVelocity(new Vector(0.0, 2.0, 0.0));
|
|
|
|
TNTPrimed tnt2 = landmine_pos.getWorld().spawn(p.getLocation(), TNTPrimed.class);
|
|
tnt2.setFuseTicks(1);
|
|
|
|
p.setGameMode(GameMode.SURVIVAL);
|
|
landmines.remove();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.NORMAL)
|
|
public void onLeavesDecay(LeavesDecayEvent event)
|
|
{
|
|
event.setCancelled(true);
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.NORMAL)
|
|
public void onPlayerChat(AsyncPlayerChatEvent event)
|
|
{
|
|
try
|
|
{
|
|
Player p = event.getPlayer();
|
|
|
|
TFM_UserInfo playerdata = TFM_UserInfo.getPlayerData(p);
|
|
playerdata.incrementMsgCount();
|
|
|
|
if (playerdata.getMsgCount() > 10)
|
|
{
|
|
TFM_Util.bcastMsg(p.getName() + " was automatically kicked for spamming chat.", ChatColor.RED);
|
|
TFM_Util.autoEject(p, "Kicked for spamming chat.");
|
|
|
|
playerdata.resetMsgCount();
|
|
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
|
|
//JeromSar
|
|
|
|
// check for muted
|
|
if (playerdata.isMuted())
|
|
{
|
|
if (!TFM_Util.isUserSuperadmin(p))
|
|
{
|
|
p.sendMessage(ChatColor.RED + "You are currently muted.");
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
playerdata.setMuted(false);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Truncate messages that are too long.
|
|
String message = event.getMessage();
|
|
if (message.length() > 85)
|
|
{
|
|
event.setMessage(message.substring(0, 85));
|
|
}
|
|
|
|
event.setMessage(ChatColor.stripColor(event.getMessage()));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TFM_Log.severe(ex);
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.HIGH)
|
|
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
|
|
{
|
|
String command = event.getMessage();
|
|
Player p = event.getPlayer();
|
|
|
|
TFM_UserInfo playerdata = TFM_UserInfo.getPlayerData(p);
|
|
playerdata.incrementMsgCount();
|
|
|
|
if (playerdata.getMsgCount() > 10)
|
|
{
|
|
TFM_Util.bcastMsg(p.getName() + " was automatically kicked for spamming commands.", ChatColor.RED);
|
|
TFM_Util.autoEject(p, "Kicked for spamming commands.");
|
|
|
|
playerdata.resetMsgCount();
|
|
|
|
TFM_Util.wipeEntities(true);
|
|
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
|
|
if (TotalFreedomMod.preprocessLogEnabled)
|
|
{
|
|
TFM_Log.info(String.format("[PREPROCESS_COMMAND] %s(%s): %s", p.getName(), ChatColor.stripColor(p.getDisplayName()), command), true);
|
|
}
|
|
|
|
command = command.toLowerCase().trim();
|
|
|
|
boolean block_command = false;
|
|
|
|
//Commands that will auto-kick the user:
|
|
if (Pattern.compile("^/stop").matcher(command).find())
|
|
{
|
|
if (!TFM_Util.isUserSuperadmin(p))
|
|
{
|
|
block_command = true;
|
|
}
|
|
}
|
|
else if (Pattern.compile("^/reload").matcher(command).find())
|
|
{
|
|
if (!TFM_Util.isUserSuperadmin(p))
|
|
{
|
|
block_command = true;
|
|
}
|
|
}
|
|
else if (Pattern.compile("^/save-").matcher(command).find())
|
|
{
|
|
if (!TFM_Util.isUserSuperadmin(p))
|
|
{
|
|
block_command = true;
|
|
}
|
|
}
|
|
|
|
if (block_command)
|
|
{
|
|
TFM_Util.autoEject(p, "That command is prohibited.");
|
|
TFM_Util.bcastMsg(p.getName() + " was automatically kicked for using harmful commands.", ChatColor.RED);
|
|
}
|
|
else
|
|
{
|
|
//Commands that will not auto-kick the user, but still deny:
|
|
if (Pattern.compile("^/time").matcher(command).find())
|
|
{
|
|
p.sendMessage(ChatColor.GRAY + "Server-side time changing is disabled. Please use /ptime to set your own personal time.");
|
|
block_command = true;
|
|
}
|
|
else if (Pattern.compile("^/md").matcher(command).find())
|
|
{
|
|
p.sendMessage(ChatColor.GRAY + "This server now uses DisguiseCraft instead of MobDisguise. Type /d to disguise and /u to undisguise.");
|
|
block_command = true;
|
|
}
|
|
}
|
|
|
|
if (block_command)
|
|
{
|
|
p.sendMessage(ChatColor.RED + "That command is prohibited.");
|
|
event.setCancelled(true);
|
|
return;
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.NORMAL)
|
|
public void onPlayerDropItem(PlayerDropItemEvent event)
|
|
{
|
|
if (TotalFreedomMod.autoEntityWipe)
|
|
{
|
|
if (event.getPlayer().getWorld().getEntities().size() > 750)
|
|
{
|
|
event.setCancelled(true);
|
|
}
|
|
else
|
|
{
|
|
event.getItemDrop().remove();
|
|
}
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.MONITOR)
|
|
public void onPlayerKick(PlayerKickEvent event)
|
|
{
|
|
Player p = event.getPlayer();
|
|
if (TotalFreedomMod.fuckoffEnabledFor.containsKey(p))
|
|
{
|
|
TotalFreedomMod.fuckoffEnabledFor.remove(p);
|
|
}
|
|
TFM_UserInfo playerdata = TFM_UserInfo.getPlayerData(p);
|
|
playerdata.disarmMP44();
|
|
if (playerdata.isCaged())
|
|
{
|
|
playerdata.regenerateHistory();
|
|
playerdata.clearHistory();
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.MONITOR)
|
|
public void onPlayerQuit(PlayerQuitEvent event)
|
|
{
|
|
Player p = event.getPlayer();
|
|
if (TotalFreedomMod.fuckoffEnabledFor.containsKey(p))
|
|
{
|
|
TotalFreedomMod.fuckoffEnabledFor.remove(p);
|
|
}
|
|
TFM_UserInfo playerdata = TFM_UserInfo.getPlayerData(p);
|
|
playerdata.disarmMP44();
|
|
if (playerdata.isCaged())
|
|
{
|
|
playerdata.regenerateHistory();
|
|
playerdata.clearHistory();
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.MONITOR)
|
|
public void onPlayerJoin(PlayerJoinEvent event)
|
|
{
|
|
try
|
|
{
|
|
final Player p = event.getPlayer();
|
|
|
|
TFM_UserList.getInstance(TotalFreedomMod.plugin).addUser(p);
|
|
|
|
boolean superadmin_impostor = TFM_Util.isSuperadminImpostor(p);
|
|
|
|
if (superadmin_impostor || TFM_Util.isUserSuperadmin(p))
|
|
{
|
|
TFM_Util.bcastMsg(ChatColor.AQUA + p.getName() + " is " + TFM_Util.getRank(p));
|
|
|
|
if (superadmin_impostor)
|
|
{
|
|
p.getInventory().clear();
|
|
p.setOp(false);
|
|
p.setGameMode(GameMode.SURVIVAL);
|
|
}
|
|
else
|
|
{
|
|
p.setOp(true);
|
|
}
|
|
}
|
|
|
|
if (TotalFreedomMod.adminOnlyMode)
|
|
{
|
|
TotalFreedomMod.plugin.getServer().getScheduler().scheduleAsyncDelayedTask(TotalFreedomMod.plugin, new Runnable()
|
|
{
|
|
@Override
|
|
public void run()
|
|
{
|
|
p.sendMessage(ChatColor.RED + "Server is currently closed to non-superadmins.");
|
|
}
|
|
}, 60L);
|
|
}
|
|
}
|
|
catch (Throwable ex)
|
|
{
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.HIGHEST)
|
|
public void onPlayerLogin(PlayerLoginEvent event)
|
|
{
|
|
//This should supersede all other onPlayerLogin authentication on the TFM server.
|
|
//When using the TFM CraftBukkit, CraftBukkit itself should not do any of its own authentication.
|
|
|
|
final Server server = TotalFreedomMod.plugin.getServer();
|
|
|
|
final ServerConfigurationManagerAbstract scm = MinecraftServer.getServer().getServerConfigurationManager();
|
|
final BanList banByIP = scm.getIPBans();
|
|
final BanList banByName = scm.getNameBans();
|
|
|
|
final Player p = event.getPlayer();
|
|
|
|
final String player_name = p.getName();
|
|
final String player_ip = event.getAddress().getHostAddress().trim().toLowerCase();
|
|
|
|
if (player_name.trim().length() <= 2)
|
|
{
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your username is too short (must be at least 3 characters long).");
|
|
return;
|
|
}
|
|
else if (Pattern.compile("[^a-zA-Z0-9\\-\\.\\_]").matcher(player_name).find())
|
|
{
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your username contains invalid characters.");
|
|
return;
|
|
}
|
|
|
|
//Not safe to use TFM_Util.isUserSuperadmin for player logging in because p.getAddress() will return a null until after player login.
|
|
boolean is_superadmin;
|
|
if (server.getOnlineMode())
|
|
{
|
|
is_superadmin = TotalFreedomMod.superadmins.contains(player_name.toLowerCase());
|
|
}
|
|
else
|
|
{
|
|
//is_superadmin = TotalFreedomMod.superadmin_ips.contains(player_ip);
|
|
is_superadmin = TFM_Util.checkPartialSuperadminIP(player_ip);
|
|
}
|
|
|
|
if (!is_superadmin)
|
|
{
|
|
BanEntry ban_entry = null;
|
|
|
|
if (banByName.isBanned(player_name.toLowerCase()))
|
|
{
|
|
ban_entry = (BanEntry) banByName.getEntries().get(player_name.toLowerCase());
|
|
|
|
String kick_message = "You are banned from this server.";
|
|
if (ban_entry != null)
|
|
{
|
|
kick_message = kick_message + "\nReason: " + ban_entry.getReason();
|
|
if (ban_entry.getExpires() != null)
|
|
{
|
|
kick_message = kick_message + "\nYour ban will be removed on " + date_format.format(ban_entry.getExpires());
|
|
}
|
|
}
|
|
|
|
event.disallow(PlayerLoginEvent.Result.KICK_BANNED, kick_message);
|
|
return;
|
|
}
|
|
|
|
boolean is_ip_banned = false;
|
|
|
|
@SuppressWarnings("rawtypes")
|
|
Iterator ip_bans = banByIP.getEntries().keySet().iterator();
|
|
while (ip_bans.hasNext())
|
|
{
|
|
String test_ip = (String) ip_bans.next();
|
|
|
|
if (!test_ip.matches("^\\d{1,3}\\.\\d{1,3}\\.(\\d{1,3}|\\*)\\.(\\d{1,3}|\\*)$"))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (player_ip.equals(test_ip))
|
|
{
|
|
ban_entry = (BanEntry) banByIP.getEntries().get(test_ip);
|
|
is_ip_banned = true;
|
|
break;
|
|
}
|
|
|
|
String[] test_ip_parts = test_ip.split("\\.");
|
|
String[] player_ip_parts = player_ip.split("\\.");
|
|
|
|
boolean is_match = false;
|
|
|
|
for (int i = 0; i < test_ip_parts.length && i < player_ip_parts.length; i++)
|
|
{
|
|
if (test_ip_parts[i].equals("*") && i >= 2)
|
|
{
|
|
is_match = true;
|
|
}
|
|
else if (test_ip_parts[i].equals(player_ip_parts[i]))
|
|
{
|
|
is_match = true;
|
|
}
|
|
else
|
|
{
|
|
is_match = false;
|
|
}
|
|
|
|
if (!is_match)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (is_match)
|
|
{
|
|
ban_entry = (BanEntry) banByIP.getEntries().get(test_ip);
|
|
is_ip_banned = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (is_ip_banned)
|
|
{
|
|
String kick_message = "Your IP address is banned from this server.";
|
|
if (ban_entry != null)
|
|
{
|
|
kick_message = kick_message + "\nReason: " + ban_entry.getReason();
|
|
if (ban_entry.getExpires() != null)
|
|
{
|
|
kick_message = kick_message + "\nYour ban will be removed on " + date_format.format(ban_entry.getExpires());
|
|
}
|
|
}
|
|
|
|
event.disallow(PlayerLoginEvent.Result.KICK_BANNED, kick_message);
|
|
return;
|
|
}
|
|
|
|
if (server.getOnlinePlayers().length >= server.getMaxPlayers())
|
|
{
|
|
event.disallow(PlayerLoginEvent.Result.KICK_FULL, "Sorry, but this server is full.");
|
|
return;
|
|
}
|
|
|
|
if (TotalFreedomMod.adminOnlyMode)
|
|
{
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server is temporarily open to admins only.");
|
|
return;
|
|
}
|
|
|
|
for (Player test_player : server.getOnlinePlayers())
|
|
{
|
|
if (test_player.getName().equalsIgnoreCase(player_name))
|
|
{
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your username is already logged into this server.");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (Player test_player : server.getOnlinePlayers())
|
|
{
|
|
if (test_player.getName().equalsIgnoreCase(player_name))
|
|
{
|
|
test_player.kickPlayer("An admin just logged in with the username you are using.");
|
|
}
|
|
}
|
|
|
|
boolean can_kick = true; //If the server is full of superadmins, however unlikely that might be, this will prevent an infinite loop.
|
|
while (server.getOnlinePlayers().length >= server.getMaxPlayers() && can_kick)
|
|
{
|
|
can_kick = false;
|
|
for (Player test_player : server.getOnlinePlayers())
|
|
{
|
|
if (!TFM_Util.isUserSuperadmin(test_player))
|
|
{
|
|
can_kick = true;
|
|
test_player.kickPlayer("You have been kicked to free up room for an admin.");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|