浏览代码

BETA: Administration rework:
* AdminTable now contains:
* GmListTable
* AdminCommandAccessRights
* AccessLevels
* Moved access_levels and admin_command_access_rights into data/accessLevels.xml, adminCommands.xml
* '''Changed access levels now full root access level is 8 so 127 is no longer valid'''!
* Replacing some FastList/FastMap with ArrayList/HashMap where synchronization isn't required in:
* L2Character
* L2World
'''NOTE: Requires DP Update!'''

Rumen Nikiforov 13 年之前
父节点
当前提交
a322ecf953
共有 26 个文件被更改,包括 556 次插入855 次删除
  1. 0 15
      L2J_Server_BETA/dist/game/config/Character.properties
  2. 0 6
      L2J_Server_BETA/java/com/l2jserver/Config.java
  3. 2 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java
  4. 0 161
      L2J_Server_BETA/java/com/l2jserver/gameserver/GmListTable.java
  5. 0 218
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/AccessLevels.java
  6. 0 135
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/AdminCommandAccessRights.java
  7. 319 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/AdminTable.java
  8. 4 13
      L2J_Server_BETA/java/com/l2jserver/gameserver/geoeditorcon/GeoEditorListener.java
  9. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/PetitionManager.java
  10. 63 109
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2AccessLevel.java
  11. 15 39
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2AdminCommandAccessRight.java
  12. 3 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2World.java
  13. 3 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/StatsSet.java
  14. 34 47
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  15. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/l2skills/L2SkillCreateItem.java
  16. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java
  17. 8 9
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
  18. 78 52
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java
  19. 3 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestDropItem.java
  20. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestGmList.java
  21. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPetition.java
  22. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPetitionCancel.java
  23. 3 14
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSendPost.java
  24. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/SendBypassBuildCmd.java
  25. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/Die.java
  26. 6 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/util/IllegalPlayerAction.java

+ 0 - 15
L2J_Server_BETA/dist/game/config/Character.properties

@@ -5,21 +5,6 @@
 # The defaults are set to be retail-like. If you modify any of these settings your server will deviate from being retail-like.
 # Warning: 
 # Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-# ---------------------------------------------------------------------------
-# AccessLevel
-# ---------------------------------------------------------------------------
-# This option will set the default AccessLevel for MasterAccess.
-# Please be careful with this setting. Characters set to this AccessLevel will have the right to execute every AdminCommand in game.
-# Default: 127 (Maximum value: 255)
-MasterAccessLevel = 127
-
-# Name color for those matching the above MasterAccess AccessLevel.
-# Default: 00CCFF
-MasterNameColor = 00CCFF
-
-# Title color for those matching the above MasterAccess AccessLevel.
-# Default: 00CCFF
-MasterTitleColor = 00CCFF
 
 # ---------------------------------------------------------------------------
 # Statistics

+ 0 - 6
L2J_Server_BETA/java/com/l2jserver/Config.java

@@ -94,9 +94,6 @@ public final class Config
 	// --------------------------------------------------
 	// L2J Variable Definitions
 	// --------------------------------------------------
-	public static int MASTERACCESS_LEVEL;
-	public static int MASTERACCESS_NAME_COLOR;
-	public static int MASTERACCESS_TITLE_COLOR;
 	public static boolean ALT_GAME_DELEVEL;
 	public static boolean DECREASE_SKILL_LEVEL;
 	public static double ALT_WEIGHT_LIMIT;
@@ -1497,9 +1494,6 @@ public final class Config
 				L2Properties Character = new L2Properties();
 				Character.load(is);
 				
-				MASTERACCESS_LEVEL = Integer.parseInt(Character.getProperty("MasterAccessLevel", "127"));
-				MASTERACCESS_NAME_COLOR = Integer.decode(StringUtil.concat("0x", Character.getProperty("MasterNameColor", "00FF00")));
-				MASTERACCESS_TITLE_COLOR = Integer.decode(StringUtil.concat("0x", Character.getProperty("MasterTitleColor", "00FF00")));
 				ALT_GAME_DELEVEL = Boolean.parseBoolean(Character.getProperty("Delevel", "true"));
 				DECREASE_SKILL_LEVEL = Boolean.parseBoolean(Character.getProperty("DecreaseSkillOnDelevel", "true"));
 				ALT_WEIGHT_LIMIT = Double.parseDouble(Character.getProperty("AltWeightLimit", "1"));

+ 2 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java

@@ -34,8 +34,7 @@ import com.l2jserver.L2DatabaseFactory;
 import com.l2jserver.Server;
 import com.l2jserver.gameserver.cache.CrestCache;
 import com.l2jserver.gameserver.cache.HtmCache;
-import com.l2jserver.gameserver.datatables.AccessLevels;
-import com.l2jserver.gameserver.datatables.AdminCommandAccessRights;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.datatables.ArmorSetsData;
 import com.l2jserver.gameserver.datatables.AugmentationData;
 import com.l2jserver.gameserver.datatables.CharNameTable;
@@ -239,9 +238,7 @@ public class GameServer
 		CharTemplateTable.getInstance();
 		CharNameTable.getInstance();
 		LevelUpData.getInstance();
-		AccessLevels.getInstance();
-		AdminCommandAccessRights.getInstance();
-		GmListTable.getInstance();
+		AdminTable.getInstance();
 		RaidBossPointsManager.getInstance();
 		PetDataTable.getInstance();
 		CharSummonTable.getInstance().init();

+ 0 - 161
L2J_Server_BETA/java/com/l2jserver/gameserver/GmListTable.java

@@ -1,161 +0,0 @@
-/*
- * 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 com.l2jserver.gameserver;
-
-import java.util.logging.Logger;
-
-import javolution.util.FastList;
-import javolution.util.FastMap;
-
-import com.l2jserver.Config;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
-import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
-
-/**
- * This class stores references to all online game masters. (access level > 100)
- * 
- * @version $Revision: 1.2.2.1.2.7 $ $Date: 2005/04/05 19:41:24 $
- */
-public class GmListTable
-{
-	private static final Logger _log = Logger.getLogger(GmListTable.class.getName());
-	
-	/** Set(L2PcInstance>) containing all the GM in game */
-	private FastMap<L2PcInstance, Boolean> _gmList;
-	
-	public static GmListTable getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
-	public FastList<L2PcInstance> getAllGms(boolean includeHidden)
-	{
-		FastList<L2PcInstance> tmpGmList = new FastList<L2PcInstance>();
-		
-		for (FastMap.Entry<L2PcInstance, Boolean> n = _gmList.head(), end = _gmList.tail(); (n = n.getNext()) != end;)
-			if (includeHidden || !n.getValue())
-				tmpGmList.add(n.getKey());
-		
-		return tmpGmList;
-	}
-	
-	public FastList<String> getAllGmNames(boolean includeHidden)
-	{
-		FastList<String> tmpGmList = new FastList<String>();
-		
-		for (FastMap.Entry<L2PcInstance, Boolean> n = _gmList.head(), end = _gmList.tail(); (n = n.getNext()) != end;)
-			if (!n.getValue())
-				tmpGmList.add(n.getKey().getName());
-			else if (includeHidden)
-				tmpGmList.add(n.getKey().getName() + " (invis)");
-		
-		return tmpGmList;
-	}
-	
-	private GmListTable()
-	{
-		_gmList = new FastMap<L2PcInstance, Boolean>().shared();
-	}
-	
-	/**
-	 * Add a L2PcInstance player to the Set _gmList
-	 * @param player 
-	 * @param hidden 
-	 */
-	public void addGm(L2PcInstance player, boolean hidden)
-	{
-		if (Config.DEBUG)
-			_log.fine("added gm: " + player.getName());
-		_gmList.put(player, hidden);
-	}
-	
-	public void deleteGm(L2PcInstance player)
-	{
-		if (Config.DEBUG)
-			_log.fine("deleted gm: " + player.getName());
-		
-		_gmList.remove(player);
-	}
-	
-	/**
-	 * GM will be displayed on clients gmlist
-	 * @param player
-	 */
-	public void showGm(L2PcInstance player)
-	{
-		FastMap.Entry<L2PcInstance, Boolean> gm = _gmList.getEntry(player);
-		if (gm != null)
-			gm.setValue(false);
-	}
-	
-	/**
-	 * GM will no longer be displayed on clients gmlist
-	 * @param player
-	 */
-	public void hideGm(L2PcInstance player)
-	{
-		FastMap.Entry<L2PcInstance, Boolean> gm = _gmList.getEntry(player);
-		if (gm != null)
-			gm.setValue(true);
-	}
-	
-	public boolean isGmOnline(boolean includeHidden)
-	{
-		for (FastMap.Entry<L2PcInstance, Boolean> n = _gmList.head(), end = _gmList.tail(); (n = n.getNext()) != end;)
-		{
-			if (includeHidden || !n.getValue())
-				return true;
-		}
-		
-		return false;
-	}
-	
-	public void sendListToPlayer(L2PcInstance player)
-	{
-		if (isGmOnline(player.isGM()))
-		{
-			player.sendPacket(SystemMessageId.GM_LIST);
-			
-			for (String name : getAllGmNames(player.isGM()))
-			{
-				SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.GM_C1);
-				sm.addString(name);
-				player.sendPacket(sm);
-			}
-		}
-		else
-			player.sendPacket(SystemMessageId.NO_GM_PROVIDING_SERVICE_NOW);
-	}
-	
-	public static void broadcastToGMs(L2GameServerPacket packet)
-	{
-		for (L2PcInstance gm : getInstance().getAllGms(true))
-			gm.sendPacket(packet);
-	}
-	
-	public static void broadcastMessageToGMs(String message)
-	{
-		for (L2PcInstance gm : getInstance().getAllGms(true))
-			gm.sendMessage(message);
-	}
-	
-	@SuppressWarnings("synthetic-access")
-	private static class SingletonHolder
-	{
-		protected static final GmListTable _instance = new GmListTable();
-	}
-}

