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.
647 lines
17 KiB
647 lines
17 KiB
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . |
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· |
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ |
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ |
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ |
|
// Magicbane Emulator Project © 2013 - 2022 |
|
// www.magicbane.com |
|
|
|
|
|
package engine.powers; |
|
|
|
import engine.Enum.PowerCategoryType; |
|
import engine.Enum.PowerTargetType; |
|
import org.pmw.tinylog.Logger; |
|
|
|
import java.sql.ResultSet; |
|
import java.sql.SQLException; |
|
import java.util.ArrayList; |
|
|
|
public class PowersBase { |
|
|
|
public int UUID; |
|
public String name; |
|
public int token; |
|
public String IDString; |
|
public String category; |
|
public int skillID; |
|
public float range; |
|
public float cost; |
|
public float costRamp; |
|
public float castTime; |
|
public float castTimeRamp; |
|
public float cooldown; |
|
public float recycleTime; |
|
public float recycleRamp; |
|
public int maxTrains; |
|
public float hateValue; |
|
public float hateRamp; |
|
public String monsterTypePrereq; // target limited to these types |
|
public String skillName; |
|
public float weaponRange = 15f; |
|
|
|
// aoe related |
|
public boolean isAOE = true; |
|
public boolean useCone = false; |
|
public boolean usePointBlank = false; |
|
public boolean useSphere = false; |
|
public float radius; |
|
public byte groupReq; // who the spell won't hit |
|
public int maxNumMobTargets; |
|
public int maxNumPlayerTargets; |
|
|
|
// chant related |
|
public float chantDuration; |
|
public int chantIterations; |
|
|
|
// valid target types from targetType field |
|
public boolean targetPlayer = false; |
|
public boolean targetMob = false; |
|
public boolean targetPet = false; |
|
public boolean targetNecroPet = false; |
|
public boolean targetSelf = false; |
|
public boolean targetWeapon = false; |
|
public boolean targetCorpse = false; |
|
public boolean targetBuilding = false; |
|
public boolean targetGroup = false; |
|
public boolean targetGuildLeader = false; |
|
public boolean targetJewelry = false; |
|
public boolean targetArmor = false; |
|
public boolean targetItem = false; |
|
|
|
|
|
// flags |
|
public boolean isCasterFriendly = false; // from groupReq |
|
public boolean isGroupFriendly = false; // from groupReq |
|
public boolean isGroupOnly = false; // from groupReq |
|
public boolean mustHitPets = false; // from groupReq |
|
public boolean isNationFriendly = false; // from groupReq |
|
public boolean targetFromLastTarget = false; // from unknown06 |
|
public boolean targetFromSelf = false; // from unknown06 |
|
public boolean targetFromName = false; // from unknown06 |
|
public boolean targetFromNearbyMobs = false; // from unknown06 |
|
public boolean useHealth = false; // from costType |
|
public boolean useMana = false; // from costType |
|
public boolean useStamina = false; // from costType |
|
public boolean isSpell = true; // from skillOrSpell field |
|
public boolean allowedInCombat = false; // from combat field |
|
public boolean allowedOutOfCombat = false; // from combat field |
|
public boolean regularPlayerCanCast = false; // from grantOverrideVar |
|
public boolean hateRampAdd = true; // 1 bit flag |
|
public boolean costRampAdd = true; // 2 bit flag |
|
public boolean recycleRampAdd = true; // 4 bit flag |
|
public boolean initRampAdd = true; // 8 bit flag |
|
public boolean canCastWhileMoving = false; // 16 bit flag |
|
public boolean canCastWhileFlying = false; // 32 bit flag |
|
public boolean isChant = false; // 64 bit flag |
|
public boolean losCheck = false; // 128 bit flag |
|
public boolean sticky = false; // 256 bit flag |
|
public boolean isAdminPower = false; // 512 bit flag |
|
public boolean requiresHitRoll = false; // 1024 bit flag |
|
public boolean isWeaponPower = false; // from category |
|
public boolean isHeal = false; //from category |
|
public boolean isTrack = false; //from category |
|
public boolean isHarmful = true; |
|
public boolean vampDrain = false; |
|
|
|
public boolean cancelOnCastSpell = false; |
|
public boolean cancelOnTakeDamage = false; |
|
|
|
public final ArrayList<String> monsterTypeRestrictions = new ArrayList<>(); |
|
public final ArrayList<ActionsBase> actions = new ArrayList<>(); |
|
public final ArrayList<PowerPrereq> effectPrereqs = new ArrayList<>(); |
|
public final ArrayList<PowerPrereq> targetEffectPrereqs = new ArrayList<>(); |
|
public final ArrayList<PowerPrereq> equipPrereqs = new ArrayList<>(); |
|
|
|
public PowerTargetType targetType; |
|
public PowerCategoryType powerCategory; |
|
public String description; |
|
|
|
/** |
|
* No Table ID Constructor |
|
*/ |
|
public PowersBase() { |
|
|
|
} |
|
|
|
/** |
|
* ResultSet Constructor |
|
*/ |
|
public PowersBase(ResultSet rs) throws SQLException { |
|
|
|
this.UUID = rs.getInt("ID"); |
|
this.name = rs.getString("name").trim(); |
|
this.token = rs.getInt("token"); |
|
this.skillName = rs.getString("skillName").trim(); |
|
this.IDString = rs.getString("IDString").trim(); |
|
this.isSpell = (rs.getString("skillOrSpell").equals("SPELL")) ? true : false; |
|
this.skillID = rs.getInt("skillID"); |
|
this.range = rs.getFloat("range"); |
|
this.description = (rs.getString("description")).trim().replace("\r\n ", ""); |
|
String ct = rs.getString("costType").trim(); |
|
if (ct.equals("HEALTH")) |
|
this.useHealth = true; |
|
else if (ct.equals("MANA")) |
|
this.useMana = true; |
|
else if (ct.equals("STAMINA")) |
|
this.useStamina = true; |
|
ct = rs.getString("targetType").trim(); |
|
if (ct.equals("BUILDING")) |
|
this.targetBuilding = true; |
|
else if (ct.equals("CORPSE")) |
|
this.targetCorpse = true; |
|
else if (ct.equals("GROUP")) |
|
this.targetGroup = true; |
|
else if (ct.equals("GUILDLEADER")) |
|
this.targetGuildLeader = true; |
|
else if (ct.equals("MOBILE")) { |
|
this.targetMob = true; |
|
this.targetPet = true; // sure on this one? |
|
} else if (ct.equals("PC")) |
|
this.targetPlayer = true; |
|
else if (ct.equals("SELF")) |
|
this.targetSelf = true; |
|
else if (ct.equals("PET")) |
|
this.targetPet = true; |
|
else if (ct.equals("NECROPET")) |
|
this.targetNecroPet = true; |
|
else if (ct.equals("ARMOR")) |
|
this.targetArmor = true; |
|
else if (ct.equals("WEAPON")) |
|
this.targetWeapon = true; |
|
else if (ct.equals("JEWELRY")) |
|
this.targetJewelry = true; |
|
else if (ct.equals("ITEM")) { |
|
this.targetItem = true; |
|
this.targetJewelry = true; |
|
this.targetArmor = true; |
|
this.targetWeapon = true; |
|
} else if (ct.equals("ARMORWEAPONJEWELRY")) { |
|
this.targetArmor = true; |
|
this.targetWeapon = true; |
|
this.targetJewelry = true; |
|
} else if (ct.equals("PCMOBILE")) { |
|
this.targetPlayer = true; |
|
this.targetMob = true; |
|
this.targetPet = true; // sure on this one? |
|
} else if (ct.equals("WEAPONARMOR")) { |
|
this.targetWeapon = true; |
|
this.targetArmor = true; |
|
} else { |
|
Logger.info("Missed " + ct + " targetType"); |
|
} |
|
String cat = rs.getString("category").trim(); |
|
this.category = cat; |
|
|
|
|
|
if (cat.isEmpty()) |
|
this.powerCategory = PowerCategoryType.NONE; |
|
else |
|
this.powerCategory = PowerCategoryType.valueOf(cat.replace("-", "")); |
|
|
|
|
|
|
|
|
|
if (cat.equals("WEAPON")) { |
|
this.isWeaponPower = true; |
|
this.isHarmful = false; |
|
if (this.skillName.equals("Bow") || this.skillName.equals("Crossbow") || this.skillName.equals("Archery")) |
|
this.weaponRange = 1000f; |
|
else if (this.skillName.equals("Throwing")) |
|
this.weaponRange = 60f; |
|
else |
|
this.weaponRange = 15f; |
|
} else if (cat.equals("HEAL") || cat.equals("GROUPHEAL")) { |
|
this.isHeal = true; |
|
this.isHarmful = false; |
|
} else if (cat.equals("TRACK")) { |
|
this.isTrack = true; |
|
this.isHarmful = false; |
|
} else if (cat.equals("AE") || cat.equals("AEDAMAGE") || |
|
cat.equals("BREAKFLY") || |
|
cat.equals("DAMAGE") || cat.equals("DEBUFF") || |
|
cat.equals("MOVE") || cat.equals("SPECIAL") || |
|
cat.equals("SPIREDISABLE")) |
|
this.isHarmful = true; |
|
else if (cat.equals("CHANT")) { |
|
this.isHarmful = ct.equals("MOBILE") || ct.equals("PC") || ct.equals("PCMOBILE"); |
|
} else if (cat.equals("DISPEL")) { |
|
//TODO this needs broken down better later |
|
this.isHarmful = false; |
|
} else if (cat.isEmpty()) { |
|
if (ct.equals("MOBILE") || ct.equals("PCMOBILE")) |
|
this.isHarmful = true; |
|
else if (ct.equals("PC")) { |
|
this.isHarmful = this.token != 429607195 && this.token != 429425915; |
|
} else |
|
this.isHarmful = false; |
|
} else |
|
this.isHarmful = false; |
|
|
|
if (cat.equals("VAMPDRAIN")) { |
|
this.vampDrain = true; |
|
this.isHarmful = true; |
|
} |
|
|
|
this.cost = rs.getFloat("cost"); |
|
this.costRamp = rs.getFloat("costRamp"); |
|
this.castTime = rs.getFloat("castTime"); |
|
this.castTimeRamp = rs.getFloat("initRamp"); |
|
this.cooldown = rs.getFloat("cooldown"); |
|
this.recycleTime = rs.getFloat("recycleTime"); |
|
this.recycleRamp = rs.getFloat("recycleRamp"); |
|
this.maxTrains = rs.getInt("maxTrains"); |
|
this.hateValue = rs.getFloat("hateValue"); |
|
this.hateRamp = rs.getFloat("hateRamp"); |
|
ct = rs.getString("unknown06").trim(); |
|
if (this.targetSelf) { |
|
} else if (ct.equals("CLICK")) |
|
if (!this.targetGroup) |
|
this.targetFromLastTarget = true; |
|
else if (ct.equals("NAME")) |
|
this.targetFromName = true; |
|
else if (ct.equals("NEARBYMOBS")) |
|
this.targetFromNearbyMobs = true; |
|
this.monsterTypePrereq = rs.getString("monsterTypePrereqs").trim(); |
|
ct = rs.getString("radiusType").trim(); |
|
if (ct.equals("CONE")) |
|
this.useCone = true; |
|
else if (ct.equals("POINTBLANK")) |
|
this.usePointBlank = true; |
|
else if (ct.equals("SPHERE")) |
|
this.useSphere = true; |
|
else |
|
this.isAOE = false; |
|
this.radius = rs.getFloat("radius"); |
|
ct = rs.getString("groupReq").trim(); |
|
if (ct.equals("CASTER")) |
|
this.isCasterFriendly = true; |
|
else if (ct.equals("GROUP")) { |
|
this.isGroupFriendly = true; |
|
this.isCasterFriendly = true; |
|
} |
|
else if (ct.equals("ALLBUTGROUP")) |
|
this.isGroupOnly = true; |
|
else if (ct.equals("ALLBUTPETS")) |
|
this.mustHitPets = true; |
|
else if (ct.equals("NATION")) { |
|
this.isNationFriendly = true; |
|
this.isCasterFriendly = true; |
|
} |
|
this.maxNumMobTargets = rs.getInt("maxNumMobTargets"); |
|
this.maxNumPlayerTargets = rs.getInt("maxNumPlayerTargets"); |
|
this.chantDuration = rs.getFloat("chantDuration"); |
|
this.chantIterations = rs.getInt("chantIterations"); |
|
ct = rs.getString("combat").trim(); |
|
if (ct.equals("COMBAT")) |
|
this.allowedInCombat = true; |
|
else if (ct.equals("NONCOMBAT")) |
|
this.allowedOutOfCombat = true; |
|
else if (ct.equals("BOTH")) { |
|
this.allowedInCombat = true; |
|
this.allowedOutOfCombat = true; |
|
} |
|
ct = rs.getString("grantOverideVar").trim(); |
|
if (ct.equals("PGOV_PLAYER")) |
|
this.regularPlayerCanCast = true; |
|
int flags = rs.getInt("flags"); |
|
if ((flags & 1) == 0) |
|
this.hateRampAdd = false; |
|
if ((flags & 2) == 0) |
|
this.costRampAdd = false; |
|
if ((flags & 4) == 0) |
|
this.recycleRampAdd = false; |
|
if ((flags & 8) == 0) |
|
this.initRampAdd = false; |
|
if ((flags & 16) != 0) |
|
this.canCastWhileMoving = true; |
|
if ((flags & 32) != 0) |
|
this.canCastWhileFlying = true; |
|
if ((flags & 64) != 0) |
|
this.isChant = true; |
|
if ((flags & 128) != 0) |
|
this.losCheck = true; |
|
if ((flags & 256) != 0) |
|
this.sticky = true; |
|
if ((flags & 512) != 0) |
|
this.isAdminPower = true; |
|
if ((flags & 1024) != 0) |
|
this.requiresHitRoll = true; |
|
ct = rs.getString("monsterTypeRestrict1").trim(); |
|
if (!ct.isEmpty()) |
|
this.monsterTypeRestrictions.add(ct); |
|
ct = rs.getString("monsterTypeRestrict2").trim(); |
|
if (!ct.isEmpty()) |
|
this.monsterTypeRestrictions.add(ct); |
|
ct = rs.getString("monsterTypeRestrict3").trim(); |
|
if (!ct.isEmpty()) |
|
this.monsterTypeRestrictions.add(ct); |
|
} |
|
|
|
|
|
public String getName() { |
|
return this.name; |
|
} |
|
|
|
public int getMaxTrains() { |
|
return this.maxTrains; |
|
} |
|
|
|
public int getUUID() { |
|
return this.UUID; |
|
} |
|
|
|
public String getIDString() { |
|
return this.IDString; |
|
} |
|
|
|
public int getToken() { |
|
if (this.IDString.equals("BLEED-DOT-10.5-RANGE")) |
|
return -369682965; |
|
return this.token; |
|
} |
|
|
|
public int getCastTime(int trains) { // returns cast time in ms |
|
if (this.initRampAdd) |
|
return (int) ((this.castTime + (this.castTimeRamp * trains)) * 1000); |
|
else |
|
return (int) ((this.castTime * (1 + (this.castTimeRamp * trains))) * 1000); |
|
} |
|
|
|
public int getRecycleTime(int trains) { // returns cast time in ms |
|
if (this.recycleRampAdd) |
|
return (int) (((this.recycleTime + (this.recycleRamp * trains)) * 1000) + getCastTime(trains)); |
|
else |
|
return (int) (((this.recycleTime * (1 + (this.recycleRamp * trains))) * 1000) + getCastTime(trains)); |
|
} |
|
|
|
// public ArrayList<FailCondition> getConditions() { |
|
// return this.conditions; |
|
// } |
|
|
|
public ArrayList<PowerPrereq> getEffectPrereqs() { |
|
return this.effectPrereqs; |
|
} |
|
|
|
public ArrayList<PowerPrereq> getTargetEffectPrereqs() { |
|
return this.targetEffectPrereqs; |
|
} |
|
|
|
public ArrayList<PowerPrereq> getEquipPrereqs() { |
|
return this.equipPrereqs; |
|
} |
|
|
|
public ArrayList<ActionsBase> getActions() { |
|
return this.actions; |
|
} |
|
|
|
public boolean usePointBlank() { |
|
return this.usePointBlank; |
|
} |
|
|
|
public float getRadius() { |
|
return this.radius; |
|
} |
|
|
|
public int getMaxNumMobTargets() { |
|
return this.maxNumMobTargets; |
|
} |
|
|
|
public int getMaxNumPlayerTargets() { |
|
return this.maxNumPlayerTargets; |
|
} |
|
|
|
public boolean cancelOnCastSpell() { |
|
return this.cancelOnCastSpell; |
|
} |
|
|
|
public boolean cancelOnTakeDamage() { |
|
return this.cancelOnTakeDamage; |
|
} |
|
|
|
public boolean allowedInCombat() { |
|
return this.allowedInCombat; |
|
} |
|
|
|
public boolean allowedOutOfCombat() { |
|
return this.allowedOutOfCombat; |
|
} |
|
|
|
public boolean isCasterFriendly() { |
|
return this.isCasterFriendly; |
|
} |
|
|
|
public boolean isGroupFriendly() { |
|
return this.isGroupFriendly; |
|
} |
|
|
|
public boolean isNationFriendly() { |
|
return this.isNationFriendly; |
|
} |
|
|
|
public boolean isGroupOnly() { |
|
return this.isGroupOnly; |
|
} |
|
|
|
public boolean mustHitPets() { |
|
return this.mustHitPets; |
|
} |
|
|
|
public boolean targetFromLastTarget() { |
|
return this.targetFromLastTarget; |
|
} |
|
|
|
public boolean targetFromSelf() { |
|
return this.targetFromSelf; |
|
} |
|
|
|
public boolean targetFromName() { |
|
return this.targetFromName; |
|
} |
|
|
|
public boolean targetFromNearbyMobs() { |
|
return this.targetFromNearbyMobs; |
|
} |
|
|
|
public float getRange() { |
|
return this.range; |
|
} |
|
|
|
public boolean requiresHitRoll() { |
|
return this.requiresHitRoll; |
|
} |
|
|
|
public boolean regularPlayerCanCast() { |
|
return this.regularPlayerCanCast; |
|
} |
|
|
|
public boolean isSpell() { |
|
return this.isSpell; |
|
} |
|
|
|
public boolean isHarmful() { |
|
return this.isHarmful; |
|
} |
|
|
|
public boolean targetPlayer() { |
|
return this.targetPlayer; |
|
} |
|
|
|
public boolean targetMob() { |
|
return this.targetMob; |
|
} |
|
|
|
public boolean targetPet() { |
|
return this.targetPet; |
|
} |
|
|
|
public boolean targetNecroPet() { |
|
return this.targetNecroPet; |
|
} |
|
|
|
public boolean targetSelf() { |
|
return this.targetSelf; |
|
} |
|
|
|
public boolean targetCorpse() { |
|
return this.targetCorpse; |
|
} |
|
|
|
public boolean targetBuilding() { |
|
return this.targetBuilding; |
|
} |
|
|
|
public boolean targetGroup() { |
|
return this.targetGroup; |
|
} |
|
|
|
public boolean targetGuildLeader() { |
|
return this.targetGuildLeader; |
|
} |
|
|
|
public boolean targetJewelry() { |
|
return this.targetJewelry; |
|
} |
|
|
|
public boolean targetArmor() { |
|
return this.targetArmor; |
|
} |
|
|
|
public boolean targetWeapon() { |
|
return this.targetWeapon; |
|
} |
|
|
|
public boolean targetItem() { |
|
return this.targetItem; |
|
} |
|
|
|
public long getCooldown() { |
|
return (long) (this.cooldown * 1000); // return |
|
// in ms |
|
} |
|
|
|
public boolean useHealth() { |
|
return this.useHealth; |
|
} |
|
|
|
public boolean useMana() { |
|
return this.useMana; |
|
} |
|
|
|
public boolean useStamina() { |
|
return this.useStamina; |
|
} |
|
|
|
public float getCost(int trains) { |
|
if (this.costRampAdd) |
|
return this.cost + (this.costRamp * trains); |
|
else |
|
return this.cost * (1 + (this.costRamp * trains)); |
|
|
|
} |
|
|
|
public float getHateValue() { |
|
return this.hateValue; |
|
} |
|
|
|
public float getHateRamp() { |
|
return this.hateRamp; |
|
} |
|
|
|
public float getHateValue(int trains) { |
|
return this.hateValue + (this.hateRamp * trains); |
|
} |
|
|
|
public boolean canCastWhileMoving() { |
|
return this.canCastWhileMoving; |
|
} |
|
|
|
public boolean canCastWhileFlying() { |
|
return this.canCastWhileFlying; |
|
} |
|
|
|
public boolean isAOE() { |
|
return isAOE; |
|
} |
|
|
|
public boolean isChant() { |
|
return isChant; |
|
} |
|
|
|
public int getChantIterations() { |
|
return chantIterations; |
|
} |
|
|
|
public float getChantDuration() { |
|
return chantDuration; |
|
} |
|
|
|
public boolean isWeaponPower() { |
|
return isWeaponPower; |
|
} |
|
|
|
public boolean isHeal() { |
|
return isHeal; |
|
} |
|
|
|
public boolean isTrack() { |
|
return isTrack; |
|
} |
|
|
|
public boolean vampDrain() { |
|
return vampDrain; |
|
} |
|
|
|
public void setCancelOnCastSpell(boolean value) { |
|
this.cancelOnCastSpell = value; |
|
} |
|
|
|
public void setCancelOnTakeDamage(boolean value) { |
|
this.cancelOnTakeDamage = value; |
|
} |
|
|
|
public String getSkillName() { |
|
return this.skillName; |
|
} |
|
|
|
public String getMonsterTypePrereq() { |
|
return this.monsterTypePrereq; |
|
} |
|
|
|
public String getCategory() { |
|
return this.category; |
|
} |
|
|
|
public float getWeaponRange() { |
|
return this.weaponRange; |
|
} |
|
|
|
public PowerCategoryType getPowerCategoryType(){ |
|
return this.powerCategory; |
|
} |
|
|
|
public String getDescription() { |
|
return description; |
|
} |
|
|
|
}
|
|
|