1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-21 04:07:48 +00:00

AoE rewrite and bug fixes

Rewrote aoe checks for cone and line aoes and added minimum distance values
Added height checks for commands
Fixed combo effects repeating for every target hit by AoE attacks
Fixed teleport sometimes not raising (I think)
Fixed gear checks in some command scripts
This commit is contained in:
yogurt 2018-07-02 00:45:06 -05:00
parent 8c5375f609
commit cf30eef39e
34 changed files with 483 additions and 330 deletions

View file

@ -409,5 +409,37 @@ namespace FFXIVClassic.Common
return dx * dx + dy * dy + dz * dz; return dx * dx + dy * dy + dz * dz;
} }
//Distance of just the x and z valeus, ignoring y
public static float XZDistanceSquared(Vector3 lhs, Vector3 rhs)
{
return XZDistanceSquared(lhs.X, lhs.Z, rhs.X, rhs.Z);
}
public static float XZDistance(Vector3 lhs, Vector3 rhs)
{
return XZDistance(lhs.X, lhs.Z, rhs.X, rhs.Z);
}
public static float XZDistance(float x, float z, float x2, float z2)
{
if (x == x2 && z == z2)
return 0.0f;
return (float)Math.Sqrt(XZDistanceSquared(x, z, x2, z2));
}
public static float XZDistanceSquared(float x, float z, float x2, float z2)
{
if (x == x2 && z == z2)
return 0.0f;
// todo: mz maths is shit
var dx = x - x2;
var dz = z - z2;
return dx * dx + dz * dz;
}
} }
} }

View file

@ -105,17 +105,17 @@ namespace FFXIVClassic.Common
return newVec; return newVec;
} }
public bool IsWithinCircle(Vector3 centre, float radius) public bool IsWithinCircle(Vector3 center, float maxRadius, float minRadius)
{ {
if (this.X == centre.X && this.Z == centre.Z) if (this.X == center.X && this.Z == center.Z)
return true; return true;
float diffX = centre.X - this.X; float diffX = center.X - this.X;
float diffZ = centre.Z - this.Z; float diffZ = center.Z - this.Z;
float distance = (float)Math.Sqrt((diffX * diffX) + (diffZ * diffZ)); float distance = Utils.XZDistance(center.X, center.Z, X, Z);
return distance < radius; return distance <= maxRadius && distance >= minRadius;
} }
public bool IsWithinBox(Vector3 upperLeftCorner, Vector3 lowerRightCorner) public bool IsWithinBox(Vector3 upperLeftCorner, Vector3 lowerRightCorner)
@ -127,5 +127,19 @@ namespace FFXIVClassic.Common
lowerRightCorner.Y >= this.Y && lowerRightCorner.Y >= this.Y &&
lowerRightCorner.Z >= this.Z; lowerRightCorner.Z >= this.Z;
} }
//Checks if this vector is in a cone, note it doesn't check for distance
public bool IsWithinCone(Vector3 coneCenter, float coneRotation, float coneAngle)
{
float angleToTarget = GetAngle(coneCenter, this);
float halfAngleOfAoe = (float) (coneAngle * Math.PI / 2);
float rotationToAdd = coneRotation + halfAngleOfAoe;
//This is the angle relative to the lower angle of the cone
angleToTarget = (angleToTarget + rotationToAdd - (0.5f * (float)Math.PI)) % (2 * (float) Math.PI);
//If the relative angle is less than the total angle of the cone, the target is inside the cone
return angleToTarget >= 0 && angleToTarget <= (coneAngle * Math.PI);
}
} }
} }

View file

@ -2258,7 +2258,7 @@ namespace FFXIVClassic_Map_Server
int count = 0; int count = 0;
conn.Open(); conn.Open();
var query = ("SELECT `id`, name, classJob, lvl, requirements, mainTarget, validTarget, aoeType, aoeRange, aoeTarget, basePotency, numHits, positionBonus, procRequirement, `range`, statusId, statusDuration, statusChance, " + var query = ("SELECT `id`, name, classJob, lvl, requirements, mainTarget, validTarget, aoeType, aoeRange, aoeMinRange, aoeConeAngle, aoeRotateAngle, aoeTarget, basePotency, numHits, positionBonus, procRequirement, `range`, minRange, rangeHeight, rangeWidth, statusId, statusDuration, statusChance, " +
"castType, castTime, recastTime, mpCost, tpCost, animationType, effectAnimation, modelAnimation, animationDuration, battleAnimation, validUser, comboId1, comboId2, comboStep, accuracyMod, worldMasterTextId, commandType, actionType, actionProperty FROM server_battle_commands;"); "castType, castTime, recastTime, mpCost, tpCost, animationType, effectAnimation, modelAnimation, animationDuration, battleAnimation, validUser, comboId1, comboId2, comboStep, accuracyMod, worldMasterTextId, commandType, actionType, actionProperty FROM server_battle_commands;");
MySqlCommand cmd = new MySqlCommand(query, conn); MySqlCommand cmd = new MySqlCommand(query, conn);
@ -2281,7 +2281,10 @@ namespace FFXIVClassic_Map_Server
battleCommand.numHits = reader.GetByte("numHits"); battleCommand.numHits = reader.GetByte("numHits");
battleCommand.positionBonus = (BattleCommandPositionBonus)reader.GetByte("positionBonus"); battleCommand.positionBonus = (BattleCommandPositionBonus)reader.GetByte("positionBonus");
battleCommand.procRequirement = (BattleCommandProcRequirement)reader.GetByte("procRequirement"); battleCommand.procRequirement = (BattleCommandProcRequirement)reader.GetByte("procRequirement");
battleCommand.range = reader.GetInt32("range"); battleCommand.range = reader.GetFloat("range");
battleCommand.minRange = reader.GetFloat("minRange");
battleCommand.rangeHeight = reader.GetInt32("rangeHeight");
battleCommand.rangeWidth = reader.GetInt32("rangeWidth");
battleCommand.statusId = reader.GetUInt32("statusId"); battleCommand.statusId = reader.GetUInt32("statusId");
battleCommand.statusDuration = reader.GetUInt32("statusDuration"); battleCommand.statusDuration = reader.GetUInt32("statusDuration");
battleCommand.statusChance = reader.GetFloat("statusChance"); battleCommand.statusChance = reader.GetFloat("statusChance");
@ -2295,7 +2298,10 @@ namespace FFXIVClassic_Map_Server
battleCommand.effectAnimation = reader.GetUInt16("effectAnimation"); battleCommand.effectAnimation = reader.GetUInt16("effectAnimation");
battleCommand.modelAnimation = reader.GetUInt16("modelAnimation"); battleCommand.modelAnimation = reader.GetUInt16("modelAnimation");
battleCommand.animationDurationSeconds = reader.GetUInt16("animationDuration"); battleCommand.animationDurationSeconds = reader.GetUInt16("animationDuration");
battleCommand.aoeRange = reader.GetInt32("aoeRange"); battleCommand.aoeRange = reader.GetFloat("aoeRange");
battleCommand.aoeMinRange = reader.GetFloat("aoeMinRange");
battleCommand.aoeConeAngle = reader.GetFloat("aoeConeAngle");
battleCommand.aoeRotateAngle = reader.GetFloat("aoeRotateAngle");
battleCommand.aoeTarget = (TargetFindAOETarget)reader.GetByte("aoeTarget"); battleCommand.aoeTarget = (TargetFindAOETarget)reader.GetByte("aoeTarget");
battleCommand.battleAnimation = reader.GetUInt32("battleAnimation"); battleCommand.battleAnimation = reader.GetUInt32("battleAnimation");

View file

@ -657,9 +657,7 @@ namespace FFXIVClassic_Map_Server.Actors
var dX = this.positionX - x; var dX = this.positionX - x;
var dY = this.positionZ - z; var dY = this.positionZ - z;
var rot2 = Math.Atan2(dY, dX); var rot2 = Math.Atan2(dY, dX);
var dRot = Math.PI - rot2 + Math.PI / 2; var dRot = Math.PI - rot2 + Math.PI / 2;
// pending move, dont need to unset it // pending move, dont need to unset it
@ -668,10 +666,11 @@ namespace FFXIVClassic_Map_Server.Actors
} }
// todo: is this legit? // todo: is this legit?
public bool IsFacing(float x, float z, float angle = 40.0f) public bool IsFacing(float x, float z, float angle = 90.0f)
{ {
angle = (float)(Math.PI * angle / 180); angle = (float)(Math.PI * angle / 180);
return Math.Abs(Vector3.GetAngle(positionX, positionZ, x, z) - rotation) < angle; var a = Vector3.GetAngle(positionX, positionZ, x, z);
return new Vector3(x, 0, z).IsWithinCone(GetPosAsVector3(), rotation, angle);
} }
public bool IsFacing(Actor target, float angle = 40.0f) public bool IsFacing(Actor target, float angle = 40.0f)

View file

@ -828,7 +828,7 @@ namespace FFXIVClassic_Map_Server.Actors
//TP gained on an attack is usually 100 * delay. //TP gained on an attack is usually 100 * delay.
//Store TP seems to add .1% per point. //Store TP seems to add .1% per point.
double weaponDelay = GetMod(Modifier.AttackDelay) / 1000.0; double weaponDelay = GetMod(Modifier.AttackDelay) / 1000.0;
var storeTPPercent = 1 + (GetMod(Modifier.StoreTP) * 0.1); var storeTPPercent = 1 + (GetMod(Modifier.StoreTP) * 0.001);
AddTP((int)(weaponDelay * 100 * storeTPPercent)); AddTP((int)(weaponDelay * 100 * storeTPPercent));
} }
} }
@ -1106,7 +1106,7 @@ namespace FFXIVClassic_Map_Server.Actors
} }
//Now that we know if we hit the target we can check if the combo continues //Now that we know if we hit the target we can check if the combo continues
if (this is Player player && command.commandType == CommandType.WeaponSkill) if (this is Player player)
if (command.isCombo && hitTarget) if (command.isCombo && hitTarget)
player.SetCombos(command.comboNextCommandId); player.SetCombos(command.comboNextCommandId);
else else
@ -1122,7 +1122,7 @@ namespace FFXIVClassic_Map_Server.Actors
public List<Character> GetPartyMembersInRange(uint range) public List<Character> GetPartyMembersInRange(uint range)
{ {
TargetFind targetFind = new TargetFind(this); TargetFind targetFind = new TargetFind(this);
targetFind.SetAOEType(ValidTarget.PartyMember, TargetFindAOEType.Circle, TargetFindAOETarget.Self, range); targetFind.SetAOEType(ValidTarget.PartyMember, TargetFindAOEType.Circle, TargetFindAOETarget.Self, range, 0, 10, 0, 0);
targetFind.FindWithinArea(this, ValidTarget.PartyMember, TargetFindAOETarget.Self); targetFind.FindWithinArea(this, ValidTarget.PartyMember, TargetFindAOETarget.Self);
return targetFind.GetTargets(); return targetFind.GetTargets();
} }

View file

