mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-02 19:42:05 -04:00
Merge branch 'ai-open' of https://bitbucket.org/takhlaq/ffxiv-classic-server into ai-open
This commit is contained in:
commit
71d5bbc9ff
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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));
|
||||
|
@ -36,8 +36,8 @@ namespace FFXIVClassic_Map_Server
|
||||
private Dictionary<uint, ZoneEntrance> zoneEntranceList;
|
||||
private Dictionary<uint, ActorClass> actorClasses = new Dictionary<uint,ActorClass>();
|
||||
private Dictionary<ulong, Party> currentPlayerParties = new Dictionary<ulong, Party>(); //GroupId, Party object
|
||||
private Dictionary<uint, StatusEffect> effectList = new Dictionary<uint, StatusEffect>();
|
||||
private Dictionary<ushort, BattleCommand> abilityList = new Dictionary<ushort, BattleCommand>();
|
||||
private Dictionary<uint, StatusEffect> statusEffectList = new Dictionary<uint, StatusEffect>();
|
||||
private Dictionary<ushort, BattleCommand> battleCommandList = new Dictionary<ushort, BattleCommand>();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -139,6 +139,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
|
||||
}
|
||||
else
|
||||
{
|
||||
distanceFromPoint = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -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<Player>(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;
|
||||
|
@ -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))
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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<Player>(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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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;
|
||||
|
||||
/// <summary>
|
||||
/// this field is not actually part of the packet struct
|
||||
/// </summary>
|
||||
public uint animation;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
41
data/scripts/magic.lua
Normal file
41
data/scripts/magic.lua
Normal file
@ -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;
|
@ -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
|
215
sql/server_battle_commands.sql
Normal file
215
sql/server_battle_commands.sql
Normal file
@ -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
|
@ -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 */;
|
||||
|
Loading…
Reference in New Issue
Block a user