diff --git a/FFXIVClassic Common Class Lib/Vector3.cs b/FFXIVClassic Common Class Lib/Vector3.cs index 863aeb69..58cb0d2a 100644 --- a/FFXIVClassic Common Class Lib/Vector3.cs +++ b/FFXIVClassic Common Class Lib/Vector3.cs @@ -78,8 +78,7 @@ namespace FFXIVClassic.Common public static float GetAngle(float x, float z, float x2, float z2) { - var angle = (float)(Math.Atan((z2 - z) / (x2 - x)) * - Math.PI); - return x > x2 ? angle + (float)Math.PI : angle; + return (float)(Math.Atan2((z2 - z), (x2 - x))); } public Vector3 NewHorizontalVector(float angle, float extents) diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 04cf5c4c..4c8303a4 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -1343,7 +1343,7 @@ namespace FFXIVClassic_Map_Server player.charaWork.parameterSave.commandSlot_recastTime[index - player.charaWork.commandBorder] = reader.GetUInt32(2); //Recast timer - BattleCommand ability = Server.GetWorldManager().GetAbility((ushort)(trueCommandId ^ 2700083200)); + BattleCommand ability = Server.GetWorldManager().GetBattleCommand((ushort)(trueCommandId ^ 2700083200)); player.charaWork.parameterTemp.maxCommandRecastTime[index - player.charaWork.commandBorder] = (ushort) (ability != null ? ability.recastTimeSeconds : 1); //Previous recast timer player.charaWork.parameterSave.commandSlot_recastTime[index - player.charaWork.commandBorder] = reader.GetUInt32(2); @@ -2085,7 +2085,7 @@ namespace FFXIVClassic_Map_Server { conn.Open(); - var query = @"SELECT id, name, flags, overwrite FROM status_effects;"; + var query = @"SELECT id, name, flags, overwrite FROM server_statuseffects;"; MySqlCommand cmd = new MySqlCommand(query, conn); @@ -2093,10 +2093,10 @@ namespace FFXIVClassic_Map_Server { while (reader.Read()) { - var id = reader.GetUInt32(0); - var name = reader.GetString(1); - var flags = reader.GetUInt32(2); - var overwrite = reader.GetUInt32(3); + var id = reader.GetUInt32("id"); + var name = reader.GetString("name"); + var flags = reader.GetUInt32("flags"); + var overwrite = reader.GetByte("overwrite"); var effect = new StatusEffect(id, name, flags, overwrite); effects.Add(id, effect); @@ -2160,7 +2160,7 @@ namespace FFXIVClassic_Map_Server conn.Open(); var query = ("SELECT `id`, name, classJob, lvl, requirements, validTarget, aoeType, numHits, positionBonus, procRequirement, `range`, buffDuration, debuffDuration, " + - "castType, castTime, recastTime, mpCost, tpCost, animationType, effectAnimation, modelAnimation, animationDuration, aoeRange FROM battle_commands;"); + "castType, castTime, recastTime, mpCost, tpCost, animationType, effectAnimation, modelAnimation, animationDuration, aoeRange FROM server_battle_commands;"); MySqlCommand cmd = new MySqlCommand(query, conn); diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index cc01b26e..d1234872 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -55,7 +55,7 @@ namespace FFXIVClassic_Map_Server mWorldManager.LoadSpawnLocations(); mWorldManager.SpawnAllActors(); mWorldManager.LoadStatusEffects(); - mWorldManager.LoadAbilities(); + mWorldManager.LoadBattleCommands(); mWorldManager.StartZoneThread(); IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(ConfigConstants.OPTIONS_BINDIP), int.Parse(ConfigConstants.OPTIONS_PORT)); diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index 0ee0258c..ba77904b 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -36,8 +36,8 @@ namespace FFXIVClassic_Map_Server private Dictionary zoneEntranceList; private Dictionary actorClasses = new Dictionary(); private Dictionary currentPlayerParties = new Dictionary(); //GroupId, Party object - private Dictionary effectList = new Dictionary(); - private Dictionary abilityList = new Dictionary(); + private Dictionary statusEffectList = new Dictionary(); + private Dictionary battleCommandList = new Dictionary(); private Server mServer; @@ -1141,25 +1141,25 @@ namespace FFXIVClassic_Map_Server } public void LoadStatusEffects() { - effectList = Database.LoadGlobalStatusEffectList(); + statusEffectList = Database.LoadGlobalStatusEffectList(); } public StatusEffect GetStatusEffect(uint id) { - StatusEffect effect; + StatusEffect statusEffect; - return effectList.TryGetValue(id, out effect) ? new StatusEffect(null, effect) : null; + return statusEffectList.TryGetValue(id, out statusEffect) ? new StatusEffect(null, statusEffect) : null; } - public void LoadAbilities() + public void LoadBattleCommands() { - abilityList = Database.LoadGlobalBattleCommandList(); + battleCommandList = Database.LoadGlobalBattleCommandList(); } - public BattleCommand GetAbility(uint id) + public BattleCommand GetBattleCommand(uint id) { - BattleCommand ability; - return abilityList.TryGetValue((ushort)id, out ability) ? ability.Clone() : null; + BattleCommand battleCommand; + return battleCommandList.TryGetValue((ushort)id, out battleCommand) ? battleCommand.Clone() : null; } } } diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index d5827f38..a1ad8ce7 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -613,21 +613,6 @@ namespace FFXIVClassic_Map_Server.Actors return zoneId; } - // todo: do this properly - public bool IsFacing(float x, float z) - { - var rot1 = this.rotation; - - var dX = this.positionX - x; - var dY = this.positionZ - z; - - var rot2 = Math.Atan2(dY, dX); - - var dRot = Math.PI - rot2 + Math.PI / 2; - - return rot1 == (float)dRot; - } - public void LookAt(Actor actor) { if (actor != null) @@ -667,7 +652,7 @@ namespace FFXIVClassic_Map_Server.Actors public bool IsFacing(float x, float z, float angle = 40.0f) { angle = (float)(Math.PI * angle / 180); - return Vector3.GetAngle(positionX, positionZ, x, z) <= angle; + return Vector3.GetAngle(positionX, positionZ, x, z) < angle; } // todo: is this legit? @@ -725,31 +710,6 @@ namespace FFXIVClassic_Map_Server.Actors } #endregion - public Player GetAsPlayer() - { - return currentSubState == SetActorStatePacket.SUB_STATE_PLAYER && this is Player ? ((Player)this) : null; - } - - public BattleNpc GetAsMob() - { - return currentSubState == SetActorStatePacket.SUB_STATE_MONSTER && this is BattleNpc ? ((BattleNpc)this) : null; - } - - public Npc GetAsNpc() - { - return currentSubState != SetActorStatePacket.SUB_STATE_PLAYER && this is Npc ? ((Npc)this) : null; - } - - public Actor GetAsActor() - { - return this is Actor ? ((Actor)this) : null; - } - - public Character GetAsCharacter() - { - return this is Character ? ((Character)this) : null; - } - public SubPacket CreateGameMessagePacket(Actor textIdOwner, ushort textId, byte log, params object[] msgParams) { if (msgParams == null || msgParams.Length == 0) diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs index 3356241d..7e86146a 100644 --- a/FFXIVClassic Map Server/actors/area/Area.cs +++ b/FFXIVClassic Map Server/actors/area/Area.cs @@ -15,6 +15,7 @@ using System.Threading.Tasks; using FFXIVClassic_Map_Server.packets.send; using FFXIVClassic_Map_Server.actors.group; using FFXIVClassic_Map_Server.actors.director; +using FFXIVClassic_Map_Server.actors.chara.ai.controllers; namespace FFXIVClassic_Map_Server.Actors { diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 8a066ce4..8862a8f5 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -12,6 +12,7 @@ using FFXIVClassic_Map_Server.actors.chara; using FFXIVClassic_Map_Server.packets.send.actor.battle; using FFXIVClassic_Map_Server.packets.send; using FFXIVClassic_Map_Server.actors.chara.ai.state; +using FFXIVClassic_Map_Server.actors.chara.ai.utils; namespace FFXIVClassic_Map_Server.Actors { @@ -499,22 +500,33 @@ namespace FFXIVClassic_Map_Server.Actors return moveSpeeds[2] + GetMod((uint)Modifier.Speed); } - public virtual void OnAttack(State state, BattleAction action) + public virtual void OnAttack(State state, BattleAction action, ref SubPacket errorPacket) + { + // todo: change animation based on equipped weapon + action.effectId |= (uint)HitEffect.HitVisual1; // melee + + var target = state.GetTarget(); + // todo: get hitrate and shit, handle protect effect and whatever + if (BattleUtils.TryAttack(this, target, action, ref errorPacket)) + { + action.amount = BattleUtils.CalculateAttackDamage(this, target, action); + //var packet = BattleActionX01Packet.BuildPacket(owner.actorId, owner.actorId, target.actorId, (uint)0x19001000, (uint)0x8000604, (ushort)0x765D, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, (byte)0x1); + } + + target.DelHP(action.amount); + } + + public virtual void OnCast(State state, BattleAction action, ref SubPacket errorPacket) { } - public virtual void OnCast(State state, BattleAction action) + public virtual void OnWeaponSkill(State state, BattleAction action, ref SubPacket errorPacket) { } - public virtual void OnWeaponSkill(State state, BattleAction action) - { - - } - - public virtual void OnAbility(State state, BattleAction action) + public virtual void OnAbility(State state, BattleAction action, ref SubPacket errorPacket) { } diff --git a/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs b/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs index 07a260b0..50b0bc40 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs @@ -126,7 +126,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai public void ChangeState(State state) { - if (GetCurrentState() != null) + if (CanChangeState()) { if (states.Count <= 10) { diff --git a/FFXIVClassic Map Server/actors/chara/ai/PathFind.cs b/FFXIVClassic Map Server/actors/chara/ai/PathFind.cs index e99f7fba..250f6ca6 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/PathFind.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/PathFind.cs @@ -139,6 +139,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai } else { + distanceFromPoint = 0; return true; } diff --git a/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs b/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs index a131f181..336d32af 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs @@ -22,7 +22,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers private DateTime waitTime; private bool firstSpell = true; - private DateTime lastRoamScript; // todo: what even is this used as + private DateTime lastRoamUpdate; private new BattleNpc owner; public BattleNpcController(BattleNpc owner) : @@ -76,7 +76,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers // todo: too far, path to player if mob, message if player // owner.ResetMoveSpeeds(); owner.moveState = 2; - if (owner.currentSubState == SetActorStatePacket.SUB_STATE_MONSTER && owner.moveSpeeds[1] != 0) + if (owner.currentSubState == SetActorStatePacket.SUB_STATE_MONSTER && owner.GetSpeed() != 0) { // todo: actual stat based range if (Utils.Distance(owner.positionX, owner.positionY, owner.positionZ, target.positionX, target.positionY, target.positionZ) > 10) @@ -106,6 +106,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers // todo: lastActionTime = lastUpdate.AddSeconds(5); owner.isMovingToSpawn = true; + owner.aiContainer.pathFind.SetPathFlags(PathFindFlags.None); + owner.aiContainer.pathFind.PreparePath(owner.spawnX, owner.spawnY, owner.spawnZ, 1.5f, 10); neutralTime = lastActionTime; owner.hateContainer.ClearHate(); owner.moveState = 1; @@ -147,7 +149,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers if (tick >= waitTime) { // todo: aggro cooldown - neutralTime = tick.AddSeconds(5); + neutralTime = tick.AddSeconds(3); if (owner.aiContainer.pathFind.IsFollowingPath()) { owner.aiContainer.pathFind.FollowPath(); @@ -157,8 +159,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers { if (tick >= lastActionTime) { - var battlenpc = owner as BattleNpc; - owner.aiContainer.pathFind.PathInRange(battlenpc.spawnX, battlenpc.spawnY, battlenpc.spawnZ, 1.5f, 15.0f); + } } // todo: @@ -166,6 +167,28 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers owner.OnRoam(tick); } + if (tick >= lastRoamUpdate && !owner.aiContainer.pathFind.IsFollowingPath()) + { + // will move on next tick + owner.aiContainer.pathFind.SetPathFlags(PathFindFlags.None); + owner.aiContainer.pathFind.PathInRange(owner.spawnX, owner.spawnY, owner.spawnZ, 1.5f, 20.0f); + } + + + if (tick >= neutralTime) + { + foreach (var player in owner.zone.GetActorsAroundActor(owner, 50)) + { + if (!owner.isMovingToSpawn && owner.aiContainer.pathFind.AtPoint() && owner.aggroType != AggroType.None) + { + uint levelDifference = (uint)Math.Abs(owner.charaWork.parameterSave.state_mainSkillLevel - ((Player)player).charaWork.parameterSave.state_mainSkillLevel); + + if (levelDifference < 10 || (owner.aggroType & AggroType.IgnoreLevelDifference) != 0 && ((BattleNpcController)owner.aiContainer.GetController()).CanAggroTarget((Player)player)) + owner.hateContainer.AddBaseHate((Player)player); + } + } + } + if (owner.aiContainer.pathFind.IsFollowingPath()) { owner.aiContainer.pathFind.FollowPath(); @@ -223,7 +246,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers continue; float mobDistance = Utils.Distance(owner.positionX, owner.positionY, owner.positionZ, chara.positionX, chara.positionY, chara.positionZ); - if (mobDistance < 0.90f && (chara.updateFlags & ActorUpdateFlags.Position) == 0) + if (mobDistance < 0.70f && (chara.updateFlags & ActorUpdateFlags.Position) == 0) { owner.aiContainer.pathFind.PathInRange(targetPos, 1.3f, 1.8f); break; diff --git a/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs b/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs index 647b9340..25267f68 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs @@ -88,14 +88,38 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state { // todo: possible underflow BattleAction action = new BattleAction(); - //var packet = BattleActionX01Packet.BuildPacket(owner.actorId, owner.actorId, target.actorId, (uint)0x19001000, (uint)0x8000604, (ushort)0x765D, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, (byte)0x1); + errorPacket = null; + //var packet = BattleActionX01Packet.BuildPacket(owner.actorId, owner.actorId, target.actorId, (uint)0x19001000, (uint)0x8000604, (ushort)0x765D, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, (byte)0x1); + action.animation = 0x19001000; action.targetId = target.actorId; action.effectId = (uint)HitEffect.Hit; action.worldMasterTextId = 0x765D; - action.param = 1; // todo: hit effect doesnt display without this? - owner.OnAttack(this, action); - //this.errorPacket = BattleActionX01Packet.BuildPacket(target.actorId, owner.actorId, target.actorId, 0, effectId, 0, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, 0); + action.param = (byte)HitDirection.None; // HitDirection (auto attack shouldnt need this afaik) + + // todo: implement auto attack damage bonus in Character.OnAttack + /* + ≪Auto-attack Damage Bonus≫ + Class Bonus 1 Bonus 2 + Pugilist Intelligence Strength + Gladiator Mind Strength + Marauder Vitality Strength + Archer Dexterity Piety + Lancer Piety Strength + Conjurer Mind Piety + Thaumaturge Mind Piety + * The above damage bonus also applies to “Shot” attacks by archers. + */ + + owner.OnAttack(this, action, ref errorPacket); + // handle paralyze/intimidate/sleep/whatever in character thing + if (errorPacket == null) + owner.zone.BroadcastPacketAroundActor(owner, BattleActionX01Packet.BuildPacket(owner.actorId, owner.actorId, action.targetId, action.animation, + 0x8000000 | action.effectId, action.worldMasterTextId, (ushort)BattleActionX01PacketCommand.Attack, action.amount, action.param) + ); + else + owner.zone.BroadcastPacketAroundActor(owner, errorPacket); + //this.errorPacket = BattleActionX01Packet.BuildPacket(target.actorId, owner.actorId, target.actorId, 0, effectId, 0, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, 0); } public override void TryInterrupt() @@ -104,14 +128,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state { // todo: sometimes paralyze can let you attack, get random percentage of actually letting you attack var list = owner.statusEffects.GetStatusEffectsByFlag((uint)StatusEffectFlags.PreventAction); - uint effectId = 0; + uint statusId = 0; if (list.Count > 0) { // todo: actually check proc rate/random chance of whatever effect - effectId = list[0].GetStatusEffectId(); + statusId = list[0].GetStatusId(); } // todo: which is actually the swing packet - //this.errorPacket = BattleActionX01Packet.BuildPacket(target.actorId, owner.actorId, target.actorId, 0, effectId, 0, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, 0); + //this.errorPacket = BattleActionX01Packet.BuildPacket(target.actorId, owner.actorId, target.actorId, 0, statusId, 0, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, 0); //owner.zone.BroadcastPacketAroundActor(owner, errorPacket); //errorPacket = null; interrupt = true; @@ -135,6 +159,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state // todo: shouldnt need to check if owner is dead since all states would be cleared if (owner.aiContainer.IsDead() || target.aiContainer.IsDead()) { + target = null; return false; } else if (!owner.aiContainer.GetTargetFind().CanTarget(target, false, true)) diff --git a/FFXIVClassic Map Server/actors/chara/ai/state/MagicState.cs b/FFXIVClassic Map Server/actors/chara/ai/state/MagicState.cs index f1fc901c..5409f089 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/state/MagicState.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/state/MagicState.cs @@ -24,7 +24,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state this.startPos = owner.GetPosAsVector3(); this.startTime = DateTime.Now; // todo: lookup spell from global table - this.spell = Server.GetWorldManager().GetAbility(spellId); + this.spell = Server.GetWorldManager().GetBattleCommand(spellId); var returnCode = lua.LuaEngine.CallLuaBattleCommandFunction(owner, spell, "magic", "onMagicPrepare", owner, target, spell); // todo: check recast @@ -125,20 +125,21 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state { var action = new BattleAction(); action.effectId = spell.effectAnimation; - action.param = 1; + action.param = (byte)HitDirection.None; // HitDirection (magic shouldnt need this afaik) action.unknown = 1; action.targetId = chara.actorId; action.worldMasterTextId = spell.worldMasterTextId; + action.animation = spell.battleAnimation; action.amount = (ushort)lua.LuaEngine.CallLuaBattleCommandFunction(owner, spell, "magic", "onMagicFinish", owner, chara, spell, action); actions[i++] = action; //packets.Add(BattleActionX01Packet.BuildPacket(chara.actorId, owner.actorId, action.targetId, spell.battleAnimation, action.effectId, action.worldMasterTextId, spell.id, action.amount, action.param)); } owner.zone.BroadcastPacketAroundActor(owner, - spell.aoeType != TargetFindAOEType.None ? (BattleActionX10Packet.BuildPacket(owner.target.actorId, owner.actorId, spell.battleAnimation, spell.id, actions)) : + spell.aoeType != TargetFindAOEType.None ? (BattleActionX10Packet.BuildPacket(owner.actorId, owner.actorId, actions[0].animation, spell.id, actions)) : BattleActionX01Packet.BuildPacket(owner.actorId, owner.actorId, target.actorId, spell.battleAnimation, actions[0].effectId, actions[0].worldMasterTextId, spell.id, actions[0].amount, actions[0].param) ); - owner.zone.BroadcastPacketsAroundActor(owner, packets); + //owner.zone.BroadcastPacketsAroundActor(owner, packets); } public override void TryInterrupt() diff --git a/FFXIVClassic Map Server/actors/chara/ai/state/WeaponSkillState.cs b/FFXIVClassic Map Server/actors/chara/ai/state/WeaponSkillState.cs index 33fa704b..b8bca65f 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/state/WeaponSkillState.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/state/WeaponSkillState.cs @@ -21,7 +21,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state { this.startTime = DateTime.Now; // todo: lookup skill from global table - this.skill = Server.GetWorldManager().GetAbility(skillId); + this.skill = Server.GetWorldManager().GetBattleCommand(skillId); var returnCode = lua.LuaEngine.CallLuaBattleCommandFunction(owner, skill, "weaponskill", "onSkillPrepare", owner, target, skill); // todo: check recast @@ -109,10 +109,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state { var action = new BattleAction(); action.effectId = (uint)HitEffect.Hit; - action.param = 1; + action.param = 1; // HitDirection action.unknown = 1; action.targetId = chara.actorId; action.worldMasterTextId = skill.worldMasterTextId; + action.animation = skill.battleAnimation; // evasion, miss, dodge, etc to be handled in script, calling helpers from scripts/weaponskills.lua action.amount = (ushort)lua.LuaEngine.CallLuaBattleCommandFunction(owner, skill, "weaponskill", "onSkillFinish", owner, target, skill, action); actions[i++] = action; @@ -121,7 +122,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state } owner.zone.BroadcastPacketAroundActor(owner, - skill.aoeType != TargetFindAOEType.None ? (BattleActionX10Packet.BuildPacket(owner.target.actorId, owner.actorId, skill.battleAnimation, skill.id, actions)) : + skill.aoeType != TargetFindAOEType.None ? (BattleActionX10Packet.BuildPacket(owner.target.actorId, owner.actorId, actions[0].animation, skill.id, actions)) : BattleActionX01Packet.BuildPacket(owner.actorId, owner.actorId, target.actorId, skill.battleAnimation, actions[0].effectId, actions[0].worldMasterTextId, skill.id, actions[0].amount, actions[0].param) ); } diff --git a/FFXIVClassic Map Server/actors/chara/ai/utils/BattleUtils.cs b/FFXIVClassic Map Server/actors/chara/ai/utils/BattleUtils.cs index d1117348..a5b5f09c 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/utils/BattleUtils.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/utils/BattleUtils.cs @@ -7,16 +7,17 @@ using System.Threading.Tasks; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server.packets.send.actor.battle; +using FFXIVClassic.Common; namespace FFXIVClassic_Map_Server.actors.chara.ai.utils { static class BattleUtils { - public static void TryAttack(Character attacker, Character defender, BattleAction action) + public static bool TryAttack(Character attacker, Character defender, BattleAction action, ref SubPacket errorPacket) { // todo: get hit rate, hit count, set hit effect action.effectId |= (uint)(HitEffect.RecoilLv2 | HitEffect.Hit | HitEffect.HitVisual1); - + return true; } public static ushort CalculateAttackDamage(Character attacker, Character defender, BattleAction action) @@ -40,6 +41,17 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.utils return damage; } + public static ushort GetCriticalHitDamage(Character attacker, Character defender, BattleAction action) + { + ushort damage = action.amount; + + // todo: + // + // action.effectId |= (uint)HitEffect.Critical; + // + return damage; + } + public static ushort CalculateSpellDamage(Character attacker, Character defender, BattleAction action) { ushort damage = 0; diff --git a/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs b/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs index f32dce66..7b1d375a 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs @@ -65,6 +65,16 @@ namespace FFXIVClassic_Map_Server.Actors CalculateBaseStats(); } + public uint GetAggroType() + { + return (uint)aggroType; + } + + public void SetAggroType(uint aggroType) + { + this.aggroType = (AggroType)aggroType; + } + public override void Update(DateTime tick) { this.aiContainer.Update(tick); @@ -137,6 +147,7 @@ namespace FFXIVClassic_Map_Server.Actors this.isMovingToSpawn = false; this.ResetMoveSpeeds(); + this.hateContainer.ClearHate(); this.ChangeState(SetActorStatePacket.MAIN_STATE_PASSIVE); } @@ -145,11 +156,14 @@ namespace FFXIVClassic_Map_Server.Actors if (IsAlive()) { aiContainer.InternalDie(tick, despawnTime); + aiContainer.pathFind.Clear(); this.ResetMoveSpeeds(); this.positionX = oldPositionX; this.positionY = oldPositionY; this.positionZ = oldPositionZ; + + this.isAtSpawn = true; } else @@ -176,25 +190,13 @@ namespace FFXIVClassic_Map_Server.Actors else { if (target == null && !aiContainer.pathFind.IsFollowingPath()) - aiContainer.pathFind.PathInRange(spawnX, spawnY, spawnZ, 1.0f, 15.0f); + aiContainer.pathFind.PathInRange(spawnX, spawnY, spawnZ, 1.5f, 15.0f); } } else { this.isMovingToSpawn = false; } - - // dont bother checking for any in-range players if going back to spawn - if (!this.isMovingToSpawn && this.aiContainer.pathFind.AtPoint() && this.aggroType != AggroType.None) - { - foreach (var player in zone.GetActorsAroundActor(this, 50)) - { - uint levelDifference = (uint)Math.Abs(this.charaWork.parameterSave.state_mainSkillLevel - player.charaWork.parameterSave.state_mainSkillLevel); - - if (levelDifference < 10 && ((BattleNpcController)aiContainer.GetController()).CanAggroTarget(player)) - hateContainer.AddBaseHate(player); - } - } } public bool IsCloseToSpawn() @@ -202,17 +204,9 @@ namespace FFXIVClassic_Map_Server.Actors return this.isAtSpawn = Utils.DistanceSquared(positionX, positionY, positionZ, spawnX, spawnY, spawnZ) <= 2500.0f; } - public override void OnAttack(State state, BattleAction action) + public override void OnAttack(State state, BattleAction action, ref SubPacket errorPacket) { - // player melee animation - uint battleAnimation = 0x19001000; - // todo: get hitrate and shit, handle protect effect and whatever - BattleUtils.TryAttack(this, state.GetTarget(), action); - - zone.BroadcastPacketAroundActor(this, - BattleActionX01Packet.BuildPacket(actorId, actorId, target.actorId, (uint)battleAnimation, - (uint)action.effectId, (ushort)action.worldMasterTextId, (ushort)BattleActionX01PacketCommand.Attack, (ushort)action.amount, (byte)action.param) - ); + base.OnAttack(state, action, ref errorPacket); } } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index b0bfd30b..f40c112f 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1894,7 +1894,7 @@ namespace FFXIVClassic_Map_Server.Actors charaWork.commandCategory[trueHotbarSlot] = 1; //Set recast time - ushort maxRecastTime = (ushort)Server.GetWorldManager().GetAbility(commandId).recastTimeSeconds; + ushort maxRecastTime = (ushort)Server.GetWorldManager().GetBattleCommand(commandId).recastTimeSeconds; uint recastEnd = Utils.UnixTimeStampUTC() + maxRecastTime; charaWork.parameterTemp.maxCommandRecastTime[trueHotbarSlot - charaWork.commandBorder] = maxRecastTime; charaWork.parameterSave.commandSlot_recastTime[trueHotbarSlot - charaWork.commandBorder] = recastEnd; @@ -2064,23 +2064,20 @@ namespace FFXIVClassic_Map_Server.Actors return true; } - public override void OnAttack(State state, BattleAction action) + public override void OnAttack(State state, BattleAction action, ref SubPacket errorPacket) { - // melee attack animation - uint battleAnimation = 0x19001000; - - // todo: change animation based on equipped weapon - action.effectId |= (uint)HitEffect.HitVisual1; // melee - - // todo: get hitrate and shit, handle protect effect and whatever - BattleUtils.TryAttack(this, state.GetTarget(), action); - action.amount = BattleUtils.CalculateAttackDamage(this, state.GetTarget(), action); - //var packet = BattleActionX01Packet.BuildPacket(owner.actorId, owner.actorId, target.actorId, (uint)0x19001000, (uint)0x8000604, (ushort)0x765D, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, (byte)0x1); - - zone.BroadcastPacketAroundActor(this, BattleActionX01Packet.BuildPacket(actorId, actorId, action.targetId, (uint)battleAnimation, - 0x8000000 | action.effectId, (ushort)action.worldMasterTextId, (ushort)BattleActionX01PacketCommand.Attack, (ushort)action.amount, (byte)action.param) - ); + base.OnAttack(state, action, ref errorPacket); + if (errorPacket == null) + { + // melee attack animation + action.animation = 0x19001000; + } + var target = state.GetTarget(); + //if (target is BattleNpc) + { + ((BattleNpc)target).hateContainer.UpdateHate(this, action.amount); + } } } } diff --git a/FFXIVClassic Map Server/dataobjects/Session.cs b/FFXIVClassic Map Server/dataobjects/Session.cs index 1083951e..5c72cabc 100644 --- a/FFXIVClassic Map Server/dataobjects/Session.cs +++ b/FFXIVClassic Map Server/dataobjects/Session.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using FFXIVClassic_Map_Server.actors.chara.ai.controllers; namespace FFXIVClassic_Map_Server.dataobjects { diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs index e1958bf9..6973b0bc 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs @@ -1,7 +1,102 @@ using FFXIVClassic.Common; +using System; namespace FFXIVClassic_Map_Server.packets.send.actor.battle { + //These flags can be stacked and mixed, but the client will prioritize certain flags over others. + [Flags] + public enum HitEffect : uint + { + //Not setting RecoilLv2 or RecoilLv3 results in the weaker RecoilLv1. + //These are the recoil animations that play on the target, ranging from weak to strong. + //The recoil that gets set was likely based on the percentage of HP lost from the attack. + RecoilLv1 = 0, + RecoilLv2 = 1 << 0, + RecoilLv3 = 1 << 1, + + //Setting both recoil flags triggers the "Critical!" pop-up text and hit visual effect. + CriticalHit = RecoilLv2 | RecoilLv3, + + //Hit visual and sound effects when connecting with the target. + //Mixing these flags together will yield different results. + //Each visual likely relates to a specific weapon. + //Ex: HitVisual4 flag alone appears to be the visual and sound effect for hand-to-hand attacks. + HitVisual1 = 1 << 2, + HitVisual2 = 1 << 3, + HitVisual3 = 1 << 4, + HitVisual4 = 1 << 5, + + //An additional visual effect that plays on the target when attacked if: + //The attack is physical and they have the protect buff on. + //The attack is magical and they have the shell buff on. + //Special Note: Shell was removed in later versions of the game. + //Another effect plays when both Protect and Shell flags are activated. + //Not sure what this effect is. + //Random guess: if the attack was a hybrid of both physical and magical and the target had both Protect and Shell buffs applied. + Protect = 1 << 6, + Shell = 1 << 7, + ProtectShellSpecial = Protect | Shell, + + //Unknown = 1 << 8, -- Not sure what this flag does. + + //If only HitEffect1 is set out of the hit effects, the "Evade!" pop-up text triggers along with the evade visual. + //If no hit effects are set, the "Miss!" pop-up is triggered and no hit visual is played. + HitEffect1 = 1 << 9, + HitEffect2 = 1 << 10, //Plays the standard hit visual effect, but with no sound if used alone. + Hit = HitEffect1 | HitEffect2, //A standard hit effect with sound effect. + HitEffect3 = 1 << 11, + HitEffect4 = 1 << 12, + HitEffect5 = 1 << 13, + GustyHitEffect = HitEffect3 | HitEffect2, + GreenTintedHitEffect = HitEffect4 | HitEffect1, + + //Knocks you back away from the attacker. + KnockbackLv1 = HitEffect4 | HitEffect2 | HitEffect1, + KnockbackLv2 = HitEffect4 | HitEffect3, + KnockbackLv3 = HitEffect4 | HitEffect3 | HitEffect1, + KnockbackLv4 = HitEffect4 | HitEffect3 | HitEffect2, + KnockbackLv5 = HitEffect4 | HitEffect3 | HitEffect2 | HitEffect1, + + //Knocks you away from the attacker in a counter-clockwise direction. + KnockbackCounterClockwiseLv1 = HitEffect5, + KnockbackCounterClockwiseLv2 = HitEffect5 | HitEffect1, + + //Knocks you away from the attacker in a clockwise direction. + KnockbackClockwiseLv1 = HitEffect5 | HitEffect2, + KnockbackClockwiseLv2 = HitEffect5 | HitEffect2 | HitEffect1, + + //Completely drags target to the attacker, even across large distances. + DrawIn = HitEffect5 | HitEffect3, + + //An additional visual effect that plays on the target based on according buff. + UnknownShieldEffect = HitEffect5 | HitEffect4, + Stoneskin = HitEffect5 | HitEffect4 | HitEffect1, + + //Unknown = 1 << 14, -- Not sure what this flag does; might be another HitEffect. + + //A special effect when performing appropriate skill combos in succession. + //Ex: Thunder (SkillCombo1 Effect) -> Thundara (SkillCombo2 Effect) -> Thundaga (SkillCombo3 Effect) + //Special Note: SkillCombo4 was never actually used in 1.0 since combos only chained up to 3 times maximum. + SkillCombo1 = 1 << 15, + SkillCombo2 = 1 << 16, + SkillCombo3 = SkillCombo1 | SkillCombo2, + SkillCombo4 = 1 << 17 + + //Flags beyond here are unknown/untested. + } + + //Mixing some of these flags will cause the client to crash. + //Setting a flag higher than Left (0x10-0x80) will cause the client to crash. + [Flags] + public enum HitDirection : byte + { + None = 0, + Front = 1 << 0, + Right = 1 << 1, + Rear = 1 << 2, + Left = 1 << 3 + } + class BattleAction { public uint targetId; @@ -10,5 +105,10 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.battle public uint effectId; public byte param; public byte unknown; + + /// + /// this field is not actually part of the packet struct + /// + public uint animation; } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs index 79d35989..de771305 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs @@ -11,88 +11,6 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.battle Attack = 22104, } - //These flags can be stacked and mixed, but the client will prioritize certain flags over others. - [Flags] - public enum HitEffect : uint - { - //Not setting RecoilLv2 or RecoilLv3 results in the weaker RecoilLv1. - //These are the recoil animations that play on the target, ranging from weak to strong. - //The recoil that gets set was likely based on the percentage of HP lost from the attack. - RecoilLv1 = 0, - RecoilLv2 = 1 << 0, - RecoilLv3 = 1 << 1, - - //Setting both recoil flags triggers the "Critical!" pop-up text and hit visual effect. - CriticalHit = RecoilLv2 | RecoilLv3, - - //Hit visual and sound effects when connecting with the target. - //Mixing these flags together will yield different results. - //Each visual likely relates to a specific weapon. - //Ex: HitVisual4 flag alone appears to be the visual and sound effect for hand-to-hand attacks. - HitVisual1 = 1 << 2, - HitVisual2 = 1 << 3, - HitVisual3 = 1 << 4, - HitVisual4 = 1 << 5, - - //An additional visual effect that plays on the target when attacked if: - //The attack is physical and they have the protect buff on. - //The attack is magical and they have the shell buff on. - //Special Note: Shell was removed in later versions of the game. - //Another effect plays when both Protect and Shell flags are activated. - //Not sure what this effect is. - //Random guess: if the attack was a hybrid of both physical and magical and the target had both Protect and Shell buffs applied. - Protect = 1 << 6, - Shell = 1 << 7, - ProtectShellSpecial = Protect | Shell, - - //Unknown = 1 << 8, -- Not sure what this flag does. - - //If only HitEffect1 is set out of the hit effects, the "Evade!" pop-up text triggers along with the evade visual. - //If no hit effects are set, the "Miss!" pop-up is triggered and no hit visual is played. - HitEffect1 = 1 << 9, - HitEffect2 = 1 << 10, //Plays the standard hit visual effect, but with no sound if used alone. - Hit = HitEffect1 | HitEffect2, //A standard hit effect with sound effect. - HitEffect3 = 1 << 11, - HitEffect4 = 1 << 12, - HitEffect5 = 1 << 13, - GustyHitEffect = HitEffect3 | HitEffect2, - GreenTintedHitEffect = HitEffect4 | HitEffect1, - - //Knocks you back away from the attacker. - KnockbackLv1 = HitEffect4 | HitEffect2 | HitEffect1, - KnockbackLv2 = HitEffect4 | HitEffect3, - KnockbackLv3 = HitEffect4 | HitEffect3 | HitEffect1, - KnockbackLv4 = HitEffect4 | HitEffect3 | HitEffect2, - KnockbackLv5 = HitEffect4 | HitEffect3 | HitEffect2 | HitEffect1, - - //Knocks you away from the attacker in a counter-clockwise direction. - KnockbackCounterClockwiseLv1 = HitEffect5, - KnockbackCounterClockwiseLv2 = HitEffect5 | HitEffect1, - - //Knocks you away from the attacker in a clockwise direction. - KnockbackClockwiseLv1 = HitEffect5 | HitEffect2, - KnockbackClockwiseLv2 = HitEffect5 | HitEffect2 | HitEffect1, - - //Completely drags target to the attacker, even across large distances. - DrawIn = HitEffect5 | HitEffect3, - - //An additional visual effect that plays on the target based on according buff. - UnknownShieldEffect = HitEffect5 | HitEffect4, - Stoneskin = HitEffect5 | HitEffect4 | HitEffect1, - - //Unknown = 1 << 14, -- Not sure what this flag does; might be another HitEffect. - - //A special effect when performing appropriate skill combos in succession. - //Ex: Thunder (SkillCombo1 Effect) -> Thundara (SkillCombo2 Effect) -> Thundaga (SkillCombo3 Effect) - //Special Note: SkillCombo4 was never actually used in 1.0 since combos only chained up to 3 times maximum. - SkillCombo1 = 1 << 15, - SkillCombo2 = 1 << 16, - SkillCombo3 = SkillCombo1 | SkillCombo2, - SkillCombo4 = 1 << 17 - - //Flags beyond here are unknown/untested. - } - class BattleActionX01Packet { public const ushort OPCODE = 0x0139; diff --git a/data/scripts/commands/magic/blizzara.lua b/data/scripts/commands/magic/blizzara.lua index 256cb6fb..fc035356 100644 --- a/data/scripts/commands/magic/blizzara.lua +++ b/data/scripts/commands/magic/blizzara.lua @@ -1,3 +1,6 @@ +require("global"); +require("magic"); + function onMagicPrepare(caster, target, spell) return 0; end; @@ -8,13 +11,16 @@ end; function onMagicFinish(caster, target, spell, action) local damage = math.random(10, 100); - print("fuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuckkk") - action.param = damage; + -- todo: populate a global script with statuses and modifiers + action.worldMasterTextId = 0x765D; + + -- todo: populate a global script with statuses and modifiers + -- magic.HandleAttackMagic(caster, target, spell, action) + -- action.effectId = bit32.bxor(0x8000000, spell.effectAnimation, 15636); action.effectId = bit32.bxor(0x8000000, spell.effectAnimation, 15636); - + if target.hateContainer then - target.hateContainer.AddBaseHate(caster); target.hateContainer.UpdateHate(caster, damage); end; return damage; diff --git a/data/scripts/commands/magic/thunder.lua b/data/scripts/commands/magic/thunder.lua index b5b3a5f9..1d854b23 100644 --- a/data/scripts/commands/magic/thunder.lua +++ b/data/scripts/commands/magic/thunder.lua @@ -1,3 +1,5 @@ +require("magic"); + function onMagicPrepare(caster, target, spell) return 0; end; @@ -8,11 +10,14 @@ end; function onMagicFinish(caster, target, spell, action) local damage = math.random(10, 100); - print("fuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuckkk") + action.worldMasterTextId = 0x765D; + + -- todo: populate a global script with statuses and modifiers + -- magic.HandleAttackMagic(caster, target, spell, action) action.effectId = bit32.bxor(0x8000000, spell.effectAnimation, 15636); + if target.hateContainer then - target.hateContainer.AddBaseHate(caster); target.hateContainer.UpdateHate(caster, damage); end; return damage; diff --git a/data/scripts/magic.lua b/data/scripts/magic.lua new file mode 100644 index 00000000..35318f58 --- /dev/null +++ b/data/scripts/magic.lua @@ -0,0 +1,41 @@ +-- todo: add enums for status effects in global.lua +require("global") + +magic = +{ + +}; + +--[[ + modifier - Modifier.Intelligence, Modifier.Mind (see Modifier.cs) + multiplier - + ]] +function magic.HandleHealingMagic(caster, target, spell, action, modifierId, multiplier, baseAmount) + potency = potency or 1.0; + healAmount = baseAmount; + + -- todo: shit based on mnd + local mind = caster.GetMod(Modifier.Mind); +end; + +function magic.HandleAttackMagic(caster, target, spell, action, modifierId, multiplier, baseAmount) + -- todo: actually handle this + damage = baseAmount or math.random(1,10) * 10; + + return damage; +end; + +function magic.HandleEvasion(caster, target, spell, action, modifierId) + + return false; +end; + +function magic.HandleStoneskin(caster, target, spell, action, modifierId, damage) + --[[ + if target.statusEffects.HasStatusEffect(StatusEffect.Stoneskin) then + -- todo: damage reduction + return true; + end; + ]] + return false; +end; \ No newline at end of file diff --git a/sql/battle_commands.sql b/sql/battle_commands.sql deleted file mode 100644 index bdbeb3d0..00000000 --- a/sql/battle_commands.sql +++ /dev/null @@ -1,215 +0,0 @@ --- MySQL dump 10.13 Distrib 5.7.18, for Win64 (x86_64) --- --- Host: localhost Database: ffxiv_server --- ------------------------------------------------------ --- Server version 5.7.18-log - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `battle_commands` --- - -DROP TABLE IF EXISTS `battle_commands`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `battle_commands` ( - `id` smallint(5) unsigned NOT NULL, - `name` varchar(255) NOT NULL, - `classJob` tinyint(3) unsigned NOT NULL, - `lvl` tinyint(3) unsigned NOT NULL, - `requirements` smallint(5) unsigned NOT NULL, - `validTarget` tinyint(3) unsigned NOT NULL, - `aoeType` tinyint(3) unsigned NOT NULL, - `numHits` tinyint(3) unsigned NOT NULL, - `positionBonus` tinyint(3) unsigned NOT NULL, - `procRequirement` tinyint(3) unsigned NOT NULL, - `range` int(10) unsigned NOT NULL, - `buffDuration` int(10) unsigned NOT NULL, - `debuffDuration` int(10) unsigned NOT NULL, - `castType` tinyint(3) unsigned NOT NULL, - `castTime` int(10) unsigned NOT NULL, - `recastTime` int(10) unsigned NOT NULL, - `mpCost` smallint(5) unsigned NOT NULL, - `tpCost` smallint(5) unsigned NOT NULL, - `animationType` tinyint(3) unsigned NOT NULL, - `effectAnimation` smallint(5) unsigned NOT NULL, - `modelAnimation` smallint(5) unsigned NOT NULL, - `animationDuration` smallint(5) unsigned NOT NULL, - `aoeRange` int(10) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `battle_commands` --- - -LOCK TABLES `battle_commands` WRITE; -/*!40000 ALTER TABLE `battle_commands` DISABLE KEYS */; -set autocommit=0; -INSERT INTO `battle_commands` VALUES (27100,'second_wind',2,6,3,1,0,1,0,0,5,0,0,0,0,45,0,0,14,519,2,2,0); -INSERT INTO `battle_commands` VALUES (27101,'blindside',2,14,3,1,0,1,0,0,5,0,60,0,0,60,0,0,14,635,2,2,0); -INSERT INTO `battle_commands` VALUES (27102,'taunt',2,42,4,32,0,1,0,0,5,5,0,0,0,60,0,0,14,517,2,2,0); -INSERT INTO `battle_commands` VALUES (27103,'featherfoot',2,2,3,1,0,1,0,0,5,0,30,0,0,60,0,0,14,535,2,2,0); -INSERT INTO `battle_commands` VALUES (27104,'fists_of_fire',2,34,4,1,0,1,0,0,5,0,0,0,0,10,0,0,14,684,2,2,0); -INSERT INTO `battle_commands` VALUES (27105,'fists_of_earth',2,22,4,1,0,1,0,0,5,0,0,0,0,10,0,0,14,685,2,2,0); -INSERT INTO `battle_commands` VALUES (27106,'hundred_fists',15,50,0,0,0,1,0,0,5,0,0,0,0,900,0,0,14,712,2,2,0); -INSERT INTO `battle_commands` VALUES (27107,'spinning_heel',15,35,0,0,0,1,0,0,5,0,0,0,0,120,0,0,14,718,2,2,0); -INSERT INTO `battle_commands` VALUES (27108,'shoulder_tackle',15,30,0,0,0,1,0,0,5,0,0,0,0,60,0,0,18,1048,205,2,0); -INSERT INTO `battle_commands` VALUES (27109,'fists_of_wind',15,40,0,0,0,1,0,0,5,0,0,0,0,10,0,0,14,720,2,2,0); -INSERT INTO `battle_commands` VALUES (27110,'pummel',2,1,1,32,0,1,1,0,5,0,0,0,0,10,0,1000,18,1027,1,2,0); -INSERT INTO `battle_commands` VALUES (27111,'concussive_blow',2,10,1,32,0,1,4,0,5,30,0,0,0,30,0,1500,18,20,3,2,0); -INSERT INTO `battle_commands` VALUES (27112,'simian_thrash',2,50,4,32,0,1,0,0,5,0,0,0,0,80,0,2000,18,1003,202,2,0); -INSERT INTO `battle_commands` VALUES (27113,'aura_pulse',2,38,4,32,1,1,0,0,5,30,0,0,0,40,0,1500,18,66,203,2,0); -INSERT INTO `battle_commands` VALUES (27114,'pounce',2,4,4,32,0,1,2,0,5,10,0,0,0,20,0,1500,18,8,3,2,0); -INSERT INTO `battle_commands` VALUES (27115,'demolish',2,30,1,32,0,1,0,0,5,0,0,0,0,30,0,1500,18,1028,2,2,0); -INSERT INTO `battle_commands` VALUES (27116,'howling_fist',2,46,4,32,0,1,4,0,5,0,0,0,0,80,0,3000,18,1029,2,2,0); -INSERT INTO `battle_commands` VALUES (27117,'sucker_punch',2,26,1,32,0,1,4,0,5,0,0,0,0,15,0,1000,18,73,3,2,0); -INSERT INTO `battle_commands` VALUES (27118,'dragon_kick',15,45,0,0,0,1,0,0,5,0,0,0,0,60,0,2000,18,1041,204,2,0); -INSERT INTO `battle_commands` VALUES (27119,'haymaker',2,18,4,32,0,1,0,1,5,0,0,0,0,5,0,250,18,23,201,2,0); -INSERT INTO `battle_commands` VALUES (27140,'sentinel',3,22,3,1,0,1,0,0,5,0,15,0,0,90,0,0,14,526,2,2,0); -INSERT INTO `battle_commands` VALUES (27141,'aegis_boon',3,6,8,1,0,1,0,0,5,0,30,0,0,60,0,0,14,583,21,2,0); -INSERT INTO `battle_commands` VALUES (27142,'rampart',3,2,3,1,0,1,0,2,5,0,60,0,0,120,0,0,14,536,2,2,0); -INSERT INTO `battle_commands` VALUES (27143,'tempered_will',3,42,8,1,0,1,0,0,5,0,20,0,0,180,0,0,14,515,2,2,0); -INSERT INTO `battle_commands` VALUES (27144,'outmaneuver',3,34,8,1,0,1,0,0,5,0,30,0,0,90,0,0,14,512,21,2,0); -INSERT INTO `battle_commands` VALUES (27145,'flash',3,14,3,32,0,1,0,0,5,0,0,0,0,30,0,0,14,696,2,2,0); -INSERT INTO `battle_commands` VALUES (27146,'cover',16,30,0,0,0,1,0,0,5,0,15,0,0,60,0,0,14,725,2,2,0); -INSERT INTO `battle_commands` VALUES (27147,'divine_veil',16,35,0,0,0,1,0,0,5,0,20,0,0,60,0,0,14,713,2,2,0); -INSERT INTO `battle_commands` VALUES (27148,'hallowed_ground',16,50,0,0,0,1,0,0,5,0,0,0,0,900,0,0,14,709,2,2,0); -INSERT INTO `battle_commands` VALUES (27149,'holy_succor',16,40,0,0,0,1,0,0,15,0,0,0,2,10,100,0,1,701,1,2,0); -INSERT INTO `battle_commands` VALUES (27150,'fast_blade',3,1,1,32,0,1,1,0,5,0,0,0,0,10,0,1000,18,1023,1,2,0); -INSERT INTO `battle_commands` VALUES (27151,'flat_blade',3,26,1,32,0,1,0,0,5,0,0,0,0,10,0,1500,18,1024,2,2,0); -INSERT INTO `battle_commands` VALUES (27152,'savage_blade',3,10,1,32,0,1,0,0,5,0,0,0,0,30,0,1000,18,1025,1,2,0); -INSERT INTO `battle_commands` VALUES (27153,'goring_blade',3,50,8,32,0,1,2,0,5,30,0,0,0,60,0,3000,18,1026,301,2,0); -INSERT INTO `battle_commands` VALUES (27154,'riot_blade',3,30,8,32,0,1,2,0,5,30,0,0,0,80,0,2000,18,75,2,2,0); -INSERT INTO `battle_commands` VALUES (27155,'rage_of_halone',3,46,8,32,0,1,0,0,5,0,0,0,0,20,0,1500,18,1008,302,2,0); -INSERT INTO `battle_commands` VALUES (27156,'shield_bash',3,18,17,32,0,1,0,0,5,5,0,0,0,30,0,250,18,5,26,2,0); -INSERT INTO `battle_commands` VALUES (27157,'war_drum',3,38,24,32,1,1,0,2,5,0,0,0,0,60,0,500,14,502,21,2,0); -INSERT INTO `battle_commands` VALUES (27158,'phalanx',3,4,8,1,0,1,0,0,5,0,0,0,0,5,0,250,18,32,1,2,0); -INSERT INTO `battle_commands` VALUES (27159,'spirits_within',16,45,0,0,0,1,0,0,5,0,0,0,0,60,0,3000,18,1044,304,2,0); -INSERT INTO `battle_commands` VALUES (27180,'provoke',4,14,3,32,0,1,0,0,5,0,0,0,0,30,0,0,14,600,2,2,0); -INSERT INTO `battle_commands` VALUES (27181,'foresight',4,2,3,1,0,1,0,0,5,0,30,0,0,60,0,0,14,545,2,2,0); -INSERT INTO `battle_commands` VALUES (27182,'bloodbath',4,6,3,1,0,1,0,0,5,0,30,0,0,60,0,0,14,581,2,2,0); -INSERT INTO `battle_commands` VALUES (27183,'berserk',4,22,32,1,0,1,0,0,5,0,0,0,0,10,0,0,14,682,2,2,0); -INSERT INTO `battle_commands` VALUES (27184,'rampage',4,34,32,1,0,1,0,0,5,0,0,0,0,10,0,0,14,546,2,2,0); -INSERT INTO `battle_commands` VALUES (27185,'enduring_march',4,42,32,1,0,1,0,0,5,0,20,0,0,180,0,0,14,539,2,2,0); -INSERT INTO `battle_commands` VALUES (27186,'vengeance',17,30,0,1,0,1,0,0,5,0,0,0,0,150,0,0,14,714,2,2,0); -INSERT INTO `battle_commands` VALUES (27187,'antagonize',17,35,0,1,0,1,0,0,5,0,0,0,0,120,0,0,14,715,2,2,0); -INSERT INTO `battle_commands` VALUES (27188,'collusion',17,40,0,4,0,1,0,0,5,0,0,0,0,90,0,0,14,711,2,2,0); -INSERT INTO `battle_commands` VALUES (27189,'mighty_strikes',17,50,0,1,0,1,0,0,5,0,0,0,0,900,0,0,14,716,2,2,0); -INSERT INTO `battle_commands` VALUES (27190,'heavy_swing',4,1,1,32,0,1,1,0,5,0,0,0,0,10,0,1000,18,14,1,2,0); -INSERT INTO `battle_commands` VALUES (27191,'skull_sunder',4,10,1,32,0,1,0,0,5,0,0,0,0,30,0,1500,18,43,1,2,0); -INSERT INTO `battle_commands` VALUES (27192,'steel_cyclone',17,45,0,32,1,1,0,0,5,0,0,0,0,30,0,2000,18,1040,404,2,0); -INSERT INTO `battle_commands` VALUES (27193,'brutal_swing',4,4,1,32,0,1,4,0,5,0,0,0,0,20,0,1500,18,15,3,2,0); -INSERT INTO `battle_commands` VALUES (27194,'maim',4,26,1,32,0,1,0,0,5,0,0,0,0,30,0,1500,18,88,1,2,0); -INSERT INTO `battle_commands` VALUES (27195,'godsbane',4,50,32,32,0,1,0,0,5,0,0,0,0,60,0,3000,18,1014,402,2,0); -INSERT INTO `battle_commands` VALUES (27196,'path_of_the_storm',4,38,32,32,0,1,2,0,5,0,0,0,0,30,0,1500,18,44,401,2,0); -INSERT INTO `battle_commands` VALUES (27197,'whirlwind',4,46,32,32,1,1,0,0,5,0,0,0,0,80,0,3000,18,1015,403,2,0); -INSERT INTO `battle_commands` VALUES (27198,'fracture',4,18,32,32,0,1,0,4,5,8,0,0,0,40,0,500,18,42,3,2,0); -INSERT INTO `battle_commands` VALUES (27199,'overpower',4,30,1,32,2,1,0,4,5,0,0,0,0,5,0,250,18,89,1,2,0); -INSERT INTO `battle_commands` VALUES (27220,'hawks_eye',7,6,3,1,0,1,0,0,5,0,15,0,0,90,0,0,14,516,2,2,0); -INSERT INTO `battle_commands` VALUES (27221,'quelling_strikes',7,22,3,1,0,1,0,0,5,30,0,0,0,60,0,0,14,614,2,2,0); -INSERT INTO `battle_commands` VALUES (27222,'decoy',7,2,3,1,0,1,0,0,15,0,60,0,0,90,100,0,14,565,2,2,0); -INSERT INTO `battle_commands` VALUES (27223,'chameleon',7,42,3,1,0,1,0,0,5,0,0,0,0,180,0,0,14,504,2,2,0); -INSERT INTO `battle_commands` VALUES (27224,'barrage',7,34,64,1,0,1,0,0,5,0,60,0,0,90,0,0,14,683,2,2,0); -INSERT INTO `battle_commands` VALUES (27225,'raging_strikes',7,14,64,1,0,1,0,0,5,0,0,0,0,10,0,0,14,632,2,2,0); -INSERT INTO `battle_commands` VALUES (27226,'swiftsong',7,26,64,1,1,1,0,0,15,0,180,0,0,10,100,0,1,150,1,2,0); -INSERT INTO `battle_commands` VALUES (27227,'battle_voice',18,50,0,1,1,1,0,0,5,0,0,0,0,900,0,0,14,721,2,2,0); -INSERT INTO `battle_commands` VALUES (27228,'heavy_shot',7,1,1,32,0,1,0,0,5,0,0,0,0,10,0,1000,18,1036,4,2,0); -INSERT INTO `battle_commands` VALUES (27229,'leaden_arrow',7,10,1,32,0,1,0,0,5,30,0,0,0,30,0,1500,18,1035,4,2,0); -INSERT INTO `battle_commands` VALUES (27230,'wide_volley',7,50,64,32,1,1,0,0,5,0,0,0,0,80,0,2000,18,18,703,2,0); -INSERT INTO `battle_commands` VALUES (27231,'quick_nock',7,38,64,32,2,1,0,0,5,0,0,0,0,180,0,1000,18,1017,702,2,0); -INSERT INTO `battle_commands` VALUES (27232,'rain_of_death',18,45,0,32,1,1,0,0,5,0,0,0,0,30,0,3000,18,1037,704,2,0); -INSERT INTO `battle_commands` VALUES (27233,'piercing_arrow',7,4,1,32,0,1,0,0,5,0,0,0,0,20,0,1000,18,1038,1,2,0); -INSERT INTO `battle_commands` VALUES (27234,'gloom_arrow',7,30,1,32,0,1,0,0,5,30,0,0,0,10,0,1000,18,1039,4,2,0); -INSERT INTO `battle_commands` VALUES (27235,'bloodletter',7,46,64,32,0,1,0,0,5,30,0,0,0,80,0,1500,18,53,701,2,0); -INSERT INTO `battle_commands` VALUES (27236,'shadowbind',7,18,64,32,0,1,0,0,5,30,0,0,0,40,0,250,18,17,4,2,0); -INSERT INTO `battle_commands` VALUES (27237,'ballad_of_magi',18,30,0,1,1,1,0,0,15,0,0,0,3,10,100,0,1,709,1,2,0); -INSERT INTO `battle_commands` VALUES (27238,'paeon_of_war',18,40,0,1,1,1,0,0,15,0,0,0,3,10,50,1000,1,710,1,2,0); -INSERT INTO `battle_commands` VALUES (27239,'minuet_of_rigor',18,35,0,1,1,1,0,0,15,0,0,0,3,10,100,0,1,711,1,2,0); -INSERT INTO `battle_commands` VALUES (27258,'refill',7,1,0,1,0,1,0,0,5,0,0,0,0,0,0,0,0,0,0,2,0); -INSERT INTO `battle_commands` VALUES (27259,'light_shot',7,1,0,32,0,1,0,0,5,0,0,0,0,0,0,0,0,0,0,2,0); -INSERT INTO `battle_commands` VALUES (27260,'invigorate',8,14,3,1,0,1,0,0,5,0,30,0,0,90,0,0,14,575,2,2,0); -INSERT INTO `battle_commands` VALUES (27261,'power_surge',8,34,128,1,0,1,0,0,5,0,0,0,0,10,0,0,14,686,2,2,0); -INSERT INTO `battle_commands` VALUES (27262,'life_surge',8,22,128,1,0,1,0,0,5,0,0,0,0,15,0,250,14,687,2,2,0); -INSERT INTO `battle_commands` VALUES (27263,'dread_spike',8,42,128,1,0,1,0,0,5,0,0,0,0,120,0,0,14,686,2,2,0); -INSERT INTO `battle_commands` VALUES (27264,'blood_for_blood',8,6,3,1,0,1,0,0,5,0,0,0,0,60,0,0,14,689,2,2,0); -INSERT INTO `battle_commands` VALUES (27265,'keen_flurry',8,26,3,1,0,1,0,0,5,0,0,0,0,90,0,0,14,569,2,2,0); -INSERT INTO `battle_commands` VALUES (27266,'jump',19,30,0,32,0,1,0,0,5,0,0,0,0,60,0,0,18,1045,804,2,0); -INSERT INTO `battle_commands` VALUES (27267,'elusive_jump',19,40,0,1,0,1,0,0,5,0,0,0,0,180,0,0,18,1046,806,2,0); -INSERT INTO `battle_commands` VALUES (27268,'dragonfire_dive',19,50,0,32,1,1,0,0,5,0,0,0,0,900,0,0,18,1045,804,2,0); -INSERT INTO `battle_commands` VALUES (27269,'true_thrust',8,1,1,32,0,1,1,0,5,0,0,0,0,10,0,1000,18,1030,2,2,0); -INSERT INTO `battle_commands` VALUES (27270,'leg_sweep',8,30,1,32,1,1,0,0,5,8,0,0,0,30,0,1000,18,37,1,2,0); -INSERT INTO `battle_commands` VALUES (27271,'doom_spike',8,46,128,32,3,1,0,0,5,0,0,0,0,60,0,3000,18,83,801,2,0); -INSERT INTO `battle_commands` VALUES (27272,'disembowel',19,35,0,32,0,1,0,0,5,0,0,0,0,30,0,750,18,1042,2,2,0); -INSERT INTO `battle_commands` VALUES (27273,'heavy_thrust',8,10,1,32,0,1,0,0,5,4,0,0,0,20,0,1500,18,1031,1,2,0); -INSERT INTO `battle_commands` VALUES (27274,'vorpal_thrust',8,2,1,32,0,1,2,0,5,0,0,0,0,20,0,1500,18,1032,2,2,0); -INSERT INTO `battle_commands` VALUES (27275,'impulse_drive',8,18,1,32,0,1,4,0,5,0,0,0,0,30,0,1500,18,1033,2,2,0); -INSERT INTO `battle_commands` VALUES (27276,'chaos_thrust',8,50,128,32,0,1,0,0,5,0,0,0,0,80,0,3000,18,40,802,2,0); -INSERT INTO `battle_commands` VALUES (27277,'ring_of_talons',19,45,0,32,1,1,0,0,5,0,0,0,0,60,0,2000,18,1009,803,2,0); -INSERT INTO `battle_commands` VALUES (27278,'feint',8,4,1,32,0,1,0,8,5,0,0,0,0,10,0,250,18,39,2,2,0); -INSERT INTO `battle_commands` VALUES (27279,'full_thrust',8,38,128,32,0,1,0,8,5,0,0,0,0,30,0,250,18,1034,801,2,0); -INSERT INTO `battle_commands` VALUES (27300,'dark_seal',22,14,3,1,0,1,0,0,5,0,30,0,0,90,0,0,14,518,2,2,0); -INSERT INTO `battle_commands` VALUES (27301,'resonance',22,22,3,1,0,1,0,0,5,0,30,0,0,90,0,0,14,669,2,2,0); -INSERT INTO `battle_commands` VALUES (27302,'excruciate',22,38,256,1,0,1,0,0,5,0,30,0,0,90,0,0,14,694,2,2,0); -INSERT INTO `battle_commands` VALUES (27303,'necrogenesis',22,6,3,1,0,1,0,0,5,0,30,0,0,90,0,0,14,695,2,2,0); -INSERT INTO `battle_commands` VALUES (27304,'parsimony',22,2,256,1,0,1,0,0,5,0,30,0,0,90,0,0,14,568,2,2,0); -INSERT INTO `battle_commands` VALUES (27305,'convert',26,30,0,1,0,1,0,0,5,0,0,0,0,450,0,0,14,724,2,2,0); -INSERT INTO `battle_commands` VALUES (27306,'sleep',22,42,256,32,0,1,0,0,15,60,0,0,3,0,75,0,1,651,1,2,0); -INSERT INTO `battle_commands` VALUES (27307,'sanguine_rite',22,30,3,1,0,1,0,0,15,0,20,0,0,60,120,0,1,152,1,2,0); -INSERT INTO `battle_commands` VALUES (27308,'blizzard',22,4,256,32,0,1,0,0,15,30,0,0,3,10,90,0,1,502,1,2,0); -INSERT INTO `battle_commands` VALUES (27309,'blizzara',22,26,256,32,1,1,0,0,15,30,0,0,0,40,150,0,1,506,1,2,0); -INSERT INTO `battle_commands` VALUES (27310,'fire',22,10,3,32,1,1,0,0,15,0,0,0,3,8,105,0,1,501,1,2,0); -INSERT INTO `battle_commands` VALUES (27311,'fira',22,34,3,32,1,1,0,0,15,0,0,0,5,16,180,0,1,504,1,2,0); -INSERT INTO `battle_commands` VALUES (27312,'firaga',22,50,256,32,1,1,0,0,15,0,0,0,8,7,255,0,1,700,1,2,0); -INSERT INTO `battle_commands` VALUES (27313,'thunder',22,1,3,32,0,1,0,0,15,0,0,0,2,6,75,0,1,503,1,2,0); -INSERT INTO `battle_commands` VALUES (27314,'thundara',22,18,256,32,0,1,0,0,15,4,0,0,0,30,135,0,1,508,1,2,0); -INSERT INTO `battle_commands` VALUES (27315,'thundaga',22,46,256,32,0,1,0,0,15,0,0,0,5,45,195,0,1,509,1,2,0); -INSERT INTO `battle_commands` VALUES (27316,'burst',26,50,0,32,0,1,0,0,15,0,0,0,4,900,90,0,1,705,1,2,0); -INSERT INTO `battle_commands` VALUES (27317,'sleepga',26,45,0,32,1,1,0,0,15,0,0,0,4,0,100,0,1,704,1,2,0); -INSERT INTO `battle_commands` VALUES (27318,'flare',26,40,0,32,1,1,0,0,15,0,0,0,8,120,200,0,1,706,1,2,0); -INSERT INTO `battle_commands` VALUES (27319,'freeze',26,35,0,32,0,1,0,0,15,0,0,0,5,120,120,0,1,707,1,2,0); -INSERT INTO `battle_commands` VALUES (27340,'sacred_prism',23,34,3,1,0,1,0,0,5,0,60,0,0,90,0,0,14,690,2,2,0); -INSERT INTO `battle_commands` VALUES (27341,'shroud_of_saints',23,38,512,1,0,1,0,0,5,0,20,0,0,180,0,0,14,691,2,2,0); -INSERT INTO `battle_commands` VALUES (27342,'cleric_stance',23,10,512,1,0,1,0,0,5,0,0,0,0,30,0,0,14,692,2,2,0); -INSERT INTO `battle_commands` VALUES (27343,'blissful_mind',23,14,512,1,0,1,0,0,5,0,0,0,0,30,0,0,14,693,2,2,0); -INSERT INTO `battle_commands` VALUES (27344,'presence_of_mind',27,30,0,1,0,1,0,0,5,0,0,0,0,300,0,0,14,722,2,2,0); -INSERT INTO `battle_commands` VALUES (27345,'benediction',27,50,0,1,1,1,0,0,5,0,0,0,0,900,0,0,14,723,2,2,0); -INSERT INTO `battle_commands` VALUES (27346,'cure',23,2,3,2,0,1,0,0,15,0,0,0,2,5,40,0,1,101,1,2,0); -INSERT INTO `battle_commands` VALUES (27347,'cura',23,30,512,2,0,1,0,0,15,0,0,0,2,5,100,0,1,103,1,2,0); -INSERT INTO `battle_commands` VALUES (27348,'curaga',23,46,512,4,1,1,0,0,15,0,0,0,3,10,150,0,1,146,1,2,0); -INSERT INTO `battle_commands` VALUES (27349,'raise',23,18,512,2,0,1,0,0,15,0,0,0,10,300,150,0,1,148,1,2,0); -INSERT INTO `battle_commands` VALUES (27350,'stoneskin',23,26,3,2,0,1,0,0,15,0,300,0,3,30,50,0,1,133,1,2,0); -INSERT INTO `battle_commands` VALUES (27351,'protect',23,6,3,4,1,1,0,0,15,0,300,0,3,30,80,0,1,1085,1,2,0); -INSERT INTO `battle_commands` VALUES (27352,'repose',23,50,0,32,0,1,0,0,15,0,0,0,3,0,80,0,1,151,1,2,0); -INSERT INTO `battle_commands` VALUES (27353,'aero',23,4,3,32,0,1,0,0,15,0,0,0,3,6,75,0,1,510,1,2,0); -INSERT INTO `battle_commands` VALUES (27354,'aerora',23,42,512,32,1,1,0,0,15,0,0,0,4,20,150,0,1,511,1,2,0); -INSERT INTO `battle_commands` VALUES (27355,'stone',23,1,3,32,0,1,0,0,15,0,0,0,2,6,75,0,1,513,1,2,0); -INSERT INTO `battle_commands` VALUES (27356,'stonera',23,22,512,32,1,1,0,0,15,0,0,0,3,30,150,0,1,514,1,2,0); -INSERT INTO `battle_commands` VALUES (27357,'esuna',27,40,0,2,0,1,0,0,15,0,0,0,2,10,40,0,1,702,1,2,0); -INSERT INTO `battle_commands` VALUES (27358,'regen',27,35,0,2,0,1,0,0,15,0,0,0,2,5,20,0,1,703,1,2,0); -INSERT INTO `battle_commands` VALUES (27359,'holy',27,45,0,32,1,1,0,0,15,0,0,0,0,300,100,0,1,708,1,2,0); -/*!40000 ALTER TABLE `battle_commands` ENABLE KEYS */; -UNLOCK TABLES; -commit; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2017-08-28 1:38:36 diff --git a/sql/server_battle_commands.sql b/sql/server_battle_commands.sql new file mode 100644 index 00000000..1b241f8a --- /dev/null +++ b/sql/server_battle_commands.sql @@ -0,0 +1,215 @@ +-- MySQL dump 10.13 Distrib 5.7.18, for Win64 (x86_64) +-- +-- Host: localhost Database: ffxiv_server +-- ------------------------------------------------------ +-- Server version 5.7.18-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `server_battle_commands` +-- + +DROP TABLE IF EXISTS `server_battle_commands`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `server_battle_commands` ( + `id` smallint(5) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `classJob` tinyint(3) unsigned NOT NULL, + `lvl` tinyint(3) unsigned NOT NULL, + `requirements` smallint(5) unsigned NOT NULL, + `validTarget` tinyint(3) unsigned NOT NULL, + `aoeType` tinyint(3) unsigned NOT NULL, + `numHits` tinyint(3) unsigned NOT NULL, + `positionBonus` tinyint(3) unsigned NOT NULL, + `procRequirement` tinyint(3) unsigned NOT NULL, + `range` int(10) unsigned NOT NULL, + `buffDuration` int(10) unsigned NOT NULL, + `debuffDuration` int(10) unsigned NOT NULL, + `castType` tinyint(3) unsigned NOT NULL, + `castTime` int(10) unsigned NOT NULL, + `recastTime` int(10) unsigned NOT NULL, + `mpCost` smallint(5) unsigned NOT NULL, + `tpCost` smallint(5) unsigned NOT NULL, + `animationType` tinyint(3) unsigned NOT NULL, + `effectAnimation` smallint(5) unsigned NOT NULL, + `modelAnimation` smallint(5) unsigned NOT NULL, + `animationDuration` smallint(5) unsigned NOT NULL, + `aoeRange` int(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `server_battle_commands` +-- + +LOCK TABLES `server_battle_commands` WRITE; +/*!40000 ALTER TABLE `server_battle_commands` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `server_battle_commands` VALUES (27100,'second_wind',2,6,3,1,0,1,0,0,5,0,0,0,0,45,0,0,14,519,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27101,'blindside',2,14,3,1,0,1,0,0,5,0,60,0,0,60,0,0,14,635,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27102,'taunt',2,42,4,32,0,1,0,0,5,5,0,0,0,60,0,0,14,517,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27103,'featherfoot',2,2,3,1,0,1,0,0,5,0,30,0,0,60,0,0,14,535,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27104,'fists_of_fire',2,34,4,1,0,1,0,0,5,0,0,0,0,10,0,0,14,684,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27105,'fists_of_earth',2,22,4,1,0,1,0,0,5,0,0,0,0,10,0,0,14,685,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27106,'hundred_fists',15,50,0,0,0,1,0,0,5,0,0,0,0,900,0,0,14,712,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27107,'spinning_heel',15,35,0,0,0,1,0,0,5,0,0,0,0,120,0,0,14,718,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27108,'shoulder_tackle',15,30,0,0,0,1,0,0,5,0,0,0,0,60,0,0,18,1048,205,2,0); +INSERT INTO `server_battle_commands` VALUES (27109,'fists_of_wind',15,40,0,0,0,1,0,0,5,0,0,0,0,10,0,0,14,720,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27110,'pummel',2,1,1,32,0,1,1,0,5,0,0,0,0,10,0,1000,18,1027,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27111,'concussive_blow',2,10,1,32,0,1,4,0,5,30,0,0,0,30,0,1500,18,20,3,2,0); +INSERT INTO `server_battle_commands` VALUES (27112,'simian_thrash',2,50,4,32,0,1,0,0,5,0,0,0,0,80,0,2000,18,1003,202,2,0); +INSERT INTO `server_battle_commands` VALUES (27113,'aura_pulse',2,38,4,32,1,1,0,0,5,30,0,0,0,40,0,1500,18,66,203,2,0); +INSERT INTO `server_battle_commands` VALUES (27114,'pounce',2,4,4,32,0,1,2,0,5,10,0,0,0,20,0,1500,18,8,3,2,0); +INSERT INTO `server_battle_commands` VALUES (27115,'demolish',2,30,1,32,0,1,0,0,5,0,0,0,0,30,0,1500,18,1028,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27116,'howling_fist',2,46,4,32,0,1,4,0,5,0,0,0,0,80,0,3000,18,1029,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27117,'sucker_punch',2,26,1,32,0,1,4,0,5,0,0,0,0,15,0,1000,18,73,3,2,0); +INSERT INTO `server_battle_commands` VALUES (27118,'dragon_kick',15,45,0,0,0,1,0,0,5,0,0,0,0,60,0,2000,18,1041,204,2,0); +INSERT INTO `server_battle_commands` VALUES (27119,'haymaker',2,18,4,32,0,1,0,1,5,0,0,0,0,5,0,250,18,23,201,2,0); +INSERT INTO `server_battle_commands` VALUES (27140,'sentinel',3,22,3,1,0,1,0,0,5,0,15,0,0,90,0,0,14,526,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27141,'aegis_boon',3,6,8,1,0,1,0,0,5,0,30,0,0,60,0,0,14,583,21,2,0); +INSERT INTO `server_battle_commands` VALUES (27142,'rampart',3,2,3,1,0,1,0,2,5,0,60,0,0,120,0,0,14,536,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27143,'tempered_will',3,42,8,1,0,1,0,0,5,0,20,0,0,180,0,0,14,515,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27144,'outmaneuver',3,34,8,1,0,1,0,0,5,0,30,0,0,90,0,0,14,512,21,2,0); +INSERT INTO `server_battle_commands` VALUES (27145,'flash',3,14,3,32,0,1,0,0,5,0,0,0,0,30,0,0,14,696,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27146,'cover',16,30,0,0,0,1,0,0,5,0,15,0,0,60,0,0,14,725,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27147,'divine_veil',16,35,0,0,0,1,0,0,5,0,20,0,0,60,0,0,14,713,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27148,'hallowed_ground',16,50,0,0,0,1,0,0,5,0,0,0,0,900,0,0,14,709,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27149,'holy_succor',16,40,0,0,0,1,0,0,15,0,0,0,2,10,100,0,1,701,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27150,'fast_blade',3,1,1,32,0,1,1,0,5,0,0,0,0,10,0,1000,18,1023,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27151,'flat_blade',3,26,1,32,0,1,0,0,5,0,0,0,0,10,0,1500,18,1024,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27152,'savage_blade',3,10,1,32,0,1,0,0,5,0,0,0,0,30,0,1000,18,1025,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27153,'goring_blade',3,50,8,32,0,1,2,0,5,30,0,0,0,60,0,3000,18,1026,301,2,0); +INSERT INTO `server_battle_commands` VALUES (27154,'riot_blade',3,30,8,32,0,1,2,0,5,30,0,0,0,80,0,2000,18,75,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27155,'rage_of_halone',3,46,8,32,0,1,0,0,5,0,0,0,0,20,0,1500,18,1008,302,2,0); +INSERT INTO `server_battle_commands` VALUES (27156,'shield_bash',3,18,17,32,0,1,0,0,5,5,0,0,0,30,0,250,18,5,26,2,0); +INSERT INTO `server_battle_commands` VALUES (27157,'war_drum',3,38,24,32,1,1,0,2,5,0,0,0,0,60,0,500,14,502,21,2,0); +INSERT INTO `server_battle_commands` VALUES (27158,'phalanx',3,4,8,1,0,1,0,0,5,0,0,0,0,5,0,250,18,32,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27159,'spirits_within',16,45,0,0,0,1,0,0,5,0,0,0,0,60,0,3000,18,1044,304,2,0); +INSERT INTO `server_battle_commands` VALUES (27180,'provoke',4,14,3,32,0,1,0,0,5,0,0,0,0,30,0,0,14,600,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27181,'foresight',4,2,3,1,0,1,0,0,5,0,30,0,0,60,0,0,14,545,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27182,'bloodbath',4,6,3,1,0,1,0,0,5,0,30,0,0,60,0,0,14,581,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27183,'berserk',4,22,32,1,0,1,0,0,5,0,0,0,0,10,0,0,14,682,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27184,'rampage',4,34,32,1,0,1,0,0,5,0,0,0,0,10,0,0,14,546,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27185,'enduring_march',4,42,32,1,0,1,0,0,5,0,20,0,0,180,0,0,14,539,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27186,'vengeance',17,30,0,1,0,1,0,0,5,0,0,0,0,150,0,0,14,714,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27187,'antagonize',17,35,0,1,0,1,0,0,5,0,0,0,0,120,0,0,14,715,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27188,'collusion',17,40,0,4,0,1,0,0,5,0,0,0,0,90,0,0,14,711,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27189,'mighty_strikes',17,50,0,1,0,1,0,0,5,0,0,0,0,900,0,0,14,716,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27190,'heavy_swing',4,1,1,32,0,1,1,0,5,0,0,0,0,10,0,1000,18,14,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27191,'skull_sunder',4,10,1,32,0,1,0,0,5,0,0,0,0,30,0,1500,18,43,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27192,'steel_cyclone',17,45,0,32,1,1,0,0,5,0,0,0,0,30,0,2000,18,1040,404,2,0); +INSERT INTO `server_battle_commands` VALUES (27193,'brutal_swing',4,4,1,32,0,1,4,0,5,0,0,0,0,20,0,1500,18,15,3,2,0); +INSERT INTO `server_battle_commands` VALUES (27194,'maim',4,26,1,32,0,1,0,0,5,0,0,0,0,30,0,1500,18,88,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27195,'godsbane',4,50,32,32,0,1,0,0,5,0,0,0,0,60,0,3000,18,1014,402,2,0); +INSERT INTO `server_battle_commands` VALUES (27196,'path_of_the_storm',4,38,32,32,0,1,2,0,5,0,0,0,0,30,0,1500,18,44,401,2,0); +INSERT INTO `server_battle_commands` VALUES (27197,'whirlwind',4,46,32,32,1,1,0,0,5,0,0,0,0,80,0,3000,18,1015,403,2,0); +INSERT INTO `server_battle_commands` VALUES (27198,'fracture',4,18,32,32,0,1,0,4,5,8,0,0,0,40,0,500,18,42,3,2,0); +INSERT INTO `server_battle_commands` VALUES (27199,'overpower',4,30,1,32,2,1,0,4,5,0,0,0,0,5,0,250,18,89,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27220,'hawks_eye',7,6,3,1,0,1,0,0,5,0,15,0,0,90,0,0,14,516,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27221,'quelling_strikes',7,22,3,1,0,1,0,0,5,30,0,0,0,60,0,0,14,614,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27222,'decoy',7,2,3,1,0,1,0,0,15,0,60,0,0,90,100,0,14,565,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27223,'chameleon',7,42,3,1,0,1,0,0,5,0,0,0,0,180,0,0,14,504,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27224,'barrage',7,34,64,1,0,1,0,0,5,0,60,0,0,90,0,0,14,683,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27225,'raging_strikes',7,14,64,1,0,1,0,0,5,0,0,0,0,10,0,0,14,632,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27226,'swiftsong',7,26,64,1,1,1,0,0,15,0,180,0,0,10,100,0,1,150,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27227,'battle_voice',18,50,0,1,1,1,0,0,5,0,0,0,0,900,0,0,14,721,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27228,'heavy_shot',7,1,1,32,0,1,0,0,5,0,0,0,0,10,0,1000,18,1036,4,2,0); +INSERT INTO `server_battle_commands` VALUES (27229,'leaden_arrow',7,10,1,32,0,1,0,0,5,30,0,0,0,30,0,1500,18,1035,4,2,0); +INSERT INTO `server_battle_commands` VALUES (27230,'wide_volley',7,50,64,32,1,1,0,0,5,0,0,0,0,80,0,2000,18,18,703,2,0); +INSERT INTO `server_battle_commands` VALUES (27231,'quick_nock',7,38,64,32,2,1,0,0,5,0,0,0,0,180,0,1000,18,1017,702,2,0); +INSERT INTO `server_battle_commands` VALUES (27232,'rain_of_death',18,45,0,32,1,1,0,0,5,0,0,0,0,30,0,3000,18,1037,704,2,0); +INSERT INTO `server_battle_commands` VALUES (27233,'piercing_arrow',7,4,1,32,0,1,0,0,5,0,0,0,0,20,0,1000,18,1038,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27234,'gloom_arrow',7,30,1,32,0,1,0,0,5,30,0,0,0,10,0,1000,18,1039,4,2,0); +INSERT INTO `server_battle_commands` VALUES (27235,'bloodletter',7,46,64,32,0,1,0,0,5,30,0,0,0,80,0,1500,18,53,701,2,0); +INSERT INTO `server_battle_commands` VALUES (27236,'shadowbind',7,18,64,32,0,1,0,0,5,30,0,0,0,40,0,250,18,17,4,2,0); +INSERT INTO `server_battle_commands` VALUES (27237,'ballad_of_magi',18,30,0,1,1,1,0,0,15,0,0,0,3,10,100,0,1,709,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27238,'paeon_of_war',18,40,0,1,1,1,0,0,15,0,0,0,3,10,50,1000,1,710,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27239,'minuet_of_rigor',18,35,0,1,1,1,0,0,15,0,0,0,3,10,100,0,1,711,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27258,'refill',7,1,0,1,0,1,0,0,5,0,0,0,0,0,0,0,0,0,0,2,0); +INSERT INTO `server_battle_commands` VALUES (27259,'light_shot',7,1,0,32,0,1,0,0,5,0,0,0,0,0,0,0,0,0,0,2,0); +INSERT INTO `server_battle_commands` VALUES (27260,'invigorate',8,14,3,1,0,1,0,0,5,0,30,0,0,90,0,0,14,575,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27261,'power_surge',8,34,128,1,0,1,0,0,5,0,0,0,0,10,0,0,14,686,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27262,'life_surge',8,22,128,1,0,1,0,0,5,0,0,0,0,15,0,250,14,687,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27263,'dread_spike',8,42,128,1,0,1,0,0,5,0,0,0,0,120,0,0,14,686,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27264,'blood_for_blood',8,6,3,1,0,1,0,0,5,0,0,0,0,60,0,0,14,689,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27265,'keen_flurry',8,26,3,1,0,1,0,0,5,0,0,0,0,90,0,0,14,569,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27266,'jump',19,30,0,32,0,1,0,0,5,0,0,0,0,60,0,0,18,1045,804,2,0); +INSERT INTO `server_battle_commands` VALUES (27267,'elusive_jump',19,40,0,1,0,1,0,0,5,0,0,0,0,180,0,0,18,1046,806,2,0); +INSERT INTO `server_battle_commands` VALUES (27268,'dragonfire_dive',19,50,0,32,1,1,0,0,5,0,0,0,0,900,0,0,18,1045,804,2,0); +INSERT INTO `server_battle_commands` VALUES (27269,'true_thrust',8,1,1,32,0,1,1,0,5,0,0,0,0,10,0,1000,18,1030,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27270,'leg_sweep',8,30,1,32,1,1,0,0,5,8,0,0,0,30,0,1000,18,37,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27271,'doom_spike',8,46,128,32,3,1,0,0,5,0,0,0,0,60,0,3000,18,83,801,2,0); +INSERT INTO `server_battle_commands` VALUES (27272,'disembowel',19,35,0,32,0,1,0,0,5,0,0,0,0,30,0,750,18,1042,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27273,'heavy_thrust',8,10,1,32,0,1,0,0,5,4,0,0,0,20,0,1500,18,1031,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27274,'vorpal_thrust',8,2,1,32,0,1,2,0,5,0,0,0,0,20,0,1500,18,1032,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27275,'impulse_drive',8,18,1,32,0,1,4,0,5,0,0,0,0,30,0,1500,18,1033,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27276,'chaos_thrust',8,50,128,32,0,1,0,0,5,0,0,0,0,80,0,3000,18,40,802,2,0); +INSERT INTO `server_battle_commands` VALUES (27277,'ring_of_talons',19,45,0,32,1,1,0,0,5,0,0,0,0,60,0,2000,18,1009,803,2,0); +INSERT INTO `server_battle_commands` VALUES (27278,'feint',8,4,1,32,0,1,0,8,5,0,0,0,0,10,0,250,18,39,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27279,'full_thrust',8,38,128,32,0,1,0,8,5,0,0,0,0,30,0,250,18,1034,801,2,0); +INSERT INTO `server_battle_commands` VALUES (27300,'dark_seal',22,14,3,1,0,1,0,0,5,0,30,0,0,90,0,0,14,518,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27301,'resonance',22,22,3,1,0,1,0,0,5,0,30,0,0,90,0,0,14,669,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27302,'excruciate',22,38,256,1,0,1,0,0,5,0,30,0,0,90,0,0,14,694,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27303,'necrogenesis',22,6,3,1,0,1,0,0,5,0,30,0,0,90,0,0,14,695,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27304,'parsimony',22,2,256,1,0,1,0,0,5,0,30,0,0,90,0,0,14,568,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27305,'convert',26,30,0,1,0,1,0,0,5,0,0,0,0,450,0,0,14,724,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27306,'sleep',22,42,256,32,0,1,0,0,15,60,0,0,3,0,75,0,1,651,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27307,'sanguine_rite',22,30,3,1,0,1,0,0,15,0,20,0,0,60,120,0,1,152,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27308,'blizzard',22,4,256,32,0,1,0,0,15,30,0,0,3,10,90,0,1,502,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27309,'blizzara',22,26,256,32,1,1,0,0,15,30,0,0,0,40,150,0,1,506,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27310,'fire',22,10,3,32,1,1,0,0,15,0,0,0,3,8,105,0,1,501,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27311,'fira',22,34,3,32,1,1,0,0,15,0,0,0,5,16,180,0,1,504,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27312,'firaga',22,50,256,32,1,1,0,0,15,0,0,0,8,7,255,0,1,700,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27313,'thunder',22,1,3,32,0,1,0,0,15,0,0,0,2,6,75,0,1,503,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27314,'thundara',22,18,256,32,0,1,0,0,15,4,0,0,0,30,135,0,1,508,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27315,'thundaga',22,46,256,32,0,1,0,0,15,0,0,0,5,45,195,0,1,509,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27316,'burst',26,50,0,32,0,1,0,0,15,0,0,0,4,900,90,0,1,705,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27317,'sleepga',26,45,0,32,1,1,0,0,15,0,0,0,4,0,100,0,1,704,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27318,'flare',26,40,0,32,1,1,0,0,15,0,0,0,8,120,200,0,1,706,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27319,'freeze',26,35,0,32,0,1,0,0,15,0,0,0,5,120,120,0,1,707,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27340,'sacred_prism',23,34,3,1,0,1,0,0,5,0,60,0,0,90,0,0,14,690,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27341,'shroud_of_saints',23,38,512,1,0,1,0,0,5,0,20,0,0,180,0,0,14,691,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27342,'cleric_stance',23,10,512,1,0,1,0,0,5,0,0,0,0,30,0,0,14,692,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27343,'blissful_mind',23,14,512,1,0,1,0,0,5,0,0,0,0,30,0,0,14,693,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27344,'presence_of_mind',27,30,0,1,0,1,0,0,5,0,0,0,0,300,0,0,14,722,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27345,'benediction',27,50,0,1,1,1,0,0,5,0,0,0,0,900,0,0,14,723,2,2,0); +INSERT INTO `server_battle_commands` VALUES (27346,'cure',23,2,3,2,0,1,0,0,15,0,0,0,2,5,40,0,1,101,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27347,'cura',23,30,512,2,0,1,0,0,15,0,0,0,2,5,100,0,1,103,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27348,'curaga',23,46,512,4,1,1,0,0,15,0,0,0,3,10,150,0,1,146,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27349,'raise',23,18,512,2,0,1,0,0,15,0,0,0,10,300,150,0,1,148,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27350,'stoneskin',23,26,3,2,0,1,0,0,15,0,300,0,3,30,50,0,1,133,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27351,'protect',23,6,3,4,1,1,0,0,15,0,300,0,3,30,80,0,1,1085,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27352,'repose',23,50,0,32,0,1,0,0,15,0,0,0,3,0,80,0,1,151,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27353,'aero',23,4,3,32,0,1,0,0,15,0,0,0,3,6,75,0,1,510,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27354,'aerora',23,42,512,32,1,1,0,0,15,0,0,0,4,20,150,0,1,511,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27355,'stone',23,1,3,32,0,1,0,0,15,0,0,0,2,6,75,0,1,513,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27356,'stonera',23,22,512,32,1,1,0,0,15,0,0,0,3,30,150,0,1,514,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27357,'esuna',27,40,0,2,0,1,0,0,15,0,0,0,2,10,40,0,1,702,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27358,'regen',27,35,0,2,0,1,0,0,15,0,0,0,2,5,20,0,1,703,1,2,0); +INSERT INTO `server_battle_commands` VALUES (27359,'holy',27,45,0,32,1,1,0,0,15,0,0,0,0,300,100,0,1,708,1,2,0); +/*!40000 ALTER TABLE `server_battle_commands` ENABLE KEYS */; +UNLOCK TABLES; +commit; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2017-08-28 1:38:36 diff --git a/sql/status_effects.sql b/sql/server_statuseffects.sql similarity index 80% rename from sql/status_effects.sql rename to sql/server_statuseffects.sql index 40f6db9a..03dc60ec 100644 --- a/sql/status_effects.sql +++ b/sql/server_statuseffects.sql @@ -16,28 +16,28 @@ /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- --- Table structure for table `status_effects` +-- Table structure for table `server_statuseffects` -- -DROP TABLE IF EXISTS `status_effects`; +DROP TABLE IF EXISTS `server_statuseffects`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `status_effects` ( +CREATE TABLE `server_statuseffects` ( `id` smallint(5) unsigned NOT NULL, `name` varchar(128) NOT NULL, `flags` int(10) unsigned NOT NULL, - `overwrite` int(10) unsigned NOT NULL, + `overwrite` tinyint(3) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- --- Dumping data for table `status_effects` +-- Dumping data for table `server_statuseffects` -- -LOCK TABLES `status_effects` WRITE; -/*!40000 ALTER TABLE `status_effects` DISABLE KEYS */; -/*!40000 ALTER TABLE `status_effects` ENABLE KEYS */; +LOCK TABLES `server_statuseffects` WRITE; +/*!40000 ALTER TABLE `server_statuseffects` DISABLE KEYS */; +/*!40000 ALTER TABLE `server_statuseffects` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;