@ -104,7 +104,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
public byte numHits; //amount of hits in the skill public byte numHits; //amount of hits in the skill
public BattleCommandPositionBonus positionBonus; //bonus for front/flank/rear public BattleCommandPositionBonus positionBonus; //bonus for front/flank/rear
public BattleCommandProcRequirement procRequirement;//if the skill requires a block/parry/evade before using public BattleCommandProcRequirement procRequirement;//if the skill requires a block/parry/evade before using
public int range; //max distance to use skill public float range; //maximum distance to target to be able to use this skill
public float minRange; //Minimum distance to target to be able to use this skill
public uint statusId; //id of statuseffect that the skill might inflict public uint statusId; //id of statuseffect that the skill might inflict
public uint statusDuration; //duration of statuseffect in milliseconds public uint statusDuration; //duration of statuseffect in milliseconds
@ -121,7 +122,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
public ushort animationDurationSeconds; public ushort animationDurationSeconds;
public uint battleAnimation; public uint battleAnimation;
public ushort worldMasterTextId; public ushort worldMasterTextId;
public int aoeRange; //size of aoe effect. (how will this work for box aoes?) public float aoeRange; //Radius for circle and cone aoes, length for box aoes
public float aoeMinRange; //Minimum range of aoe effect for things like Lunar Dynamo or Arrow Helix
public float aoeConeAngle; //Angle of aoe cones
public float aoeRotateAngle; //Amount aoes are rotated about the target position (usually the user's position)
public float rangeHeight; //Total height a skill can be used against target above or below user
public float rangeWidth; //Width of box aoes
public int[] comboNextCommandId = new int[2]; //next two skills in a combo public int[] comboNextCommandId = new int[2]; //next two skills in a combo
public short comboStep; //Where in a combo string this skill is public short comboStep; //Where in a combo string this skill is
public CommandType commandType; public CommandType commandType;
@ -130,12 +136,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
public byte statusTier; //tier of status to put on target public byte statusTier; //tier of status to put on target
public ulong statusMagnitude = 0; //magnitude of status to put on target public double statusMagnitude = 0; //magnitude of status to put on target
public ushort basePotency; //damage variable public ushort basePotency; //damage variable
public float enmityModifier; //multiples by damage done to get final enmity public float enmityModifier; //multiples by damage done to get final enmity
public float accuracyModifier; //modifies accuracy public float accuracyModifier; //modifies accuracy
public float bonusCritRate; //extra crit rate public float bonusCritRate; //extra crit rate
public bool isCombo; public bool isCombo;
public bool comboEffectAdded = false; //If the combo effect is added to multiple hiteffects it plays multiple times, so this keeps track of that
public bool isRanged = false; public bool isRanged = false;
public bool actionCrit; //Whether any actions were critical hits, used for Excruciate public bool actionCrit; //Whether any actions were critical hits, used for Excruciate
@ -193,11 +200,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
if (aoeType == TargetFindAOEType.Box) if (aoeType == TargetFindAOEType.Box)
{ {
targetFind.SetAOEBox(validTarget, aoeTarget, range, aoeRange); targetFind.SetAOEBox(validTarget, aoeTarget, aoeRange, rangeWidth, aoeRotateAngle);
} }
else else
{ {
targetFind.SetAOEType(validTarget, aoeType, aoeTarget, range, aoeRange); targetFind.SetAOEType(validTarget, aoeType, aoeTarget, aoeRange, aoeMinRange, rangeHeight, aoeRotateAngle, aoeConeAngle);
} }
/* /*

View file

@ -127,7 +127,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
return AddStatusEffect(se, owner); return AddStatusEffect(se, owner);
} }
public bool AddStatusEffect(uint id, byte tier, UInt64 magnitude) public bool AddStatusEffect(uint id, byte tier, double magnitude)
{ {
var se = Server.GetWorldManager().GetStatusEffect(id); var se = Server.GetWorldManager().GetStatusEffect(id);
@ -137,7 +137,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
return AddStatusEffect(se, owner); return AddStatusEffect(se, owner);
} }
public bool AddStatusEffect(uint id, byte tier, UInt64 magnitude, uint duration, int tickMs = 3000) public bool AddStatusEffect(uint id, byte tier, double magnitude, uint duration, int tickMs = 3000)
{ {
var se = Server.GetWorldManager().GetStatusEffect(id); var se = Server.GetWorldManager().GetStatusEffect(id);
if (se != null) if (se != null)

View file

@ -240,7 +240,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
var targetPos = new Vector3(owner.target.positionX, owner.target.positionY, owner.target.positionZ); var targetPos = new Vector3(owner.target.positionX, owner.target.positionY, owner.target.positionZ);
var distance = Utils.Distance(owner.positionX, owner.positionY, owner.positionZ, targetPos.X, targetPos.Y, targetPos.Z); var distance = Utils.Distance(owner.positionX, owner.positionY, owner.positionZ, targetPos.X, targetPos.Y, targetPos.Z);
if (distance > owner.GetAttackRange() - 0.2f || owner.aiContainer.CanFollowPath()) if (distance > owner.GetAttackRange() - 0.2f && owner.aiContainer.CanFollowPath())
{ {
if (CanMoveForward(distance)) if (CanMoveForward(distance))
{ {

View file

@ -75,8 +75,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
private ValidTarget validTarget; private ValidTarget validTarget;
private TargetFindAOETarget aoeTarget; private TargetFindAOETarget aoeTarget;
private TargetFindAOEType aoeType; private TargetFindAOEType aoeType;
private Vector3 targetPosition; private Vector3 aoeTargetPosition; //This is the center of circle an cone AOEs and the position where line aoes come out
private float maxDistance; private float aoeTargetRotation; //This is the direction the aoe target is facing
private float maxDistance; //Radius for circle and cone AOEs, length for line AOEs
private float minDistance; //Minimum distance to that target must be to be able to be hit
private float width; //Width of line AOEs
private float height; //All AoEs are boxes or cylinders. Height is usually 10y regardless of maxDistance, but some commands have different values. Height is total height, so targets can be at most half this distance away on Y axis
private float aoeRotateAngle; //This is the angle that cones and line aoes are rotated about aoeTargetPosition for skills that come out of a side other than the front
private float coneAngle; //The angle of the cone itself in Pi Radians
private float param; private float param;
private List<Character> targets; private List<Character> targets;
@ -92,8 +98,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
this.validTarget = ValidTarget.Enemy; this.validTarget = ValidTarget.Enemy;
this.aoeType = TargetFindAOEType.None; this.aoeType = TargetFindAOEType.None;
this.aoeTarget = TargetFindAOETarget.Target; this.aoeTarget = TargetFindAOETarget.Target;
this.targetPosition = null; this.aoeTargetPosition = null;
this.aoeTargetRotation = 0;
this.maxDistance = 0.0f; this.maxDistance = 0.0f;
this.minDistance = 0.0f;
this.width = 0.0f;
this.height = 0.0f;
this.aoeRotateAngle = 0.0f;
this.coneAngle = 0.0f;
this.param = 0.0f; this.param = 0.0f;
this.targets = new List<Character>(); this.targets = new List<Character>();
} }
@ -117,12 +129,16 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
/// <see cref="TargetFindAOEType.Box"/> - width of box / 2 (todo: set box length not just between user and target) /// <see cref="TargetFindAOEType.Box"/> - width of box / 2 (todo: set box length not just between user and target)
/// </param> /// </param>
/// <param name="param"> param in degrees of cone (todo: probably use radians and forget converting at runtime) </param> /// <param name="param"> param in degrees of cone (todo: probably use radians and forget converting at runtime) </param>
public void SetAOEType(ValidTarget validTarget, TargetFindAOEType aoeType, TargetFindAOETarget aoeTarget, float maxDistance = -1.0f, float param = -1.0f) public void SetAOEType(ValidTarget validTarget, TargetFindAOEType aoeType, TargetFindAOETarget aoeTarget, float maxDistance, float minDistance, float height, float aoeRotate, float coneAngle, float param = 0.0f)
{ {
this.validTarget = validTarget; this.validTarget = validTarget;
this.aoeType = aoeType; this.aoeType = aoeType;
this.maxDistance = maxDistance != -1.0f ? maxDistance : 0.0f; this.maxDistance = maxDistance;
this.param = param != -1.0f ? param : 0.0f; this.minDistance = minDistance;
this.param = param;
this.height = height;
this.aoeRotateAngle = aoeRotate;
this.coneAngle = coneAngle;
} }
/// <summary> /// <summary>
@ -132,15 +148,16 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
/// <param name="aoeTarget"></param> /// <param name="aoeTarget"></param>
/// <param name="length"></param> /// <param name="length"></param>
/// <param name="width"></param> /// <param name="width"></param>
public void SetAOEBox(ValidTarget validTarget, TargetFindAOETarget aoeTarget, float length, float width) public void SetAOEBox(ValidTarget validTarget, TargetFindAOETarget aoeTarget, float length, float width, float aoeRotateAngle)
{ {
this.validTarget = validTarget; this.validTarget = validTarget;
this.aoeType = TargetFindAOEType.Box; this.aoeType = TargetFindAOEType.Box;
this.aoeTarget = aoeTarget; this.aoeTarget = aoeTarget;
this.aoeRotateAngle = aoeRotateAngle;
float x = owner.positionX - (float)Math.Cos(owner.rotation + (float)(Math.PI / 2)) * (length); float x = owner.positionX - (float)Math.Cos(owner.rotation + (float)(Math.PI / 2)) * (length);
float z = owner.positionZ + (float)Math.Sin(owner.rotation + (float)(Math.PI / 2)) * (length); float z = owner.positionZ + (float)Math.Sin(owner.rotation + (float)(Math.PI / 2)) * (length);
this.targetPosition = new Vector3(x, owner.positionY, z); this.maxDistance = length;
this.maxDistance = width; this.width = width;
} }
/// <summary> /// <summary>
@ -163,9 +180,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
validTarget = flags; validTarget = flags;
// are we creating aoe circles around target or self // are we creating aoe circles around target or self
if (aoeTarget == TargetFindAOETarget.Self) if (aoeTarget == TargetFindAOETarget.Self)
this.targetPosition = owner.GetPosAsVector3(); {
this.aoeTargetPosition = owner.GetPosAsVector3();
this.aoeTargetRotation = owner.rotation + (float) (aoeRotateAngle * Math.PI);
}
else else
this.targetPosition = target.GetPosAsVector3(); {
this.aoeTargetPosition = target.GetPosAsVector3();
this.aoeTargetRotation = target.rotation + (float) (aoeRotateAngle * Math.PI);
}
masterTarget = TryGetMasterTarget(target) ?? target; masterTarget = TryGetMasterTarget(target) ?? target;
@ -179,66 +202,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
{ {
AddAllInRange(target, withPet); AddAllInRange(target, withPet);
} }
/*
if (aoeType != TargetFindAOEType.None)
{
if (IsPlayer(owner))
{
if (masterTarget is Player)
{
findType = TargetFindCharacterType.PlayerToPlayer;
if (masterTarget.currentParty != null) //if (targets.Count > 8)
{ //targets.RemoveRange(8, targets.Count - 8);
if ((validTarget & (ValidTarget.Ally | ValidTarget.PartyMember)) != 0)
AddAllInAlliance(masterTarget, withPet);
else
AddAllInParty(masterTarget, withPet);
}
else
{
AddTarget(masterTarget, withPet);
}
}
else
{
findType = TargetFindCharacterType.PlayerToBattleNpc;
AddAllBattleNpcs(masterTarget, false);
}
}
else
{
// todo: this needs checking..
if (masterTarget is Player || owner.allegiance == CharacterTargetingAllegiance.Player)
findType = TargetFindCharacterType.BattleNpcToPlayer;
else
findType = TargetFindCharacterType.BattleNpcToBattleNpc;
// todo: configurable pet aoe buff
if (findType == TargetFindCharacterType.BattleNpcToBattleNpc && TryGetMasterTarget(target) != null)
withPet = true;
// todo: does ffxiv have call for help flag?
//if ((findFlags & ValidTarget.HitAll) != 0)
//{
// AddAllInZone(masterTarget, withPet);
//}
AddAllInAlliance(target, withPet);
if (findType == TargetFindCharacterType.BattleNpcToPlayer)
{
if (owner.allegiance == CharacterTargetingAllegiance.Player)
AddAllInZone(masterTarget, withPet);
else
AddAllInHateList();
}
}
}*/
if (targets.Count > 8)
targets.RemoveRange(8, targets.Count - 8);
//Curaga starts with lowest health players, so the targets are definitely sorted at least for some abilities //Curaga starts with lowest health players, so the targets are definitely sorted at least for some abilities
//Other aoe abilities might be sorted by distance? //Other aoe abilities might be sorted by distance?
@ -252,28 +218,33 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
/// </summary> /// </summary>
private bool IsWithinBox(Character target, bool withPet) private bool IsWithinBox(Character target, bool withPet)
{ {
if (aoeTarget == TargetFindAOETarget.Self) Vector3 vec = target.GetPosAsVector3() - aoeTargetPosition;
targetPosition = owner.GetPosAsVector3(); Vector3 relativePos = new Vector3();
else
targetPosition = target.GetPosAsVector3();
var myPos = owner.GetPosAsVector3(); //Get target's position relative to owner's position where owner's front is facing positive z axis
var angle = Vector3.GetAngle(myPos, targetPosition); relativePos.X = (float)(vec.X * Math.Cos(aoeTargetRotation) - vec.Z * Math.Sin(aoeTargetRotation));
relativePos.Z = (float)(vec.X * Math.Sin(aoeTargetRotation) + vec.Z * Math.Cos(aoeTargetRotation));
// todo: actually check this works.. float halfHeight = height / 2;
var myCorner = myPos.NewHorizontalVector(angle, maxDistance); float halfWidth = width / 2;
var myCorner2 = myPos.NewHorizontalVector(angle, -maxDistance);
var targetCorner = targetPosition.NewHorizontalVector(angle, maxDistance); Vector3 closeBottomLeft = new Vector3(-halfWidth, -halfHeight, minDistance);
var targetCorner2 = targetPosition.NewHorizontalVector(angle, -maxDistance); Vector3 farTopRight = new Vector3(halfWidth, halfHeight, maxDistance);
return target.GetPosAsVector3().IsWithinBox(targetCorner2, myCorner); return relativePos.IsWithinBox(closeBottomLeft, farTopRight);
} }
private bool IsWithinCone(Character target, bool withPet) private bool IsWithinCone(Character target, bool withPet)
{ {
// todo: make this actual cone double distance = Utils.XZDistance(aoeTargetPosition, target.GetPosAsVector3());
return owner.IsFacing(target, param) && Utils.Distance(owner.positionX, owner.positionY, owner.positionZ, target.positionX, target.positionY, target.positionZ) < maxDistance;
//Make sure target is within the correct range first
if (!IsWithinCircle(target))
return false;
//This might not be 100% right or the most optimal way to do this
//Get between taget's position and our position
return target.GetPosAsVector3().IsWithinCone(aoeTargetPosition, aoeTargetRotation, coneAngle);
} }
private void AddTarget(Character target, bool withPet) private void AddTarget(Character target, bool withPet)
@ -364,10 +335,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
if ((validTarget & ValidTarget.NPC) == 0 && target.isStatic) if ((validTarget & ValidTarget.NPC) == 0 && target.isStatic)
return false; return false;
//This skill can't be used on corpses and target is dead, return false
if ((validTarget & ValidTarget.Corpse) == 0 && target.IsDead())
return false;
//This skill must be used on Allies and target is not an ally, return false //This skill must be used on Allies and target is not an ally, return false
if ((validTarget & ValidTarget.Ally) != 0 && target.allegiance != owner.allegiance) if ((validTarget & ValidTarget.Ally) != 0 && target.allegiance != owner.allegiance)
return false; return false;
//This skill can't be used on players and target is a player, return false //This skill can't be used on players and target is a player, return false
//Do we need a player flag? Ally/Enemy flags probably serve the same purpose //Do we need a player flag? Ally/Enemy flags probably serve the same purpose
//if ((validTarget & ValidTarget.Player) == 0 && target is Player) //if ((validTarget & ValidTarget.Player) == 0 && target is Player)
@ -404,7 +380,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
if (!ignoreAOE) if (!ignoreAOE)
{ {
// hit everything within zone or within aoe region // hit everything within zone or within aoe region
if (param == -1.0f || aoeType == TargetFindAOEType.Circle && !IsWithinCircle(target, param)) if (param == -1.0f || aoeType == TargetFindAOEType.Circle && !IsWithinCircle(target))
return false; return false;
if (aoeType == TargetFindAOEType.Cone && !IsWithinCone(target, withPet)) if (aoeType == TargetFindAOEType.Cone && !IsWithinCone(target, withPet))
@ -419,16 +395,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
return true; return true;
} }
private bool IsWithinCircle(Character target, float maxDistance) private bool IsWithinCircle(Character target)
{ {
// todo: make y diff modifiable? //Check if XZ is in circle and that y difference isn't larger than half height
return target.GetPosAsVector3().IsWithinCircle(aoeTargetPosition, maxDistance, minDistance) && Math.Abs(owner.positionY - target.positionY) <= (height / 2);
//if (Math.Abs(owner.positionX - target.positionY) > 6.0f)
// return false;
if (this.targetPosition == null)
this.targetPosition = aoeTarget == TargetFindAOETarget.Self ? owner.GetPosAsVector3() : masterTarget.GetPosAsVector3();
return target.GetPosAsVector3().IsWithinCircle(targetPosition, maxDistance);
} }
private bool IsPlayer(Character target) private bool IsPlayer(Character target)

View file

