forked from MagicBane/Server
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.2 KiB
130 lines
4.2 KiB
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . |
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· |
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ |
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ |
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ |
|
// Magicbane Emulator Project © 2013 - 2022 |
|
// www.magicbane.com |
|
|
|
|
|
package engine.objects; |
|
|
|
import java.util.concurrent.atomic.AtomicInteger; |
|
|
|
public class GuildStatusController { |
|
|
|
/* |
|
* Status is stored in a single integer contained within the Character Table |
|
* |
|
* This class is responsible for maintaining and interpreting that value. |
|
* |
|
* Byte 1 - All : Title [0x000000FF] |
|
* Byte 2 - Low : isFullMember [0x00000F00] |
|
* Byte 2 - High : isTaxCollector [0x0000F000] |
|
* Byte 3 - Low : isRecruiter [0x000F0000] |
|
* Byte 3 - High : isInnerCouncil [0x00F00000] |
|
* Byte 4 - Low : isGuildLeader [0x0F000000] |
|
* Byte 4 - High : Empty [0xF0000000] |
|
*/ |
|
|
|
//Constants |
|
private static final int TITLE = 0x000000FF; // 00, F0 and 0F had no effect |
|
private static final int FULLMEMBER = 0x00000F00; |
|
private static final int TAXCOLLECTOR = 0x0000F000; |
|
private static final int RECRUITER = 0x000F0000; |
|
private static final int INNERCOUNCIL = 0x00F00000; |
|
private static final int GUILDLEADER = 0x0F000000; |
|
|
|
//Getters |
|
public static boolean isGuildLeader(AtomicInteger status) { |
|
return ((status.get() & GUILDLEADER) > 0); |
|
} |
|
|
|
public static boolean isInnerCouncil(AtomicInteger status) { |
|
return ((status.get() & INNERCOUNCIL) > 0); |
|
} |
|
|
|
public static boolean isRecruiter(AtomicInteger status) { |
|
return ((status.get() & RECRUITER) > 0); |
|
} |
|
|
|
public static boolean isTaxCollector(AtomicInteger status) { |
|
return ((status.get() & TAXCOLLECTOR) > 0); |
|
} |
|
|
|
public static boolean isFullMember(AtomicInteger status) { |
|
return ((status.get() & FULLMEMBER) > 0); |
|
} |
|
|
|
public static int getTitle(AtomicInteger status) { |
|
return status.get() & TITLE; |
|
} |
|
|
|
public static int getRank(AtomicInteger status) { |
|
int value = status.get(); |
|
|
|
//Guild Leader |
|
if (value > 0x00FFFFFF) { |
|
return 10; |
|
} |
|
|
|
//Inner Council |
|
if (value > 0x000FFFFF) { |
|
return 9; |
|
} |
|
|
|
//Recruiter |
|
if (value > 0x0000FFFF) { |
|
return 8; |
|
} |
|
|
|
//Tax Collector |
|
if (value > 0x00000FFF) { |
|
return 7; |
|
} |
|
|
|
//Full Member |
|
if (value > 0x000000FF) { |
|
return 6; |
|
} |
|
|
|
//Petitioner |
|
return 5; |
|
} |
|
|
|
//Setters |
|
public static void setTitle(AtomicInteger current, int i) { |
|
int value; |
|
i &= TITLE; |
|
do { |
|
value = current.get(); |
|
} while (!current.compareAndSet(value, (value & ~TITLE) | i)); |
|
} |
|
|
|
public static void setFullMember(AtomicInteger status, boolean newValue) { |
|
setNibble(status, newValue, FULLMEMBER); |
|
} |
|
|
|
public static void setTaxCollector(AtomicInteger status, boolean newValue) { |
|
setNibble(status, newValue, TAXCOLLECTOR); |
|
} |
|
|
|
public static void setRecruiter(AtomicInteger status, boolean newValue) { |
|
setNibble(status, newValue, RECRUITER); |
|
} |
|
|
|
public static void setInnerCouncil(AtomicInteger status, boolean newValue) { |
|
setNibble(status, newValue, INNERCOUNCIL); |
|
} |
|
|
|
public static void setGuildLeader(AtomicInteger status, boolean newValue) { |
|
setNibble(status, newValue, GUILDLEADER); |
|
} |
|
|
|
private static void setNibble(AtomicInteger current, boolean newValue, int mask) { |
|
int value, i = ((newValue) ? mask & -1 : 0); |
|
do { |
|
value = current.get(); |
|
} while (!current.compareAndSet(value, (value & ~mask) | i)); |
|
} |
|
}
|
|
|