// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ // ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ // 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] */ //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)); } //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; }