|  |  |  | // • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
 | 
					
						
							|  |  |  | // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
 | 
					
						
							|  |  |  | // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
 | 
					
						
							|  |  |  | // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
 | 
					
						
							|  |  |  | // ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
 | 
					
						
							|  |  |  | //      Magicbane Emulator Project © 2013 - 2022
 | 
					
						
							|  |  |  | //                www.magicbane.com
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package engine.objects;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import engine.Enum.DispatchChannel;
 | 
					
						
							|  |  |  | import engine.gameManager.DbManager;
 | 
					
						
							|  |  |  | import engine.net.ByteBufferWriter;
 | 
					
						
							|  |  |  | import engine.net.DispatchMessage;
 | 
					
						
							|  |  |  | import engine.net.client.msg.ApplyRuneMsg;
 | 
					
						
							|  |  |  | import engine.server.MBServerStatics;
 | 
					
						
							|  |  |  | import org.pmw.tinylog.Logger;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import java.sql.ResultSet;
 | 
					
						
							|  |  |  | import java.sql.SQLException;
 | 
					
						
							|  |  |  | import java.util.ArrayList;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public class CharacterRune extends AbstractGameObject {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private final RuneBase runeBase;
 | 
					
						
							|  |  |  |     private final int player;
 | 
					
						
							|  |  |  |     private final ArrayList<SkillReq> skillsGranted;
 | 
					
						
							|  |  |  |     private final ArrayList<PowerReq> powersGranted;
 | 
					
						
							|  |  |  |     private final ArrayList<RuneBaseEffect> effectsGranted;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * No Table ID Constructor
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  |     public CharacterRune(RuneBase runeBase, int characterID) {
 | 
					
						
							|  |  |  |         super();
 | 
					
						
							|  |  |  |         this.runeBase = runeBase;
 | 
					
						
							|  |  |  |         this.player = characterID;
 | 
					
						
							|  |  |  |         if (this.runeBase != null) {
 | 
					
						
							|  |  |  |             this.skillsGranted = DbManager.SkillReqQueries.GET_REQS_FOR_RUNE(this.runeBase.getObjectUUID());
 | 
					
						
							|  |  |  |             this.powersGranted = PowerReq.getPowerReqsForRune(this.runeBase.getObjectUUID());
 | 
					
						
							|  |  |  |         } else {
 | 
					
						
							|  |  |  |             this.skillsGranted = new ArrayList<>();
 | 
					
						
							|  |  |  |             this.powersGranted = new ArrayList<>();
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         if (this.runeBase != null)
 | 
					
						
							|  |  |  |             this.effectsGranted = DbManager.RuneBaseEffectQueries.GET_EFFECTS_FOR_RUNEBASE(this.runeBase.getObjectUUID());
 | 
					
						
							|  |  |  |         else
 | 
					
						
							|  |  |  |             this.effectsGranted = new ArrayList<>();
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Normal Constructor
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  |     public CharacterRune(RuneBase runeBase, int characterID, int newUUID) {
 | 
					
						
							|  |  |  |         super(newUUID);
 | 
					
						
							|  |  |  |         this.runeBase = runeBase;
 | 
					
						
							|  |  |  |         this.player = characterID;
 | 
					
						
							|  |  |  |         if (this.runeBase != null) {
 | 
					
						
							|  |  |  |             this.skillsGranted = DbManager.SkillReqQueries.GET_REQS_FOR_RUNE(this.runeBase.getObjectUUID());
 | 
					
						
							|  |  |  |             this.powersGranted = PowerReq.getPowerReqsForRune(this.runeBase.getObjectUUID());
 | 
					
						
							|  |  |  |         } else {
 | 
					
						
							|  |  |  |             this.skillsGranted = new ArrayList<>();
 | 
					
						
							|  |  |  |             this.powersGranted = new ArrayList<>();
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         if (this.runeBase != null)
 | 
					
						
							|  |  |  |             this.effectsGranted = DbManager.RuneBaseEffectQueries.GET_EFFECTS_FOR_RUNEBASE(this.runeBase.getObjectUUID());
 | 
					
						
							|  |  |  |         else
 | 
					
						
							|  |  |  |             this.effectsGranted = new ArrayList<>();
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * ResultSet Constructor
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  |     public CharacterRune(ResultSet rs) throws SQLException {
 | 
					
						
							|  |  |  |         super(rs);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         this.runeBase = RuneBase.getRuneBase(rs.getInt("RuneBaseID"));
 | 
					
						
							|  |  |  |         this.player = rs.getInt("CharacterID");
 | 
					
						
							|  |  |  |         if (this.runeBase != null) {
 | 
					
						
							|  |  |  |             this.skillsGranted = DbManager.SkillReqQueries.GET_REQS_FOR_RUNE(this.runeBase.getObjectUUID());
 | 
					
						
							|  |  |  |             this.powersGranted = PowerReq.getPowerReqsForRune(this.runeBase.getObjectUUID());
 | 
					
						
							|  |  |  |             this.effectsGranted = DbManager.RuneBaseEffectQueries.GET_EFFECTS_FOR_RUNEBASE(this.runeBase.getObjectUUID());
 | 
					
						
							|  |  |  |         } else {
 | 
					
						
							|  |  |  |             Logger.error("Failed to find RuneBase for CharacterRune " + this.getObjectUUID());
 | 
					
						
							|  |  |  |             this.skillsGranted = new ArrayList<>();
 | 
					
						
							|  |  |  |             this.powersGranted = new ArrayList<>();
 | 
					
						
							|  |  |  |             this.effectsGranted = new ArrayList<>();
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public static void serializeForClientMsg(CharacterRune characterRune, ByteBufferWriter writer) {
 | 
					
						
							|  |  |  |         if (characterRune.runeBase != null) {
 | 
					
						
							|  |  |  |             int idd = characterRune.runeBase.getObjectUUID();
 | 
					
						
							|  |  |  |             if (idd > 3000 && idd < 3050)
 | 
					
						
							|  |  |  |                 writer.putInt(4);
 | 
					
						
							|  |  |  |             else
 | 
					
						
							|  |  |  |                 writer.putInt(5);
 | 
					
						
							|  |  |  |             //			writer.putInt(this.runeBase.getMessageType());
 | 
					
						
							|  |  |  |             writer.putInt(0);
 | 
					
						
							|  |  |  |             writer.putInt(characterRune.runeBase.getObjectUUID());
 | 
					
						
							|  |  |  |             writer.putInt(characterRune.getObjectType().ordinal());
 | 
					
						
							|  |  |  |             writer.putInt(characterRune.getObjectUUID());
 | 
					
						
							|  |  |  |         } else {
 | 
					
						
							|  |  |  |             for (int i = 0; i < 5; i++)
 | 
					
						
							|  |  |  |                 writer.putInt(0);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public static boolean grantRune(PlayerCharacter pc, int runeID) {
 | 
					
						
							|  |  |  |         //Verify not too many runes
 | 
					
						
							|  |  |  |         ArrayList<CharacterRune> runes = pc.getRunes();
 | 
					
						
							|  |  |  |         boolean worked = false;
 | 
					
						
							|  |  |  |         synchronized (runes) {
 | 
					
						
							|  |  |  |             if (runes == null || runes.size() > 12)
 | 
					
						
							|  |  |  |                 return false;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             //Verify player doesn't already have rune
 | 
					
						
							|  |  |  |             for (CharacterRune rune : runes) {
 | 
					
						
							|  |  |  |                 RuneBase rb = rune.runeBase;
 | 
					
						
							|  |  |  |                 if (rb == null || rb.getObjectUUID() == runeID)
 | 
					
						
							|  |  |  |                     return false;
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             RuneBase rb = RuneBase.getRuneBase(runeID);
 | 
					
						
							|  |  |  |             if (rb == null)
 | 
					
						
							|  |  |  |                 return false;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             //Attempt to add rune to database
 | 
					
						
							|  |  |  |             CharacterRune toAdd = new CharacterRune(rb, pc.getObjectUUID());
 | 
					
						
							|  |  |  |             CharacterRune rune = null;
 | 
					
						
							|  |  |  |             try {
 | 
					
						
							|  |  |  |                 rune = DbManager.CharacterRuneQueries.ADD_CHARACTER_RUNE(toAdd);
 | 
					
						
							|  |  |  |             } catch (Exception e) {
 | 
					
						
							|  |  |  |                 return false;
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             if (rune == null)
 | 
					
						
							|  |  |  |                 return false;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             //attempt add rune to player
 | 
					
						
							|  |  |  |             worked = pc.addRune(rune);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             //worked, send ApplyRuneMsg
 | 
					
						
							|  |  |  |             if (worked) {
 | 
					
						
							|  |  |  |                 ApplyRuneMsg arm = new ApplyRuneMsg(pc.getObjectType().ordinal(), pc.getObjectUUID(), runeID, rune.getObjectType().ordinal(), rune.getObjectUUID(), true);
 | 
					
						
							|  |  |  |                 DispatchMessage.dispatchMsgToInterestArea(pc, arm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
 | 
					
						
							|  |  |  |                 CharacterSkill.calculateSkills(pc);
 | 
					
						
							|  |  |  |                 pc.applyBonuses();
 | 
					
						
							|  |  |  |                 return true;
 | 
					
						
							|  |  |  |             } else
 | 
					
						
							|  |  |  |                 return false;
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public static boolean removeRune(PlayerCharacter pc, int runeID) {
 | 
					
						
							|  |  |  |         ArrayList<CharacterRune> runes = pc.getRunes();
 | 
					
						
							|  |  |  |         synchronized (runes) {
 | 
					
						
							|  |  |  |             for (CharacterRune rune : runes) {
 | 
					
						
							|  |  |  |                 RuneBase rb = rune.runeBase;
 | 
					
						
							|  |  |  |                 if (rb == null)
 | 
					
						
							|  |  |  |                     continue;
 | 
					
						
							|  |  |  |                 if (rb.getObjectUUID() == runeID && DbManager.CharacterRuneQueries.DELETE_CHARACTER_RUNE(rune)) {
 | 
					
						
							|  |  |  |                     runes.remove(runes.indexOf(rune));
 | 
					
						
							|  |  |  |                     CharacterSkill.calculateSkills(pc);
 | 
					
						
							|  |  |  |                     pc.applyBonuses();
 | 
					
						
							|  |  |  |                     return true;
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             return false;
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * Getters
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  |     public RuneBase getRuneBase() {
 | 
					
						
							|  |  |  |         return this.runeBase;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public int getRuneBaseID() {
 | 
					
						
							|  |  |  |         if (this.runeBase != null)
 | 
					
						
							|  |  |  |             return this.runeBase.getObjectUUID();
 | 
					
						
							|  |  |  |         return 0;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public int getPlayerID() {
 | 
					
						
							|  |  |  |         return this.player;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * Serializing
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public ArrayList<SkillReq> getSkillsGranted() {
 | 
					
						
							|  |  |  |         return this.skillsGranted;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public ArrayList<PowerReq> getPowersGranted() {
 | 
					
						
							|  |  |  |         return this.powersGranted;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public ArrayList<RuneBaseEffect> getEffectsGranted() {
 | 
					
						
							|  |  |  |         return this.effectsGranted;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @Override
 | 
					
						
							|  |  |  |     public void updateDatabase() {
 | 
					
						
							|  |  |  |         DbManager.CharacterRuneQueries.updateDatabase(this);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 |