Ver código fonte

BETA: Reworking clan privilege bit masks.
* Added `EnumIntBitMask<T>` template which handles all bitwise operations.
* Removed clan privilege bit masks from `L2Clan`.
* Added `ClanPrivilege` enum which now hosts all clan privileges bit masks.
* Patch by: FBIagent
* Reviewed by: Zoey76, xban1x, UnAfraid, Nos, St3et, Adry_85
* Tested by: xban1x

xban1x 11 anos atrás
pai
commit
d53c3cd95c
29 arquivos alterados com 326 adições e 101 exclusões
  1. 15 0
      L2J_Server_BETA/L2J Debug.launch
  2. 3 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ClanTable.java
  3. 64 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/ClanPrivilege.java
  4. 21 47
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Clan.java
  5. 4 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2AuctioneerInstance.java
  6. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CastleDoormenInstance.java
  7. 5 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallManagerInstance.java
  8. 7 7
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2FortManagerInstance.java
  9. 13 11
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  10. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/FortSiege.java
  11. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestExSetPledgeCrestLarge.java
  12. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestGiveNickName.java
  13. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestJoinDominionWar.java
  14. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestJoinSiege.java
  15. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestOustPledgeMember.java
  16. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgePower.java
  17. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeReorganizeMember.java
  18. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeSetAcademyMaster.java
  19. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeSetMemberPowerGrade.java
  20. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSetCrop.java
  21. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSetPledgeCrest.java
  22. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSetSeed.java
  23. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestStartPledgeWar.java
  24. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestStopPledgeWar.java
  25. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/SendWareHouseWithDrawList.java
  26. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ManagePledgePower.java
  27. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/PledgeReceivePowerInfo.java
  28. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java
  29. 157 0
      L2J_Server_BETA/java/com/l2jserver/util/EnumIntBitmask.java

+ 15 - 0
L2J_Server_BETA/L2J Debug.launch

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<stringAttribute key="bad_container_name" value="\L2J_Server_BETA\L2J_Debug.launc"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
+<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;sourceLookupDirector&gt;&#13;&#10;&lt;sourceContainers duplicates=&quot;false&quot;&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;project name=&amp;quot;L2J_DataPack_BETA&amp;quot; referencedProjects=&amp;quot;false&amp;quot;/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.cdt.debug.core.containerType.sourceFoldersRelativePath&quot;/&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;default/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.default&quot;/&gt;&#13;&#10;&lt;/sourceContainers&gt;&#13;&#10;&lt;/sourceLookupDirector&gt;&#13;&#10;"/>
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.l2jserver.gameserver.GameServer"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="L2J_Server_BETA"/>
+</launchConfiguration>

+ 3 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ClanTable.java

@@ -39,6 +39,7 @@ import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
 import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
 import com.l2jserver.gameserver.instancemanager.SiegeManager;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2ClanMember;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -60,6 +61,7 @@ import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.impl.L2Script.EventStage;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.clan.ClanWarListener;
 import com.l2jserver.gameserver.util.Util;
+import com.l2jserver.util.EnumIntBitmask;
 import com.l2jserver.util.L2FastList;
 
 /**
@@ -197,7 +199,7 @@ public class ClanTable
 		clan.store();
 		player.setClan(clan);
 		player.setPledgeClass(L2ClanMember.calculatePledgeClass(player));
-		player.setClanPrivileges(L2Clan.CP_ALL);
+		player.setClanPrivileges(new EnumIntBitmask<>(ClanPrivilege.class, true));
 		
 		_clans.put(Integer.valueOf(clan.getId()), clan);
 		

+ 64 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/ClanPrivilege.java

@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) - LJ Server
+ * 
+ * This file is part of LJ Server.
+ * 
+ * LJ Server 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  of the License, or
+ * (at your option) any later version.
+ * 
+ * LJ Server 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.model;
+
+/**
+ * This enum is used for clan privileges.<br>
+ * The ordinal of each entry is the bit index in the privilege bitmask.
+ * @author FBIagent
+ */
+public enum ClanPrivilege
+{
+	/** dummy entry */
+	DUMMY,
+	/** Privilege to join clan */
+	CL_JOIN_CLAN,
+	/** Privilege to give a title */
+	CL_GIVE_TITLE,
+	/** Privilege to view warehouse content */
+	CL_VIEW_WAREHOUSE,
+	/** Privilege to manage clan ranks */
+	CL_MANAGE_RANKS,
+	CL_PLEDGE_WAR,
+	CL_DISMISS,
+	/** Privilege to register clan crest */
+	CL_REGISTER_CREST,
+	CL_APPRENTICE,
+	CL_TROOPS_FAME,
+	CL_SUMMON_AIRSHIP,
+	/** Privilege to open a door */
+	CH_OPEN_DOOR,
+	CH_OTHER_RIGHTS,
+	CH_AUCTION,
+	CH_DISMISS,
+	CH_SET_FUNCTIONS,
+	CS_OPEN_DOOR,
+	CS_MANOR_ADMIN,
+	CS_MANAGE_SIEGE,
+	CS_USE_FUNCTIONS,
+	CS_DISMISS,
+	CS_TAXES,
+	CS_MERCENARIES,
+	CS_SET_FUNCTIONS;
+	
+	public int getBitmask()
+	{
+		return 1 << ordinal();
+	}
+}