@ -47,7 +47,20 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
} }
else else
{ {
//owner.LookAt(target); if (!skill.IsInstantCast())
{
float castTime = skill.castTimeMs;
// command casting duration
if (owner is Player)
{
// todo: modify spellSpeed based on modifiers and stuff
((Player)owner).SendStartCastbar(skill.id, Utils.UnixTimeStampUTC(DateTime.Now.AddMilliseconds(castTime)));
}
owner.SendChant(0xf, 0x0);
//You ready [skill] (6F000002: BLM, 6F000003: WHM, 0x6F000008: BRD)
owner.DoBattleAction(skill.id, (uint)0x6F000000 | skill.castType, new BattleAction(target.actorId, 30126, 1, 0, 1));
}
} }
} }
@ -66,7 +79,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
// todo: check weapon delay/haste etc and use that // todo: check weapon delay/haste etc and use that
var actualCastTime = skill.castTimeMs; var actualCastTime = skill.castTimeMs;
if ((tick - startTime).Milliseconds >= skill.castTimeMs) if ((tick - startTime).TotalMilliseconds >= skill.castTimeMs)
{ {
OnComplete(); OnComplete();
return true; return true;
@ -88,6 +101,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
public override void OnComplete() public override void OnComplete()
{ {
owner.LookAt(target);
bool hitTarget = false; bool hitTarget = false;
skill.targetFind.FindWithinArea(target, skill.validTarget, skill.aoeTarget); skill.targetFind.FindWithinArea(target, skill.validTarget, skill.aoeTarget);
@ -130,6 +144,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
public override void Cleanup() public override void Cleanup()
{ {
owner.SendChant(0, 0);
owner.aiContainer.UpdateLastActionTime(skill.animationDurationSeconds); owner.aiContainer.UpdateLastActionTime(skill.animationDurationSeconds);
} }
} }

View file

@ -104,7 +104,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
//List<BattleAction> actions = new List<BattleAction>(); //List<BattleAction> actions = new List<BattleAction>();
BattleActionContainer actions = new BattleActionContainer(); BattleActionContainer actions = new BattleActionContainer();
target.SetMod((uint) Modifier.MinimumHpLock, 0);
var i = 0; var i = 0;
for (int hitNum = 0; hitNum < 1 /* owner.GetMod((uint) Modifier.HitCount)*/; hitNum++) for (int hitNum = 0; hitNum < 1 /* owner.GetMod((uint) Modifier.HitCount)*/; hitNum++)
@ -123,7 +122,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
BattleAction error = null;// new BattleAction(0, null, 0, 0); BattleAction error = null;// new BattleAction(0, null, 0, 0);
//owner.DoActions(null, actions.GetList(), ref error); //owner.DoActions(null, actions.GetList(), ref error);
//owner.OnAttack(this, actions[0], ref errorResult); //owner.OnAttack(this, actions[0], ref errorResult);
owner.DoBattleAction(22104, 0x19001000, actions.GetList()); var anim = (uint)(17 << 24 | 1 << 12);
owner.DoBattleAction(22104, anim, actions.GetList());
} }
public override void TryInterrupt() public override void TryInterrupt()
@ -161,6 +161,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
{ {
return false; return false;
} }
if (!owner.IsFacing(target))
{
return false;
}
// todo: shouldnt need to check if owner is dead since all states would be cleared // todo: shouldnt need to check if owner is dead since all states would be cleared
if (owner.IsDead() || target.IsDead()) if (owner.IsDead() || target.IsDead())
{ {
@ -179,7 +184,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
{ {
if (owner is Player) if (owner is Player)
{ {
((Player)owner).SendGameMessage(Server.GetWorldManager().GetActor(), 32539, 0x20); //The target is too far away
((Player)owner).SendGameMessage(Server.GetWorldManager().GetActor(), 32537, 0x20);
} }
return false; return false;
} }

View file

@ -61,17 +61,20 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
// todo: check within attack range // todo: check within attack range
float[] baseCastDuration = { 1.0f, 0.25f }; float[] baseCastDuration = { 1.0f, 0.25f };
//Check combo stuff here because combos can impact spell cast times
float spellSpeed = spell.castTimeMs;
//There are no positional spells, so just check onCombo, need to check first because certain spells change aoe type/accuracy //There are no positional spells, so just check onCombo, need to check first because certain spells change aoe type/accuracy
//If owner is a player and the spell being used is part of the current combo //If owner is a player and the spell being used is part of the current combo
if (spell.comboStep == 1 || ((owner is Player p) && (p.playerWork.comboNextCommandId[0] == spell.id || p.playerWork.comboNextCommandId[1] == spell.id))) if (owner is Player p && p.GetClass() == spell.job)
{
if (spell.comboStep == 1 || ((p.playerWork.comboNextCommandId[0] == spell.id || p.playerWork.comboNextCommandId[1] == spell.id)))
{ {
lua.LuaEngine.CallLuaBattleCommandFunction(owner, spell, "magic", "onCombo", owner, target, spell); lua.LuaEngine.CallLuaBattleCommandFunction(owner, spell, "magic", "onCombo", owner, target, spell);
spell.isCombo = true; spell.isCombo = true;
} }
}
//Check combo stuff here because combos can impact spell cast times
float spellSpeed = spell.castTimeMs;
if (!spell.IsInstantCast()) if (!spell.IsInstantCast())
{ {

View file

@ -46,7 +46,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
} }
else else
{ {
owner.LookAt(target);
hitDirection = owner.GetHitDirection(target); hitDirection = owner.GetHitDirection(target);
//Do positionals and combo effects first because these can influence accuracy and amount of targets/numhits, which influence the rest of the steps //Do positionals and combo effects first because these can influence accuracy and amount of targets/numhits, which influence the rest of the steps
@ -76,6 +75,21 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
skill.isCombo = true; skill.isCombo = true;
} }
} }
if (!skill.IsInstantCast())
{
float castTime = skill.castTimeMs;
// command casting duration
if (owner is Player)
{
// todo: modify spellSpeed based on modifiers and stuff
((Player)owner).SendStartCastbar(skill.id, Utils.UnixTimeStampUTC(DateTime.Now.AddMilliseconds(castTime)));
}
owner.SendChant(0xf, 0x0);
//You ready [skill] (6F000002: BLM, 6F000003: WHM, 0x6F000008: BRD)
owner.DoBattleAction(skill.id, (uint)0x6F000000 | skill.castType, new BattleAction(target.actorId, 30126, 1, 0, 1));
}
} }
} }
} }
@ -95,7 +109,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
// todo: check weapon delay/haste etc and use that // todo: check weapon delay/haste etc and use that
var actualCastTime = skill.castTimeMs; var actualCastTime = skill.castTimeMs;
if ((tick - startTime).Milliseconds >= skill.castTimeMs) if ((tick - startTime).TotalMilliseconds >= skill.castTimeMs)
{ {
OnComplete(); OnComplete();
return true; return true;
@ -117,6 +131,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
public override void OnComplete() public override void OnComplete()
{ {
owner.LookAt(target);
skill.targetFind.FindWithinArea(target, skill.validTarget, skill.aoeTarget); skill.targetFind.FindWithinArea(target, skill.validTarget, skill.aoeTarget);
isCompleted = true; isCompleted = true;

View file

@ -542,8 +542,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.utils
hitEffect |= HitTypeEffects[hitType]; hitEffect |= HitTypeEffects[hitType];
//For combos that land, add the combo effect //For combos that land, add the combo effect
if (skill != null && skill.isCombo && hitType > HitType.Evade && hitType != HitType.Evade) if (skill != null && skill.isCombo && hitType > HitType.Evade && hitType != HitType.Evade && !skill.comboEffectAdded)
{
hitEffect |= (HitEffect)(skill.comboStep << 15); hitEffect |= (HitEffect)(skill.comboStep << 15);
skill.comboEffectAdded = true;
}
//if attack hit the target, take into account protective status effects //if attack hit the target, take into account protective status effects
if (hitType >= HitType.Parry) if (hitType >= HitType.Parry)
@ -581,8 +584,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.utils
hitEffect |= HitTypeEffects[hitType]; hitEffect |= HitTypeEffects[hitType];
if (skill != null && skill.isCombo) if (skill != null && skill.isCombo && !skill.comboEffectAdded)
{
hitEffect |= (HitEffect)(skill.comboStep << 15); hitEffect |= (HitEffect)(skill.comboStep << 15);
skill.comboEffectAdded = true;
}
//if attack hit the target, take into account protective status effects //if attack hit the target, take into account protective status effects
if (hitType >= HitType.Block) if (hitType >= HitType.Block)

View file

@ -2124,6 +2124,7 @@ namespace FFXIVClassic_Map_Server.Actors
public override bool CanCast(Character target, BattleCommand spell) public override bool CanCast(Character target, BattleCommand spell)
{ {
//Might want to do these with a BattleAction instead to be consistent with the rest of command stuff
if (GetHotbarTimer(spell.id) > Utils.UnixTimeStampUTC()) if (GetHotbarTimer(spell.id) > Utils.UnixTimeStampUTC())
{ {
// todo: this needs confirming // todo: this needs confirming
@ -2137,12 +2138,30 @@ namespace FFXIVClassic_Map_Server.Actors
SendGameMessage(Server.GetWorldManager().GetActor(), 32511, 0x20, (uint)spell.id); SendGameMessage(Server.GetWorldManager().GetActor(), 32511, 0x20, (uint)spell.id);
return false; return false;
} }
if (Utils.Distance(positionX, positionY, positionZ, target.positionX, target.positionY, target.positionZ) > spell.range) if (Utils.XZDistance(positionX, positionZ, target.positionX, target.positionZ) > spell.range)
{ {
// The target is out of range. // The target is too far away.
SendGameMessage(Server.GetWorldManager().GetActor(), 32539, 0x20, (uint)spell.id); SendGameMessage(Server.GetWorldManager().GetActor(), 32539, 0x20, (uint)spell.id);
return false; return false;
} }
if (Utils.XZDistance(positionX, positionZ, target.positionX, target.positionZ) < spell.minRange)
{
// The target is too close.
SendGameMessage(Server.GetWorldManager().GetActor(), 32538, 0x20, (uint)spell.id);
return false;
}
if (target.positionY - positionY > (spell.rangeHeight / 2))
{
// The target is too far above you.
SendGameMessage(Server.GetWorldManager().GetActor(), 32540, 0x20, (uint)spell.id);
return false;
}
if (positionY - target.positionY > (spell.rangeHeight / 2))
{
// The target is too far below you.
SendGameMessage(Server.GetWorldManager().GetActor(), 32541, 0x20, (uint)spell.id);
return false;
}
if (!IsValidTarget(target, spell.mainTarget) || !spell.IsValidMainTarget(this, target)) if (!IsValidTarget(target, spell.mainTarget) || !spell.IsValidMainTarget(this, target))
{ {
// error packet is set in IsValidTarget // error packet is set in IsValidTarget
@ -2169,13 +2188,38 @@ namespace FFXIVClassic_Map_Server.Actors
return false; return false;
} }
if (Utils.Distance(positionX, positionY, positionZ, target.positionX, target.positionY, target.positionZ) > skill.range) //Original game checked height difference before horizontal distance
if (target.positionY - positionY > (skill.rangeHeight / 2))
{ {
// The target is out of range. // The target is too far above you.
SendGameMessage(Server.GetWorldManager().GetActor(), 32539, 0x20, (uint)skill.id); SendGameMessage(Server.GetWorldManager().GetActor(), 32540, 0x20, (uint)skill.id);
return false; return false;
} }
if (positionY - target.positionY > (skill.rangeHeight / 2))
{
// The target is too far below you.
SendGameMessage(Server.GetWorldManager().GetActor(), 32541, 0x20, (uint)skill.id);
return false;
}
var targetDist = Utils.XZDistance(positionX, positionZ, target.positionX, target.positionZ);
if (targetDist > skill.range)
{
// The target is out of range.
SendGameMessage(Server.GetWorldManager().GetActor(), 32537, 0x20, (uint)skill.id);
return false;
}
if (targetDist < skill.minRange)
{
// The target is too close.
SendGameMessage(Server.GetWorldManager().GetActor(), 32538, 0x20, (uint)skill.id);
return false;
}
if (!IsValidTarget(target, skill.validTarget) || !skill.IsValidMainTarget(this, target)) if (!IsValidTarget(target, skill.validTarget) || !skill.IsValidMainTarget(this, target))
{ {
// error packet is set in IsValidTarget // error packet is set in IsValidTarget
@ -2379,7 +2423,8 @@ namespace FFXIVClassic_Map_Server.Actors
//If we're starting or continuing a combo chain, add the status effect and combo cost bonus //If we're starting or continuing a combo chain, add the status effect and combo cost bonus
if (comboIds[0] != 0) if (comboIds[0] != 0)
{ {
StatusEffect comboEffect = new StatusEffect(this, (uint) StatusEffectId.Combo, 1, 0, 13); StatusEffect comboEffect = new StatusEffect(this, Server.GetWorldManager().GetStatusEffect((uint) StatusEffectId.Combo));
comboEffect.SetDuration(13);
comboEffect.SetOverwritable(1); comboEffect.SetOverwritable(1);
statusEffects.AddStatusEffect(comboEffect, this, true); statusEffects.AddStatusEffect(comboEffect, this, true);
playerWork.comboCostBonusRate = 1; playerWork.comboCostBonusRate = 1;
@ -2469,5 +2514,12 @@ namespace FFXIVClassic_Map_Server.Actors
} }
} }
} }
public bool HasItemEquippedInSlot(uint itemId, ushort slot)
{
var equippedItem = equipment.GetItemAtSlot(slot);
return equippedItem != null && equippedItem.itemId == itemId;
}
} }
} }

View file

@ -32,8 +32,8 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
binWriter.Write((byte)breakage); binWriter.Write((byte)breakage);
binWriter.Write((byte)(((leftChant & 0xF) << 4) | (rightChant & 0xF))); binWriter.Write((byte)(((leftChant & 0xF) << 4) | (rightChant & 0xF)));
binWriter.Write((byte)(guard & 0xF)); binWriter.Write((byte)(guard & 0xF));
binWriter.Write((byte)((wasteStat & 0xF) << 4)); binWriter.Write((byte)(wasteStat));
binWriter.Write((byte)(statMode & 0xF)); binWriter.Write((byte)(statMode));
binWriter.Write((byte)0); binWriter.Write((byte)0);
binWriter.Write((UInt16)(idleAnimationId&0xFFFF)); binWriter.Write((UInt16)(idleAnimationId&0xFFFF));
} }

View file

@ -107,14 +107,14 @@ function onEventStarted(player, actor, triggerName, isTeleport)
if (destination ~= nil) then if (destination ~= nil) then
randoPos = getRandomPointInBand(destination[2], destination[4], 3, 5); randoPos = getRandomPointInBand(destination[2], destination[4], 3, 5);
rotation = getAngleFacing(randoPos.x, randoPos.y, destination[2], destination[4]); rotation = getAngleFacing(randoPos.x, randoPos.y, destination[2], destination[4]);
GetWorldManager():DoZoneChange(player, destination[1], nil, 0, 2, randoPos.x, destination[3], randoPos.y, rotation);
--bandaid fix for returning while dead, missing things like weakness and the heal number --bandaid fix for returning while dead, missing things like weakness and the heal number
if (player:GetHP() == 0) then if (player:GetHP() == 0) then
player:SetHP(player.GetMaxHP()); player:SetHP(player.GetMaxHP());
player:ChangeState(0); player:ChangeState(0);
player:PlayAnimation(0x01000066); player:PlayAnimation(0x01000066);
end end
GetWorldManager():DoZoneChange(player, destination[1], nil, 0, 2, randoPos.x, destination[3], randoPos.y, rotation);
end end
end end
end end

View file

@ -11,7 +11,7 @@ end;
function onSkillFinish(caster, target, skill, action, actionContainer) function onSkillFinish(caster, target, skill, action, actionContainer)
--8032701: Fighter's Gauntlets: Reduces Collusion cooldown by 10 seconds --8032701: Fighter's Gauntlets: Reduces Collusion cooldown by 10 seconds
if caster.GetEquipment().GetItemAtSlot(14).itemId == 8032701 then if caster.HasItemEquippedInSlot(8032701, 13) then
skill.recastTimeMs = skill.recastTimeMs - 10000; skill.recastTimeMs = skill.recastTimeMs - 10000;
end end