+ 0 - 218
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/AccessLevels.java

@@ -1,218 +0,0 @@
-/*
- * 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 com.l2jserver.gameserver.datatables;
-
-import gnu.trove.map.hash.TIntObjectHashMap;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.l2jserver.Config;
-import com.l2jserver.L2DatabaseFactory;
-import com.l2jserver.gameserver.model.L2AccessLevel;
-
-/**
- * @author FBIagent<br>
- */
-public class AccessLevels
-{
-	/** The logger<br> */
-	private static Logger _log = Logger.getLogger(AccessLevels.class.getName());
-	/** Reserved master access level<br> */
-	public static final int _masterAccessLevelNum = Config.MASTERACCESS_LEVEL;
-	/** The master access level which can use everything<br> */
-	public static L2AccessLevel _masterAccessLevel = new L2AccessLevel(_masterAccessLevelNum, "Master Access", Config.MASTERACCESS_NAME_COLOR, Config.MASTERACCESS_TITLE_COLOR, null, true, true, true, true, true, true, true, true);
-	/** Reserved user access level<br> */
-	public static final int _userAccessLevelNum = 0;
-	/** The user access level which can do no administrative tasks<br> */
-	public static L2AccessLevel _userAccessLevel = new L2AccessLevel(_userAccessLevelNum, "User", -1, -1, null, false, false, false, true, false, true, true, true);
-	/** FastMap of access levels defined in database<br> */
-	private TIntObjectHashMap<L2AccessLevel> _accessLevels;
-	
-	/**
-	 * Returns the one and only instance of this class<br><br>
-	 * 
-	 * @return AccessLevels: the one and only instance of this class<br>
-	 */
-	public static AccessLevels getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
-	private AccessLevels()
-	{
-		loadAccessLevels();
-		_accessLevels.put(_userAccessLevelNum, _userAccessLevel);
-	}
-	
-	/**
-	 * Loads the access levels from database<br>
-	 */
-	private void loadAccessLevels()
-	{
-		_accessLevels = new TIntObjectHashMap<L2AccessLevel>();
-		
-		Connection con = null;
-		
-		try
-		{
-			con = L2DatabaseFactory.getInstance().getConnection();
-			
-			PreparedStatement stmt = con.prepareStatement("SELECT * FROM `access_levels` ORDER BY `accessLevel` DESC");
-			ResultSet rset = stmt.executeQuery();
-			int accessLevel = 0;
-			String name = null;
-			int nameColor = 0;
-			int titleColor = 0;
-			String childs = null;
-			boolean isGm = false;
-			boolean allowPeaceAttack = false;
-			boolean allowFixedRes = false;
-			boolean allowTransaction = false;
-			boolean allowAltG = false;
-			boolean giveDamage = false;
-			boolean takeAggro = false;
-			boolean gainExp = false;
-			
-			while (rset.next())
-			{
-				accessLevel = rset.getInt("accessLevel");
-				name = rset.getString("name");
-				
-				if (accessLevel == _userAccessLevelNum)
-				{
-					_log.warning("AccessLevels: Access level with name " + name + " is using reserved user access level " + _userAccessLevelNum + ". Ignoring it!");
-					continue;
-				}
-				else if (accessLevel == _masterAccessLevelNum)
-				{
-					_log.warning("AccessLevels: Access level with name " + name + " is using reserved master access level " + _masterAccessLevelNum + ". Ignoring it!");
-					continue;
-				}
-				else if (accessLevel < 0)
-				{
-					_log.warning("AccessLevels: Access level with name " + name + " is using banned access level state(below 0). Ignoring it!");
-					continue;
-				}
-				
-				try
-				{
-					nameColor = Integer.decode("0x" + rset.getString("nameColor"));
-				}
-				catch (NumberFormatException nfe)
-				{
-					try
-					{
-						nameColor = Integer.decode("0xFFFFFF");
-					}
-					catch (NumberFormatException nfe2)
-					{
-						
-					}
-				}
-				
-				try
-				{
-					titleColor = Integer.decode("0x" + rset.getString("titleColor"));
-					
-				}
-				catch (NumberFormatException nfe)
-				{
-					try
-					{
-						titleColor = Integer.decode("0xFFFF77");
-					}
-					catch (NumberFormatException nfe2)
-					{
-						
-					}
-				}
-				
-				childs = rset.getString("childAccess");
-				isGm = rset.getBoolean("isGm");
-				allowPeaceAttack = rset.getBoolean("allowPeaceAttack");
-				allowFixedRes = rset.getBoolean("allowFixedRes");
-				allowTransaction = rset.getBoolean("allowTransaction");
-				allowAltG = rset.getBoolean("allowAltg");
-				giveDamage = rset.getBoolean("giveDamage");
-				takeAggro = rset.getBoolean("takeAggro");
-				gainExp = rset.getBoolean("gainExp");
-				
-				_accessLevels.put(accessLevel, new L2AccessLevel(accessLevel, name, nameColor, titleColor, childs.isEmpty() ? null : childs, isGm, allowPeaceAttack, allowFixedRes, allowTransaction, allowAltG, giveDamage, takeAggro, gainExp));
-			}
-			
-			rset.close();
-			stmt.close();
-		}
-		catch (SQLException e)
-		{
-			_log.log(Level.WARNING, "AccessLevels: Error loading from database:" + e.getMessage(), e);
-		}
-		finally
-		{
-			L2DatabaseFactory.close(con);
-		}
-		_log.info("AccessLevels: Loaded " + _accessLevels.size() + " from database.");
-	}
-	
-	/**
-	 * Returns the access level by characterAccessLevel<br><br>
-	 * 
-	 * @param accessLevelNum as int<br><br>
-	 *
-	 * @return AccessLevel: AccessLevel instance by char access level<br>
-	 */
-	public L2AccessLevel getAccessLevel(int accessLevelNum)
-	{
-		L2AccessLevel accessLevel = null;
-		
-		synchronized (_accessLevels)
-		{
-			accessLevel = _accessLevels.get(accessLevelNum);
-		}
-		return accessLevel;
-	}
-	
-	/**
-	 * @param accessLevel
-	 */
-	public void addBanAccessLevel(int accessLevel)
-	{
-		synchronized (_accessLevels)
-		{
-			if (accessLevel > -1)
-			{
-				return;
-			}
-			
-			_accessLevels.put(accessLevel, new L2AccessLevel(accessLevel, "Banned", -1, -1, null, false, false, false, false, false, false, false, false));
-		}
-	}
-	
-	public void reloadAccessLevels()
-	{
-		loadAccessLevels();
-	}
-	
-	@SuppressWarnings("synthetic-access")
-	private static class SingletonHolder
-	{
-		protected static final AccessLevels _instance = new AccessLevels();
-	}
-}

+ 0 - 135
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/AdminCommandAccessRights.java

@@ -1,135 +0,0 @@
-/*
- * 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 com.l2jserver.gameserver.datatables;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javolution.util.FastMap;
-
-import com.l2jserver.L2DatabaseFactory;
-import com.l2jserver.gameserver.model.L2AccessLevel;
-import com.l2jserver.gameserver.model.L2AdminCommandAccessRight;
-
-/**
- * @author FBIagent<br>
- */
-public class AdminCommandAccessRights
-{
-	/** The logger<br> */
-	private static Logger _log = Logger.getLogger(AdminCommandAccessRights.class.getName());
-	
-	private Map<String, L2AdminCommandAccessRight> _adminCommandAccessRights;
-	
-	/**
-	 * Returns the one and only instance of this class<br><br>
-	 * 
-	 * @return AdminCommandAccessRights: the one and only instance of this class<br>
-	 */
-	public static AdminCommandAccessRights getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
-	/** The access rights<br> */
-	private AdminCommandAccessRights()
-	{
-		loadAdminCommandAccessRights();
-	}
-	
-	/**
-	 * Loads admin command access rights from database<br>
-	 */
-	private void loadAdminCommandAccessRights()
-	{
-		_adminCommandAccessRights = new FastMap<String, L2AdminCommandAccessRight>();
-		
-		Connection con = null;
-		
-		try
-		{
-			con = L2DatabaseFactory.getInstance().getConnection();
-			
-			PreparedStatement stmt = con.prepareStatement("SELECT * FROM admin_command_access_rights");
-			ResultSet rset = stmt.executeQuery();
-			String adminCommand = null;
-			String accessLevels = null;
-			boolean confirm = false;
-			
-			while (rset.next())
-			{
-				adminCommand = rset.getString("adminCommand");
-				accessLevels = rset.getString("accessLevels");
-				confirm = rset.getBoolean("confirmDlg");
-				_adminCommandAccessRights.put(adminCommand, new L2AdminCommandAccessRight(adminCommand, accessLevels, confirm));
-			}
-			rset.close();
-			stmt.close();
-		}
-		catch (SQLException e)
-		{
-			_log.log(Level.WARNING, "AdminCommandAccessRights: Error loading from database:" + e.getMessage(), e);
-		}
-		finally
-		{
-			L2DatabaseFactory.close(con);
-		}
-		
-		_log.info("AdminCommandAccessRights: Loaded " + _adminCommandAccessRights.size() + " from database.");
-	}
-	
-	public boolean hasAccess(String adminCommand, L2AccessLevel accessLevel)
-	{
-		if (accessLevel.getLevel() == AccessLevels._masterAccessLevelNum)
-			return true;
-		
-		L2AdminCommandAccessRight acar = _adminCommandAccessRights.get(adminCommand);
-		
-		if (acar == null)
-		{
-			_log.info("AdminCommandAccessRights: No rights defined for admin command " + adminCommand + ".");
-			return false;
-		}
-		
-		return acar.hasAccess(accessLevel);
-	}
-	
-	public boolean requireConfirm(String command)
-	{
-		L2AdminCommandAccessRight acar = _adminCommandAccessRights.get(command);
-		if (acar == null)
-		{
-			_log.info("AdminCommandAccessRights: No rights defined for admin command " + command + ".");
-			return false;
-		}
-		return _adminCommandAccessRights.get(command).getRequireConfirm();
-	}
-	
-	public void reloadAdminCommandAccessRights()
-	{
-		loadAdminCommandAccessRights();
-	}
-	
-	@SuppressWarnings("synthetic-access")
-	private static class SingletonHolder
-	{
-		protected static final AdminCommandAccessRights _instance = new AdminCommandAccessRights();
-	}
-}