+ 21 - 47
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Clan.java

@@ -79,6 +79,7 @@ import com.l2jserver.gameserver.scripting.scriptengine.events.ClanLevelUpEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.clan.ClanCreationListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.clan.ClanMembershipListener;
 import com.l2jserver.gameserver.util.Util;
+import com.l2jserver.util.EnumIntBitmask;
 
 public class L2Clan implements IIdentifiable, INamable
 {
@@ -97,40 +98,6 @@ public class L2Clan implements IIdentifiable, INamable
 	public static final int PENALTY_TYPE_DISMISS_CLAN = 3;
 	/** Leader clan dissolve ally */
 	public static final int PENALTY_TYPE_DISSOLVE_ALLY = 4;
-	// Clan Privileges
-	/** No privilege to manage any clan activity */
-	public static final int CP_NOTHING = 0;
-	/** Privilege to join clan */
-	public static final int CP_CL_JOIN_CLAN = 2;
-	/** Privilege to give a title */
-	public static final int CP_CL_GIVE_TITLE = 4;
-	/** Privilege to view warehouse content */
-	public static final int CP_CL_VIEW_WAREHOUSE = 8;
-	/** Privilege to manage clan ranks */
-	public static final int CP_CL_MANAGE_RANKS = 16;
-	public static final int CP_CL_PLEDGE_WAR = 32;
-	public static final int CP_CL_DISMISS = 64;
-	/** Privilege to register clan crest */
-	public static final int CP_CL_REGISTER_CREST = 128;
-	public static final int CP_CL_APPRENTICE = 256;
-	public static final int CP_CL_TROOPS_FAME = 512;
-	public static final int CP_CL_SUMMON_AIRSHIP = 1024;
-	/** Privilege to open a door */
-	public static final int CP_CH_OPEN_DOOR = 2048;
-	public static final int CP_CH_OTHER_RIGHTS = 4096;
-	public static final int CP_CH_AUCTION = 8192;
-	public static final int CP_CH_DISMISS = 16384;
-	public static final int CP_CH_SET_FUNCTIONS = 32768;
-	public static final int CP_CS_OPEN_DOOR = 65536;
-	public static final int CP_CS_MANOR_ADMIN = 131072;
-	public static final int CP_CS_MANAGE_SIEGE = 262144;
-	public static final int CP_CS_USE_FUNCTIONS = 524288;
-	public static final int CP_CS_DISMISS = 1048576;
-	public static final int CP_CS_TAXES = 2097152;
-	public static final int CP_CS_MERCENARIES = 4194304;
-	public static final int CP_CS_SET_FUNCTIONS = 8388608;
-	/** Privilege to manage all clan activity */
-	public static final int CP_ALL = 16777214;
 	// Sub-unit types
 	/** Clan subunit type of Academy */
 	public static final int SUBUNIT_ACADEMY = -1;
@@ -285,7 +252,7 @@ public class L2Clan implements IIdentifiable, INamable
 			{
 				SiegeManager.getInstance().removeSiegeSkills(exLeader);
 			}
-			exLeader.setClanPrivileges(L2Clan.CP_NOTHING);
+			exLeader.getClanPrivileges().clear();
 			exLeader.broadcastUserInfo();
 			
 		}
@@ -294,7 +261,7 @@ public class L2Clan implements IIdentifiable, INamable
 			try (Connection con = L2DatabaseFactory.getInstance().getConnection();
 				PreparedStatement ps = con.prepareStatement("UPDATE characters SET clan_privs = ? WHERE charId = ?"))
 			{
-				ps.setInt(1, L2Clan.CP_NOTHING);
+				ps.setInt(1, 0);
 				ps.setInt(2, getLeaderId());
 				ps.execute();
 			}