View file

@ -13,7 +13,7 @@ function onSkillFinish(caster, target, skill, action, actionContainer)
--This is for the "Cover" effect the caster receives. --This is for the "Cover" effect the caster receives.
local coverTier = 1 local coverTier = 1
--8032701: Gallant Surcoat: Enhances Cover --8032701: Gallant Surcoat: Enhances Cover
if caster.GetEquipment().GetItemAtSlot(10).itemId == 8032701 then if caster.HasItemEquippedInSlot(8032701, 10) then
coverTier = 2; coverTier = 2;
end end

View file

@ -9,5 +9,9 @@ function onAbilityStart(caster, target, skill)
return 0; return 0;
end; end;
function onSkillFinish(caster, target, skill, action) function onSkillFinish(caster, target, skill, action, actionContainer)
action.amount = skill.basePotency;
--DoAction handles rates, buffs, dealing damage
action.DoAction(caster, target, skill, actionContainer);
end; end;

View file

@ -11,7 +11,7 @@ end;
function onSkillFinish(caster, target, skill, action, actionContainer) function onSkillFinish(caster, target, skill, action, actionContainer)
--8051401: Gallant Cuisses --8051401: Gallant Cuisses
if caster.GetEquipment().GetItemAtSlot(14).itemId == 8051401 then if caster.HasItemEquippedInSlot(8051401, 12) then
ability.statusTier = 2; ability.statusTier = 2;
end end

View file

@ -15,7 +15,7 @@ function onAbilityStart(caster, target, ability)
local magnitude = 100; local magnitude = 100;
--8032704: Drachen Mail --8032704: Drachen Mail
if caster.GetEquipment().GetItemAtSlot(10).itemId == 8032704 then if caster.HasItemEquippedInSlot(8032704, 10) then
magnitude = 120; magnitude = 120;
end end

View file

@ -9,7 +9,7 @@ end;
function onAbilityStart(caster, target, ability) function onAbilityStart(caster, target, ability)
--8032703: Fighter's Cuirass: Enhances Vengeance --8032703: Fighter's Cuirass: Enhances Vengeance
if caster.GetEquipment().GetItemAtSlot(13).itemId == 8032703 then if caster.HasItemEquippedInSlot(8032703, 10) then
skill.statusTier = 2; skill.statusTier = 2;
end end

View file

@ -0,0 +1,18 @@
require("global");
properties = {
permissions = 0,
parameters = "ss",
description =
[[
Sets a modifier of player
!setmod <modId> <modVal> |
]],
}
function onTrigger(player, argc, modId, modVal)
local sender = "[setmod] ";
local mod = tonumber(modId)
local val = tonumber(modVal)
player:SetMod(mod, val);
end;

View file

@ -14,14 +14,11 @@ function onTrigger(player, argc, state)
local messageID = MESSAGE_TYPE_SYSTEM_ERROR; local messageID = MESSAGE_TYPE_SYSTEM_ERROR;
local sender = "[setstate] "; local sender = "[setstate] ";
max = tonumber(state) or 0; local s = tonumber(state);
local actor = GetWorldManager():GetActorInWorld(player.currentTarget) or nil;
for s = 0, max do if player and actor then
if player and player.target then actor:ChangeState(s);
player.target:ChangeState(s);
wait(0.8); wait(0.8);
player:SendMessage(0x20, "", "state: "..s); player:SendMessage(0x20, "", "state: "..s);
end; end;
end
end; end;

View file

@ -14,8 +14,7 @@ function onMagicStart(caster, target, skill)
--8032705: Choral Shirt: Enhances Ballad of Magi --8032705: Choral Shirt: Enhances Ballad of Magi
--With Choral Shirt, Ballad gives 26 mp a tick. It could be a flat 6 or multiply by 1.3 --With Choral Shirt, Ballad gives 26 mp a tick. It could be a flat 6 or multiply by 1.3
--Because minuet seemed like a normal addition I'm assuming this is too --Because minuet seemed like a normal addition I'm assuming this is too
local shirt = caster.GetEquipment().GetItemAtSlot(10); if caster.HasItemEquippedInSlot(8032705, 10) then
if shirt and shirt.itemId == 8032705 then
mpPerTick = mpPerTick + 6; mpPerTick = mpPerTick + 6;
end end

View file

@ -13,7 +13,7 @@ function onSkillFinish(caster, target, skill, action, actionContainer)
action.amount = skill.basePotency; action.amount = skill.basePotency;
--8071401: Gallant Gauntlets: Enhances Holy Succor --8071401: Gallant Gauntlets: Enhances Holy Succor
if caster.GetEquipment().GetItemAtSlot(13).itemId == 8071401 then if caster.HasItemEquippedInSlot(8071401, 13) then
action.amount = action.amount * 1.10; action.amount = action.amount * 1.10;
end end

View file

@ -14,8 +14,7 @@ function onMagicStart(caster, target, skill)
--8071405: Choral Ringbands: Enhances Minuet of Rigor --8071405: Choral Ringbands: Enhances Minuet of Rigor
--With Choral Tights, Minuet gives 60 ACC/MACC at 50. Unsure what it is at lower levels (ie if it's a flat added 25 MP or a multiplier) --With Choral Tights, Minuet gives 60 ACC/MACC at 50. Unsure what it is at lower levels (ie if it's a flat added 25 MP or a multiplier)
--Assuming it's a flat 25 because that makes more sense than multiplying by 1.714 --Assuming it's a flat 25 because that makes more sense than multiplying by 1.714
local gloves = caster.GetEquipment().GetItemAtSlot(13); if caster.HasItemEquippedInSlot(8071405, 13) then
if gloves and gloves.itemId == 8071405 then
acc = acc + 25; acc = acc + 25;
end end

View file

@ -12,8 +12,7 @@ function onMagicStart(caster, target, skill)
local tpPerTick = 50; local tpPerTick = 50;
--8051405: Choral Tights: Enhances Paeon Of War --8051405: Choral Tights: Enhances Paeon Of War
local pants = caster.GetEquipment().GetItemAtSlot(12); if caster.HasItemEquippedInSlot(8051405, 12) then
if pants and pants.itemId == 8051405 then
tpPerTick = 60; tpPerTick = 60;
end end

View file

@ -17,7 +17,8 @@ function onSkillFinish(caster, target, skill, action, actionContainer)
local slope = 0.625; local slope = 0.625;
local intercept = -110; local intercept = -110;
if caster.GetEquipment().GetItemAtSlot(14).itemId == 8051406 then --8051406: Healer's Culottes: Enhances Regen
if caster.HasItemEquippedInSlot(8051406, 14) then
--I don't know if the numbers in that thread are completely correct because the AF Regen table has 3 1555s in a row. --I don't know if the numbers in that thread are completely correct because the AF Regen table has 3 1555s in a row.
--If we assume that AF boots multiply both static parts of the regenTick equation by 1.25, we get a decently close match to actual numbers --If we assume that AF boots multiply both static parts of the regenTick equation by 1.25, we get a decently close match to actual numbers
slope = slope * 1.25; slope = slope * 1.25;
@ -26,7 +27,6 @@ function onSkillFinish(caster, target, skill, action, actionContainer)
local regenTick = (slope * caster.GetMod(modifiersGlobal.MagicEnhancePotency)) + intercept) + 1; local regenTick = (slope * caster.GetMod(modifiersGlobal.MagicEnhancePotency)) + intercept) + 1;
spell.statusMagnitude = regenTick; spell.statusMagnitude = regenTick;
--DoAction handles rates, buffs, dealing damage --DoAction handles rates, buffs, dealing damage

View file

@ -1,14 +0,0 @@
require("global");
require("weaponskill");
function onSkillPrepare(caster, target, skill)
return 0;
end;
function onSkillStart(caster, target, skill)
return 0;
end;
function onSkillFinish(caster, target, skill, action)
return weaponskill.onSkillFinish(caster, target, skill, action);
end;

View file

@ -81,7 +81,8 @@ modifiersGlobal =
Regain = 70, --TP regen, should be -90 out of combat, Invigorate sets to 100+ depending on traits Regain = 70, --TP regen, should be -90 out of combat, Invigorate sets to 100+ depending on traits
RegenDown = 71, --Damage over time effects. Separate from normal Regen because of how they are displayed in game RegenDown = 71, --Damage over time effects. Separate from normal Regen because of how they are displayed in game
Stoneskin = 72, --Nullifies damage Stoneskin = 72, --Nullifies damage
MinimumTpLock = 73 MinimumTpLock = 73, --Don't let TP fall below this, used in openings
KnockbackImmune = 74 --Immune to knockback effects when above 0
} }
mobModifiersGlobal = mobModifiersGlobal =

View file

@ -28,6 +28,16 @@ function getDistanceBetweenActors(actor1, actor2)
return math.sqrt(dx * dx + dy * dy + dz *dz); return math.sqrt(dx * dx + dy * dy + dz *dz);
end end
function getXZDistanceBetweenActors(actor1, actor2)
local pos1 = actor1:GetPos();
local pos2 = actor2:GetPos();
local dx = pos1[0] - pos2[0];
local dz = pos1[2] - pos2[2];
return math.sqrt(dx * dx + dz *dz);
end
function math.Clamp(val, lower, upper) function math.Clamp(val, lower, upper)
if lower > upper then lower, upper = upper, lower end -- swap if boundaries supplied the wrong way if lower > upper then lower, upper = upper, lower end -- swap if boundaries supplied the wrong way
return math.max(lower, math.min(upper, val)) return math.max(lower, math.min(upper, val))

View file