+ 319 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/AdminTable.java

@@ -0,0 +1,319 @@
+/*
+ * 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 com.l2jserver.gameserver.datatables;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+
+import javolution.util.FastMap;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.engines.DocumentParser;
+import com.l2jserver.gameserver.model.L2AccessLevel;
+import com.l2jserver.gameserver.model.L2AdminCommandAccessRight;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+
+/**
+ * @author UnAfraid
+ */
+public class AdminTable extends DocumentParser
+{
+	private Map<Integer, L2AccessLevel> _accessLevels;
+	private Map<String, L2AdminCommandAccessRight> _adminCommandAccessRights;
+	private Map<L2PcInstance, Boolean> _gmList;
+	private int _highestLevel = 0;
+	private AdminTable()
+	{
+		_accessLevels = new HashMap<>();
+		_adminCommandAccessRights = new HashMap<>();
+		_gmList = new FastMap<L2PcInstance, Boolean>().shared();
+		load();
+	}
+	
+	@Override
+	protected void parseDocument(Document doc)
+	{
+		NamedNodeMap attrs;
+		Node attr;
+		StatsSet set;
+		L2AccessLevel level;
+		L2AdminCommandAccessRight command;
+		for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+		{
+			if ("list".equalsIgnoreCase(n.getNodeName()))
+			{
+				for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+				{
+					if ("access".equalsIgnoreCase(d.getNodeName()))
+					{
+						set = new StatsSet();
+						attrs = d.getAttributes();
+						for (int i = 0; i < attrs.getLength(); i++)
+						{
+							attr = attrs.item(i);
+							set.set(attr.getNodeName(), attr.getNodeValue());
+						}
+						level = new L2AccessLevel(set);
+						if (level.getLevel() >  _highestLevel)
+						{
+							_highestLevel = level.getLevel();
+						}
+						_accessLevels.put(level.getLevel(), level);
+					}
+					else if ("admin".equalsIgnoreCase(d.getNodeName()))
+					{
+						set = new StatsSet();
+						attrs = d.getAttributes();
+						for (int i = 0; i < attrs.getLength(); i++)
+						{
+							attr = attrs.item(i);
+							set.set(attr.getNodeName(), attr.getNodeValue());
+						}
+						command = new L2AdminCommandAccessRight(set);
+						_adminCommandAccessRights.put(command.getAdminCommand(), command);
+					}
+				}
+			}
+		}
+	}
+	
+	private void load()
+	{
+		parseFile(new File(Config.DATAPACK_ROOT, "data/accessLevels.xml"));
+		_log.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _accessLevels.size() + " Access Levels");
+		parseFile(new File(Config.DATAPACK_ROOT, "data/adminCommands.xml"));
+		_log.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _adminCommandAccessRights.size() + " Access Commands");
+	}
+	
+	public void reload()
+	{
+		_accessLevels.clear();
+		_adminCommandAccessRights.clear();
+		load();
+	}
+	
+	/**
+	 * @return AccessLevels: the one and only instance of this class<br>
+	 */
+	public static AdminTable getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	
+	/**
+	 * Returns the access level by characterAccessLevel<br>
+	 * <br>
+	 * @param accessLevelNum as int<br>
+	 * <br>
+	 * @return AccessLevel: AccessLevel instance by char access level<br>
+	 */
+	public L2AccessLevel getAccessLevel(int accessLevelNum)
+	{
+		if (accessLevelNum < 0)
+		{
+			return _accessLevels.get(-1);
+		}
+		else if (!_accessLevels.containsKey(accessLevelNum))
+		{
+			_accessLevels.put(accessLevelNum, new L2AccessLevel());
+		}
+		return _accessLevels.get(accessLevelNum);
+	}
+	
+	public L2AccessLevel getMasterAccessLevel()
+	{
+		return _accessLevels.get(_highestLevel);
+	}
+	
+	public boolean hasAccessLevel(int id)
+	{
+		return _accessLevels.containsKey(id);
+	}
+	
+	public boolean hasAccess(String adminCommand, L2AccessLevel accessLevel)
+	{	
+		L2AdminCommandAccessRight acar = _adminCommandAccessRights.get(adminCommand);
+		
+		if (acar == null)
+		{
+			// Trying to avoid the spam for next time when the gm would try to use the same command
+			if (accessLevel.getLevel() > 0 && accessLevel.getLevel() == _highestLevel)
+			{
+				acar = new L2AdminCommandAccessRight(adminCommand, true, accessLevel.getLevel());
+				_adminCommandAccessRights.put(adminCommand, acar);
+				_log.info("AdminCommandAccessRights: No rights defined for admin command " + adminCommand + " auto setting accesslevel: " + accessLevel.getLevel() + " !");
+			}
+			else
+			{
+				_log.info("AdminCommandAccessRights: No rights defined for admin command " + adminCommand + " !");
+				return false;
+			}
+		}
+		
+		return acar.hasAccess(accessLevel);
+	}
+	
+	public boolean requireConfirm(String command)
+	{
+		L2AdminCommandAccessRight acar = _adminCommandAccessRights.get(command);
+		if (acar == null)
+		{
+			_log.info("AdminCommandAccessRights: No rights defined for admin command " + command + ".");
+			return false;
+		}
+		return acar.getRequireConfirm();
+	}
+	
+	public List<L2PcInstance> getAllGms(boolean includeHidden)
+	{
+		List<L2PcInstance> tmpGmList = new ArrayList<>();
+		
+		for (Entry<L2PcInstance, Boolean> entry : _gmList.entrySet())
+		{
+			if (includeHidden || !entry.getValue())
+			{
+				tmpGmList.add(entry.getKey());
+			}
+		}
+		
+		return tmpGmList;
+	}
+	
+	public List<String> getAllGmNames(boolean includeHidden)
+	{
+		List<String> tmpGmList = new ArrayList<>();
+		
+		for (Entry<L2PcInstance, Boolean> entry : _gmList.entrySet())
+		{
+			if (!entry.getValue())
+			{
+				tmpGmList.add(entry.getKey().getName());
+			}
+			else if (includeHidden)
+			{
+				tmpGmList.add(entry.getKey().getName() + " (invis)");
+			}
+		}
+		
+		return tmpGmList;
+	}
+	
+
+	/**
+	 * Add a L2PcInstance player to the Set _gmList
+	 * @param player 
+	 * @param hidden 
+	 */
+	public void addGm(L2PcInstance player, boolean hidden)
+	{
+		if (Config.DEBUG)
+			_log.fine("added gm: " + player.getName());
+		_gmList.put(player, hidden);
+	}
+	
+	public void deleteGm(L2PcInstance player)
+	{
+		if (Config.DEBUG)
+			_log.fine("deleted gm: " + player.getName());
+		
+		_gmList.remove(player);
+	}
+	
+	/**
+	 * GM will be displayed on clients gmlist
+	 * @param player
+	 */
+	public void showGm(L2PcInstance player)
+	{
+		if (_gmList.containsKey(player))
+			_gmList.put(player, false);
+	}
+	
+	/**
+	 * GM will no longer be displayed on clients gmlist
+	 * @param player
+	 */
+	public void hideGm(L2PcInstance player)
+	{
+		if (_gmList.containsKey(player))
+			_gmList.put(player, true);
+	}
+	
+	public boolean isGmOnline(boolean includeHidden)
+	{
+		for (Entry<L2PcInstance, Boolean> entry : _gmList.entrySet())
+		{
+			if (includeHidden || !entry.getValue())
+				return true;
+		}
+		
+		return false;
+	}
+	
+	public void sendListToPlayer(L2PcInstance player)
+	{
+		if (isGmOnline(player.isGM()))
+		{
+			player.sendPacket(SystemMessageId.GM_LIST);
+			
+			for (String name : getAllGmNames(player.isGM()))
+			{
+				SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.GM_C1);
+				sm.addString(name);
+				player.sendPacket(sm);
+			}
+		}
+		else
+		{
+			player.sendPacket(SystemMessageId.NO_GM_PROVIDING_SERVICE_NOW);
+		}
+	}
+	
+	public void broadcastToGMs(L2GameServerPacket packet)
+	{
+		for (L2PcInstance gm : getInstance().getAllGms(true))
+		{
+			gm.sendPacket(packet);
+		}
+	}
+	
+	public void broadcastMessageToGMs(String message)
+	{
+		for (L2PcInstance gm : getInstance().getAllGms(true))
+		{
+			gm.sendMessage(message);
+		}
+	}
+	
+	@SuppressWarnings("synthetic-access")
+	private static class SingletonHolder
+	{
+		protected static final AdminTable _instance = new AdminTable();
+	}
+}