@@ -321,7 +288,7 @@ public class L2Clan implements IIdentifiable, INamable
 		if (newLeader != null)
 		{
 			newLeader.setPledgeClass(L2ClanMember.calculatePledgeClass(newLeader));
-			newLeader.setClanPrivileges(L2Clan.CP_ALL);
+			newLeader.getClanPrivileges().setAll();
 			
 			if (getLevel() >= SiegeManager.getInstance().getSiegeClanMinLevel())
 			{
@@ -334,7 +301,7 @@ public class L2Clan implements IIdentifiable, INamable
 			try (Connection con = L2DatabaseFactory.getInstance().getConnection();
 				PreparedStatement ps = con.prepareStatement("UPDATE characters SET clan_privs = ? WHERE charId = ?"))
 			{
-				ps.setInt(1, L2Clan.CP_ALL);
+				ps.setInt(1, EnumIntBitmask.getAllBitmask(ClanPrivilege.class));
 				ps.setInt(2, getLeaderId());
 				ps.execute();
 			}
@@ -1828,13 +1795,20 @@ public class L2Clan implements IIdentifiable, INamable
 	{
 		private final int _rankId;
 		private final int _party;// TODO find out what this stuff means and implement it
-		private int _rankPrivs;
+		private final EnumIntBitmask<ClanPrivilege> _rankPrivs;
 		
 		public RankPrivs(int rank, int party, int privs)
 		{
 			_rankId = rank;
 			_party = party;
-			_rankPrivs = privs;
+			_rankPrivs = new EnumIntBitmask<>(ClanPrivilege.class, privs);
+		}
+		
+		public RankPrivs(int rank, int party, EnumIntBitmask<ClanPrivilege> rankPrivs)
+		{
+			_rankId = rank;
+			_party = party;
+			_rankPrivs = rankPrivs;
 		}
 		
 		public int getRank()
@@ -1847,14 +1821,14 @@ public class L2Clan implements IIdentifiable, INamable
 			return _party;
 		}
 		
-		public int getPrivs()
+		public EnumIntBitmask<ClanPrivilege> getPrivs()
 		{
 			return _rankPrivs;
 		}
 		
 		public void setPrivs(int privs)
 		{
-			_rankPrivs = privs;
+			_rankPrivs.setBitmask(privs);
 		}
 	}
 	
@@ -2095,18 +2069,18 @@ public class L2Clan implements IIdentifiable, INamable
 		RankPrivs privs;
 		for (int i = 1; i < 10; i++)
 		{
-			privs = new RankPrivs(i, 0, CP_NOTHING);
+			privs = new RankPrivs(i, 0, new EnumIntBitmask<>(ClanPrivilege.class, false));
 			_privs.put(i, privs);
 		}
 	}
 	
-	public int getRankPrivs(int rank)
+	public EnumIntBitmask<ClanPrivilege> getRankPrivs(int rank)
 	{
 		if (_privs.get(rank) != null)
 		{
 			return _privs.get(rank).getPrivs();
 		}
-		return CP_NOTHING;
+		return new EnumIntBitmask<>(ClanPrivilege.class, false);
 	}
 	
 	public void setRankPrivs(int rank, int privs)
