From da621dfc0e240188ce96d15246b19542cf31ce72 Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Tue, 12 Sep 2017 01:24:02 +0100 Subject: [PATCH] added pool/spawn/genus mod loading - moved ai helper classes to own folder --- .../FFXIVClassic Map Server.csproj | 8 +- FFXIVClassic Map Server/WorldManager.cs | 85 +++++++++-- .../actors/chara/Character.cs | 37 ++++- .../actors/chara/ModifierList.cs | 58 ++++++++ .../actors/chara/ai/AIContainer.cs | 3 +- .../ai/controllers/BattleNpcController.cs | 39 +++-- .../chara/ai/{ => helpers}/ActionQueue.cs | 0 .../actors/chara/ai/{ => helpers}/PathFind.cs | 0 .../chara/ai/{ => helpers}/TargetFind.cs | 0 .../actors/chara/ai/state/AttackState.cs | 24 ++-- .../actors/chara/ai/state/InactiveState.cs | 42 ++++++ .../actors/chara/npc/BattleNpc.cs | 20 ++- .../dataobjects/Session.cs | 10 +- sql/server_battlenpc_genus.sql | 133 +++++++++--------- sql/server_battlenpc_genus_mods.sql | 53 +++++++ sql/server_battlenpc_pool_mods.sql | 53 +++++++ sql/server_battlenpc_pools.sql | 2 +- sql/server_battlenpc_spawn_locations.sql | 2 +- sql/server_battlenpc_spawn_mods.sql | 53 +++++++ 19 files changed, 484 insertions(+), 138 deletions(-) create mode 100644 FFXIVClassic Map Server/actors/chara/ModifierList.cs rename FFXIVClassic Map Server/actors/chara/ai/{ => helpers}/ActionQueue.cs (100%) rename FFXIVClassic Map Server/actors/chara/ai/{ => helpers}/PathFind.cs (100%) rename FFXIVClassic Map Server/actors/chara/ai/{ => helpers}/TargetFind.cs (100%) create mode 100644 FFXIVClassic Map Server/actors/chara/ai/state/InactiveState.cs create mode 100644 sql/server_battlenpc_genus_mods.sql create mode 100644 sql/server_battlenpc_pool_mods.sql create mode 100644 sql/server_battlenpc_spawn_mods.sql diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 0b56c529..2279f3d1 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -85,28 +85,30 @@ - + - + + - + + diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index bf1f2844..4b16fd00 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -40,7 +40,10 @@ namespace FFXIVClassic_Map_Server private Dictionary currentPlayerParties = new Dictionary(); //GroupId, Party object private Dictionary statusEffectList = new Dictionary(); private Dictionary battleCommandList = new Dictionary(); - + private Dictionary battleNpcGenusMods = new Dictionary(); + private Dictionary battleNpcPoolMods = new Dictionary(); + private Dictionary battleNpcSpawnMods = new Dictionary(); + private Server mServer; private const int MILIS_LOOPTIME = 333; @@ -422,6 +425,10 @@ namespace FFXIVClassic_Map_Server public void LoadBattleNpcs() { + LoadBattleNpcModifiers("server_battlenpc_genus_mods", "genusId", battleNpcGenusMods); + LoadBattleNpcModifiers("server_battlenpc_pool_mods", "poolId", battleNpcPoolMods); + LoadBattleNpcModifiers("server_battlenpc_spawn_mods", "bnpcId", battleNpcSpawnMods); + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) { try @@ -433,7 +440,7 @@ namespace FFXIVClassic_Map_Server bgr.dropListId, bgr.allegiance, bgr.spawnType, bgr.animationId, bgr.actorState, bgr.privateAreaName, bgr.privateAreaLevel, bgr.zoneId, bpo.poolId, bpo.genusId, bpo.currentJob, bpo.combatSkill, bpo.combatDelay, bpo.combatDmgMult, bpo.aggroType, bpo.immunity, bpo.linkType, bpo.skillListId, bpo.spellListId, - bge.genusId, bge.modelSize, bge.kindredId, bge.detection, bge.hpp, bge.mpp, bge.tpp, bge.str, bge.vit, bge.dex, + bge.genusId, bge.modelSize, bge.speed, bge.kindredId, bge.detection, bge.hpp, bge.mpp, bge.tpp, bge.str, bge.vit, bge.dex, bge.int, bge.mnd, bge.pie, bge.att, bge.acc, bge.def, bge.eva, bge.slash, bge.pierce, bge.h2h, bge.blunt, bge.fire, bge.ice, bge.wind, bge.lightning, bge.earth, bge.water FROM server_battlenpc_spawn_locations bsl @@ -446,7 +453,7 @@ namespace FFXIVClassic_Map_Server var count = 0; foreach (var zonePair in zoneList) { - var zone = zonePair.Value; + Area zone = zonePair.Value; MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@zoneId", zonePair.Key); @@ -465,6 +472,14 @@ namespace FFXIVClassic_Map_Server reader.GetUInt16("actorState"), reader.GetUInt32("animationId"), ""); battleNpc.SetBattleNpcId(reader.GetUInt32("bnpcId")); + + battleNpc.poolId = reader.GetUInt32("poolId"); + battleNpc.genusId = reader.GetUInt32("genusId"); + battleNpcPoolMods.TryGetValue(battleNpc.poolId, out battleNpc.poolMods); + battleNpcGenusMods.TryGetValue(battleNpc.genusId, out battleNpc.genusMods); + battleNpcSpawnMods.TryGetValue(battleNpc.GetBattleNpcId(), out battleNpc.spawnMods); + + battleNpc.SetMod((uint)Modifier.Speed, reader.GetByte("speed")); battleNpc.neutral = reader.GetByte("aggroType") == 0; battleNpc.SetDetectionType(reader.GetUInt32("detection")); @@ -527,7 +542,7 @@ namespace FFXIVClassic_Map_Server z.SpawnAllActors(true); } - public void SpawnBattleNpcById(uint id) + public void SpawnBattleNpcById(uint id, Area area = null) { // todo: this is stupid duplicate code and really needs to die, think of a better way later using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) @@ -541,7 +556,7 @@ namespace FFXIVClassic_Map_Server bgr.dropListId, bgr.allegiance, bgr.spawnType, bgr.animationId, bgr.actorState, bgr.privateAreaName, bgr.privateAreaLevel, bgr.zoneId, bpo.poolId, bpo.genusId, bpo.currentJob, bpo.combatSkill, bpo.combatDelay, bpo.combatDmgMult, bpo.aggroType, bpo.immunity, bpo.linkType, bpo.skillListId, bpo.spellListId, - bge.genusId, bge.modelSize, bge.kindredId, bge.detection, bge.hpp, bge.mpp, bge.tpp, bge.str, bge.vit, bge.dex, + bge.genusId, bge.modelSize, bge.speed, bge.kindredId, bge.detection, bge.hpp, bge.mpp, bge.tpp, bge.str, bge.vit, bge.dex, bge.int, bge.mnd, bge.pie, bge.att, bge.acc, bge.def, bge.eva, bge.slash, bge.pierce, bge.h2h, bge.blunt, bge.fire, bge.ice, bge.wind, bge.lightning, bge.earth, bge.water FROM server_battlenpc_spawn_locations bsl @@ -560,9 +575,9 @@ namespace FFXIVClassic_Map_Server { while (reader.Read()) { - var zone = Server.GetWorldManager().GetZone(reader.GetUInt16("zoneId")); - int actorId = zone.GetActorCount() + 1; - var bnpc = zone.GetBattleNpcById(id); + area = area ?? Server.GetWorldManager().GetZone(reader.GetUInt16("zoneId")); + int actorId = area.GetActorCount() + 1; + var bnpc = area.GetBattleNpcById(id); if (bnpc != null) { @@ -574,12 +589,20 @@ namespace FFXIVClassic_Map_Server // - load skill/spell/drop lists, set detection icon, load pool/family/group mods var battleNpc = new BattleNpc(actorId, Server.GetWorldManager().GetActorClass(reader.GetUInt32("actorClassId")), - reader.GetString("scriptName"), zone, reader.GetFloat("positionX"), reader.GetFloat("positionY"), reader.GetFloat("positionZ"), reader.GetFloat("rotation"), + reader.GetString("scriptName"), area, reader.GetFloat("positionX"), reader.GetFloat("positionY"), reader.GetFloat("positionZ"), reader.GetFloat("rotation"), reader.GetUInt16("actorState"), reader.GetUInt32("animationId"), ""); - - battleNpc.SetBattleNpcId(reader.GetUInt32("bnpcId")); - battleNpc.neutral = reader.GetByte("aggroType") == 0; + battleNpc.SetBattleNpcId(reader.GetUInt32("bnpcId")); + battleNpc.SetMod((uint)Modifier.Speed, reader.GetByte("speed")); + battleNpc.neutral = reader.GetByte("aggroType") == 0; + + // set mob mods + battleNpc.poolId = reader.GetUInt32("poolId"); + battleNpc.genusId = reader.GetUInt32("genusId"); + battleNpcPoolMods.TryGetValue(battleNpc.poolId, out battleNpc.poolMods); + battleNpcGenusMods.TryGetValue(battleNpc.genusId, out battleNpc.genusMods); + battleNpcSpawnMods.TryGetValue(battleNpc.GetBattleNpcId(), out battleNpc.spawnMods); + battleNpc.SetDetectionType(reader.GetUInt32("detection")); battleNpc.kindredType = (KindredType)reader.GetUInt32("kindredId"); battleNpc.npcSpawnType = (NpcSpawnType)reader.GetUInt32("spawnType"); @@ -608,15 +631,16 @@ namespace FFXIVClassic_Map_Server battleNpc.SetMod((uint)Modifier.Defense, reader.GetUInt32("def")); battleNpc.SetMod((uint)Modifier.Evasion, reader.GetUInt32("eva")); - battleNpc.dropListId = reader.GetUInt32("dropListId"); battleNpc.spellListId = reader.GetUInt32("spellListId"); battleNpc.skillListId = reader.GetUInt32("skillListId"); battleNpc.SetBattleNpcId(reader.GetUInt32("bnpcId")); + battleNpc.CalculateBaseStats(); + battleNpc.RecalculateStats(); //battleNpc.SetMod((uint)Modifier.ResistFire, ) - zone.AddActorToZone(battleNpc); + area.AddActorToZone(battleNpc); count++; } } @@ -633,6 +657,39 @@ namespace FFXIVClassic_Map_Server } } + public void LoadBattleNpcModifiers(string tableName, string primaryKey, Dictionary list) + { + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) + { + try + { + conn.Open(); + var query = $"SELECT {primaryKey}, modId, modVal, isMobMod FROM {tableName} GROUP BY {primaryKey};"; + + MySqlCommand cmd = new MySqlCommand(query, conn); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + var id = reader.GetUInt32(primaryKey); + ModifierList modList = new ModifierList(id); + modList.SetModifier(reader.GetUInt16("modId"), reader.GetInt64("modVal"), reader.GetBoolean("isMobMod")); + list.Add(id, modList); + } + } + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + } + finally + { + conn.Dispose(); + } + } + } + //Moves the actor to the new zone if exists. No packets are sent nor position changed. Merged zone is removed. public void DoSeamlessZoneChange(Player player, uint destinationZoneId) { diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 0af7b0be..9134e085 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -115,6 +115,7 @@ namespace FFXIVClassic_Map_Server.Actors // todo: base this on equip and shit SetMod((uint)Modifier.AttackRange, 3); SetMod((uint)Modifier.AttackDelay, (Program.Random.Next(30, 60) * 100)); + SetMod((uint)Modifier.Speed, (uint)moveSpeeds[2]); spawnX = positionX; spawnY = positionY; @@ -315,12 +316,10 @@ namespace FFXIVClassic_Map_Server.Actors packets.Add(BattleActionX00Packet.BuildPacket(actorId, 0x72000062, 0)); packets.Add(BattleActionX01Packet.BuildPacket(actorId, 0x7C000062, 21001, new BattleAction(actorId, 0, 1))); - // this is silly, but looks like state change goes full retard unless theyre sent in order updateFlags &= ~ActorUpdateFlags.State; //DoBattleAction(21001, 0x7C000062, new BattleAction(this.actorId, 0, 1, 0, 0, 1)); //Attack Mode } - // todo: should probably add another flag for battleTemp since all this uses reflection if ((updateFlags & ActorUpdateFlags.HpTpMp) != 0) { var propPacketUtil = new ActorPropertyPacketUtil("charaWork.parameterSave", this); @@ -497,6 +496,21 @@ namespace FFXIVClassic_Map_Server.Actors return (byte)((charaWork.parameterSave.hp[0] / charaWork.parameterSave.hpMax[0]) * 100); } + public void SetHP(uint hp) + { + charaWork.parameterSave.hp[0] = (short)hp; + if (hp > charaWork.parameterSave.hpMax[0]) + SetMaxHP(hp); + + updateFlags |= ActorUpdateFlags.HpTpMp; + } + + public void SetMaxHP(uint hp) + { + charaWork.parameterSave.hpMax[0] = (short)hp; + updateFlags |= ActorUpdateFlags.HpTpMp; + } + // todo: the following functions are virtuals since we want to check hidden item bonuses etc on player for certain conditions public virtual void AddHP(int hp) { @@ -516,6 +530,16 @@ namespace FFXIVClassic_Map_Server.Actors } } + public short GetJob() + { + return charaWork.parameterSave.state_mainSkill[0]; + } + + public short GetLevel() + { + return charaWork.parameterSave.state_mainSkillLevel; + } + public void AddMP(int mp) { charaWork.parameterSave.mp = (short)(charaWork.parameterSave.mp + mp).Clamp(ushort.MinValue, charaWork.parameterSave.mpMax); @@ -527,8 +551,7 @@ namespace FFXIVClassic_Map_Server.Actors public void AddTP(int tp) { - tpBase = (ushort)((tpBase + tp).Clamp(0, 3000)); - + charaWork.parameterTemp.tp = (short)((charaWork.parameterTemp.tp + tp).Clamp(0, 3000)); updateFlags |= ActorUpdateFlags.HpTpMp; } @@ -550,9 +573,9 @@ namespace FFXIVClassic_Map_Server.Actors public void CalculateBaseStats() { // todo: apply mods and shit here, get race/level/job and shit - // baseStats.generalParameter[ASIDHOASID] = + } - // todo: should this include stats too? + public void RecalculateStats() { if (GetMod((uint)Modifier.Hp) != 0) @@ -576,7 +599,7 @@ namespace FFXIVClassic_Map_Server.Actors public virtual float GetSpeed() { // todo: for battlenpc/player calculate speed - return moveSpeeds[2] + GetMod((uint)Modifier.Speed); + return GetMod((uint)Modifier.Speed); } public virtual void OnAttack(State state, BattleAction action, ref BattleAction error) diff --git a/FFXIVClassic Map Server/actors/chara/ModifierList.cs b/FFXIVClassic Map Server/actors/chara/ModifierList.cs new file mode 100644 index 00000000..15b188b6 --- /dev/null +++ b/FFXIVClassic Map Server/actors/chara/ModifierList.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FFXIVClassic_Map_Server.actors.chara.npc; + +namespace FFXIVClassic_Map_Server.actors.chara +{ + class ModifierListEntry + { + public uint id; + public Int64 value; + + public ModifierListEntry(uint id, Int64 value) + { + this.id = id; + this.value = value; + } + } + + class ModifierList + { + public Dictionary modList; + public Dictionary mobModList; + + public ModifierList(uint id) + { + modList = new Dictionary(); + mobModList = new Dictionary(); + } + + public void AddModifier(uint id, Int64 val, bool isMobMod) + { + var list = isMobMod ? mobModList : modList; + list.Add(id, new ModifierListEntry(id, val)); + } + + public void SetModifier(uint id, Int64 val, bool isMobMod) + { + var list = isMobMod ? mobModList : modList; + if (list.ContainsKey(id)) + list[id].value = val; + else + list.Add(id, new ModifierListEntry(id, val)); + } + + public Int64 GetModifier(uint id, bool isMobMod) + { + ModifierListEntry retVal; + var list = isMobMod ? mobModList : modList; + if (!list.TryGetValue(id, out retVal)) + return 0; + + return retVal.value; + } + } +} diff --git a/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs b/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs index a666de9d..86a211ce 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs @@ -134,7 +134,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai public bool CanFollowPath() { - return pathFind != null && (GetCurrentState() != null || GetCurrentState().CanChangeState()); + return pathFind != null && (GetCurrentState() == null || GetCurrentState().CanChangeState()); } public bool CanChangeState() @@ -278,6 +278,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai if (controller != null) controller.UseItem(target, slot, itemId); } + public void InternalChangeTarget(Character target) { // targets are changed in the controller diff --git a/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs b/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs index 5b8ef878..3a78aba8 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs @@ -8,6 +8,8 @@ using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server.actors.area; using FFXIVClassic_Map_Server.utils; +using FFXIVClassic_Map_Server.actors.chara.ai.state; +using FFXIVClassic_Map_Server.actors.chara.npc; namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers { @@ -132,10 +134,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers Engage(owner.hateContainer.GetMostHatedTarget()); return; } - //else if (owner.currentLockedTarget != 0) - //{ - // ChangeTarget(Server.GetWorldManager().GetActorInWorld(owner.currentLockedTarget).GetAsCharacter()); - //} if (tick >= waitTime) { @@ -155,7 +153,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers waitTime = tick.AddSeconds(10); owner.OnRoam(tick); - if (!owner.aiContainer.pathFind.IsFollowingPath()) + if (!owner.aiContainer.pathFind.IsFollowingPath() && CanMoveForward(0.0f)) { // will move on next tick owner.aiContainer.pathFind.SetPathFlags(PathFindFlags.None); @@ -166,22 +164,25 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers if (tick >= neutralTime) { - foreach (var player in owner.zone.GetActorsAroundActor(owner, 50)) + if (!owner.neutral && owner.IsAlive()) { - if (!owner.isMovingToSpawn && owner.aiContainer.pathFind.AtPoint() && owner.detectionType != DetectionType.None) + foreach (var player in owner.zone.GetActorsAroundActor(owner, 50)) { - uint levelDifference = (uint)Math.Abs(owner.charaWork.parameterSave.state_mainSkillLevel - player.charaWork.parameterSave.state_mainSkillLevel); - - if (levelDifference <= 10 || (owner.detectionType & DetectionType.IgnoreLevelDifference) != 0 && CanAggroTarget(player)) + if (!owner.isMovingToSpawn && owner.aiContainer.pathFind.AtPoint() && owner.detectionType != DetectionType.None) { - owner.hateContainer.AddBaseHate(player); - break; + uint levelDifference = (uint)Math.Abs(owner.charaWork.parameterSave.state_mainSkillLevel - player.charaWork.parameterSave.state_mainSkillLevel); + + if (levelDifference <= 10 || (owner.detectionType & DetectionType.IgnoreLevelDifference) != 0 && CanAggroTarget(player)) + { + owner.hateContainer.AddBaseHate(player); + break; + } } } } } - if (owner.aiContainer.pathFind.IsFollowingPath()) + if (owner.aiContainer.pathFind.IsFollowingPath() && owner.aiContainer.CanFollowPath()) { owner.aiContainer.pathFind.FollowPath(); } @@ -328,6 +329,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers bool hasInvisible = false; bool isFacing = owner.IsFacing(target); + // use the mobmod sight range before defaulting to 20 yalms + if (detectSight && !hasInvisible && isFacing && distance < owner.GetMobMod((uint)MobModifier.SightRange)) + return CanSeePoint(target.positionX, target.positionY, target.positionZ); + // todo: check line of sight and aggroTypes if (distance > 20) { @@ -341,10 +346,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers } - if ((owner.detectionType & DetectionType.LowHp) != 0 && target.GetHPP() < 75) + + if ((owner.detectionType & DetectionType.Sound) != 0 && !hasSneak && distance < owner.GetMobMod((uint)MobModifier.SoundRange)) return CanSeePoint(target.positionX, target.positionY, target.positionZ); - if (detectSight && !hasInvisible && isFacing) + if ((owner.detectionType & DetectionType.Magic) != 0 && target.aiContainer.IsCurrentState()) + return CanSeePoint(target.positionX, target.positionY, target.positionZ); + + if ((owner.detectionType & DetectionType.LowHp) != 0 && target.GetHPP() < 75) return CanSeePoint(target.positionX, target.positionY, target.positionZ); return false; diff --git a/FFXIVClassic Map Server/actors/chara/ai/ActionQueue.cs b/FFXIVClassic Map Server/actors/chara/ai/helpers/ActionQueue.cs similarity index 100% rename from FFXIVClassic Map Server/actors/chara/ai/ActionQueue.cs rename to FFXIVClassic Map Server/actors/chara/ai/helpers/ActionQueue.cs diff --git a/FFXIVClassic Map Server/actors/chara/ai/PathFind.cs b/FFXIVClassic Map Server/actors/chara/ai/helpers/PathFind.cs similarity index 100% rename from FFXIVClassic Map Server/actors/chara/ai/PathFind.cs rename to FFXIVClassic Map Server/actors/chara/ai/helpers/PathFind.cs diff --git a/FFXIVClassic Map Server/actors/chara/ai/TargetFind.cs b/FFXIVClassic Map Server/actors/chara/ai/helpers/TargetFind.cs similarity index 100% rename from FFXIVClassic Map Server/actors/chara/ai/TargetFind.cs rename to FFXIVClassic Map Server/actors/chara/ai/helpers/TargetFind.cs diff --git a/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs b/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs index 5994f140..0a925e53 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs @@ -73,18 +73,18 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state public override void OnInterrupt() { // todo: send paralyzed/sleep message etc. + if (errorResult != null) + { + owner.zone.BroadcastPacketAroundActor(owner, BattleActionX01Packet.BuildPacket(errorResult.targetId, errorResult.animation, 0x765D, errorResult)); + errorResult = null; + } } public override void OnComplete() { - // todo: possible underflow BattleAction action = new BattleAction(target.actorId, 0x765D, (uint) HitEffect.Hit, 0, (byte) HitDirection.None); errorResult = null; - //var packet = BattleActionX01Packet.BuildPacket(owner.actorId, owner.actorId, target.actorId, (uint)0x19001000, (uint)0x8000604, (ushort)0x765D, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, (byte)0x1); - - // HitDirection (auto attack shouldnt need this afaik) - // todo: implement auto attack damage bonus in Character.OnAttack /* ≪Auto-attack Damage Bonus≫ @@ -98,30 +98,22 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state Thaumaturge Mind Piety * The above damage bonus also applies to “Shot” attacks by archers. */ - + // handle paralyze/intimidate/sleep/whatever in Character.OnAttack owner.OnAttack(this, action, ref errorResult); - // handle paralyze/intimidate/sleep/whatever in character thing owner.DoBattleAction((ushort)BattleActionX01PacketCommand.Attack, action.animation, errorResult == null ? action : errorResult); - - //this.errorPacket = BattleActionX01Packet.BuildPacket(target.actorId, owner.actorId, target.actorId, 0, effectId, 0, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, 0); } public override void TryInterrupt() { if (owner.statusEffects.HasStatusEffectsByFlag((uint)StatusEffectFlags.PreventAction)) { - // todo: sometimes paralyze can let you attack, get random percentage of actually letting you attack + // todo: sometimes paralyze can let you attack, calculate proc rate var list = owner.statusEffects.GetStatusEffectsByFlag((uint)StatusEffectFlags.PreventAction); uint statusId = 0; if (list.Count > 0) { - // todo: actually check proc rate/random chance of whatever effect statusId = list[0].GetStatusId(); } - // todo: which is actually the swing packet - //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; return; } @@ -147,7 +139,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state return false; } // todo: shouldnt need to check if owner is dead since all states would be cleared - if (owner.aiContainer.IsDead() || target.aiContainer.IsDead()) + if (owner.IsDead() || target.IsDead()) { if (owner is BattleNpc) ((BattleNpc)owner).hateContainer.ClearHate(target); diff --git a/FFXIVClassic Map Server/actors/chara/ai/state/InactiveState.cs b/FFXIVClassic Map Server/actors/chara/ai/state/InactiveState.cs new file mode 100644 index 00000000..e0439e37 --- /dev/null +++ b/FFXIVClassic Map Server/actors/chara/ai/state/InactiveState.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FFXIVClassic_Map_Server.Actors; + +namespace FFXIVClassic_Map_Server.actors.chara.ai.state +{ + class InactiveState : State + { + private DateTime endTime; + private uint durationMs; + public InactiveState(Character owner, uint durationMs, bool canChangeState) : + base(owner, null) + { + if (!canChangeState) + owner.aiContainer.InterruptStates(); + this.durationMs = durationMs; + endTime = DateTime.Now.AddMilliseconds(durationMs); + } + + public override bool Update(DateTime tick) + { + if (durationMs == 0) + { + if (owner.IsDead()) + return true; + + if (!owner.statusEffects.HasStatusEffectsByFlag(StatusEffectFlags.PreventAction)) + return true; + } + + if (durationMs != 0 && tick > endTime) + { + return true; + } + + return false; + } + } +} diff --git a/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs b/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs index 610a0e3e..9c9c9bc6 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs @@ -63,6 +63,12 @@ namespace FFXIVClassic_Map_Server.Actors public uint spellListId, skillListId, dropListId; public Dictionary skillList = new Dictionary(); public Dictionary spellList = new Dictionary(); + + public uint poolId, genusId; + public ModifierList poolMods; + public ModifierList genusMods; + public ModifierList spawnMods; + private Dictionary mobModifiers = new Dictionary(); public BattleNpc(int actorNumber, ActorClass actorClass, string uniqueId, Area spawnedArea, float posX, float posY, float posZ, float rot, @@ -326,9 +332,6 @@ namespace FFXIVClassic_Map_Server.Actors public void OnRoam(DateTime tick) { - // todo: move this to battlenpccontroller.. - bool foundActor = false; - // leash back to spawn if (!IsCloseToSpawn()) { @@ -345,7 +348,15 @@ namespace FFXIVClassic_Map_Server.Actors } else { - this.isMovingToSpawn = false; + // recover hp + if (GetHPP() < 100) + { + AddHP(GetMaxHP() / 10); + } + else + { + this.isMovingToSpawn = false; + } lua.LuaEngine.CallLuaBattleFunction(this, "onRoam", this); } } @@ -368,7 +379,6 @@ namespace FFXIVClassic_Map_Server.Actors public override void OnCast(State state, BattleAction[] actions, ref BattleAction[] errors) { base.OnCast(state, actions, ref errors); - } public override void OnAbility(State state, BattleAction[] actions, ref BattleAction[] errors) diff --git a/FFXIVClassic Map Server/dataobjects/Session.cs b/FFXIVClassic Map Server/dataobjects/Session.cs index 13dacb4b..a713efd8 100644 --- a/FFXIVClassic Map Server/dataobjects/Session.cs +++ b/FFXIVClassic Map Server/dataobjects/Session.cs @@ -40,7 +40,7 @@ namespace FFXIVClassic_Map_Server.dataobjects public void QueuePacket(SubPacket subPacket) { subPacket.SetTargetId(id); - Server.GetWorldConnection()?.QueuePacket(subPacket); + Server.GetWorldConnection().QueuePacket(subPacket); } public Player GetActor() @@ -90,7 +90,6 @@ namespace FFXIVClassic_Map_Server.dataobjects playerActor.QueuePositionUpdate(new Vector3(x,y,z)); } - long lastMilis = 0; public void UpdateInstance(List list) { if (isUpdatesLocked) @@ -120,14 +119,7 @@ namespace FFXIVClassic_Map_Server.dataobjects if (actorInstanceList.Contains(actor)) { - //Don't send for static characters (npcs) - // todo: this is retarded, need actual mob class - //if (actor is Character && ((Character)actor).isStatic) - // continue; - //var packet = actor.CreatePositionUpdatePacket(); - //if (packet != null) - // QueuePacket(packet); } else { diff --git a/sql/server_battlenpc_genus.sql b/sql/server_battlenpc_genus.sql index 05f4875b..67da55e0 100644 --- a/sql/server_battlenpc_genus.sql +++ b/sql/server_battlenpc_genus.sql @@ -26,6 +26,7 @@ CREATE TABLE `server_battlenpc_genus` ( `genusId` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `modelSize` tinyint(3) unsigned NOT NULL DEFAULT '1', + `speed` tinyint(3) unsigned NOT NULL DEFAULT '0', `kindredId` int(11) unsigned NOT NULL DEFAULT '0', `kindredName` varchar(255) NOT NULL DEFAULT 'Unknown', `detection` smallint(5) unsigned NOT NULL DEFAULT '0', @@ -63,71 +64,71 @@ CREATE TABLE `server_battlenpc_genus` ( LOCK TABLES `server_battlenpc_genus` WRITE; /*!40000 ALTER TABLE `server_battlenpc_genus` DISABLE KEYS */; set autocommit=0; -INSERT INTO `server_battlenpc_genus` VALUES (1,'Aldgoat',1,1,'Beast',1,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (2,'Antelope',1,1,'Beast',1,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (3,'Wolf',1,1,'Beast',2,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (4,'Opo-opo',1,1,'Beast',1,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (5,'Coeurl',1,1,'Beast',15,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (6,'Goobbue',1,1,'Beast',4,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (7,'Sheep',1,1,'Beast',1,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (8,'Buffalo',1,1,'Beast',4,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (9,'Boar',1,1,'Beast',2,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (10,'Moon-Mouse?',1,1,'Beast',2,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (11,'Mole',1,1,'Beast',4,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (12,'Rodent',1,1,'Beast',2,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (13,'Cactuar',1,2,'Plantoid',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (14,'Funguar',1,2,'Plantoid',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (15,'Flying-trap',1,2,'Plantoid',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (16,'Morbol',1,2,'Plantoid',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (17,'Orobon',1,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (18,'Gigantoad',1,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (19,'Salamander',1,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (20,'Jelly-fish',1,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (21,'Slug',1,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (22,'Megalo-crab',1,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (23,'Amaalja',1,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (24,'Ixal',1,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (25,'Qiqirn',1,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (26,'Goblin',1,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (27,'Kobold',1,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (28,'Sylph',1,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (29,'Person',1,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (30,'Drake',1,5,'Reptilian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (31,'Basilisk',1,5,'Reptilian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (32,'Raptor',1,5,'Reptilian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (33,'Ant-ring',1,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (34,'Swarm',1,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (35,'Diremite',1,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (36,'Chigoe',1,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (37,'Gnat',1,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (38,'Beetle',1,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (39,'Yarzon',1,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (40,'Apkallu',1,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (41,'Vulture',1,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (42,'Dodo',1,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (43,'Bat',1,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (44,'Hippogryph',1,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (45,'Puk',1,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (46,'Ghost',1,8,'Undead',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (47,'The-Damned',1,8,'Undead',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (48,'Wight',1,8,'Undead',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (49,'Coblyn',1,9,'Cursed',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (50,'Spriggan',1,9,'Cursed',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (51,'Ahriman',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (52,'Imp',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (53,'Will-O-Wisp',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (54,'Fire-Elemental',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (55,'Water-Elemental',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (56,'Earth-Elemental',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (57,'Lightning-Elemental',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (58,'Ice-Elemental',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (59,'Wind-Elemental',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (60,'Ogre',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (61,'Phurble',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (62,'Plasmoid',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (63,'Flan',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (64,'Bomb',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -INSERT INTO `server_battlenpc_genus` VALUES (65,'Grenade',1,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (1,'Aldgoat',1,0,1,'Beast',1,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (2,'Antelope',1,0,1,'Beast',1,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (3,'Wolf',1,0,1,'Beast',2,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (4,'Opo-opo',1,0,1,'Beast',1,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (5,'Coeurl',1,0,1,'Beast',15,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (6,'Goobbue',1,0,1,'Beast',4,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (7,'Sheep',1,0,1,'Beast',1,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (8,'Buffalo',1,0,1,'Beast',4,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (9,'Boar',1,0,1,'Beast',2,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (10,'Moon-Mouse?',1,0,1,'Beast',2,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (11,'Mole',1,0,1,'Beast',4,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (12,'Rodent',1,0,1,'Beast',2,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (13,'Cactuar',1,0,2,'Plantoid',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (14,'Funguar',1,0,2,'Plantoid',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (15,'Flying-trap',1,0,2,'Plantoid',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (16,'Morbol',1,0,2,'Plantoid',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (17,'Orobon',1,0,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (18,'Gigantoad',1,0,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (19,'Salamander',1,0,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (20,'Jelly-fish',1,0,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (21,'Slug',1,0,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (22,'Megalo-crab',1,0,3,'Aquan',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (23,'Amaalja',1,0,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (24,'Ixal',1,0,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (25,'Qiqirn',1,0,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (26,'Goblin',1,0,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (27,'Kobold',1,0,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (28,'Sylph',1,0,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (29,'Person',1,0,4,'Spoken',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (30,'Drake',1,0,5,'Reptilian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (31,'Basilisk',1,0,5,'Reptilian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (32,'Raptor',1,0,5,'Reptilian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (33,'Ant-ring',1,0,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (34,'Swarm',1,0,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (35,'Diremite',1,0,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (36,'Chigoe',1,0,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (37,'Gnat',1,0,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (38,'Beetle',1,0,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (39,'Yarzon',1,0,6,'Insect',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (40,'Apkallu',1,0,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (41,'Vulture',1,0,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (42,'Dodo',1,0,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (43,'Bat',1,0,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (44,'Hippogryph',1,0,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (45,'Puk',1,0,7,'Avian',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (46,'Ghost',1,0,8,'Undead',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (47,'The-Damned',1,0,8,'Undead',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (48,'Wight',1,0,8,'Undead',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (49,'Coblyn',1,0,9,'Cursed',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (50,'Spriggan',1,0,9,'Cursed',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (51,'Ahriman',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (52,'Imp',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (53,'Will-O-Wisp',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (54,'Fire-Elemental',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (55,'Water-Elemental',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (56,'Earth-Elemental',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (57,'Lightning-Elemental',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (58,'Ice-Elemental',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (59,'Wind-Elemental',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (60,'Ogre',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (61,'Phurble',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (62,'Plasmoid',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (63,'Flan',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (64,'Bomb',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +INSERT INTO `server_battlenpc_genus` VALUES (65,'Grenade',1,0,10,'Voidsent',0,100,100,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); /*!40000 ALTER TABLE `server_battlenpc_genus` ENABLE KEYS */; UNLOCK TABLES; commit; @@ -141,4 +142,4 @@ commit; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-09-05 1:34:50 +-- Dump completed on 2017-09-11 23:51:16 diff --git a/sql/server_battlenpc_genus_mods.sql b/sql/server_battlenpc_genus_mods.sql new file mode 100644 index 00000000..8e205061 --- /dev/null +++ b/sql/server_battlenpc_genus_mods.sql @@ -0,0 +1,53 @@ +-- 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_battlenpc_genus_mods` +-- + +DROP TABLE IF EXISTS `server_battlenpc_genus_mods`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `server_battlenpc_genus_mods` ( + `genusId` int(10) unsigned NOT NULL, + `modId` smallint(5) unsigned NOT NULL, + `modVal` bigint(20) NOT NULL, + `isMobMod` tinyint(1) unsigned NOT NULL DEFAULT '0' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `server_battlenpc_genus_mods` +-- + +LOCK TABLES `server_battlenpc_genus_mods` WRITE; +/*!40000 ALTER TABLE `server_battlenpc_genus_mods` DISABLE KEYS */; +set autocommit=0; +/*!40000 ALTER TABLE `server_battlenpc_genus_mods` 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-09-11 23:52:18 diff --git a/sql/server_battlenpc_pool_mods.sql b/sql/server_battlenpc_pool_mods.sql new file mode 100644 index 00000000..ed03b238 --- /dev/null +++ b/sql/server_battlenpc_pool_mods.sql @@ -0,0 +1,53 @@ +-- 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_battlenpc_pool_mods` +-- + +DROP TABLE IF EXISTS `server_battlenpc_pool_mods`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `server_battlenpc_pool_mods` ( + `poolId` int(10) unsigned NOT NULL, + `modId` smallint(5) unsigned NOT NULL, + `modVal` bigint(20) NOT NULL, + `isMobMod` tinyint(1) unsigned NOT NULL DEFAULT '0' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `server_battlenpc_pool_mods` +-- + +LOCK TABLES `server_battlenpc_pool_mods` WRITE; +/*!40000 ALTER TABLE `server_battlenpc_pool_mods` DISABLE KEYS */; +set autocommit=0; +/*!40000 ALTER TABLE `server_battlenpc_pool_mods` 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-09-11 23:52:06 diff --git a/sql/server_battlenpc_pools.sql b/sql/server_battlenpc_pools.sql index e0ae764b..016111fc 100644 --- a/sql/server_battlenpc_pools.sql +++ b/sql/server_battlenpc_pools.sql @@ -61,4 +61,4 @@ commit; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-09-07 21:54:45 +-- Dump completed on 2017-09-11 23:51:35 diff --git a/sql/server_battlenpc_spawn_locations.sql b/sql/server_battlenpc_spawn_locations.sql index 91194f28..7119f200 100644 --- a/sql/server_battlenpc_spawn_locations.sql +++ b/sql/server_battlenpc_spawn_locations.sql @@ -56,4 +56,4 @@ commit; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-09-10 2:47:43 +-- Dump completed on 2017-09-11 23:51:12 diff --git a/sql/server_battlenpc_spawn_mods.sql b/sql/server_battlenpc_spawn_mods.sql new file mode 100644 index 00000000..d1d713fd --- /dev/null +++ b/sql/server_battlenpc_spawn_mods.sql @@ -0,0 +1,53 @@ +-- 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_battlenpc_spawn_mods` +-- + +DROP TABLE IF EXISTS `server_battlenpc_spawn_mods`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `server_battlenpc_spawn_mods` ( + `bnpcId` int(10) unsigned NOT NULL, + `modId` smallint(5) unsigned NOT NULL, + `modVal` bigint(20) NOT NULL, + `isMobMod` tinyint(1) unsigned NOT NULL DEFAULT '0' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `server_battlenpc_spawn_mods` +-- + +LOCK TABLES `server_battlenpc_spawn_mods` WRITE; +/*!40000 ALTER TABLE `server_battlenpc_spawn_mods` DISABLE KEYS */; +set autocommit=0; +/*!40000 ALTER TABLE `server_battlenpc_spawn_mods` 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-09-11 23:51:53