+ 4 - 13
L2J_Server_BETA/java/com/l2jserver/gameserver/geoeditorcon/GeoEditorListener.java

@@ -75,12 +75,10 @@ public class GeoEditorListener extends Thread
 	@Override
 	public void run()
 	{
-		Socket connection = null;
-		try
+		try (Socket connection = _serverSocket.accept())
 		{
-			while (true)
+			while (!isInterrupted())
 			{
-				connection = _serverSocket.accept();
 				if (_geoEditor != null && _geoEditor.isWorking())
 				{
 					_log.warning("Geoeditor already connected!");
@@ -95,13 +93,6 @@ public class GeoEditorListener extends Thread
 		catch (Exception e)
 		{
 			_log.log(Level.WARNING, "GeoEditorListener: " + e.getMessage(), e);
-			try
-			{
-				connection.close();
-			}
-			catch (Exception e2)
-			{
-			}
 		}
 		finally
 		{
@@ -109,9 +100,9 @@ public class GeoEditorListener extends Thread
 			{
 				_serverSocket.close();
 			}
-			catch (IOException io)
+			catch (Exception e)
 			{
-				_log.log(Level.INFO, "", io);
+				_log.log(Level.WARNING, "GeoEditorListener: " + e.getMessage(), e);
 			}
 			_log.warning("GeoEditorListener Closed!");
 		}

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/PetitionManager.java

@@ -24,7 +24,7 @@ import javolution.util.FastList;
 import javolution.util.FastMap;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.GmListTable;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.idfactory.IdFactory;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -554,7 +554,7 @@ public final class PetitionManager
 		
 		// Notify all GMs that a new petition has been submitted.
 		String msgContent = petitioner.getName() + " has submitted a new petition."; //(ID: " + newPetitionId + ").";
-		GmListTable.broadcastToGMs(new CreatureSay(petitioner.getObjectId(), Say2.HERO_VOICE, "Petition System", msgContent));
+		AdminTable.getInstance().broadcastToGMs(new CreatureSay(petitioner.getObjectId(), Say2.HERO_VOICE, "Petition System", msgContent));
 		
 		return newPetitionId;
 	}

+ 63 - 109
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2AccessLevel.java

@@ -14,26 +14,21 @@
  */
 package com.l2jserver.gameserver.model;
 
-import java.util.logging.Logger;
-
-import com.l2jserver.gameserver.datatables.AccessLevels;
-
+import com.l2jserver.gameserver.datatables.AdminTable;
 
 /**
  * @author FBIagent<br>
  */
 public class L2AccessLevel
 {
-	/** The logger<br> */
-	private static Logger _log = Logger.getLogger( L2AccessLevel.class.getName() );
 	/** The access level<br> */
 	private int _accessLevel = 0;
 	/** The access level name<br> */
 	private String _name = null;
 	/** Child access levels */
-	L2AccessLevel[] _childsAccessLevel = null;
+	L2AccessLevel _childsAccessLevel = null;
 	/** Child access levels */
-	private String _childs = null;
+	private int _child = 0;
 	/** The name color for the access level<br> */
 	private int _nameColor = 0;
 	/** The title color for the access level<br> */
@@ -55,46 +50,43 @@ public class L2AccessLevel
 	/** Flag to gain exp in party */
 	private boolean _gainExp = false;
 	
-	/**
-	 * Initializes members<br><br>
-	 * 
-	 * @param accessLevel as int<br>
-	 * @param name as String<br>
-	 * @param nameColor as int<br>
-	 * @param titleColor as int<br>
-	 * @param childs as String<br>
-	 * @param isGm as boolean<br>
-	 * @param allowPeaceAttack as boolean<br>
-	 * @param allowFixedRes as boolean<br>
-	 * @param allowTransaction as boolean<br>
-	 * @param allowAltG as boolean<br>
-	 * @param giveDamage as boolean<br>
-	 * @param takeAggro as boolean<br>
-	 * @param gainExp as boolean<br>
-	 */
-	public L2AccessLevel(int accessLevel, String name, int nameColor, int titleColor, String childs, boolean isGm,
-			boolean allowPeaceAttack, boolean allowFixedRes, boolean allowTransaction, boolean allowAltG, boolean giveDamage, boolean takeAggro, boolean gainExp)
+	public L2AccessLevel(StatsSet set)
 	{
-		_accessLevel = accessLevel;
-		_name = name;
-		_nameColor = nameColor;
-		_titleColor = titleColor;
-		_childs = childs;
-		_isGm = isGm;
-		_allowPeaceAttack = allowPeaceAttack;
-		_allowFixedRes = allowFixedRes;
-		_allowTransaction = allowTransaction;
-		_allowAltG = allowAltG;
-		_giveDamage = giveDamage;
-		_takeAggro = takeAggro;
-		_gainExp = gainExp;
+		_accessLevel = set.getInteger("level");
+		_name = set.getString("name");
+		_nameColor = Integer.decode("0x" + set.getString("nameColor", "FFFFFF"));
+		_titleColor = Integer.decode("0x" + set.getString("titleColor", "FFFFFF"));
+		_child = set.getInteger("childAccess", 0);
+		_isGm = set.getBool("isGM", false);
+		_allowPeaceAttack = set.getBool("allowPeaceAttack", false);
+		_allowFixedRes = set.getBool("allowFixedRes", false);
+		_allowTransaction = set.getBool("allowTransaction", true);
+		_allowAltG = set.getBool("allowAltg", false);
+		_giveDamage = set.getBool("giveDamage", true);
+		_takeAggro = set.getBool("takeAggro", true);
+		_gainExp = set.getBool("gainExp", true);
 	}
 	
-	
+	public L2AccessLevel()
+	{
+		_accessLevel = 0;
+		_name = "User";
+		_nameColor = Integer.decode("0xFFFFFF");
+		_titleColor = Integer.decode("0xFFFFFF");
+		_child = 0;
+		_isGm = false;
+		_allowPeaceAttack = false;
+		_allowFixedRes = false;
+		_allowTransaction = true;
+		_allowAltG = false;
+		_giveDamage = true;
+		_takeAggro = true;
+		_gainExp = true;
+	}
 	
 	/**
-	 * Returns the access level<br><br>
-	 * 
+	 * Returns the access level<br>
+	 * <br>
 	 * @return int: access level<br>
 	 */
 	public int getLevel()
@@ -103,8 +95,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Returns the access level name<br><br>
-	 * 
+	 * Returns the access level name<br>
+	 * <br>
 	 * @return String: access level name<br>
 	 */
 	public String getName()
@@ -113,8 +105,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Returns the name color of the access level<br><br>
-	 * 
+	 * Returns the name color of the access level<br>
+	 * <br>
 	 * @return int: the name color for the access level<br>
 	 */
 	public int getNameColor()
@@ -123,8 +115,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Returns the title color color of the access level<br><br>
-	 * 
+	 * Returns the title color color of the access level<br>
+	 * <br>
 	 * @return int: the title color for the access level<br>
 	 */
 	public int getTitleColor()
@@ -133,8 +125,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Retuns if the access level has gm access or not<br><br>
-	 * 
+	 * Retuns if the access level has gm access or not<br>
+	 * <br>
 	 * @return boolean: true if access level have gm access, otherwise false<br>
 	 */
 	public boolean isGm()
@@ -143,8 +135,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Returns if the access level is allowed to attack in peace zone or not<br><br>
-	 * 
+	 * Returns if the access level is allowed to attack in peace zone or not<br>
+	 * <br>
 	 * @return boolean: true if the access level is allowed to attack in peace zone, otherwise false<br>
 	 */
 	public boolean allowPeaceAttack()
@@ -153,7 +145,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Retruns if the access level is allowed to use fixed res or not<br><br>
+	 * Retruns if the access level is allowed to use fixed res or not<br>
+	 * <br>
 	 * @return true if the access level is allowed to use fixed res, otherwise false<br>
 	 */
 	public boolean allowFixedRes()
@@ -162,8 +155,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Returns if the access level is allowed to perform transactions or not<br><br>
-	 * 
+	 * Returns if the access level is allowed to perform transactions or not<br>
+	 * <br>
 	 * @return boolean: true if access level is allowed to perform transactions, otherwise false<br>
 	 */
 	public boolean allowTransaction()
@@ -172,8 +165,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Returns if the access level is allowed to use AltG commands or not<br><br>
-	 * 
+	 * Returns if the access level is allowed to use AltG commands or not<br>
+	 * <br>
 	 * @return boolean: true if access level is allowed to use AltG commands, otherwise false<br>
 	 */
 	public boolean allowAltG()
@@ -182,8 +175,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Returns if the access level can give damage or not<br><br>
-	 * 
+	 * Returns if the access level can give damage or not<br>
+	 * <br>
 	 * @return boolean: true if the access level can give damage, otherwise false<br>
 	 */
 	public boolean canGiveDamage()
@@ -192,8 +185,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Returns if the access level can take aggro or not<br><br>
-	 * 
+	 * Returns if the access level can take aggro or not<br>
+	 * <br>
 	 * @return boolean: true if the access level can take aggro, otherwise false<br>
 	 */
 	public boolean canTakeAggro()
@@ -202,8 +195,8 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Returns if the access level can gain exp or not<br><br>
-	 * 
+	 * Returns if the access level can gain exp or not<br>
+	 * <br>
 	 * @return boolean: true if the access level can gain exp, otherwise false<br>
 	 */
 	public boolean canGainExp()
@@ -212,60 +205,21 @@ public class L2AccessLevel
 	}
 	
 	/**
-	 * Returns if the access level contains allowedAccess as child<br><br>
-	 *
-	 * @param accessLevel as AccessLevel<br><br>
-	 * 
+	 * Returns if the access level contains allowedAccess as child<br>
+	 * @param accessLevel as AccessLevel<br>
 	 * @return boolean: true if a child access level is equals to allowedAccess, otherwise false<br>
 	 */
 	public boolean hasChildAccess(L2AccessLevel accessLevel)
 	{
 		if (_childsAccessLevel == null)
 		{
-			if (_childs == null)
-				return false;
-			
-			setChildAccess(_childs);
-			for (L2AccessLevel childAccess : _childsAccessLevel)
-			{
-				if (childAccess != null && (childAccess.getLevel() == accessLevel.getLevel() || childAccess.hasChildAccess(accessLevel)))
-					return true;
-			}
-		}
-		else
-		{
-			for (L2AccessLevel childAccess : _childsAccessLevel)
+			if (_child <= 0)
 			{
-				if (childAccess != null && (childAccess.getLevel() == accessLevel.getLevel() || childAccess.hasChildAccess(accessLevel)))
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	private void setChildAccess(String childs)
-	{
-		String[] childsSplit = childs.split(";");
-		
-		_childsAccessLevel = new L2AccessLevel[childsSplit.length];
-		
-		for (int i = 0;i < childsSplit.length;++ i)
-		{
-			L2AccessLevel accessLevelInst = AccessLevels.getInstance().getAccessLevel(Integer.parseInt(childsSplit[i]));
-			
-			if (accessLevelInst == null)
-			{
-				_log.warning("AccessLevel: Undefined child access level " + childsSplit[i]);
-				continue;
-			}
-			
-			if (accessLevelInst.hasChildAccess(this))
-			{
-				_log.warning("AccessLevel: Child access tree overlapping for " + _name + " and " + accessLevelInst.getName());
-				continue;
+				return false;
 			}
 			
-			_childsAccessLevel[i] = accessLevelInst;
+			_childsAccessLevel = AdminTable.getInstance().getAccessLevel(_child);
 		}
+		return (_childsAccessLevel.getLevel() == accessLevel.getLevel() || _childsAccessLevel.hasChildAccess(accessLevel));
 	}
 }

+ 15 - 39
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2AdminCommandAccessRight.java

@@ -14,47 +14,31 @@
  */
 package com.l2jserver.gameserver.model;
 
-import com.l2jserver.gameserver.datatables.AccessLevels;
+import com.l2jserver.gameserver.datatables.AdminTable;
 
 /**
  * @author FBIagent<br>
  */
 public class L2AdminCommandAccessRight
-{
+{	
 	/** The admin command<br> */
 	private String _adminCommand = null;
 	/** The access levels which can use the admin command<br> */
-	private L2AccessLevel[] _accessLevels = null;
+	private int _accessLevel;
 	private boolean _requireConfirm;
 	
-	/**
-	 * Initialized members
-	 * 
-	 * @param adminCommand as String
-	 * @param accessLevels as String
-	 * @param confirm 
-	 */
-	public L2AdminCommandAccessRight(String adminCommand, String accessLevels, boolean confirm)
+	public L2AdminCommandAccessRight(StatsSet set)
+	{
+		_adminCommand = set.getString("command");
+		_requireConfirm = set.getBool("confirmDlg", false);
+		_accessLevel = set.getInteger("accessLevel", 7);		
+	}
+	
+	public L2AdminCommandAccessRight(String command, boolean confirm, int level)
 	{
-		_adminCommand = adminCommand;
+		_adminCommand = command;
 		_requireConfirm = confirm;
-		
-		String[] accessLevelsSplit = accessLevels.split(",");
-		int numLevels = accessLevelsSplit.length;
-		
-		_accessLevels = new L2AccessLevel[numLevels];
-		
-		for (int i = 0; i < numLevels; ++i)
-		{
-			try
-			{
-				_accessLevels[i] = AccessLevels.getInstance().getAccessLevel(Integer.parseInt(accessLevelsSplit[i]));
-			}
-			catch (NumberFormatException nfe)
-			{
-				_accessLevels[i] = null;
-			}
-		}
+		_accessLevel = level;		
 	}
 	
 	/**
@@ -76,16 +60,8 @@ public class L2AdminCommandAccessRight
 	 */
 	public boolean hasAccess(L2AccessLevel characterAccessLevel)
 	{
-		for (int i = 0; i < _accessLevels.length; ++i)
-		{
-			L2AccessLevel accessLevel = _accessLevels[i];
-			
-			if (accessLevel != null
-					&& (accessLevel.getLevel() == characterAccessLevel.getLevel() || characterAccessLevel.hasChildAccess(accessLevel)))
-				return true;
-		}
-		
-		return false;
+		L2AccessLevel accessLevel = AdminTable.getInstance().getAccessLevel(_accessLevel);
+		return (accessLevel.getLevel() == characterAccessLevel.getLevel() || characterAccessLevel.hasChildAccess(accessLevel));
 	}
 
 	public boolean getRequireConfirm()

+ 3 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2World.java

@@ -23,10 +23,8 @@ import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javolution.util.FastList;
-
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.GmListTable;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.datatables.CharNameTable;
 import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -207,9 +205,9 @@ public final class L2World
 	/**
 	 * @return a table containing all GMs.
 	 */
-	public FastList<L2PcInstance> getAllGMs()
+	public List<L2PcInstance> getAllGMs()
 	{
-		return GmListTable.getInstance().getAllGms(true);
+		return AdminTable.getInstance().getAllGms(true);
 	}
 	
 	public L2TIntObjectHashMap<L2PcInstance> getAllPlayers()

+ 3 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/StatsSet.java

@@ -243,9 +243,10 @@ public final class StatsSet
 	/**
 	 * Returns the int[] associated to the key put in parameter ("name"). If the value associated to the key is null, this method returns the value of the parameter deflt.
 	 * @param name : String designating the key in the set
+	 * @param splitOn 
 	 * @return int[] : value associated to the key
 	 */
-	public int[] getIntegerArray(String name)
+	public int[] getIntegerArray(String name, String splitOn)
 	{
 		Object val = _set.get(name);
 		if (val == null)
@@ -259,7 +260,7 @@ public final class StatsSet
 			return result;
 		}
 		int c = 0;
-		String[] vals = ((String) val).split(";");
+		String[] vals = ((String) val).split(splitOn);
 		int[] result = new int[vals.length];
 		for (String v : vals)
 		{

+ 34 - 47
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -45,7 +45,6 @@ import com.l2jserver.L2DatabaseFactory;
 import com.l2jserver.gameserver.Announcements;
 import com.l2jserver.gameserver.GameTimeController;
 import com.l2jserver.gameserver.GeoData;
-import com.l2jserver.gameserver.GmListTable;
 import com.l2jserver.gameserver.ItemsAutoDestroy;
 import com.l2jserver.gameserver.LoginServerThread;
 import com.l2jserver.gameserver.RecipeController;
@@ -61,8 +60,7 @@ import com.l2jserver.gameserver.cache.WarehouseCacheManager;
 import com.l2jserver.gameserver.communitybbs.BB.Forum;
 import com.l2jserver.gameserver.communitybbs.Manager.ForumsBBSManager;
 import com.l2jserver.gameserver.communitybbs.Manager.RegionBBSManager;
-import com.l2jserver.gameserver.datatables.AccessLevels;
-import com.l2jserver.gameserver.datatables.AdminCommandAccessRights;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.datatables.CharNameTable;
 import com.l2jserver.gameserver.datatables.CharSummonTable;
 import com.l2jserver.gameserver.datatables.CharTemplateTable;
@@ -4708,7 +4706,7 @@ public final class L2PcInstance extends L2Playable
 			L2GameClient client = L2PcInstance.this.getClient();
 			if (client != null && !client.isAuthedGG() && L2PcInstance.this.isOnline())
 			{
-				GmListTable.broadcastMessageToGMs("Client "+client+" failed to reply GameGuard query and is being kicked!");
+				AdminTable.getInstance().broadcastMessageToGMs("Client "+client+" failed to reply GameGuard query and is being kicked!");
 				_log.info("Client "+client+" failed to reply GameGuard query and is being kicked!");
 				client.close(LeaveWorld.STATIC_PACKET);
 			}
@@ -7042,45 +7040,28 @@ public final class L2PcInstance extends L2Playable
 	 * @param level 
 	 */
 	public void setAccessLevel(int level)
-	{
-		if (level == AccessLevels._masterAccessLevelNum)
-		{
-			_log.warning( "Master access level set for character " + getName() + "! Just a warning to be careful ;)" );
-			_accessLevel = AccessLevels._masterAccessLevel;
-		}
-		else if (level == AccessLevels._userAccessLevelNum)
-			_accessLevel = AccessLevels._userAccessLevel;
-		else
-		{
-			L2AccessLevel accessLevel = AccessLevels.getInstance().getAccessLevel(level);
-			
-			if (accessLevel == null)
-			{
-				if (level < 0)
-				{
-					AccessLevels.getInstance().addBanAccessLevel(level);
-					_accessLevel = AccessLevels.getInstance().getAccessLevel(level);
-				}
-				else
-				{
-					_log.warning( "Tryed to set unregistered access level " + level + " to character " + getName() + ". Setting access level without privileges!" );
-					_accessLevel = AccessLevels._userAccessLevel;
-				}
-			}
-			else
-				_accessLevel = accessLevel;
-		}
+	{	
+		_accessLevel = AdminTable.getInstance().getAccessLevel(level);
 		
 		getAppearance().setNameColor(_accessLevel.getNameColor());
 		getAppearance().setTitleColor(_accessLevel.getTitleColor());
 		broadcastUserInfo();
 		
 		CharNameTable.getInstance().addName(this);
+		
+		if (!AdminTable.getInstance().hasAccessLevel(level))
+		{
+			_log.warning("Tryed to set unregistered access level " + level + " for " + toString() + ". Setting access level without privileges!");
+		}
+		else if (level > 0)
+		{
+			_log.warning(_accessLevel.getName() + " access level set for character " + getName() + "! Just a warning to be careful ;)");
+		}
 	}
 	
 	public void setAccountAccesslevel(int level)
 	{
-		LoginServerThread.getInstance().sendAccessLevel(getAccountName(),level);
+		LoginServerThread.getInstance().sendAccessLevel(getAccountName(), level);
 	}
 	
 	/**
@@ -7090,9 +7071,9 @@ public final class L2PcInstance extends L2Playable
 	public L2AccessLevel getAccessLevel()
 	{
 		if (Config.EVERYBODY_HAS_ADMIN_RIGHTS)
-			return AccessLevels._masterAccessLevel;
-		else if ( _accessLevel == null ) /* This is here because inventory etc. is loaded before access level on login, so it is not null */
-			setAccessLevel(AccessLevels._userAccessLevelNum);
+			return AdminTable.getInstance().getMasterAccessLevel();
+		else if (_accessLevel == null) /* This is here because inventory etc. is loaded before access level on login, so it is not null */
+			setAccessLevel(0);
 		
 		return _accessLevel;
 	}
@@ -7117,7 +7098,10 @@ public final class L2PcInstance extends L2Playable
 			sendPacket(new UserInfo(this));
 			sendPacket(new ExBrExtraUserInfo(this));
 		}
-		if (broadcastType == 2) broadcastUserInfo();
+		if (broadcastType == 2)
+		{
+			broadcastUserInfo();
+		}
 	}
 	
 	/**
@@ -10373,7 +10357,6 @@ public final class L2PcInstance extends L2Playable
 		setTarget(null);
 		setIsInvul(true);
 		getAppearance().setInvisible();
-		//sendPacket(new GMHide(1));
 		teleToLocation(loc, false);
 		sendPacket(new ExOlympiadMode(3));
 		
@@ -10387,13 +10370,15 @@ public final class L2PcInstance extends L2Playable
 		setXYZ(_lastX, _lastY, _lastZ);
 		setIsParalyzed(false);
 		stopParalyze(false);
-		//sendPacket(new GMHide(0));
-		if (!AdminCommandAccessRights.getInstance().hasAccess("admin_invis", getAccessLevel()))
+		if (!isGM())
+		{
 			getAppearance().setVisible();
-		if (!AdminCommandAccessRights.getInstance().hasAccess("admin_invul", getAccessLevel()))
 			setIsInvul(false);
-		if (getAI() != null)
+		}
+		if (hasAI())
+		{
 			getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
+		}
 		
 		setFalling(); // prevent receive falling damage
 		_observerMode = false;
@@ -10412,13 +10397,15 @@ public final class L2PcInstance extends L2Playable
 		sendPacket(new ExOlympiadMode(0));
 		setInstanceId(0);
 		teleToLocation(_lastX, _lastY, _lastZ, true);
-		//sendPacket(new GMHide(0));
-		if (!AdminCommandAccessRights.getInstance().hasAccess("admin_invis", getAccessLevel()))
+		if (!isGM())
+		{
 			getAppearance().setVisible();
-		if (!AdminCommandAccessRights.getInstance().hasAccess("admin_invul", getAccessLevel()))
 			setIsInvul(false);
-		if (getAI() != null)
+		}
+		if (hasAI())
+		{
 			getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
+		}
 		setLastCords(0, 0, 0);
 		broadcastUserInfo();
 	}
@@ -12155,7 +12142,7 @@ public final class L2PcInstance extends L2Playable
 		{
 			try
 			{
-				GmListTable.getInstance().deleteGm(this);
+				AdminTable.getInstance().deleteGm(this);
 			}
 			catch (Exception e)
 			{

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/l2skills/L2SkillCreateItem.java

@@ -39,7 +39,7 @@ public class L2SkillCreateItem extends L2Skill
 	public L2SkillCreateItem(StatsSet set)
 	{
 		super(set);
-		_createItemId = set.getIntegerArray("create_item_id");
+		_createItemId = set.getIntegerArray("create_item_id", ";");
 		_createItemCount = set.getInteger("create_item_count", 0);
 		_randomCount = set.getInteger("random_count", 1);
 	}

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java

@@ -15,7 +15,7 @@
 package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.datatables.AdminCommandAccessRights;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.handler.AdminCommandHandler;
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -71,7 +71,7 @@ public final class DlgAnswer extends L2GameClientPacket
 					return;
 				String command = _command.split(" ")[0];
 				IAdminCommandHandler ach = AdminCommandHandler.getInstance().getHandler(command);
-				if (AdminCommandAccessRights.getInstance().hasAccess(command, activeChar.getAccessLevel()))
+				if (AdminTable.getInstance().hasAccess(command, activeChar.getAccessLevel()))
 				{
 					if (Config.GMAUDIT)
 						GMAudit.auditGMAction(activeChar.getName()+" ["+activeChar.getObjectId()+"]", _command, (activeChar.getTarget() != null?activeChar.getTarget().getName():"no-target"));

+ 8 - 9
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java

@@ -20,13 +20,12 @@ import javolution.util.FastList;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.Announcements;
-import com.l2jserver.gameserver.GmListTable;
 import com.l2jserver.gameserver.LoginServerThread;
 import com.l2jserver.gameserver.SevenSigns;
 import com.l2jserver.gameserver.TaskPriority;
 import com.l2jserver.gameserver.cache.HtmCache;
 import com.l2jserver.gameserver.communitybbs.Manager.RegionBBSManager;
-import com.l2jserver.gameserver.datatables.AdminCommandAccessRights;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
@@ -179,34 +178,34 @@ public class EnterWorld extends L2GameClientPacket
 		// Apply special GM properties to the GM when entering
 		if (activeChar.isGM())
 		{
-			if (Config.GM_STARTUP_INVULNERABLE && AdminCommandAccessRights.getInstance().hasAccess("admin_invul", activeChar.getAccessLevel()))
+			if (Config.GM_STARTUP_INVULNERABLE && AdminTable.getInstance().hasAccess("admin_invul", activeChar.getAccessLevel()))
 			{
 				activeChar.setIsInvul(true);
 			}
 			
-			if (Config.GM_STARTUP_INVISIBLE && AdminCommandAccessRights.getInstance().hasAccess("admin_invisible", activeChar.getAccessLevel()))
+			if (Config.GM_STARTUP_INVISIBLE && AdminTable.getInstance().hasAccess("admin_invisible", activeChar.getAccessLevel()))
 			{
 				activeChar.getAppearance().setInvisible();
 			}
 			
-			if (Config.GM_STARTUP_SILENCE && AdminCommandAccessRights.getInstance().hasAccess("admin_silence", activeChar.getAccessLevel()))
+			if (Config.GM_STARTUP_SILENCE && AdminTable.getInstance().hasAccess("admin_silence", activeChar.getAccessLevel()))
 			{
 				activeChar.setSilenceMode(true);
 			}
 			
-			if (Config.GM_STARTUP_DIET_MODE && AdminCommandAccessRights.getInstance().hasAccess("admin_diet", activeChar.getAccessLevel()))
+			if (Config.GM_STARTUP_DIET_MODE && AdminTable.getInstance().hasAccess("admin_diet", activeChar.getAccessLevel()))
 			{
 				activeChar.setDietMode(true);
 				activeChar.refreshOverloaded();
 			}
 			
-			if (Config.GM_STARTUP_AUTO_LIST && AdminCommandAccessRights.getInstance().hasAccess("admin_gmliston", activeChar.getAccessLevel()))
+			if (Config.GM_STARTUP_AUTO_LIST && AdminTable.getInstance().hasAccess("admin_gmliston", activeChar.getAccessLevel()))
 			{
-				GmListTable.getInstance().addGm(activeChar, false);
+				AdminTable.getInstance().addGm(activeChar, false);
 			}
 			else
 			{
-				GmListTable.getInstance().addGm(activeChar, true);
+				AdminTable.getInstance().addGm(activeChar, true);
 			}
 			
 			if (Config.GM_GIVE_SPECIAL_SKILLS)

+ 78 - 52
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java

@@ -20,7 +20,7 @@ import java.util.logging.Level;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.communitybbs.CommunityBoard;
-import com.l2jserver.gameserver.datatables.AdminCommandAccessRights;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.handler.AdminCommandHandler;
 import com.l2jserver.gameserver.handler.BypassHandler;
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
@@ -39,10 +39,10 @@ import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.ConfirmDlg;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
 import com.l2jserver.gameserver.util.GMAudit;
+import com.l2jserver.gameserver.util.Util;
 
 /**
  * This class ...
- *
  * @version $Revision: 1.12.4.5 $ $Date: 2005/04/11 10:06:11 $
  */
 public final class RequestBypassToServer extends L2GameClientPacket
@@ -68,16 +68,16 @@ public final class RequestBypassToServer extends L2GameClientPacket
 		if (!getClient().getFloodProtectors().getServerBypass().tryPerformAction(_command))
 			return;
 		
-		if(_command.isEmpty())
+		if (_command.isEmpty())
 		{
-			_log.info(activeChar.getName()+" send empty requestbypass");
+			_log.info(activeChar.getName() + " send empty requestbypass");
 			activeChar.logout();
 			return;
 		}
 		
 		try
 		{
-			if (_command.startsWith("admin_")) //&& activeChar.getAccessLevel() >= Config.GM_ACCESSLEVEL)
+			if (_command.startsWith("admin_"))
 			{
 				String command = _command.split(" ")[0];
 				
@@ -85,89 +85,105 @@ public final class RequestBypassToServer extends L2GameClientPacket
 				
 				if (ach == null)
 				{
-					if ( activeChar.isGM() )
+					if (activeChar.isGM())
+					{
 						activeChar.sendMessage("The command " + command.substring(6) + " does not exist!");
-					
-					_log.warning("No handler registered for admin command '" + command + "'");
+					}
+					_log.warning(activeChar + " requested not registered admin command '" + command + "'");
 					return;
 				}
 				
-				if (!AdminCommandAccessRights.getInstance().hasAccess(command, activeChar.getAccessLevel()))
+				if (!AdminTable.getInstance().hasAccess(command, activeChar.getAccessLevel()))
 				{
 					activeChar.sendMessage("You don't have the access rights to use this command!");
 					_log.warning("Character " + activeChar.getName() + " tried to use admin command " + command + ", without proper access level!");
 					return;
 				}
 				
-				if (AdminCommandAccessRights.getInstance().requireConfirm(command))
+				if (AdminTable.getInstance().requireConfirm(command))
 				{
 					activeChar.setAdminConfirmCmd(_command);
 					ConfirmDlg dlg = new ConfirmDlg(SystemMessageId.S1);
-					dlg.addString("Are you sure you want execute command "+_command.substring(6)+" ?");
+					dlg.addString("Are you sure you want execute command " + _command.substring(6) + " ?");
 					activeChar.sendPacket(dlg);
 				}
 				else
 				{
 					if (Config.GMAUDIT)
-						GMAudit.auditGMAction(activeChar.getName()+" ["+activeChar.getObjectId()+"]", _command, (activeChar.getTarget() != null?activeChar.getTarget().getName():"no-target"));
+					{
+						GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", _command, (activeChar.getTarget() != null ? activeChar.getTarget().getName() : "no-target"));
+					}
 					
 					ach.useAdminCommand(_command, activeChar);
 				}
 			}
-			else if (_command.equals("come_here") && ( activeChar.isGM()))
+			else if (_command.equals("come_here") && activeChar.isGM())
 			{
 				comeHere(activeChar);
 			}
 			else if (_command.startsWith("npc_"))
 			{
-				if(!activeChar.validateBypass(_command))
+				if (!activeChar.validateBypass(_command))
 					return;
 				
 				int endOfId = _command.indexOf('_', 5);
 				String id;
 				if (endOfId > 0)
+				{
 					id = _command.substring(4, endOfId);
+				}
 				else
+				{
 					id = _command.substring(4);
-				try
+				}
+				if (Util.isDigit(id))
 				{
 					L2Object object = L2World.getInstance().findObject(Integer.parseInt(id));
 					
-					if (object instanceof L2Npc && endOfId > 0 && activeChar.isInsideRadius(object, L2Npc.INTERACTION_DISTANCE, false, false))
-						((L2Npc)object).onBypassFeedback(activeChar, _command.substring(endOfId+1));
-					
-					activeChar.sendPacket(ActionFailed.STATIC_PACKET);
+					if (object != null && object.isNpc() && endOfId > 0 && activeChar.isInsideRadius(object, L2Npc.INTERACTION_DISTANCE, false, false))
+					{
+						((L2Npc) object).onBypassFeedback(activeChar, _command.substring(endOfId + 1));
+					}
 				}
-				catch (NumberFormatException nfe) {}
+				
+				activeChar.sendPacket(ActionFailed.STATIC_PACKET);
 			}
 			else if (_command.startsWith("summon_"))
 			{
-				if(!activeChar.validateBypass(_command))
+				if (!activeChar.validateBypass(_command))
 					return;
 				
 				int endOfId = _command.indexOf('_', 8);
 				String id;
+				
 				if (endOfId > 0)
+				{
 					id = _command.substring(7, endOfId);
+				}
 				else
+				{
 					id = _command.substring(7);
-				try
+				}
+				
+				if (Util.isDigit(id))
 				{
 					L2Object object = L2World.getInstance().findObject(Integer.parseInt(id));
 					
 					if (object instanceof L2MerchantSummonInstance && endOfId > 0 && activeChar.isInsideRadius(object, L2Npc.INTERACTION_DISTANCE, false, false))
-						((L2MerchantSummonInstance)object).onBypassFeedback(activeChar, _command.substring(endOfId+1));
-					
-					activeChar.sendPacket(ActionFailed.STATIC_PACKET);
+					{
+						((L2MerchantSummonInstance) object).onBypassFeedback(activeChar, _command.substring(endOfId + 1));
+					}
 				}
-				catch (NumberFormatException nfe) {}
+				activeChar.sendPacket(ActionFailed.STATIC_PACKET);
 			}
 			// Navigate through Manor windows
 			else if (_command.startsWith("manor_menu_select"))
 			{
 				final IBypassHandler manor = BypassHandler.getInstance().getHandler("manor_menu_select");
 				if (manor != null)
+				{
 					manor.useBypass(_command, activeChar, null);
+				}
 			}
 			else if (_command.startsWith("_bbs"))
 			{
@@ -177,97 +193,106 @@ public final class RequestBypassToServer extends L2GameClientPacket
 						activeChar.sendPacket(SystemMessageId.CB_OFFLINE);
 				}
 				else
+				{
 					CommunityBoard.getInstance().handleCommands(getClient(), _command);
+				}
 			}
 			else if (_command.startsWith("bbs"))
 			{
 				if (Config.ENABLE_COMMUNITY_BOARD)
 				{
 					if (!CommunityServerThread.getInstance().sendPacket(new RequestShowCommunityBoard(activeChar.getObjectId(), _command)))
+					{
 						activeChar.sendPacket(SystemMessageId.CB_OFFLINE);
+					}
 				}
 				else
+				{
 					CommunityBoard.getInstance().handleCommands(getClient(), _command);
+				}
 			}
 			else if (_command.startsWith("_mail"))
 			{
 				if (!CommunityServerThread.getInstance().sendPacket(new RequestShowCommunityBoard(activeChar.getObjectId(), "_bbsmail")))
+				{
 					activeChar.sendPacket(SystemMessageId.CB_OFFLINE);
+				}
 			}
 			else if (_command.startsWith("_friend"))
 			{
 				if (!CommunityServerThread.getInstance().sendPacket(new RequestShowCommunityBoard(activeChar.getObjectId(), "_bbsfriend")))
+				{
 					activeChar.sendPacket(SystemMessageId.CB_OFFLINE);
+				}
 			}
 			else if (_command.startsWith("Quest "))
 			{
-				if(!activeChar.validateBypass(_command))
+				if (!activeChar.validateBypass(_command))
 					return;
 				
-				L2PcInstance player = getClient().getActiveChar();
-				if (player == null) return;
-				
 				String p = _command.substring(6).trim();
 				int idx = p.indexOf(' ');
 				if (idx < 0)
-					player.processQuestEvent(p, "");
+				{
+					activeChar.processQuestEvent(p, "");
+				}
 				else
-					player.processQuestEvent(p.substring(0, idx), p.substring(idx).trim());
+				{
+					activeChar.processQuestEvent(p.substring(0, idx), p.substring(idx).trim());
+				}
 			}
 			else if (_command.startsWith("_match"))
 			{
-				L2PcInstance player = getClient().getActiveChar();
-				if (player == null) return;
-				
-				String params = _command.substring(_command.indexOf("?")+1);
+				String params = _command.substring(_command.indexOf("?") + 1);
 				StringTokenizer st = new StringTokenizer(params, "&");
 				int heroclass = Integer.parseInt(st.nextToken().split("=")[1]);
 				int heropage = Integer.parseInt(st.nextToken().split("=")[1]);
 				int heroid = Hero.getInstance().getHeroByClass(heroclass);
-				if( heroid > 0)
+				if (heroid > 0)
 				{
-					Hero.getInstance().showHeroFights(player, heroclass, heroid, heropage);
+					Hero.getInstance().showHeroFights(activeChar, heroclass, heroid, heropage);
 				}
 			}
 			else if (_command.startsWith("_diary"))
 			{
-				L2PcInstance player = getClient().getActiveChar();
-				if (player == null) return;
-				
-				String params = _command.substring(_command.indexOf("?")+1);
+				String params = _command.substring(_command.indexOf("?") + 1);
 				StringTokenizer st = new StringTokenizer(params, "&");
 				int heroclass = Integer.parseInt(st.nextToken().split("=")[1]);
 				int heropage = Integer.parseInt(st.nextToken().split("=")[1]);
 				int heroid = Hero.getInstance().getHeroByClass(heroclass);
-				if( heroid > 0)
+				if (heroid > 0)
 				{
-					Hero.getInstance().showHeroDiary(player, heroclass, heroid, heropage);
+					Hero.getInstance().showHeroDiary(activeChar, heroclass, heroid, heropage);
 				}
 			}
 			else
 			{
 				final IBypassHandler handler = BypassHandler.getInstance().getHandler(_command);
 				if (handler != null)
+				{
 					handler.useBypass(_command, activeChar, null);
+				}
 				else
-					_log.log(Level.WARNING, getClient()+" sent not handled RequestBypassToServer: ["+_command+"]");
+				{
+					_log.log(Level.WARNING, getClient() + " sent not handled RequestBypassToServer: [" + _command + "]");
+				}
 			}
 		}
 		catch (Exception e)
 		{
-			_log.log(Level.WARNING, getClient()+" sent bad RequestBypassToServer: \""+_command+"\"", e);
+			_log.log(Level.WARNING, getClient() + " sent bad RequestBypassToServer: \"" + _command + "\"", e);
 			if (activeChar.isGM())
 			{
 				StringBuilder sb = new StringBuilder(200);
 				sb.append("<html><body>");
-				sb.append("Bypass error: "+e+"<br1>");
-				sb.append("Bypass command: "+_command+"<br1>");
+				sb.append("Bypass error: " + e + "<br1>");
+				sb.append("Bypass command: " + _command + "<br1>");
 				sb.append("StackTrace:<br1>");
 				for (StackTraceElement ste : e.getStackTrace())
-					sb.append(ste.toString()+"<br1>");
+					sb.append(ste.toString() + "<br1>");
 				sb.append("</body></html>");
 				// item html
-				NpcHtmlMessage msg = new NpcHtmlMessage(0,12807);
+				NpcHtmlMessage msg = new NpcHtmlMessage(0, 12807);
 				msg.setHtml(sb.toString());
 				msg.disableValidation();
 				activeChar.sendPacket(msg);
@@ -281,12 +306,13 @@ public final class RequestBypassToServer extends L2GameClientPacket
 	private static void comeHere(L2PcInstance activeChar)
 	{
 		L2Object obj = activeChar.getTarget();
-		if (obj == null) return;
+		if (obj == null)
+			return;
 		if (obj instanceof L2Npc)
 		{
 			L2Npc temp = (L2Npc) obj;
 			temp.setTarget(activeChar);
-			temp.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(activeChar.getX(),activeChar.getY(), activeChar.getZ(), 0 ));
+			temp.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(activeChar.getX(), activeChar.getY(), activeChar.getZ(), 0));
 		}
 	}
 	

+ 3 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestDropItem.java

@@ -15,7 +15,7 @@
 package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.GmListTable;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
@@ -206,16 +206,14 @@ public final class RequestDropItem extends L2GameClientPacket
 		if (activeChar.isGM())
 		{
 			String target = (activeChar.getTarget() != null ? activeChar.getTarget().getName() : "no-target");
-			GMAudit.auditGMAction(activeChar.getName()+" ["+activeChar.getObjectId()+"]",
-					"Drop", target, "(id: " + dropedItem.getItemId() + " name: " + dropedItem.getItemName() + " objId: " + dropedItem.getObjectId()
-					+ " x: " + activeChar.getX() + " y: " + activeChar.getY() + " z: " + activeChar.getZ() + ")");
+			GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", "Drop", target, "(id: " + dropedItem.getItemId() + " name: " + dropedItem.getItemName() + " objId: " + dropedItem.getObjectId() + " x: " + activeChar.getX() + " y: " + activeChar.getY() + " z: " + activeChar.getZ() + ")");
 		}
 		
 		if (dropedItem != null && dropedItem.getItemId() == PcInventory.ADENA_ID && dropedItem.getCount() >= 1000000)
 		{
 			String msg = "Character (" + activeChar.getName() + ") has dropped (" + dropedItem.getCount() + ")adena at (" + _x + "," + _y + "," + _z + ")";
 			_log.warning(msg);
-			GmListTable.broadcastMessageToGMs(msg);
+			AdminTable.getInstance().broadcastMessageToGMs(msg);
 		}
 	}
 	

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestGmList.java

@@ -14,7 +14,7 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import com.l2jserver.gameserver.GmListTable;
+import com.l2jserver.gameserver.datatables.AdminTable;
 
 /**
  * This class handles RequestGmLista packet triggered by /gmlist command
@@ -36,7 +36,7 @@ public final class RequestGmList extends L2GameClientPacket
 	{
 		if (getClient().getActiveChar() == null)
 			return;
-		GmListTable.getInstance().sendListToPlayer(getClient().getActiveChar());
+		AdminTable.getInstance().sendListToPlayer(getClient().getActiveChar());
 	}
 	
 	@Override

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPetition.java

@@ -15,7 +15,7 @@
 package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.GmListTable;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.instancemanager.PetitionManager;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -50,7 +50,7 @@ public final class RequestPetition extends L2GameClientPacket
 		if (activeChar == null)
 			return;
 		
-		if (!GmListTable.getInstance().isGmOnline(false))
+		if (!AdminTable.getInstance().isGmOnline(false))
 		{
 			activeChar.sendPacket(SystemMessageId.NO_GM_PROVIDING_SERVICE_NOW);
 			return;

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPetitionCancel.java

@@ -15,7 +15,7 @@
 package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.GmListTable;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.instancemanager.PetitionManager;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -71,7 +71,7 @@ public final class RequestPetitionCancel extends L2GameClientPacket
 					
 					// Notify all GMs that the player's pending petition has been cancelled.
 					String msgContent = activeChar.getName() + " has canceled a pending petition.";
-					GmListTable.broadcastToGMs(new CreatureSay(activeChar.getObjectId(), Say2.HERO_VOICE, "Petition System", msgContent));
+					AdminTable.getInstance().broadcastToGMs(new CreatureSay(activeChar.getObjectId(), Say2.HERO_VOICE, "Petition System", msgContent));
 				}
 				else
 				{

+ 3 - 14
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSendPost.java

@@ -19,7 +19,7 @@ import static com.l2jserver.gameserver.model.itemcontainer.PcInventory.ADENA_ID;
 import static com.l2jserver.gameserver.model.itemcontainer.PcInventory.MAX_ADENA;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.datatables.AccessLevels;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.datatables.CharNameTable;
 import com.l2jserver.gameserver.instancemanager.MailManager;
 import com.l2jserver.gameserver.model.BlockList;
@@ -202,20 +202,9 @@ public final class RequestSendPost extends L2GameClientPacket
 			return;
 		}
 		
-		L2AccessLevel accessLevel;
+		
 		final int level = CharNameTable.getInstance().getAccessLevelById(receiverId);
-		if (level == AccessLevels._masterAccessLevelNum)
-			accessLevel = AccessLevels._masterAccessLevel;
-		else if (level == AccessLevels._userAccessLevelNum)
-		{
-			accessLevel = AccessLevels._userAccessLevel;
-		}
-		else
-		{
-			accessLevel = AccessLevels.getInstance().getAccessLevel(level);
-			if (accessLevel == null)
-				accessLevel = AccessLevels._userAccessLevel;
-		}
+		final L2AccessLevel accessLevel = AdminTable.getInstance().getAccessLevel(level);
 		
 		if (accessLevel.isGm() && !activeChar.getAccessLevel().isGm())
 		{

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/SendBypassBuildCmd.java

@@ -15,7 +15,7 @@
 package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.datatables.AdminCommandAccessRights;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.handler.AdminCommandHandler;
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -63,7 +63,7 @@ public final class SendBypassBuildCmd extends L2GameClientPacket
 			return;
 		}
 		
-		if (!AdminCommandAccessRights.getInstance().hasAccess(command , activeChar.getAccessLevel()))
+		if (!AdminTable.getInstance().hasAccess(command , activeChar.getAccessLevel()))
 		{
 			activeChar.sendMessage("You don't have the access right to use this command!");
 			_log.warning("Character " + activeChar.getName() + " tryed to use admin command " + command + ", but have no access to it!");

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/Die.java

@@ -14,7 +14,7 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
-import com.l2jserver.gameserver.datatables.AccessLevels;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.FortManager;
@@ -49,7 +49,7 @@ public class Die extends L2GameServerPacket
 	private int _charObjId;
 	private boolean _canTeleport;
 	private boolean _sweepable;
-	private L2AccessLevel _access = AccessLevels._userAccessLevel;
+	private L2AccessLevel _access = AdminTable.getInstance().getAccessLevel(0);
 	private L2Clan _clan;
 	L2Character _activeChar;
 	

+ 6 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/util/IllegalPlayerAction.java

@@ -19,7 +19,7 @@ import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.GmListTable;
+import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
 
@@ -70,12 +70,13 @@ public final class IllegalPlayerAction implements Runnable
 		LogRecord record = new LogRecord(Level.INFO, "AUDIT:" + _message);
 		record.setLoggerName("audit");
 		record.setParameters(new Object[]
-		                                {
-				_actor, _punishment
-		                                });
+		{
+			_actor,
+			_punishment
+		});
 		_logAudit.log(record);
 		
-		GmListTable.broadcastMessageToGMs(_message);
+		AdminTable.getInstance().broadcastMessageToGMs(_message);
 		
 		switch (_punishment)
 		{