// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ // ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ // Magicbane Emulator Project © 2013 - 2022 // www.magicbane.com package engine.objects; import engine.gameManager.DbManager; import engine.mbEnums; import engine.mbEnums.RaceType; import engine.net.ByteBufferWriter; import engine.server.MBServerStatics; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; import java.util.concurrent.ConcurrentHashMap; public class Race { // Local class cache private static ConcurrentHashMap _raceByID = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); private final String name; private final String description; private final int raceRuneID; private final short strStart; private final short strMin; private final short strMax; private final short dexStart; private final short dexMin; private final short dexMax; private final short conStart; private final short conMin; private final short conMax; private final short intStart; private final short intMin; private final short intMax; private final short spiStart; private final short spiMin; private final short spiMax; private final short healthBonus; private final short manaBonus; private final short staminaBonus; private final byte startingPoints; private final float minHeight; private final float strHeightMod; private final HashSet skinColors; private final HashSet beardColors; private final HashSet hairColors; private final ArrayList baseClasses; private final ArrayList skillsGranted; private final ArrayList powersGranted; private mbEnums.RaceType raceType; private int token = 0; private HashSet hairStyles; private HashSet beardStyles; private ArrayList effectsList = new ArrayList<>(); /** * ResultSet Constructor */ public Race(ResultSet rs) throws SQLException { this.raceRuneID = rs.getInt("ID"); this.raceType = mbEnums.RaceType.getRaceTypebyRuneID(raceRuneID); this.name = rs.getString("name"); this.description = rs.getString("description"); this.strStart = rs.getShort("strStart"); this.strMin = rs.getShort("strMin"); this.strMax = rs.getShort("strMax"); this.dexStart = rs.getShort("dexStart"); this.dexMin = rs.getShort("dexMin"); this.dexMax = rs.getShort("dexMax"); this.conStart = rs.getShort("conStart"); this.conMin = rs.getShort("conMin"); this.conMax = rs.getShort("conMax"); this.intStart = rs.getShort("intStart"); this.intMin = rs.getShort("intMin"); this.intMax = rs.getShort("intMax"); this.spiStart = rs.getShort("spiStart"); this.spiMin = rs.getShort("spiMin"); this.spiMax = rs.getShort("spiMax"); this.token = rs.getInt("token"); this.healthBonus = rs.getShort("healthBonus"); this.manaBonus = rs.getShort("manaBonus"); this.staminaBonus = rs.getShort("staminaBonus"); this.startingPoints = rs.getByte("startingPoints"); this.raceType = RaceType.getRaceTypebyRuneID(this.raceRuneID); this.minHeight = rs.getFloat("minHeight"); this.strHeightMod = rs.getFloat("strHeightMod"); this.hairStyles = DbManager.RaceQueries.HAIR_STYLES_FOR_RACE(raceRuneID); this.beardStyles = DbManager.RaceQueries.BEARD_STYLES_FOR_RACE(raceRuneID); this.skinColors = DbManager.RaceQueries.SKIN_COLOR_FOR_RACE(raceRuneID); this.beardColors = DbManager.RaceQueries.BEARD_COLORS_FOR_RACE(raceRuneID); this.hairColors = DbManager.RaceQueries.HAIR_COLORS_FOR_RACE(raceRuneID); this.baseClasses = DbManager.BaseClassQueries.GET_BASECLASS_FOR_RACE(raceRuneID); this.skillsGranted = DbManager.SkillReqQueries.GET_REQS_FOR_RUNE(raceRuneID); this.powersGranted = PowerReq.getPowerReqsForRune(raceRuneID); this.effectsList = DbManager.MobBaseQueries.GET_RUNEBASE_EFFECTS(this.raceRuneID); } public static void loadAllRaces() { Race._raceByID = DbManager.RaceQueries.LOAD_ALL_RACES(); } public static Race getRace(int id) { return _raceByID.get(id); } @Override public boolean equals(Object object) { if ((object instanceof Race) == false) return false; Race race = (Race) object; return this.raceRuneID == race.raceRuneID; } @Override public int hashCode() { return this.raceRuneID; } /* * Getters */ public String getName() { return name; } public String getDescription() { return description; } public short getStrStart() { return strStart; } public short getStrMin() { return strMin; } public short getStrMax() { return strMax; } public short getDexStart() { return dexStart; } public short getDexMin() { return dexMin; } public short getDexMax() { return dexMax; } public short getConStart() { return conStart; } public short getConMin() { return conMin; } public short getConMax() { return conMax; } public short getIntStart() { return intStart; } public short getIntMin() { return intMin; } public short getIntMax() { return intMax; } public short getSpiStart() { return spiStart; } public short getSpiMin() { return spiMin; } public short getSpiMax() { return spiMax; } public byte getStartingPoints() { return startingPoints; } public int getToken() { return token; } public final HashSet getHairStyles() { return hairStyles; } public final HashSet getBeardStyles() { return beardStyles; } public final HashSet getBeardColors() { return beardColors; } public HashSet getHairColors() { return hairColors; } public HashSet getSkinColors() { return skinColors; } public int getNumSkinColors() { return this.skinColors.size(); } public int getNumHairColors() { return this.hairColors.size(); } public int getNumBeardColors() { return this.beardColors.size(); } public final ArrayList getValidBaseClasses() { return baseClasses; } public ArrayList getAllowedRunes() { return RuneBase.AllowedRaceRunesMap.get(raceRuneID); } public ArrayList getSkillsGranted() { return this.skillsGranted; } public ArrayList getPowersGranted() { return this.powersGranted; } public ArrayList getEffectsGranted() { return RuneBaseEffect.RuneIDBaseEffectMap.get(this.raceRuneID); } /* * Validators */ public boolean isValidBeardStyle(int id) { return this.beardStyles.contains(id); } public boolean isValidBeardColor(int id) { return this.beardColors.contains(id); } public boolean isValidHairStyle(int id) { return this.hairStyles.contains(id); } public boolean isValidHairColor(int id) { return this.hairColors.contains(id); } public boolean isValidSkinColor(int id) { return this.skinColors.contains(id); } public boolean isAllowedRune(RuneBase rb) { if (this.getAllowedRunes() != null) if (this.getAllowedRunes().contains(rb.getObjectUUID())) return true; if (RuneBase.AllowedBaseClassRunesMap.containsKey(111111)) { if (RuneBase.AllowedRaceRunesMap.get(111111).contains(rb.getObjectUUID())) return true; } return false; } public float getHealthBonus() { return this.healthBonus; } public float getManaBonus() { return this.manaBonus; } public float getStaminaBonus() { return this.staminaBonus; } public float getMinHeight() { return this.minHeight; } public float getStrHeightMod() { return this.strHeightMod; } public float getHeight(short str) { return this.minHeight + (this.strHeightMod * str); } /* * Serializing */ public float getCenterHeight(short str) { return getHeight(str) / 2f; } public void serializeForClientMsg(ByteBufferWriter writer) { writer.putInt(1); // For Race writer.putInt(0); // Pad writer.putInt(this.raceRuneID); writer.putInt(mbEnums.GameObjectType.Race.ordinal()); writer.putInt(raceRuneID); } public int getRaceRuneID() { return raceRuneID; } public mbEnums.RaceType getRaceType() { return raceType; } public ArrayList getEffectsList() { return effectsList; } }