@@ -2139,7 +2113,7 @@ public class L2Clan implements IIdentifiable, INamable
 					{
 						if (cm.getPlayerInstance() != null)
 						{
-							cm.getPlayerInstance().setClanPrivileges(privs);
+							cm.getPlayerInstance().getClanPrivileges().setBitmask(privs);
 							cm.getPlayerInstance().sendPacket(new UserInfo(cm.getPlayerInstance()));
 							cm.getPlayerInstance().sendPacket(new ExBrExtraUserInfo(cm.getPlayerInstance()));
 						}
@@ -2302,7 +2276,7 @@ public class L2Clan implements IIdentifiable, INamable
 		{
 			return false;
 		}
-		if (!activeChar.hasClanPrivilege(L2Clan.CP_CL_JOIN_CLAN))
+		if (!activeChar.hasClanPrivilege(ClanPrivilege.CL_JOIN_CLAN))
 		{
 			activeChar.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
 			return false;

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2AuctioneerInstance.java

@@ -33,7 +33,7 @@ import com.l2jserver.gameserver.enums.InstanceType;
 import com.l2jserver.gameserver.instancemanager.AuctionManager;
 import com.l2jserver.gameserver.instancemanager.ClanHallManager;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager;
-import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.entity.Auction;
@@ -535,7 +535,7 @@ public final class L2AuctioneerInstance extends L2Npc
 			}
 			else if (actualCommand.equalsIgnoreCase("cancelAuction"))
 			{
-				if (!player.hasClanPrivilege(L2Clan.CP_CH_AUCTION))
+				if (!player.hasClanPrivilege(ClanPrivilege.CH_AUCTION))
 				{
 					String filename = "data/html/auction/not_authorized.htm";
 					final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
@@ -575,7 +575,7 @@ public final class L2AuctioneerInstance extends L2Npc
 			}
 			else if (actualCommand.equalsIgnoreCase("sale"))
 			{
-				if (!player.hasClanPrivilege(L2Clan.CP_CH_AUCTION))
+				if (!player.hasClanPrivilege(ClanPrivilege.CH_AUCTION))
 				{
 					String filename = "data/html/auction/not_authorized.htm";
 					final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
@@ -597,7 +597,7 @@ public final class L2AuctioneerInstance extends L2Npc
 			else if (actualCommand.equalsIgnoreCase("rebid"))
 			{
 				SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm");
-				if (!player.hasClanPrivilege(L2Clan.CP_CH_AUCTION))
+				if (!player.hasClanPrivilege(ClanPrivilege.CH_AUCTION))
 				{
 					String filename = "data/html/auction/not_authorized.htm";
 					final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CastleDoormenInstance.java

@@ -21,7 +21,7 @@ package com.l2jserver.gameserver.model.actor.instance;
 import java.util.StringTokenizer;
 
 import com.l2jserver.gameserver.enums.InstanceType;
-import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
 
@@ -74,7 +74,7 @@ public class L2CastleDoormenInstance extends L2DoormenInstance
 	@Override
 	protected final boolean isOwnerClan(L2PcInstance player)
 	{
-		if ((player.getClan() != null) && player.hasClanPrivilege(L2Clan.CP_CS_OPEN_DOOR))
+		if ((player.getClan() != null) && player.hasClanPrivilege(ClanPrivilege.CS_OPEN_DOOR))
 		{
 			SiegableHall hall = getConquerableHall();
 			// save in variable because it's a costly call

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallManagerInstance.java

@@ -28,7 +28,7 @@ import com.l2jserver.gameserver.datatables.TeleportLocationTable;
 import com.l2jserver.gameserver.enums.InstanceType;
 import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
 import com.l2jserver.gameserver.instancemanager.ClanHallManager;
-import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2TeleportLocation;
 import com.l2jserver.gameserver.model.PcCondOverride;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
@@ -94,7 +94,7 @@ public class L2ClanHallManagerInstance extends L2MerchantInstance
 			if (actualCommand.equalsIgnoreCase("banish_foreigner"))
 			{
 				final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-				if (player.hasClanPrivilege(L2Clan.CP_CH_DISMISS))
+				if (player.hasClanPrivilege(ClanPrivilege.CH_DISMISS))
 				{
 					if (val.equalsIgnoreCase("list"))
 					{
@@ -116,7 +116,7 @@ public class L2ClanHallManagerInstance extends L2MerchantInstance
 			else if (actualCommand.equalsIgnoreCase("manage_vault"))
 			{
 				final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-				if (player.hasClanPrivilege(L2Clan.CP_CL_VIEW_WAREHOUSE))
+				if (player.hasClanPrivilege(ClanPrivilege.CL_VIEW_WAREHOUSE))
 				{
 					if (getClanHall().getLease() <= 0)
 					{
@@ -140,7 +140,7 @@ public class L2ClanHallManagerInstance extends L2MerchantInstance
 			else if (actualCommand.equalsIgnoreCase("door"))
 			{
 				final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-				if (player.hasClanPrivilege(L2Clan.CP_CH_OPEN_DOOR))
+				if (player.hasClanPrivilege(ClanPrivilege.CH_OPEN_DOOR))
 				{
 					if (val.equalsIgnoreCase("open"))
 					{
@@ -249,7 +249,7 @@ public class L2ClanHallManagerInstance extends L2MerchantInstance
 			}
 			else if (actualCommand.equalsIgnoreCase("manage"))
 			{
-				if (player.hasClanPrivilege(L2Clan.CP_CH_SET_FUNCTIONS))
+				if (player.hasClanPrivilege(ClanPrivilege.CH_SET_FUNCTIONS))
 				{
 					if (val.equalsIgnoreCase("recovery"))
 					{

+ 7 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2FortManagerInstance.java

@@ -26,7 +26,7 @@ import com.l2jserver.gameserver.cache.HtmCache;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.TeleportLocationTable;
 import com.l2jserver.gameserver.enums.InstanceType;
-import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2TeleportLocation;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.entity.Fort;
@@ -97,7 +97,7 @@ public class L2FortManagerInstance extends L2MerchantInstance
 			}
 			if (actualCommand.equalsIgnoreCase("expel"))
 			{
-				if (player.hasClanPrivilege(L2Clan.CP_CS_DISMISS))
+				if (player.hasClanPrivilege(ClanPrivilege.CS_DISMISS))
 				{
 					final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
 					html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-expel.htm");
@@ -115,7 +115,7 @@ public class L2FortManagerInstance extends L2MerchantInstance
 			}
 			else if (actualCommand.equalsIgnoreCase("banish_foreigner"))
 			{
-				if (player.hasClanPrivilege(L2Clan.CP_CS_DISMISS))
+				if (player.hasClanPrivilege(ClanPrivilege.CS_DISMISS))
 				{
 					getFort().banishForeigners(); // Move non-clan members off fortress area
 					final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
@@ -187,7 +187,7 @@ public class L2FortManagerInstance extends L2MerchantInstance
 			else if (actualCommand.equalsIgnoreCase("operate_door")) // door
 			// control
 			{
-				if (player.hasClanPrivilege(L2Clan.CP_CS_OPEN_DOOR))
+				if (player.hasClanPrivilege(ClanPrivilege.CS_OPEN_DOOR))
 				{
 					if (!val.isEmpty())
 					{
@@ -232,7 +232,7 @@ public class L2FortManagerInstance extends L2MerchantInstance
 			else if (actualCommand.equalsIgnoreCase("manage_vault"))
 			{
 				final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-				if (player.hasClanPrivilege(L2Clan.CP_CL_VIEW_WAREHOUSE))
+				if (player.hasClanPrivilege(ClanPrivilege.CL_VIEW_WAREHOUSE))
 				{
 					if (val.equalsIgnoreCase("deposit"))
 					{
@@ -358,7 +358,7 @@ public class L2FortManagerInstance extends L2MerchantInstance
 			}
 			else if (actualCommand.equalsIgnoreCase("manage"))
 			{
-				if (player.hasClanPrivilege(L2Clan.CP_CS_SET_FUNCTIONS))
+				if (player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS))
 				{
 					if (val.equalsIgnoreCase("recovery"))
 					{
@@ -1021,7 +1021,7 @@ public class L2FortManagerInstance extends L2MerchantInstance
 	
 	private void showVaultWindowWithdraw(L2PcInstance player, WarehouseListType itemtype, byte sortorder)
 	{
-		if (player.isClanLeader() || player.hasClanPrivilege(L2Clan.CP_CL_VIEW_WAREHOUSE))
+		if (player.isClanLeader() || player.hasClanPrivilege(ClanPrivilege.CL_VIEW_WAREHOUSE))
 		{
 			player.sendPacket(ActionFailed.STATIC_PACKET);
 			player.setActiveWarehouse(player.getClan().getWarehouse());

+ 13 - 11
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -121,6 +121,7 @@ import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
 import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.ArenaParticipantsHolder;
 import com.l2jserver.gameserver.model.BlockList;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2AccessLevel;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2ClanMember;
@@ -330,6 +331,7 @@ import com.l2jserver.gameserver.taskmanager.AttackStanceTaskManager;
 import com.l2jserver.gameserver.util.Broadcast;
 import com.l2jserver.gameserver.util.FloodProtectors;
 import com.l2jserver.gameserver.util.Util;
+import com.l2jserver.util.EnumIntBitmask;
 import com.l2jserver.util.Rnd;
 
 /**
@@ -665,7 +667,7 @@ public final class L2PcInstance extends L2Playable
 	private long _clanCreateExpiryTime;
 	
 	private int _powerGrade = 0;
-	private int _clanPrivileges = 0;
+	private volatile EnumIntBitmask<ClanPrivilege> _clanPrivileges = new EnumIntBitmask<>(ClanPrivilege.class, false);
 	
 	/** L2PcInstance's pledge class (knight, Baron, etc.) */
 	private int _pledgeClass = 0;
@@ -6319,7 +6321,7 @@ public final class L2PcInstance extends L2Playable
 		if (clan == null)
 		{
 			_clanId = 0;
-			_clanPrivileges = 0;
+			_clanPrivileges = new EnumIntBitmask<>(ClanPrivilege.class, false);
 			_pledgeType = 0;
 			_powerGrade = 0;
 			_lvlJoinedAcademy = 0;
@@ -7035,7 +7037,7 @@ public final class L2PcInstance extends L2Playable
 			statement.setInt(28, getAccessLevel().getLevel());
 			statement.setInt(29, isOnlineInt());
 			statement.setInt(30, isIn7sDungeon() ? 1 : 0);
-			statement.setInt(31, getClanPrivileges());
+			statement.setInt(31, getClanPrivileges().getBitmask());
 			statement.setInt(32, getWantsPeace());
 			statement.setInt(33, getBaseClass());
 			statement.setInt(34, getNewbie());
@@ -7132,7 +7134,7 @@ public final class L2PcInstance extends L2Playable
 						}
 						else
 						{
-							player.setClanPrivileges(L2Clan.CP_ALL);
+							player.getClanPrivileges().setAll();
 							player.setPowerGrade(1);
 						}
 						player.setPledgeClass(L2ClanMember.calculatePledgeClass(player));
@@ -7149,7 +7151,7 @@ public final class L2PcInstance extends L2Playable
 							player.setPledgeClass(8);
 						}
 						
-						player.setClanPrivileges(L2Clan.CP_NOTHING);
+						player.getClanPrivileges().clear();
 					}
 					
 					player.setDeleteTimer(rset.getLong("deletetime"));
@@ -7647,7 +7649,7 @@ public final class L2PcInstance extends L2Playable
 			statement.setInt(29, getAccessLevel().getLevel());
 			statement.setInt(30, isOnlineInt());
 			statement.setInt(31, isIn7sDungeon() ? 1 : 0);
-			statement.setInt(32, getClanPrivileges());
+			statement.setInt(32, getClanPrivileges().getBitmask());
 			statement.setInt(33, getWantsPeace());
 			statement.setInt(34, getBaseClass());
 			
@@ -9721,19 +9723,19 @@ public final class L2PcInstance extends L2Playable
 	
 	private ScheduledFuture<?> _taskWarnUserTakeBreak;
 	
-	public int getClanPrivileges()
+	public EnumIntBitmask<ClanPrivilege> getClanPrivileges()
 	{
 		return _clanPrivileges;
 	}
 	
-	public void setClanPrivileges(int n)
+	public void setClanPrivileges(EnumIntBitmask<ClanPrivilege> clanPrivileges)
 	{
-		_clanPrivileges = n;
+		_clanPrivileges = clanPrivileges.clone();
 	}
 	
-	public boolean hasClanPrivilege(int privilege)
+	public boolean hasClanPrivilege(ClanPrivilege privilege)
 	{
-		return ((_clanPrivileges & privilege) == privilege);
+		return _clanPrivileges.has(privilege);
 	}
 	
 	// baron etc

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/FortSiege.java

@@ -41,6 +41,7 @@ import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
 import com.l2jserver.gameserver.model.CombatFlag;
 import com.l2jserver.gameserver.model.FortSiegeSpawn;
 import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2SiegeClan;
 import com.l2jserver.gameserver.model.L2SiegeClan.SiegeClanType;
@@ -950,7 +951,7 @@ public class FortSiege implements Siegable
 			b = false;
 			player.sendMessage("Only clans with Level " + FortSiegeManager.getInstance().getSiegeClanMinLevel() + " and higher may register for a fortress siege.");
 		}
-		else if (!player.hasClanPrivilege(L2Clan.CP_CS_MANAGE_SIEGE))
+		else if (!player.hasClanPrivilege(ClanPrivilege.CS_MANAGE_SIEGE))
 		{
 			b = false;
 			player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);

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

@@ -20,6 +20,7 @@ package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.gameserver.datatables.CrestTable;
 import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2Crest;
 import com.l2jserver.gameserver.model.L2Crest.CrestType;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -76,7 +77,7 @@ public final class RequestExSetPledgeCrestLarge extends L2GameClientPacket
 			return;
 		}
 		
-		if (!activeChar.hasClanPrivilege(L2Clan.CP_CL_REGISTER_CREST))
+		if (!activeChar.hasClanPrivilege(ClanPrivilege.CL_REGISTER_CREST))
 		{
 			activeChar.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
 			return;

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

@@ -18,7 +18,7 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2ClanMember;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -56,7 +56,7 @@ public class RequestGiveNickName extends L2GameClientPacket
 		else
 		{
 			// Can the player change/give a title?
-			if (!activeChar.hasClanPrivilege(L2Clan.CP_CL_GIVE_TITLE))
+			if (!activeChar.hasClanPrivilege(ClanPrivilege.CL_GIVE_TITLE))
 			{
 				activeChar.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
 				return;

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

@@ -21,6 +21,7 @@ package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
 import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ExShowDominionRegistry;
@@ -68,7 +69,7 @@ public final class RequestJoinDominionWar extends L2GameClientPacket
 		
 		if (_isClan == 0x01)
 		{
-			if (!activeChar.hasClanPrivilege(L2Clan.CP_CS_MANAGE_SIEGE))
+			if (!activeChar.hasClanPrivilege(ClanPrivilege.CS_MANAGE_SIEGE))
 			{
 				activeChar.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
 				return;

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

@@ -22,6 +22,7 @@ package com.l2jserver.gameserver.network.clientpackets;
 import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
@@ -56,7 +57,7 @@ public final class RequestJoinSiege extends L2GameClientPacket
 			return;
 		}
 		
-		if (!activeChar.hasClanPrivilege(L2Clan.CP_CS_MANAGE_SIEGE))
+		if (!activeChar.hasClanPrivilege(ClanPrivilege.CS_MANAGE_SIEGE))
 		{
 			activeChar.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
 			return;

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

@@ -21,6 +21,7 @@ package com.l2jserver.gameserver.network.clientpackets;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2ClanMember;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListDelete;
@@ -55,7 +56,7 @@ public final class RequestOustPledgeMember extends L2GameClientPacket
 			activeChar.sendPacket(SystemMessageId.YOU_ARE_NOT_A_CLAN_MEMBER);
 			return;
 		}
-		if (!activeChar.hasClanPrivilege(L2Clan.CP_CL_DISMISS))
+		if (!activeChar.hasClanPrivilege(ClanPrivilege.CL_DISMISS))
 		{
 			activeChar.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
 			return;

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

@@ -18,7 +18,7 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.serverpackets.ManagePledgePower;
 
@@ -67,7 +67,7 @@ public final class RequestPledgePower extends L2GameClientPacket
 					// Clan war, right to dismiss, set functions
 					// Auction, manage taxes, attack/defend registration, mercenary management
 					// => Leaves only CP_CL_VIEW_WAREHOUSE, CP_CH_OPEN_DOOR, CP_CS_OPEN_DOOR?
-					_privs = (_privs & L2Clan.CP_CL_VIEW_WAREHOUSE) + (_privs & L2Clan.CP_CH_OPEN_DOOR) + (_privs & L2Clan.CP_CS_OPEN_DOOR);
+					_privs &= ClanPrivilege.CL_VIEW_WAREHOUSE.getBitmask() | ClanPrivilege.CH_OPEN_DOOR.getBitmask() | ClanPrivilege.CS_OPEN_DOOR.getBitmask();
 				}
 				player.getClan().setRankPrivs(_rank, _privs);
 			}

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

@@ -20,6 +20,7 @@ package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2ClanMember;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
 /**
@@ -64,7 +65,7 @@ public final class RequestPledgeReorganizeMember extends L2GameClientPacket
 			return;
 		}
 		
-		if (!activeChar.hasClanPrivilege(L2Clan.CP_CL_MANAGE_RANKS))
+		if (!activeChar.hasClanPrivilege(ClanPrivilege.CL_MANAGE_RANKS))
 		{
 			return;
 		}

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

@@ -20,6 +20,7 @@ package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2ClanMember;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
@@ -54,7 +55,7 @@ public final class RequestPledgeSetAcademyMaster extends L2GameClientPacket
 			return;
 		}
 		
-		if (!activeChar.hasClanPrivilege(L2Clan.CP_CL_APPRENTICE))
+		if (!activeChar.hasClanPrivilege(ClanPrivilege.CL_APPRENTICE))
 		{
 			activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_THE_RIGHT_TO_DISMISS_AN_APPRENTICE);
 			return;

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

@@ -20,6 +20,7 @@ package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2ClanMember;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
 /**
@@ -54,7 +55,7 @@ public final class RequestPledgeSetMemberPowerGrade extends L2GameClientPacket
 			return;
 		}
 		
-		if (!activeChar.hasClanPrivilege(L2Clan.CP_CL_MANAGE_RANKS))
+		if (!activeChar.hasClanPrivilege(ClanPrivilege.CL_MANAGE_RANKS))
 		{
 			return;
 		}

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

@@ -28,7 +28,7 @@ import com.l2jserver.Config;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.CastleManorManager;
 import com.l2jserver.gameserver.model.CropProcure;
-import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.util.Util;
@@ -82,7 +82,7 @@ public class RequestSetCrop extends L2GameClientPacket
 		
 		L2PcInstance player = getClient().getActiveChar();
 		// check player privileges
-		if ((player == null) || (player.getClan() == null) || !player.hasClanPrivilege(L2Clan.CP_CS_MANOR_ADMIN))
+		if ((player == null) || (player.getClan() == null) || !player.hasClanPrivilege(ClanPrivilege.CS_MANOR_ADMIN))
 		{
 			return;
 		}

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

@@ -20,6 +20,7 @@ package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.gameserver.datatables.CrestTable;
 import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2Crest;
 import com.l2jserver.gameserver.model.L2Crest.CrestType;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -81,7 +82,7 @@ public final class RequestSetPledgeCrest extends L2GameClientPacket
 			return;
 		}
 		
-		if (!activeChar.hasClanPrivilege(L2Clan.CP_CL_REGISTER_CREST))
+		if (!activeChar.hasClanPrivilege(ClanPrivilege.CL_REGISTER_CREST))
 		{
 			activeChar.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
 			return;

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

@@ -27,7 +27,7 @@ import java.util.List;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.CastleManorManager;
-import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.SeedProduction;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Castle;
@@ -81,7 +81,7 @@ public class RequestSetSeed extends L2GameClientPacket
 		
 		L2PcInstance player = getClient().getActiveChar();
 		// check player privileges
-		if ((player == null) || (player.getClan() == null) || !player.hasClanPrivilege(L2Clan.CP_CS_MANOR_ADMIN))
+		if ((player == null) || (player.getClan() == null) || !player.hasClanPrivilege(ClanPrivilege.CS_MANOR_ADMIN))
 		{
 			return;
 		}

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

@@ -20,6 +20,7 @@ package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.ClanTable;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -65,7 +66,7 @@ public final class RequestStartPledgeWar extends L2GameClientPacket
 			sm = null;
 			return;
 		}
-		else if (!player.hasClanPrivilege(L2Clan.CP_CL_PLEDGE_WAR))
+		else if (!player.hasClanPrivilege(ClanPrivilege.CL_PLEDGE_WAR))
 		{
 			player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
 			player.sendPacket(ActionFailed.STATIC_PACKET);

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

@@ -19,6 +19,7 @@
 package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.gameserver.datatables.ClanTable;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2ClanMember;
 import com.l2jserver.gameserver.model.L2World;
@@ -71,7 +72,7 @@ public final class RequestStopPledgeWar extends L2GameClientPacket
 		}
 		
 		// Check if player who does the request has the correct rights to do it
-		if (!player.hasClanPrivilege(L2Clan.CP_CL_PLEDGE_WAR))
+		if (!player.hasClanPrivilege(ClanPrivilege.CL_PLEDGE_WAR))
 		{
 			player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
 			return;

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

@@ -19,7 +19,7 @@
 package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.holders.ItemHolder;
@@ -114,7 +114,7 @@ public final class SendWareHouseWithDrawList extends L2GameClientPacket
 		
 		if (Config.ALT_MEMBERS_CAN_WITHDRAW_FROM_CLANWH)
 		{
-			if ((warehouse instanceof ClanWarehouse) && !player.hasClanPrivilege(L2Clan.CP_CL_VIEW_WAREHOUSE))
+			if ((warehouse instanceof ClanWarehouse) && !player.hasClanPrivilege(ClanPrivilege.CL_VIEW_WAREHOUSE))
 			{
 				return;
 			}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ManagePledgePower.java

@@ -42,7 +42,7 @@ public class ManagePledgePower extends L2GameServerPacket
 			writeC(0x2a);
 			writeD(0);
 			writeD(0);
-			writeD(_clan.getRankPrivs(_rank));
+			writeD(_clan.getRankPrivs(_rank).getBitmask());
 		}
 	}
 }

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/PledgeReceivePowerInfo.java

@@ -43,6 +43,6 @@ public class PledgeReceivePowerInfo extends L2GameServerPacket
 		
 		writeD(_member.getPowerGrade()); // power grade
 		writeS(_member.getName());
-		writeD(_member.getClan().getRankPrivs(_member.getPowerGrade())); // privileges
+		writeD(_member.getClan().getRankPrivs(_member.getPowerGrade()).getBitmask()); // privileges
 	}
 }

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java

@@ -212,7 +212,7 @@ public final class UserInfo extends L2GameServerPacket
 		writeD(_activeChar.getAppearance().getInvisible() && _activeChar.isGM() ? _activeChar.getAbnormalVisualEffects() | AbnormalVisualEffect.STEALTH.getMask() : _activeChar.getAbnormalVisualEffects());
 		writeC(_activeChar.isInsideZone(ZoneId.WATER) ? 1 : _activeChar.isFlyingMounted() ? 2 : 0);
 		
-		writeD(_activeChar.getClanPrivileges());
+		writeD(_activeChar.getClanPrivileges().getBitmask());
 		
 		writeH(_activeChar.getRecomLeft()); // c2 recommendations remaining
 		writeH(_activeChar.getRecomHave()); // c2 recommendations received

+ 157 - 0
L2J_Server_BETA/java/com/l2jserver/util/EnumIntBitmask.java

@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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.
+ * 
+ * L2J Server 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.util;
+
+/**
+ * @author FBIagent
+ * @param <E> The enum type
+ */
+public final class EnumIntBitmask<E extends Enum<E>> implements Cloneable
+{
+	public static <E extends Enum<E>> int getAllBitmask(Class<E> enumClass)
+	{
+		int allBitmask = 0;
+		E[] values = enumClass.getEnumConstants();
+		if (values.length > 32)
+		{
+			throw new IllegalArgumentException("Enum too big for an integer bitmask.");
+		}
+		for (E value : values)
+		{
+			allBitmask |= 1 << value.ordinal();
+		}
+		return allBitmask;
+	}
+	
+	private final Class<E> _enumClass;
+	private int _bitmask;
+	
+	public EnumIntBitmask(Class<E> enumClass, boolean all)
+	{
+		_enumClass = enumClass;
+		
+		E[] values = _enumClass.getEnumConstants();
+		if (values.length > 32)
+		{
+			throw new IllegalArgumentException("Enum too big for an integer bitmask.");
+		}
+		
+		if (all)
+		{
+			setAll();
+		}
+		else
+		{
+			clear();
+		}
+	}
+	
+	public EnumIntBitmask(Class<E> enumClass, int bitmask)
+	{
+		_enumClass = enumClass;
+		_bitmask = bitmask;
+	}
+	
+	public void setAll()
+	{
+		set(_enumClass.getEnumConstants());
+	}
+	
+	public void clear()
+	{
+		_bitmask = 0;
+	}
+	
+	@SafeVarargs
+	public final void set(E... many)
+	{
+		clear();
+		for (E one : many)
+		{
+			_bitmask |= 1 << one.ordinal();
+		}
+	}
+	
+	@SafeVarargs
+	public final void set(E first, E... more)
+	{
+		clear();
+		add(first, more);
+	}
+	
+	public void setBitmask(int bitmask)
+	{
+		_bitmask = bitmask;
+	}
+	
+	@SafeVarargs
+	public final void add(E first, E... more)
+	{
+		_bitmask |= 1 << first.ordinal();
+		if (more != null)
+		{
+			for (E one : more)
+			{
+				_bitmask |= 1 << one.ordinal();
+			}
+		}
+	}
+	
+	@SafeVarargs
+	public final void remove(E first, E... more)
+	{
+		_bitmask &= ~(1 << first.ordinal());
+		if (more != null)
+		{
+			for (E one : more)
+			{
+				_bitmask &= ~(1 << one.ordinal());
+			}
+		}
+	}
+	
+	@SafeVarargs
+	public final boolean has(E first, E... more)
+	{
+		if ((_bitmask & (1 << first.ordinal())) == 0)
+		{
+			return false;
+		}
+		
+		for (E one : more)
+		{
+			if ((_bitmask & (1 << one.ordinal())) == 0)
+			{
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	@Override
+	public EnumIntBitmask<E> clone()
+	{
+		return new EnumIntBitmask<>(_enumClass, _bitmask);
+	}
+	
+	public int getBitmask()
+	{
+		return _bitmask;
+	}
+}