@ -31,14 +31,20 @@ CREATE TABLE `server_battle_commands` (
`mainTarget` tinyint(3) unsigned NOT NULL, `mainTarget` tinyint(3) unsigned NOT NULL,
`validTarget` tinyint(3) unsigned NOT NULL, `validTarget` tinyint(3) unsigned NOT NULL,
`aoeType` tinyint(3) unsigned NOT NULL, `aoeType` tinyint(3) unsigned NOT NULL,
`aoeRange` int(10) NOT NULL DEFAULT '0', `aoeRange` float NOT NULL DEFAULT '0',
`aoeMinRange` float NOT NULL DEFAULT '0',
`aoeConeAngle` float NOT NULL DEFAULT '0',
`aoeRotateAngle` float NOT NULL DEFAULT '0',
`aoeTarget` tinyint(3) NOT NULL, `aoeTarget` tinyint(3) NOT NULL,
`basePotency` smallint(5) unsigned NOT NULL, `basePotency` smallint(5) unsigned NOT NULL,
`numHits` tinyint(3) unsigned NOT NULL, `numHits` tinyint(3) unsigned NOT NULL,
`positionBonus` tinyint(3) unsigned NOT NULL, `positionBonus` tinyint(3) unsigned NOT NULL,
`procRequirement` tinyint(3) unsigned NOT NULL, `procRequirement` tinyint(3) unsigned NOT NULL,
`range` int(10) unsigned NOT NULL, `range` int(10) unsigned NOT NULL,
`minRange` int(10) unsigned NOT NULL DEFAULT '0',
`bestRange` int(10) unsigned NOT NULL DEFAULT '0', `bestRange` int(10) unsigned NOT NULL DEFAULT '0',
`rangeHeight` int(10) unsigned NOT NULL DEFAULT '10',
`rangeWidth` int(10) unsigned NOT NULL DEFAULT '2',
`statusId` int(10) NOT NULL, `statusId` int(10) NOT NULL,
`statusDuration` int(10) unsigned NOT NULL, `statusDuration` int(10) unsigned NOT NULL,
`statusChance` float NOT NULL DEFAULT '0.5', `statusChance` float NOT NULL DEFAULT '0.5',
@ -73,148 +79,157 @@ CREATE TABLE `server_battle_commands` (
LOCK TABLES `server_battle_commands` WRITE; LOCK TABLES `server_battle_commands` WRITE;
/*!40000 ALTER TABLE `server_battle_commands` DISABLE KEYS */; /*!40000 ALTER TABLE `server_battle_commands` DISABLE KEYS */;
set autocommit=0; set autocommit=0;
INSERT INTO `server_battle_commands` VALUES (27100,'second_wind',2,6,3,1,1,0,0,0,100,1,0,0,0,0,0,0,0,0,0,45,0,0,14,519,2,3,234889735,0,0,0,0,0,30320,3,3,13,0); INSERT INTO `server_battle_commands` VALUES (23456,'breath_of_the_lion',0,1,0,1,32,2,12,0,0.5,0,1,100,1,0,0,0,0,0,10,2,0,0,0,11,3500,10,0,0,19,0,1,3,318771200,0,0,0,3,0,30301,2,2,9,1);
INSERT INTO `server_battle_commands` VALUES (27101,'blindside',2,14,3,1,1,0,0,0,100,1,0,0,0,0,223237,60,1,0,0,60,0,0,14,635,2,3,234889851,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (23457,'voice_of_the_lion',0,1,0,1,32,3,20,0,0,0,1,100,1,0,0,0,0,0,10,2,0,0,0,11,3500,10,0,0,19,0,2,3,318775296,0,0,0,3,0,30301,2,2,9,1);
INSERT INTO `server_battle_commands` VALUES (27102,'taunt',2,42,4,32,32,0,0,0,100,1,0,0,25,0,223073,5,1,0,0,60,0,0,14,517,2,3,234889733,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (23458,'breath_of_the_dragon',0,1,0,1,32,2,12,0,0.666667,0.25,1,100,1,0,0,0,0,0,10,2,0,0,0,11,3500,10,0,0,19,0,3,3,318779392,0,0,0,3,0,30301,2,2,9,1);
INSERT INTO `server_battle_commands` VALUES (27103,'featherfoot',2,2,3,1,1,0,0,0,100,1,0,0,0,0,223075,30,1,0,0,60,0,0,14,535,2,3,234889751,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (23459,'voice_of_the_dragon',0,1,0,1,32,1,22,15,2,0,1,100,1,0,0,0,0,0,10,2,0,0,0,11,3500,10,0,0,19,0,4,3,318783488,0,0,0,3,0,30301,2,2,9,1);
INSERT INTO `server_battle_commands` VALUES (27104,'fists_of_fire',2,34,4,1,1,0,0,0,100,1,0,0,0,0,223209,4294967295,1,0,0,10,0,0,14,684,2,3,234889900,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (23460,'breath_of_the_ram',0,1,0,1,32,2,12,0,0.666667,-0.25,1,100,1,0,0,0,0,0,10,2,0,0,0,11,3500,10,0,0,19,0,5,3,318787584,0,0,0,3,0,30301,2,2,9,1);
INSERT INTO `server_battle_commands` VALUES (27105,'fists_of_earth',2,22,4,1,1,0,0,0,100,1,0,0,0,0,223210,4294967295,1,0,0,10,0,0,14,685,2,3,234889901,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (23461,'voice_of_the_ram',0,1,0,1,32,1,10,0,2,0,1,100,1,0,0,0,0,0,10,2,0,0,0,11,3500,10,0,0,19,0,6,3,318791680,0,0,0,3,0,30301,2,2,9,1);
INSERT INTO `server_battle_commands` VALUES (27106,'hundred_fists',15,50,0,1,1,0,0,0,100,1,0,0,0,0,223244,15,1,0,0,900,0,0,14,712,2,3,234889928,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (23462,'dissent_of_the_bat',0,1,0,1,32,2,16,0,0.66667,0,1,100,1,0,0,0,0,0,10,2,0,0,0,11,3500,10,0,0,19,0,7,3,318795776,0,0,0,3,0,30301,2,2,9,1);
INSERT INTO `server_battle_commands` VALUES (27107,'spinning_heel',15,35,0,1,1,0,0,0,100,1,0,0,0,0,223245,20,1,0,0,120,0,0,14,718,2,3,234889934,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (23463,'chaotic_chorus',0,1,0,1,32,1,16,0,2,0,1,100,1,0,0,0,0,0,10,2,0,0,0,11,3500,10,0,0,19,0,8,3,318799872,0,0,0,3,0,30301,2,2,9,1);
INSERT INTO `server_battle_commands` VALUES (27108,'shoulder_tackle',15,30,0,32,32,0,0,0,100,1,0,0,15,0,223015,10,0.75,0,0,60,0,0,18,1048,205,3,302830616,0,0,0,0,0,30301,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (23464,'the_scorpions_sting',0,1,0,1,32,2,12,0,0.5,1,1,100,1,0,0,0,0,0,10,2,0,0,0,11,3500,10,0,0,19,0,9,3,318803968,0,0,0,3,0,30301,2,2,9,1);
INSERT INTO `server_battle_commands` VALUES (27109,'fists_of_wind',15,40,0,1,1,0,0,0,100,1,0,0,0,0,223211,4294967295,1,0,0,10,0,0,14,720,2,3,234889936,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27100,'second_wind',2,6,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,0,0,0,0,0,45,0,0,14,519,2,3,234889735,0,0,0,0,0,30320,3,3,13,0);
INSERT INTO `server_battle_commands` VALUES (27110,'pummel',2,1,1,32,32,0,0,0,100,1,1,0,5,0,0,0,0,0,0,10,0,1000,18,1027,1,3,301995011,0,27111,27113,1,0,30301,2,1,3,0); INSERT INTO `server_battle_commands` VALUES (27101,'blindside',2,14,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223237,60,1,0,0,60,0,0,14,635,2,3,234889851,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27111,'concussive_blow',2,10,1,32,32,0,0,0,100,1,4,0,5,0,223007,30,0,0,0,30,0,1500,18,20,3,3,302002196,0,27112,0,2,0,30301,2,1,3,0); INSERT INTO `server_battle_commands` VALUES (27102,'taunt',2,42,4,32,32,0,0,0,0,0,0,100,1,0,0,15,0,0,10,2,223073,5,1,0,0,60,0,0,14,517,2,3,234889733,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27112,'simian_thrash',2,50,4,32,32,0,0,0,100,9,0,0,5,0,0,0,0,0,0,80,0,2000,18,1003,202,3,302818283,0,0,0,3,0,30301,2,1,3,0); INSERT INTO `server_battle_commands` VALUES (27103,'featherfoot',2,2,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223075,30,1,0,0,60,0,0,14,535,2,3,234889751,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27113,'aura_pulse',2,38,4,32,32,1,8,1,100,1,0,0,5,0,223003,30,0,0,0,40,0,1500,18,66,203,3,302821442,0,0,0,2,0,30301,2,1,3,0); INSERT INTO `server_battle_commands` VALUES (27104,'fists_of_fire',2,34,4,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223209,4294967295,1,0,0,10,0,0,14,684,2,3,234889900,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27114,'pounce',2,4,4,32,32,0,0,0,100,1,2,0,5,0,223015,10,0,0,0,20,0,1500,18,8,3,3,302002184,0,27115,27117,1,0,30301,2,1,3,0); INSERT INTO `server_battle_commands` VALUES (27105,'fists_of_earth',2,22,4,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223210,4294967295,1,0,0,10,0,0,14,685,2,3,234889901,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27115,'demolish',2,30,1,32,32,0,0,0,100,1,0,0,5,0,0,0,0,0,0,30,0,1500,18,1028,2,3,301999108,0,27116,0,2,0,30301,2,1,3,0); INSERT INTO `server_battle_commands` VALUES (27106,'hundred_fists',15,50,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223244,15,1,0,0,900,0,0,14,712,2,3,234889928,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27116,'howling_fist',2,46,4,32,32,0,0,0,100,1,4,0,5,0,0,0,0,0,0,80,0,3000,18,1029,2,3,301999109,0,0,0,3,0,30301,2,1,3,0); INSERT INTO `server_battle_commands` VALUES (27107,'spinning_heel',15,35,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223245,20,1,0,0,120,0,0,14,718,2,3,234889934,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27117,'sucker_punch',2,26,1,32,32,0,0,0,100,1,4,0,5,0,0,0,0,0,0,15,0,1000,18,73,3,3,302002249,0,0,0,3,0,30301,2,1,3,0); INSERT INTO `server_battle_commands` VALUES (27108,'shoulder_tackle',15,30,0,32,32,0,0,0,0,0,0,100,1,0,0,15,0,0,10,2,223015,10,0.75,0,0,60,0,0,18,1048,205,3,302830616,0,0,0,0,0,30301,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27118,'dragon_kick',15,45,0,32,32,0,0,0,100,1,0,0,5,0,223013,10,0,0,0,60,0,2000,18,1041,204,3,302826513,0,0,0,0,0,30301,2,1,3,0); INSERT INTO `server_battle_commands` VALUES (27109,'fists_of_wind',15,40,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223211,4294967295,1,0,0,10,0,0,14,720,2,3,234889936,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27119,'haymaker',2,18,4,32,32,0,0,0,100,1,0,2,5,0,223015,10,0.75,0,0,5,0,250,18,23,201,3,302813207,0,0,0,0,0,30301,2,1,3,0); INSERT INTO `server_battle_commands` VALUES (27110,'pummel',2,1,1,32,32,0,0,0,0,0,0,100,1,1,0,5,0,0,10,2,0,0,0,0,0,10,0,1000,18,1027,1,3,301995011,0,27111,27113,1,0,30301,2,1,3,0);
INSERT INTO `server_battle_commands` VALUES (27140,'sentinel',3,22,3,1,1,0,0,0,100,1,0,0,0,0,223062,15,1,0,0,90,0,0,14,526,2,3,234889742,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27111,'concussive_blow',2,10,1,32,32,0,0,0,0,0,0,100,1,4,0,5,0,0,10,2,223007,30,0,0,0,30,0,1500,18,20,3,3,302002196,0,27112,0,2,0,30301,2,1,3,0);
INSERT INTO `server_battle_commands` VALUES (27141,'aegis_boon',3,6,8,1,1,0,0,0,100,1,0,0,0,0,223058,30,1,0,0,60,0,0,14,583,21,3,234967623,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27112,'simian_thrash',2,50,4,32,32,0,0,0,0,0,0,100,9,0,0,5,0,0,10,2,0,0,0,0,0,80,0,2000,18,1003,202,3,302818283,0,0,0,3,0,30301,2,1,3,0);
INSERT INTO `server_battle_commands` VALUES (27142,'rampart',3,2,3,1,5,0,8,1,100,1,0,0,0,0,223064,60,1,0,0,120,0,0,14,536,2,3,234889752,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27113,'aura_pulse',2,38,4,32,32,1,8,0,0,0,1,100,1,0,0,5,0,0,10,2,223003,30,0,0,0,40,0,1500,18,66,203,3,302821442,0,0,0,2,0,30301,2,1,3,0);
INSERT INTO `server_battle_commands` VALUES (27143,'tempered_will',3,42,8,1,1,0,0,0,100,1,0,0,0,0,223068,20,1,0,0,180,0,0,14,515,2,3,234889731,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27114,'pounce',2,4,4,32,32,0,0,0,0,0,0,100,1,2,0,5,0,0,10,2,223015,10,0,0,0,20,0,1500,18,8,3,3,302002184,0,27115,27117,1,0,30301,2,1,3,0);
INSERT INTO `server_battle_commands` VALUES (27144,'outmaneuver',3,34,8,1,1,0,0,0,100,1,0,0,0,0,223236,30,1,0,0,90,0,0,14,512,21,3,234967552,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27115,'demolish',2,30,1,32,32,0,0,0,0,0,0,100,1,0,0,5,0,0,10,2,0,0,0,0,0,30,0,1500,18,1028,2,3,301999108,0,27116,0,2,0,30301,2,1,3,0);
INSERT INTO `server_battle_commands` VALUES (27145,'flash',3,14,3,32,32,0,8,0,100,1,0,0,25,0,223007,10,0,0,0,30,0,0,14,696,2,3,234889912,0,0,0,0,0,30101,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27116,'howling_fist',2,46,4,32,32,0,0,0,0,0,0,100,1,4,0,5,0,0,10,2,0,0,0,0,0,80,0,3000,18,1029,2,3,301999109,0,0,0,3,0,30301,2,1,3,0);
INSERT INTO `server_battle_commands` VALUES (27146,'cover',16,30,0,12,12,0,0,0,100,1,0,0,15,0,223173,15,1,0,0,60,0,0,14,725,2,3,234889941,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27117,'sucker_punch',2,26,1,32,32,0,0,0,0,0,0,100,1,4,0,5,0,0,10,2,0,0,0,0,0,15,0,1000,18,73,3,3,302002249,0,0,0,3,0,30301,2,1,3,0);
INSERT INTO `server_battle_commands` VALUES (27147,'divine_veil',16,35,0,1,1,0,0,0,100,1,0,0,0,0,223248,20,1,0,0,60,0,0,14,713,2,3,234889929,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27118,'dragon_kick',15,45,0,32,32,0,0,0,0,0,0,100,1,0,0,5,0,0,10,2,223013,10,0,0,0,60,0,2000,18,1041,204,3,302826513,0,0,0,0,0,30301,2,1,3,0);
INSERT INTO `server_battle_commands` VALUES (27148,'hallowed_ground',16,50,0,1,1,0,0,0,100,1,0,0,0,0,223249,20,1,0,0,900,0,0,14,709,2,3,234889925,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27119,'haymaker',2,18,4,32,32,0,0,0,0,0,0,100,1,0,2,5,0,0,10,2,223015,10,0.75,0,0,5,0,250,18,23,201,3,302813207,0,0,0,0,0,30301,2,1,3,0);
INSERT INTO `server_battle_commands` VALUES (27149,'holy_succor',16,40,0,9,9,0,0,0,100,1,0,0,15,0,0,0,0,3,2000,10,100,0,1,701,1,3,16782013,0,0,0,0,0,30328,3,3,13,0); INSERT INTO `server_battle_commands` VALUES (27140,'sentinel',3,22,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223062,15,1,0,0,90,0,0,14,526,2,3,234889742,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27150,'fast_blade',3,1,1,32,32,0,0,0,100,1,1,0,5,0,0,0,0,0,0,10,0,1000,18,1023,1,3,301995007,0,27151,27152,1,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27141,'aegis_boon',3,6,8,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223058,30,1,0,0,60,0,0,14,583,21,3,234967623,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27151,'flat_blade',3,26,1,32,32,0,0,0,100,1,0,0,5,0,0,0,0,0,0,10,0,1500,18,1024,2,3,301999104,0,0,0,2,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27142,'rampart',3,2,3,1,5,0,8,0,0,0,1,100,1,0,0,0,0,0,10,2,223064,60,1,0,0,120,0,0,14,536,2,3,234889752,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27152,'savage_blade',3,10,1,32,32,0,0,0,100,1,0,0,5,0,0,0,0,0,0,30,0,1000,18,1025,1,3,301995009,0,27153,0,2,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27143,'tempered_will',3,42,8,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223068,20,1,0,0,180,0,0,14,515,2,3,234889731,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27153,'goring_blade',3,50,8,32,32,0,0,0,100,1,2,0,5,0,223206,30,0,0,0,60,0,3000,18,1026,301,3,303223810,0,0,0,3,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27144,'outmaneuver',3,34,8,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223236,30,1,0,0,90,0,0,14,512,21,3,234967552,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27154,'riot_blade',3,30,8,32,32,0,0,0,100,1,2,0,15,0,223038,30,0,0,0,80,0,2000,18,75,2,3,301998155,0,27155,0,1,0,30301,2,1,1,1); INSERT INTO `server_battle_commands` VALUES (27145,'flash',3,14,3,32,32,0,8,0,0,0,0,100,1,0,0,15,0,0,10,2,223007,10,0,0,0,30,0,0,14,696,2,3,234889912,0,0,0,0,0,30101,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27155,'rage_of_halone',3,46,8,32,32,0,0,0,100,5,0,0,5,0,0,0,0,0,0,20,0,1500,18,1008,302,3,303227888,0,0,0,2,-40,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27146,'cover',16,30,0,12,12,0,0,0,0,0,0,100,1,0,0,15,0,0,10,2,223173,15,1,0,0,60,0,0,14,725,2,3,234889941,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27156,'shield_bash',3,18,17,32,32,0,0,0,100,1,0,0,5,0,223015,5,0.75,0,0,30,0,250,18,5,26,3,302096389,0,0,0,0,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27147,'divine_veil',16,35,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223248,20,1,0,0,60,0,0,14,713,2,3,234889929,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27157,'war_drum',3,38,24,32,32,1,8,0,100,1,0,4,5,0,0,0,0,0,0,60,0,500,14,502,21,3,234967542,0,0,0,0,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27148,'hallowed_ground',16,50,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223249,20,1,0,0,900,0,0,14,709,2,3,234889925,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27158,'phalanx',3,4,8,32,32,0,0,0,100,1,0,4,5,0,0,0,0,0,0,5,0,250,18,32,1,3,301994016,0,27159,0,1,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27149,'holy_succor',16,40,0,9,9,0,0,0,0,0,0,100,1,0,0,15,0,0,10,2,0,0,0,3,2000,10,100,0,1,701,1,3,16782013,0,0,0,0,0,30328,3,3,13,0);
INSERT INTO `server_battle_commands` VALUES (27159,'spirits_within',16,45,0,32,32,0,0,0,100,1,0,0,5,0,0,0,0,0,0,60,0,3000,18,1044,304,3,303236116,0,0,0,2,50,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27150,'fast_blade',3,1,1,32,32,0,0,0,0,0,0,100,1,1,0,5,0,0,10,2,0,0,0,0,0,10,0,1000,18,1023,1,3,301995007,0,27151,27152,1,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27180,'provoke',4,14,3,32,32,0,0,0,100,1,0,0,25,0,223034,30,0,0,0,30,0,0,14,600,2,3,234889816,0,0,0,0,0,30101,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27151,'flat_blade',3,26,1,32,32,0,0,0,0,0,0,100,1,0,0,5,0,0,10,2,0,0,0,0,0,10,0,1500,18,1024,2,3,301999104,0,0,0,2,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27181,'foresight',4,2,3,1,1,0,0,0,100,1,0,0,0,0,223083,30,1,0,0,60,0,0,14,545,2,3,234889761,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27152,'savage_blade',3,10,1,32,32,0,0,0,0,0,0,100,1,0,0,5,0,0,10,2,0,0,0,0,0,30,0,1000,18,1025,1,3,301995009,0,27153,0,2,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27182,'bloodbath',4,6,3,1,1,0,0,0,100,1,0,0,0,0,223081,30,1,0,0,60,0,0,14,581,2,3,234889797,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27153,'goring_blade',3,50,8,32,32,0,0,0,0,0,0,100,1,2,0,5,0,0,10,2,223206,30,0,0,0,60,0,3000,18,1026,301,3,303223810,0,0,0,3,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27183,'berserk',4,22,32,1,1,0,0,0,100,1,0,0,0,0,223207,4294967295,1,0,0,10,0,0,14,682,2,3,234889898,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27154,'riot_blade',3,30,8,32,32,0,0,0,0,0,0,100,1,2,0,15,0,0,10,2,223038,30,0,0,0,80,0,2000,18,75,2,3,301998155,0,27155,0,1,0,30301,2,1,1,1);
INSERT INTO `server_battle_commands` VALUES (27184,'rampage',4,34,32,1,1,0,0,0,100,1,0,0,0,0,223208,4294967295,1,0,0,10,0,0,14,546,2,3,234889762,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27155,'rage_of_halone',3,46,8,32,32,0,0,0,0,0,0,100,5,0,0,5,0,0,10,2,0,0,0,0,0,20,0,1500,18,1008,302,3,303227888,0,0,0,2,-40,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27185,'enduring_march',4,42,32,1,1,0,0,0,100,1,0,0,0,0,223078,20,1,0,0,180,0,0,14,539,2,3,234889755,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27156,'shield_bash',3,18,17,32,32,0,0,0,0,0,0,100,1,0,0,5,0,0,10,2,223015,5,0.75,0,0,30,0,250,18,5,26,3,302096389,0,0,0,0,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27186,'vengeance',17,30,0,1,1,0,0,0,100,1,0,0,0,0,223250,15,1,0,0,150,0,0,14,714,2,3,234889930,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27157,'war_drum',3,38,24,32,32,1,8,0,0,0,1,100,1,0,4,5,0,0,10,2,0,0,0,0,0,60,0,500,14,502,21,3,234967542,0,0,0,0,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27187,'antagonize',17,35,0,1,1,0,0,0,100,1,0,0,0,0,223251,15,1,0,0,120,0,0,14,715,2,3,234889931,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27158,'phalanx',3,4,8,32,32,0,0,0,0,0,0,100,1,0,4,5,0,0,10,2,0,0,0,0,0,5,0,250,18,32,1,3,301994016,0,27159,0,1,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27188,'collusion',17,40,0,12,12,0,0,0,100,1,0,0,15,0,223097,15,1,0,0,90,0,0,14,711,2,3,234889927,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27159,'spirits_within',16,45,0,32,32,0,0,0,0,0,0,100,1,0,0,5,0,0,10,2,0,0,0,0,0,60,0,3000,18,1044,304,3,303236116,0,0,0,2,50,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27189,'mighty_strikes',17,50,0,1,1,0,0,0,100,1,0,0,0,0,223252,15,1,0,0,900,0,0,14,716,2,3,234889932,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27180,'provoke',4,14,3,32,32,0,0,0,0,0,0,100,1,0,0,15,0,0,10,2,223034,30,0,0,0,30,0,0,14,600,2,3,234889816,0,0,0,0,0,30101,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27190,'heavy_swing',4,1,1,32,32,0,0,0,100,1,1,0,5,0,0,0,0,0,0,10,0,1000,18,14,1,3,301993998,0,27191,0,1,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27181,'foresight',4,2,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223083,30,1,0,0,60,0,0,14,545,2,3,234889761,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27191,'skull_sunder',4,10,1,32,32,0,0,0,100,1,0,0,5,0,0,0,0,0,0,30,0,1500,18,43,1,3,301994027,0,27192,0,2,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27182,'bloodbath',4,6,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223081,30,1,0,0,60,0,0,14,581,2,3,234889797,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27192,'steel_cyclone',17,45,0,32,32,1,8,0,100,1,0,0,5,0,223015,3,0,0,0,30,0,2000,18,1040,404,3,303645712,0,0,0,3,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27183,'berserk',4,22,32,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223207,4294967295,1,0,0,10,0,0,14,682,2,3,234889898,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27193,'brutal_swing',4,4,1,32,32,0,0,0,100,1,4,0,5,0,0,0,0,0,0,20,0,1500,18,15,3,3,302002191,0,27194,0,1,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27184,'rampage',4,34,32,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223208,4294967295,1,0,0,10,0,0,14,546,2,3,234889762,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27194,'maim',4,26,1,32,32,0,0,0,100,1,0,0,5,0,0,0,0,0,0,30,0,1500,18,88,1,3,301994072,0,27195,0,2,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27185,'enduring_march',4,42,32,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223078,20,1,0,0,180,0,0,14,539,2,3,234889755,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27195,'godsbane',4,50,32,32,32,0,0,0,100,3,0,0,5,0,0,0,0,0,0,60,0,3000,18,1014,402,3,303637494,0,0,0,3,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27186,'vengeance',17,30,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223250,15,1,0,0,150,0,0,14,714,2,3,234889930,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27196,'path_of_the_storm',4,38,32,32,32,0,0,0,100,1,2,0,5,0,228021,30,0,0,0,30,0,1500,18,44,401,3,303632428,0,27197,0,1,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27187,'antagonize',17,35,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223251,15,1,0,0,120,0,0,14,715,2,3,234889931,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27197,'whirlwind',4,46,32,32,32,1,8,0,100,1,0,0,5,0,0,0,0,0,0,80,0,3000,18,1015,403,3,303641591,0,0,0,2,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27188,'collusion',17,40,0,12,12,0,0,0,0,0,0,100,1,0,0,15,0,0,10,2,223097,15,1,0,0,90,0,0,14,711,2,3,234889927,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27198,'fracture',4,18,32,32,32,0,0,0,100,1,0,3,5,0,223013,8,0.75,0,0,40,0,500,18,42,3,3,302002218,0,0,0,0,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27189,'mighty_strikes',17,50,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223252,15,1,0,0,900,0,0,14,716,2,3,234889932,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27199,'overpower',4,30,1,32,32,2,0,0,100,1,0,3,5,0,0,0,0,0,0,5,0,250,18,89,1,3,301994073,0,0,0,0,0,30301,2,1,1,0); INSERT INTO `server_battle_commands` VALUES (27190,'heavy_swing',4,1,1,32,32,0,0,0,0,0,0,100,1,1,0,5,0,0,10,2,0,0,0,0,0,10,0,1000,18,14,1,3,301993998,0,27191,0,1,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27220,'hawks_eye',7,6,3,1,1,0,0,0,100,1,0,0,0,0,223106,15,1,0,0,90,0,0,14,516,2,3,234889732,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27191,'skull_sunder',4,10,1,32,32,0,0,0,0,0,0,100,1,0,0,5,0,0,10,2,0,0,0,0,0,30,0,1500,18,43,1,3,301994027,0,27192,0,2,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27221,'quelling_strike',7,22,3,1,1,0,0,0,100,1,0,0,0,0,223104,30,1,0,0,60,0,0,14,614,2,3,234889830,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27192,'steel_cyclone',17,45,0,32,32,1,8,0,0,0,1,100,1,0,0,5,0,0,10,2,223015,3,0,0,0,30,0,2000,18,1040,404,3,303645712,0,0,0,3,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27222,'decoy',7,2,3,1,1,0,0,0,100,1,0,0,0,0,223108,60,1,0,0,90,100,0,14,565,2,3,234889781,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27193,'brutal_swing',4,4,1,32,32,0,0,0,0,0,0,100,1,4,0,5,0,0,10,2,0,0,0,0,0,20,0,1500,18,15,3,3,302002191,0,27194,0,1,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27223,'chameleon',7,42,3,1,1,0,0,0,100,1,0,0,0,0,0,0,0,0,0,180,0,0,14,504,2,3,234889720,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27194,'maim',4,26,1,32,32,0,0,0,0,0,0,100,1,0,0,5,0,0,10,2,0,0,0,0,0,30,0,1500,18,88,1,3,301994072,0,27195,0,2,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27224,'barrage',7,34,64,1,1,0,0,0,100,1,0,0,0,0,223220,60,1,0,0,90,0,0,14,683,2,3,234889899,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27195,'godsbane',4,50,32,32,32,0,0,0,0,0,0,100,3,0,0,5,0,0,10,2,0,0,0,0,0,60,0,3000,18,1014,402,3,303637494,0,0,0,3,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27225,'raging_strike',7,14,64,1,1,0,0,0,100,1,0,0,0,0,223221,4294967295,1,0,0,10,0,0,14,632,2,3,234889848,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27196,'path_of_the_storm',4,38,32,32,32,0,0,0,0,0,0,100,1,2,0,5,0,0,10,2,228021,30,0,0,0,30,0,1500,18,44,401,3,303632428,0,27197,0,1,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27226,'swiftsong',7,26,64,1,5,1,20,0,100,1,0,0,0,0,223224,180,1,0,0,10,100,0,1,150,1,3,16781462,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27197,'whirlwind',4,46,32,32,32,1,8,0,0,0,1,100,1,0,0,5,0,0,10,2,0,0,0,0,0,80,0,3000,18,1015,403,3,303641591,0,0,0,2,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27227,'battle_voice',18,50,0,1,5,1,20,0,100,1,0,0,0,0,223029,60,1,0,0,900,0,0,14,721,2,3,234889937,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27198,'fracture',4,18,32,32,32,0,0,0,0,0,0,100,1,0,3,5,0,0,10,2,223013,8,0.75,0,0,40,0,500,18,42,3,3,302002218,0,0,0,0,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27228,'heavy_shot',7,1,1,32,32,0,0,0,100,1,0,0,25,8,0,0,0,0,0,10,0,1000,18,1036,4,3,302007308,0,27229,27231,1,0,30301,2,1,4,1); INSERT INTO `server_battle_commands` VALUES (27199,'overpower',4,30,1,32,32,2,8,0,0.5,0,1,100,1,0,3,8,0,0,10,2,0,0,0,0,0,5,0,250,18,89,1,3,301994073,0,0,0,0,0,30301,2,1,1,0);
INSERT INTO `server_battle_commands` VALUES (27229,'leaden_arrow',7,10,1,32,32,0,0,0,100,1,0,0,25,0,228021,30,0.75,0,0,30,0,1500,18,1035,4,3,302007307,0,27230,0,2,0,30301,2,1,4,1); INSERT INTO `server_battle_commands` VALUES (27220,'hawks_eye',7,6,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223106,15,1,0,0,90,0,0,14,516,2,3,234889732,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27230,'wide_volley',7,50,64,32,32,1,8,0,100,1,0,0,25,0,0,0,0,0,0,80,0,2000,18,18,703,3,304869394,0,0,0,3,-20,30301,2,1,4,1); INSERT INTO `server_battle_commands` VALUES (27221,'quelling_strike',7,22,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223104,30,1,0,0,60,0,0,14,614,2,3,234889830,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27231,'quick_nock',7,38,64,32,32,2,0,0,100,1,0,0,10,0,0,0,0,0,0,180,0,1000,18,1017,702,3,304866297,0,27232,0,2,0,30301,2,1,4,1); INSERT INTO `server_battle_commands` VALUES (27222,'decoy',7,2,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223108,60,1,0,0,90,100,0,14,565,2,3,234889781,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27232,'rain_of_death',18,45,0,32,32,1,8,0,100,1,0,0,25,0,223015,5,0.75,0,0,30,0,3000,18,1037,704,3,304874509,0,0,0,3,0,30301,2,1,4,1); INSERT INTO `server_battle_commands` VALUES (27223,'chameleon',7,42,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,0,0,0,0,0,180,0,0,14,504,2,3,234889720,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27233,'piercing_arrow',7,4,1,32,32,0,0,0,100,1,0,0,25,8,0,0,0,0,0,20,0,1000,18,1038,1,3,301995022,0,27234,27236,1,0,30301,2,1,4,1); INSERT INTO `server_battle_commands` VALUES (27224,'barrage',7,34,64,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223220,60,1,0,0,90,0,0,14,683,2,3,234889899,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27234,'gloom_arrow',7,30,1,32,32,0,0,0,100,1,0,0,25,0,223007,30,0,0,0,10,0,1000,18,1039,4,3,302007311,0,27235,0,2,0,30301,2,1,4,1); INSERT INTO `server_battle_commands` VALUES (27225,'raging_strike',7,14,64,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223221,4294967295,1,0,0,10,0,0,14,632,2,3,234889848,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27235,'bloodletter',7,46,64,32,32,0,0,0,100,1,0,0,25,0,223241,30,0.75,0,0,80,0,1500,18,53,701,3,304861237,0,0,0,3,0,30301,2,1,4,1); INSERT INTO `server_battle_commands` VALUES (27226,'swiftsong',7,26,64,1,5,1,20,0,0,0,1,100,1,0,0,0,0,0,10,2,223224,180,1,0,0,10,100,0,1,150,1,3,16781462,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27236,'shadowbind',7,18,64,32,32,0,0,0,100,1,0,0,25,0,228011,15,0.9,0,0,40,0,250,18,17,4,3,302006289,0,0,0,2,0,30301,2,1,4,1); INSERT INTO `server_battle_commands` VALUES (27227,'battle_voice',18,50,0,1,5,1,20,0,0,0,1,100,1,0,0,0,0,0,10,2,223029,60,1,0,0,900,0,0,14,721,2,3,234889937,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27237,'ballad_of_magi',18,30,0,1,5,1,20,0,100,1,0,0,0,0,223254,180,1,8,3000,10,100,0,1,709,1,3,16782021,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27228,'heavy_shot',7,1,1,32,32,0,0,0,0,0,0,100,1,0,0,20,0,8,10,2,0,0,0,0,0,10,0,1000,18,1036,4,3,302007308,0,27229,27231,1,0,30301,2,1,4,1);
INSERT INTO `server_battle_commands` VALUES (27238,'paeon_of_war',18,40,0,1,5,1,20,0,100,1,0,0,0,0,223255,180,1,8,3000,10,50,1000,1,710,1,3,16782022,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27229,'leaden_arrow',7,10,1,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,228021,30,0.75,0,0,30,0,1500,18,1035,4,3,302007307,0,27230,0,2,0,30301,2,1,4,1);
INSERT INTO `server_battle_commands` VALUES (27239,'minuet_of_rigor',18,35,0,1,5,1,20,0,100,1,0,0,0,0,223256,180,1,8,3000,10,100,0,1,711,1,3,16782023,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27230,'wide_volley',7,50,64,32,32,1,8,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,0,0,80,0,2000,18,18,703,3,304869394,0,0,0,3,-20,30301,2,1,4,1);
INSERT INTO `server_battle_commands` VALUES (27258,'refill',7,1,0,1,1,0,0,0,100,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,32613,3,0,0,0); INSERT INTO `server_battle_commands` VALUES (27231,'quick_nock',7,38,64,32,32,2,10,0,0.5,0,1,100,1,0,0,10,0,0,10,2,0,0,0,0,0,180,0,1000,18,1017,702,3,304866297,0,27232,0,2,0,30301,2,1,4,1);
INSERT INTO `server_battle_commands` VALUES (27259,'light_shot',7,1,0,32,32,0,0,0,100,1,0,0,25,0,0,0,0,0,0,0,0,0,17,0,1,3,285216768,0,0,0,0,0,30301,3,1,0,1); INSERT INTO `server_battle_commands` VALUES (27232,'rain_of_death',18,45,0,32,32,1,8,0,0,0,0,100,1,0,0,20,0,0,10,2,223015,5,0.75,0,0,30,0,3000,18,1037,704,3,304874509,0,0,0,3,0,30301,2,1,4,1);
INSERT INTO `server_battle_commands` VALUES (27260,'invigorate',8,14,3,1,1,0,0,0,100,1,0,0,0,0,223094,30,1,0,0,90,0,0,14,575,2,3,234889791,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27233,'piercing_arrow',7,4,1,32,32,0,0,0,0,0,0,100,1,0,0,20,0,8,10,2,0,0,0,0,0,20,0,1000,18,1038,1,3,301995022,0,27234,27236,1,0,30301,2,1,4,1);
INSERT INTO `server_battle_commands` VALUES (27261,'power_surge',8,34,128,1,1,0,0,0,100,1,0,0,0,0,223212,60,1,0,0,10,0,0,14,686,2,3,234889902,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27234,'gloom_arrow',7,30,1,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,223007,30,0,0,0,10,0,1000,18,1039,4,3,302007311,0,27235,0,2,0,30301,2,1,4,1);
INSERT INTO `server_battle_commands` VALUES (27262,'life_surge',8,22,128,1,1,0,0,0,100,1,0,0,0,0,223215,180,1,0,0,15,0,250,14,687,2,3,234889903,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27235,'bloodletter',7,46,64,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,223241,30,0.75,0,0,80,0,1500,18,53,701,3,304861237,0,0,0,3,0,30301,2,1,4,1);
INSERT INTO `server_battle_commands` VALUES (27263,'dread_spike',8,42,128,1,1,0,0,0,100,1,0,0,0,0,223218,30,1,0,0,120,0,0,14,686,2,3,234889902,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27236,'shadowbind',7,18,64,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,228011,15,0.9,0,0,40,0,250,18,17,4,3,302006289,0,0,0,2,0,30301,2,1,4,1);
INSERT INTO `server_battle_commands` VALUES (27264,'blood_for_blood',8,6,3,1,1,0,0,0,100,1,0,0,0,0,223219,60,1,0,0,60,0,0,14,689,2,3,234889905,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27237,'ballad_of_magi',18,30,0,1,5,1,20,0,0,0,1,100,1,0,0,0,0,0,10,2,223254,180,1,8,3000,10,100,0,1,709,1,3,16782021,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27265,'keen_flurry',8,26,3,1,1,0,0,0,100,1,0,0,0,0,223091,30,1,0,0,90,0,0,14,569,2,3,234889785,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27238,'paeon_of_war',18,40,0,1,5,1,20,0,0,0,1,100,1,0,0,0,0,0,10,2,223255,180,1,8,3000,10,50,1000,1,710,1,3,16782022,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27266,'jump',19,30,0,32,32,0,0,0,100,1,0,0,25,0,0,0,0,0,0,60,0,0,18,1045,804,3,305284117,0,0,0,0,0,30301,3,1,2,0); INSERT INTO `server_battle_commands` VALUES (27239,'minuet_of_rigor',18,35,0,1,5,1,20,0,0,0,1,100,1,0,0,0,0,0,10,2,223256,180,1,8,3000,10,100,0,1,711,1,3,16782023,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27267,'elusive_jump',19,40,0,1,1,0,0,0,100,1,0,0,0,0,0,0,0,0,0,180,0,0,18,1046,806,3,305292310,0,0,0,0,0,30101,3,0,0,0); INSERT INTO `server_battle_commands` VALUES (27258,'refill',7,1,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,32613,3,0,0,0);
INSERT INTO `server_battle_commands` VALUES (27268,'dragonfire_dive',19,50,0,32,32,1,0,0,100,1,0,0,25,0,0,0,0,0,0,900,0,0,18,1045,804,3,305284117,0,0,0,0,0,30301,3,2,5,0); INSERT INTO `server_battle_commands` VALUES (27259,'light_shot',7,1,0,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,0,0,0,0,0,17,0,1,3,285216768,0,0,0,0,0,30301,3,1,0,1);
INSERT INTO `server_battle_commands` VALUES (27269,'true_thrust',8,1,1,32,32,0,0,0,100,1,1,0,5,0,0,0,0,0,0,10,0,1000,18,1030,2,3,301999110,0,27270,27273,1,0,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27260,'invigorate',8,14,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223094,30,1,0,0,90,0,0,14,575,2,3,234889791,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27270,'leg_sweep',8,30,1,32,32,1,0,0,100,1,0,0,5,0,223015,8,0,0,0,30,0,1000,18,37,1,3,301994021,0,27271,0,2,0,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27261,'power_surge',8,34,128,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223212,60,1,0,0,10,0,0,14,686,2,3,234889902,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27271,'doom_spike',8,46,128,32,32,3,0,0,100,1,0,0,5,0,0,0,0,0,0,60,0,3000,18,83,801,3,305270867,0,0,0,3,0,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27262,'life_surge',8,22,128,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223215,180,1,0,0,15,0,250,14,687,2,3,234889903,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27272,'disembowel',19,35,0,32,32,0,0,0,100,1,0,0,5,0,223005,15,0.75,0,0,30,0,750,18,1042,2,3,301999122,0,0,0,0,0,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27263,'dread_spike',8,42,128,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223218,30,1,0,0,120,0,0,14,686,2,3,234889902,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27273,'heavy_thrust',8,10,1,32,32,0,0,0,100,1,0,0,5,0,223015,4,0.75,0,0,20,0,1500,18,1031,1,3,301995015,0,0,0,0,0,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27264,'blood_for_blood',8,6,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223219,60,1,0,0,60,0,0,14,689,2,3,234889905,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27274,'vorpal_thrust',8,2,1,32,32,0,0,0,100,1,2,0,5,0,0,0,0,0,0,20,0,1500,18,1032,2,3,301999112,0,27275,0,1,0,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27265,'keen_flurry',8,26,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223091,30,1,0,0,90,0,0,14,569,2,3,234889785,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27275,'impulse_drive',8,18,1,32,32,0,0,0,100,1,4,0,5,0,0,0,0,0,0,30,0,1500,18,1033,2,3,301999113,0,27276,27277,2,0,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27266,'jump',19,30,0,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,0,0,60,0,0,18,1045,804,3,305284117,0,0,0,0,0,30301,3,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27276,'chaos_thrust',8,50,128,32,32,0,0,0,100,6,0,0,5,0,0,0,0,0,0,80,0,3000,18,40,802,3,305274920,0,0,0,3,0,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27267,'elusive_jump',19,40,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,0,0,0,0,0,180,0,0,18,1046,806,3,305292310,0,0,0,0,0,30101,3,0,0,0);
INSERT INTO `server_battle_commands` VALUES (27277,'ring_of_talons',19,45,0,32,32,1,8,1,100,1,0,0,5,0,0,0,0,0,0,60,0,2000,18,1009,803,3,305279985,0,0,0,3,0,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27268,'dragonfire_dive',19,50,0,32,32,1,4,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,0,0,900,0,0,18,1045,804,3,305284117,0,0,0,0,0,30301,3,2,5,0);
INSERT INTO `server_battle_commands` VALUES (27278,'feint',8,4,1,32,32,0,0,0,100,1,0,1,5,0,0,0,0,0,0,10,0,250,18,39,2,3,301998119,0,27272,0,1,100,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27269,'true_thrust',8,1,1,32,32,0,0,0,0,0,0,100,1,1,0,5,0,0,10,2,0,0,0,0,0,10,0,1000,18,1030,2,3,301999110,0,27270,27273,1,0,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27279,'full_thrust',8,38,128,32,32,0,0,0,100,1,0,1,5,0,0,0,0,0,0,30,0,250,18,1034,801,3,305271818,0,0,0,0,50,30301,2,1,2,0); INSERT INTO `server_battle_commands` VALUES (27270,'leg_sweep',8,30,1,32,32,2,8,0,0.5,0,1,100,1,0,0,5,0,0,10,2,223015,8,0,0,0,30,0,1000,18,37,1,3,301994021,0,27271,0,2,0,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27300,'dark_seal',22,14,3,1,1,0,0,0,100,1,0,0,0,0,223229,30,1,0,0,90,0,0,14,518,2,3,234889734,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27271,'doom_spike',8,46,128,32,32,3,5,0,0,0,1,100,1,0,0,5,0,0,10,2,0,0,0,0,0,60,0,3000,18,83,801,3,305270867,0,0,0,3,0,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27301,'resonance',22,22,3,1,1,0,0,0,100,1,0,0,0,0,223230,30,1,0,0,90,0,0,14,669,2,3,234889885,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27272,'disembowel',19,35,0,32,32,0,0,0,0,0,0,100,1,0,0,5,0,0,10,2,223005,15,0.75,0,0,30,0,750,18,1042,2,3,301999122,0,0,0,0,0,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27302,'excruciate',22,38,256,1,1,0,0,0,100,1,0,0,0,0,223231,30,1,0,0,90,0,0,14,694,2,3,234889910,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27273,'heavy_thrust',8,10,1,32,32,0,0,0,0,0,0,100,1,0,0,5,0,0,10,2,223015,4,0.75,0,0,20,0,1500,18,1031,1,3,301995015,0,0,0,0,0,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27303,'necrogenesis',22,6,3,1,1,0,0,0,100,1,0,0,0,0,223232,30,1,0,0,90,0,0,14,695,2,3,234889911,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27274,'vorpal_thrust',8,2,1,32,32,0,0,0,0,0,0,100,1,2,0,5,0,0,10,2,0,0,0,0,0,20,0,1500,18,1032,2,3,301999112,0,27275,0,1,0,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27304,'parsimony',22,2,256,1,1,0,0,0,100,1,0,0,0,0,223233,30,1,0,0,90,0,0,14,568,2,3,234889784,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27275,'impulse_drive',8,18,1,32,32,0,0,0,0,0,0,100,1,4,0,5,0,0,10,2,0,0,0,0,0,30,0,1500,18,1033,2,3,301999113,0,27276,27277,2,0,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27305,'convert',26,30,0,1,1,0,0,0,100,1,0,0,0,0,0,0,0,0,0,450,0,0,14,724,2,3,234889940,0,0,0,0,0,30101,3,0,0,0); INSERT INTO `server_battle_commands` VALUES (27276,'chaos_thrust',8,50,128,32,32,0,0,0,0,0,0,100,6,0,0,5,0,0,10,2,0,0,0,0,0,80,0,3000,18,40,802,3,305274920,0,0,0,3,0,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27306,'sleep',22,42,256,32,32,0,0,0,100,1,0,0,25,0,228001,60,0.9,2,3000,0,75,0,1,651,1,3,16781963,0,0,0,0,0,30328,4,4,12,0); INSERT INTO `server_battle_commands` VALUES (27277,'ring_of_talons',19,45,0,32,32,1,8,0,0,0,1,100,1,0,0,5,0,0,10,2,0,0,0,0,0,60,0,2000,18,1009,803,3,305279985,0,0,0,3,0,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27307,'sanguine_rite',22,30,3,1,1,0,0,0,100,1,0,0,0,0,223234,20,1,0,0,60,120,0,1,152,1,3,16781464,0,0,0,0,0,30328,4,4,0,0); INSERT INTO `server_battle_commands` VALUES (27278,'feint',8,4,1,32,32,0,0,0,0,0,0,100,1,0,1,5,0,0,10,2,0,0,0,0,0,10,0,250,18,39,2,3,301998119,0,27272,0,1,100,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27308,'blizzard',22,4,256,32,32,0,0,0,100,1,0,0,25,0,228021,30,0.75,2,3000,10,90,0,1,502,1,3,16781814,0,0,0,0,0,30301,4,2,6,0); INSERT INTO `server_battle_commands` VALUES (27279,'full_thrust',8,38,128,32,32,0,0,0,0,0,0,100,1,0,1,5,0,0,10,2,0,0,0,0,0,30,0,250,18,1034,801,3,305271818,0,0,0,0,50,30301,2,1,2,0);
INSERT INTO `server_battle_commands` VALUES (27309,'blizzara',22,26,256,32,32,1,0,0,100,1,0,0,25,0,228011,30,0.75,0,0,40,150,0,1,506,1,3,16781818,0,0,0,0,0,30301,4,2,6,0); INSERT INTO `server_battle_commands` VALUES (27300,'dark_seal',22,14,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223229,30,1,0,0,90,0,0,14,518,2,3,234889734,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27310,'fire',22,10,3,32,32,1,0,0,100,1,0,0,25,0,0,0,0,2,3000,8,105,0,1,501,1,3,16781813,0,27311,0,1,0,30301,4,2,5,0); INSERT INTO `server_battle_commands` VALUES (27301,'resonance',22,22,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223230,30,1,0,0,90,0,0,14,669,2,3,234889885,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27311,'fira',22,34,3,32,32,1,0,0,100,1,0,0,25,0,0,0,0,2,5000,16,180,0,1,504,1,3,16781816,0,27312,0,2,0,30301,4,2,5,0); INSERT INTO `server_battle_commands` VALUES (27302,'excruciate',22,38,256,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223231,30,1,0,0,90,0,0,14,694,2,3,234889910,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27312,'firaga',22,50,256,32,32,1,0,0,100,1,0,0,25,0,0,0,0,2,8000,7,255,0,1,700,1,3,16782012,0,0,0,3,0,30301,4,2,5,0); INSERT INTO `server_battle_commands` VALUES (27303,'necrogenesis',22,6,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223232,30,1,0,0,90,0,0,14,695,2,3,234889911,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27313,'thunder',22,1,3,32,32,0,0,0,100,1,0,0,25,0,0,0,0,2,2000,6,75,0,1,503,1,3,16781815,0,27314,0,1,0,30301,4,2,9,0); INSERT INTO `server_battle_commands` VALUES (27304,'parsimony',22,2,256,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223233,30,1,0,0,90,0,0,14,568,2,3,234889784,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27314,'thundara',22,18,256,32,32,0,0,0,100,1,0,0,25,0,223015,4,0.75,0,0,30,135,0,1,508,1,3,16781820,0,27315,27316,2,0,30301,4,2,9,0); INSERT INTO `server_battle_commands` VALUES (27305,'convert',26,30,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,0,0,0,0,0,450,0,0,14,724,2,3,234889940,0,0,0,0,0,30101,3,0,0,0);
INSERT INTO `server_battle_commands` VALUES (27315,'thundaga',22,46,256,32,32,0,0,0,100,1,0,0,25,0,0,0,0,2,5000,45,195,0,1,509,1,3,16781821,0,0,0,3,0,30301,4,2,9,0); INSERT INTO `server_battle_commands` VALUES (27306,'sleep',22,42,256,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,228001,60,0.9,2,3000,0,75,0,1,651,1,3,16781963,0,0,0,0,0,30328,4,4,12,0);
INSERT INTO `server_battle_commands` VALUES (27316,'burst',26,50,0,32,32,0,0,0,100,1,0,0,25,0,0,0,0,2,4000,900,90,0,1,705,1,3,16782017,0,0,0,3,0,30301,4,2,9,0); INSERT INTO `server_battle_commands` VALUES (27307,'sanguine_rite',22,30,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223234,20,1,0,0,60,120,0,1,152,1,3,16781464,0,0,0,0,0,30328,4,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27317,'sleepga',26,45,0,32,32,1,8,0,100,1,0,0,25,0,228001,60,0.9,2,4000,0,100,0,1,704,1,3,16782016,0,0,0,0,0,30328,4,4,12,0); INSERT INTO `server_battle_commands` VALUES (27308,'blizzard',22,4,256,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,228021,30,0.75,2,3000,10,90,0,1,502,1,3,16781814,0,0,0,0,0,30301,4,2,6,0);
INSERT INTO `server_battle_commands` VALUES (27318,'flare',26,40,0,1,32,1,8,1,100,1,0,0,25,0,223262,30,0.75,2,8000,120,200,0,1,706,1,3,16782018,0,0,0,0,0,30301,4,2,5,0); INSERT INTO `server_battle_commands` VALUES (27309,'blizzara',22,26,256,32,32,1,8,0,0,0,0,100,1,0,0,20,0,0,10,2,228011,30,0.75,0,0,40,150,0,1,506,1,3,16781818,0,0,0,0,0,30301,4,2,6,0);
INSERT INTO `server_battle_commands` VALUES (27319,'freeze',26,35,0,32,32,0,0,0,100,1,0,0,25,0,0,0,0,2,5000,120,120,0,1,707,1,3,16782019,0,0,0,0,0,30301,4,2,6,0); INSERT INTO `server_battle_commands` VALUES (27310,'fire',22,10,3,32,32,1,8,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,2,3000,8,105,0,1,501,1,3,16781813,0,27311,0,1,0,30301,4,2,5,0);
INSERT INTO `server_battle_commands` VALUES (27340,'sacred_prism',23,34,3,1,1,0,0,0,100,1,0,0,0,0,223225,60,1,0,0,90,0,0,14,690,2,3,234889906,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27311,'fira',22,34,3,32,32,1,8,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,2,5000,16,180,0,1,504,1,3,16781816,0,27312,0,2,0,30301,4,2,5,0);
INSERT INTO `server_battle_commands` VALUES (27341,'shroud_of_saints',23,38,512,1,1,0,0,0,100,1,0,0,0,0,223226,20,1,0,0,180,0,0,14,691,2,3,234889907,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27312,'firaga',22,50,256,32,32,1,8,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,2,8000,7,255,0,1,700,1,3,16782012,0,0,0,3,0,30301,4,2,5,0);
INSERT INTO `server_battle_commands` VALUES (27342,'cleric_stance',23,10,512,1,1,0,0,0,100,1,0,0,0,0,223227,4294967295,1,0,0,30,0,0,14,692,2,3,234889908,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27313,'thunder',22,1,3,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,2,2000,6,75,0,1,503,1,3,16781815,0,27314,0,1,0,30301,4,2,9,0);
INSERT INTO `server_battle_commands` VALUES (27343,'blissful_mind',23,14,512,1,1,0,0,0,100,1,0,0,0,0,223228,4294967295,1,0,0,30,0,0,14,693,2,3,234889909,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27314,'thundara',22,18,256,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,223015,4,0.75,0,0,30,135,0,1,508,1,3,16781820,0,27315,27316,2,0,30301,4,2,9,0);
INSERT INTO `server_battle_commands` VALUES (27344,'presence_of_mind',27,30,0,1,1,0,0,0,100,1,0,0,0,0,223116,30,1,0,0,300,0,0,14,722,2,3,234889938,0,0,0,0,0,30328,3,4,0,0); INSERT INTO `server_battle_commands` VALUES (27315,'thundaga',22,46,256,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,2,5000,45,195,0,1,509,1,3,16781821,0,0,0,3,0,30301,4,2,9,0);
INSERT INTO `server_battle_commands` VALUES (27345,'benediction',27,50,0,1,5,1,20,1,100,1,0,0,0,0,0,0,0,0,0,900,0,0,14,723,2,3,234889939,0,0,0,0,0,30320,3,3,13,0); INSERT INTO `server_battle_commands` VALUES (27316,'burst',26,50,0,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,2,4000,900,90,0,1,705,1,3,16782017,0,0,0,3,0,30301,4,2,9,0);
INSERT INTO `server_battle_commands` VALUES (27346,'cure',23,2,3,9,9,0,0,0,100,1,0,0,25,0,0,0,0,3,2000,5,40,0,1,101,1,3,16781413,0,0,0,0,0,30320,4,3,13,0); INSERT INTO `server_battle_commands` VALUES (27317,'sleepga',26,45,0,32,32,1,8,0,0,0,0,100,1,0,0,20,0,0,10,2,228001,60,0.9,2,4000,0,100,0,1,704,1,3,16782016,0,0,0,0,0,30328,4,4,12,0);
INSERT INTO `server_battle_commands` VALUES (27347,'cura',23,30,512,9,9,0,0,0,100,1,0,0,25,0,0,0,0,3,2000,5,100,0,1,103,1,3,16781415,0,0,0,0,0,30320,4,3,13,0); INSERT INTO `server_battle_commands` VALUES (27318,'flare',26,40,0,1,32,1,8,0,0,0,1,100,1,0,0,20,0,0,10,2,223262,30,0.75,2,8000,120,200,0,1,706,1,3,16782018,0,0,0,0,0,30301,4,2,5,0);
INSERT INTO `server_battle_commands` VALUES (27348,'curaga',23,46,512,5,5,1,15,0,100,1,0,0,25,0,0,0,0,3,3000,10,150,0,1,146,1,3,16781458,0,0,0,0,0,30320,4,3,13,0); INSERT INTO `server_battle_commands` VALUES (27319,'freeze',26,35,0,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,2,5000,120,120,0,1,707,1,3,16782019,0,0,0,0,0,30301,4,2,6,0);
INSERT INTO `server_battle_commands` VALUES (27349,'raise',23,18,512,130,130,0,0,0,100,1,0,0,25,0,0,0,0,3,10000,300,150,0,1,148,1,3,16781460,0,0,0,0,0,30101,4,4,11,0); INSERT INTO `server_battle_commands` VALUES (27340,'sacred_prism',23,34,3,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223225,60,1,0,0,90,0,0,14,690,2,3,234889906,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27350,'stoneskin',23,26,3,9,9,0,0,0,100,1,0,0,25,0,223133,300,1,3,3000,30,50,0,1,133,1,3,16781445,0,0,0,0,0,30328,4,4,8,0); INSERT INTO `server_battle_commands` VALUES (27341,'shroud_of_saints',23,38,512,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223226,20,1,0,0,180,0,0,14,691,2,3,234889907,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27351,'protect',23,6,3,5,5,1,20,0,100,1,0,0,25,0,223129,300,1,3,3000,30,80,0,1,1085,1,3,16782397,0,0,0,0,0,30328,4,4,11,0); INSERT INTO `server_battle_commands` VALUES (27342,'cleric_stance',23,10,512,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223227,4294967295,1,0,0,30,0,0,14,692,2,3,234889908,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27352,'repose',23,50,0,32,32,0,0,0,100,1,0,0,25,0,228001,60,0.9,3,3000,0,80,0,1,151,1,3,16781463,0,0,0,0,0,30328,4,4,10,0); INSERT INTO `server_battle_commands` VALUES (27343,'blissful_mind',23,14,512,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223228,4294967295,1,0,0,30,0,0,14,693,2,3,234889909,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27353,'aero',23,4,3,32,32,0,0,0,100,1,0,0,25,0,223235,20,0.75,3,3000,6,75,0,1,510,1,3,16781822,0,27354,0,1,0,30301,4,2,7,0); INSERT INTO `server_battle_commands` VALUES (27344,'presence_of_mind',27,30,0,1,1,0,0,0,0,0,0,100,1,0,0,0,0,0,10,2,223116,30,1,0,0,300,0,0,14,722,2,3,234889938,0,0,0,0,0,30328,3,4,0,0);
INSERT INTO `server_battle_commands` VALUES (27354,'aerora',23,42,512,32,32,1,0,0,100,1,0,0,25,0,0,0,0,3,4000,20,150,0,1,511,1,3,16781823,0,0,0,2,0,30301,4,2,7,0); INSERT INTO `server_battle_commands` VALUES (27345,'benediction',27,50,0,1,5,1,20,0,0,0,1,100,1,0,0,0,0,0,10,2,0,0,0,0,0,900,0,0,14,723,2,3,234889939,0,0,0,0,0,30320,3,3,13,0);
INSERT INTO `server_battle_commands` VALUES (27355,'stone',23,1,3,32,32,0,0,0,100,1,0,0,25,0,223243,10,0.75,3,2000,6,75,0,1,513,1,3,16781825,0,27356,0,1,0,30301,4,2,8,0); INSERT INTO `server_battle_commands` VALUES (27346,'cure',23,2,3,9,9,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,3,2000,5,40,0,1,101,1,3,16781413,0,0,0,0,0,30320,4,3,13,0);
INSERT INTO `server_battle_commands` VALUES (27356,'stonera',23,22,512,32,32,1,0,0,100,1,0,0,25,0,228021,30,0.75,3,3000,30,150,0,1,514,1,3,16781826,0,0,0,2,0,30301,4,2,8,0); INSERT INTO `server_battle_commands` VALUES (27347,'cura',23,30,512,9,9,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,3,2000,5,100,0,1,103,1,3,16781415,0,0,0,0,0,30320,4,3,13,0);
INSERT INTO `server_battle_commands` VALUES (27357,'esuna',27,40,0,9,9,0,0,0,100,1,0,0,25,0,0,0,0,3,2000,10,40,0,1,702,1,3,16782014,0,0,0,0,0,30329,4,0,13,0); INSERT INTO `server_battle_commands` VALUES (27348,'curaga',23,46,512,5,5,1,15,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,3,3000,10,150,0,1,146,1,3,16781458,0,0,0,0,0,30320,4,3,13,0);
INSERT INTO `server_battle_commands` VALUES (27358,'regen',27,35,0,9,9,0,0,0,100,1,0,0,25,0,223180,45,1,3,2000,5,20,0,1,703,1,3,16782015,0,0,0,0,0,30328,4,4,13,0); INSERT INTO `server_battle_commands` VALUES (27349,'raise',23,18,512,130,130,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,3,10000,300,150,0,1,148,1,3,16781460,0,0,0,0,0,30101,4,4,11,0);
INSERT INTO `server_battle_commands` VALUES (27359,'holy',27,45,0,1,32,1,8,1,100,1,0,0,25,0,228011,10,0.9,0,0,300,100,0,1,708,1,3,16782020,0,0,0,0,0,30301,4,2,11,0); INSERT INTO `server_battle_commands` VALUES (27350,'stoneskin',23,26,3,9,9,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,223133,300,1,3,3000,30,50,0,1,133,1,3,16781445,0,0,0,0,0,30328,4,4,8,0);
INSERT INTO `server_battle_commands` VALUES (27351,'protect',23,6,3,5,5,1,20,0,0,0,0,100,1,0,0,20,0,0,10,2,223129,300,1,3,3000,30,80,0,1,1085,1,3,16782397,0,0,0,0,0,30328,4,4,11,0);
INSERT INTO `server_battle_commands` VALUES (27352,'repose',23,50,0,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,228001,60,0.9,3,3000,0,80,0,1,151,1,3,16781463,0,0,0,0,0,30328,4,4,10,0);
INSERT INTO `server_battle_commands` VALUES (27353,'aero',23,4,3,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,223235,20,0.75,3,3000,6,75,0,1,510,1,3,16781822,0,27354,0,1,0,30301,4,2,7,0);
INSERT INTO `server_battle_commands` VALUES (27354,'aerora',23,42,512,32,32,1,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,3,4000,20,150,0,1,511,1,3,16781823,0,0,0,2,0,30301,4,2,7,0);
INSERT INTO `server_battle_commands` VALUES (27355,'stone',23,1,3,32,32,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,223243,10,0.75,3,2000,6,75,0,1,513,1,3,16781825,0,27356,0,1,0,30301,4,2,8,0);
INSERT INTO `server_battle_commands` VALUES (27356,'stonera',23,22,512,32,32,1,0,0,0,0,0,100,1,0,0,20,0,0,10,2,228021,30,0.75,3,3000,30,150,0,1,514,1,3,16781826,0,0,0,2,0,30301,4,2,8,0);
INSERT INTO `server_battle_commands` VALUES (27357,'esuna',27,40,0,9,9,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,0,0,0,3,2000,10,40,0,1,702,1,3,16782014,0,0,0,0,0,30329,4,0,13,0);
INSERT INTO `server_battle_commands` VALUES (27358,'regen',27,35,0,9,9,0,0,0,0,0,0,100,1,0,0,20,0,0,10,2,223180,45,1,3,2000,5,20,0,1,703,1,3,16782015,0,0,0,0,0,30328,4,4,13,0);
INSERT INTO `server_battle_commands` VALUES (27359,'holy',27,45,0,1,32,1,8,0,0,0,1,100,1,0,0,0,0,0,10,2,228011,10,0.9,0,0,300,100,0,1,708,1,3,16782020,0,0,0,0,0,30301,4,2,11,0);
/*!40000 ALTER TABLE `server_battle_commands` ENABLE KEYS */; /*!40000 ALTER TABLE `server_battle_commands` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;
commit; commit;
@ -228,4 +243,4 @@ commit;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2018-05-31 11:16:20 -- Dump completed on 2018-07-02 0:22:43