diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
index 2279f3d1..e5f93603 100644
--- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
+++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
@@ -85,6 +85,7 @@
+
@@ -110,6 +111,7 @@
+
diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs
index 4b16fd00..065955f4 100644
--- a/FFXIVClassic Map Server/WorldManager.cs
+++ b/FFXIVClassic Map Server/WorldManager.cs
@@ -436,13 +436,13 @@ namespace FFXIVClassic_Map_Server
conn.Open();
var query = @"
SELECT bsl.bnpcId, bsl.groupId, bsl.positionX, bsl.positionY, bsl.positionZ, bsl.rotation,
- bgr.groupId, bgr.poolId, bgr.actorClassId, bgr.scriptName, bgr.minLevel, bgr.maxLevel, bgr.respawnTime, bgr.hp, bgr.mp,
+ bgr.groupId, bgr.poolId, bgr.scriptName, bgr.minLevel, bgr.maxLevel, bgr.respawnTime, bgr.hp, bgr.mp,
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.poolId, bpo.genusId, bpo.actorClassId, bpo.currentJob, bpo.combatSkill, bpo.combatDelay, bpo.combatDmgMult, bpo.aggroType,
bpo.immunity, bpo.linkType, bpo.skillListId, bpo.spellListId,
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
+ bge.fire, bge.ice, bge.wind, bge.lightning, bge.earth, bge.water, bge.element
FROM server_battlenpc_spawn_locations bsl
INNER JOIN server_battlenpc_groups bgr ON bsl.groupId = bgr.groupId
INNER JOIN server_battlenpc_pools bpo ON bgr.poolId = bpo.poolId
@@ -517,8 +517,12 @@ namespace FFXIVClassic_Map_Server
//battleNpc.SetMod((uint)Modifier.ResistFire, )
- zone.AddActorToZone(battleNpc);
- count++;
+ // todo: this is dumb
+ if (battleNpc.npcSpawnType == NpcSpawnType.Normal)
+ {
+ zone.AddActorToZone(battleNpc);
+ count++;
+ }
}
}
}
@@ -552,13 +556,13 @@ namespace FFXIVClassic_Map_Server
conn.Open();
var query = @"
SELECT bsl.bnpcId, bsl.groupId, bsl.positionX, bsl.positionY, bsl.positionZ, bsl.rotation,
- bgr.groupId, bgr.poolId, bgr.actorClassId, bgr.scriptName, bgr.minLevel, bgr.maxLevel, bgr.respawnTime, bgr.hp, bgr.mp,
+ bgr.groupId, bgr.poolId, bgr.scriptName, bgr.minLevel, bgr.maxLevel, bgr.respawnTime, bgr.hp, bgr.mp,
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.poolId, bpo.genusId, bpo.actorClassId, bpo.currentJob, bpo.combatSkill, bpo.combatDelay, bpo.combatDmgMult, bpo.aggroType,
bpo.immunity, bpo.linkType, bpo.skillListId, bpo.spellListId,
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
+ bge.fire, bge.ice, bge.wind, bge.lightning, bge.earth, bge.water, bge.element
FROM server_battlenpc_spawn_locations bsl
INNER JOIN server_battlenpc_groups bgr ON bsl.groupId = bgr.groupId
INNER JOIN server_battlenpc_pools bpo ON bgr.poolId = bpo.poolId
diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs
index 3918f2f6..7e657d1a 100644
--- a/FFXIVClassic Map Server/actors/area/Area.cs
+++ b/FFXIVClassic Map Server/actors/area/Area.cs
@@ -111,6 +111,9 @@ namespace FFXIVClassic_Map_Server.Actors
{
lock (mActorList)
{
+ if (actor is Character)
+ ((Character)actor).ResetTempVars();
+
if (!mActorList.ContainsKey(actor.actorId))
mActorList.Add(actor.actorId, actor);
diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs
index 9134e085..7ce0cf7b 100644
--- a/FFXIVClassic Map Server/actors/chara/Character.cs
+++ b/FFXIVClassic Map Server/actors/chara/Character.cs
@@ -13,6 +13,7 @@ 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;
+using FFXIVClassic_Map_Server.actors.chara.npc;
namespace FFXIVClassic_Map_Server.Actors
{
@@ -25,6 +26,15 @@ namespace FFXIVClassic_Map_Server.Actors
Player
}
+ enum DamageTakenType
+ {
+ None,
+ Attack,
+ Magic,
+ Weaponskill,
+ Ability
+ }
+
class Character : Actor
{
public const int CLASSID_PUG = 2;
@@ -102,6 +112,8 @@ namespace FFXIVClassic_Map_Server.Actors
public ushort newMainState;
public float spawnX, spawnY, spawnZ;
+ protected Dictionary tempVars = new Dictionary();
+
public Character(uint actorID) : base(actorID)
{
//Init timer array to "notimer"
@@ -392,6 +404,12 @@ namespace FFXIVClassic_Map_Server.Actors
return false;
}
+ public virtual bool Engage(Character target)
+ {
+ aiContainer.Engage(target);
+ return false;
+ }
+
public virtual bool Disengage(ushort newMainState = 0xFFFF)
{
if (newMainState != 0xFFFF)
@@ -447,12 +465,12 @@ namespace FFXIVClassic_Map_Server.Actors
public bool IsDead()
{
- return aiContainer.IsDead();
+ return !IsAlive();
}
public bool IsAlive()
{
- return !aiContainer.IsDead();
+ return !aiContainer.IsDead() && GetHP() > 0;
}
public short GetHP()
@@ -520,7 +538,7 @@ namespace FFXIVClassic_Map_Server.Actors
// todo: +/- hp and die
// todo: battlenpcs probably have way more hp?
var addHp = charaWork.parameterSave.hp[0] + hp;
- addHp = addHp.Clamp(ushort.MinValue, charaWork.parameterSave.hpMax[0]);
+ addHp = addHp.Clamp((short)GetMod((uint)Modifier.MinimumHpLock), charaWork.parameterSave.hpMax[0]);
charaWork.parameterSave.hp[0] = (short)addHp;
if (charaWork.parameterSave.hp[0] < 1)
@@ -615,7 +633,7 @@ namespace FFXIVClassic_Map_Server.Actors
//var packet = BattleActionX01Packet.BuildPacket(owner.actorId, owner.actorId, target.actorId, (uint)0x19001000, (uint)0x8000604, (ushort)0x765D, (ushort)BattleActionX01PacketCommand.Attack, (ushort)damage, (byte)0x1);
}
- target.OnDamageTaken(this, action);
+ target.OnDamageTaken(this, action, DamageTakenType.Ability);
// todo: call onAttack/onDamageTaken
target.DelHP(action.amount);
if (target is BattleNpc)
@@ -629,7 +647,7 @@ namespace FFXIVClassic_Map_Server.Actors
this.DelMP(spell.mpCost); // mpCost can be set in script e.g. if caster has something for free spells
foreach (var action in actions)
- zone.FindActorInArea(action.targetId).OnDamageTaken(this, action);
+ zone.FindActorInArea(action.targetId).OnDamageTaken(this, action, DamageTakenType.Magic);
if (target is BattleNpc)
((BattleNpc)target).lastAttacker = this;
@@ -642,7 +660,7 @@ namespace FFXIVClassic_Map_Server.Actors
this.DelTP(skill.tpCost);
foreach (var action in actions)
- zone.FindActorInArea(action.targetId)?.OnDamageTaken(this, action);
+ zone.FindActorInArea(action.targetId)?.OnDamageTaken(this, action, DamageTakenType.Weaponskill);
if (target is BattleNpc)
((BattleNpc)target).lastAttacker = this;
@@ -654,7 +672,7 @@ namespace FFXIVClassic_Map_Server.Actors
((BattleNpc)target).lastAttacker = this;
foreach (var action in actions)
- zone.FindActorInArea(action.targetId)?.OnDamageTaken(this, action);
+ zone.FindActorInArea(action.targetId)?.OnDamageTaken(this, action, DamageTakenType.Ability);
}
public virtual void OnSpawn()
@@ -672,11 +690,64 @@ namespace FFXIVClassic_Map_Server.Actors
}
- public virtual void OnDamageTaken(Character attacker, BattleAction action)
+ public virtual void OnDamageTaken(Character attacker, BattleAction action, DamageTakenType damageTakenType)
{
}
- #endregion
+
+ public UInt64 GetTempVar(string name)
+ {
+ UInt64 retVal = 0;
+ if (tempVars.TryGetValue(name, out retVal))
+ return retVal;
+ return 0;
+ }
+
+ // cause lua is a dick
+ public void SetTempVar(string name, uint val)
+ {
+ if (tempVars.ContainsKey(name))
+ tempVars[name] = val;
+ }
+
+ public void SetTempVar(string name, UInt64 val)
+ {
+ if (tempVars.ContainsKey(name))
+ tempVars[name] = val;
+ }
+
+ public void ResetTempVars()
+ {
+ tempVars.Clear();
+ }
+
+ #region lua helpers
+ public bool IsEngaged()
+ {
+ return aiContainer.IsEngaged();
+ }
+
+ public bool IsPlayer()
+ {
+ return this is Player;
+ }
+
+ public bool IsMonster()
+ {
+ return this is BattleNpc && !IsAlly();
+ }
+
+ public bool IsPet()
+ {
+ return this is Pet;
+ }
+
+ public bool IsAlly()
+ {
+ return this is Ally;
+ }
+ #endregion lua helpers
+ #endregion ai stuff
}
}
diff --git a/FFXIVClassic Map Server/actors/chara/Modifier.cs b/FFXIVClassic Map Server/actors/chara/Modifier.cs
index d3f081b6..c58b3266 100644
--- a/FFXIVClassic Map Server/actors/chara/Modifier.cs
+++ b/FFXIVClassic Map Server/actors/chara/Modifier.cs
@@ -53,5 +53,6 @@ namespace FFXIVClassic_Map_Server.actors.chara
HarvestRate = 40,
Raise = 41,
+ MinimumHpLock = 42, // hp cannot fall below this value
}
}
diff --git a/FFXIVClassic Map Server/actors/chara/ai/BattleCommand.cs b/FFXIVClassic Map Server/actors/chara/ai/BattleCommand.cs
index ef44cffc..8a01284c 100644
--- a/FFXIVClassic Map Server/actors/chara/ai/BattleCommand.cs
+++ b/FFXIVClassic Map Server/actors/chara/ai/BattleCommand.cs
@@ -235,5 +235,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
return tpCost;
}
+
+ public List GetTargets()
+ {
+ return targetFind?.GetTargets();
+ }
}
}
diff --git a/FFXIVClassic Map Server/actors/chara/ai/controllers/AllyController.cs b/FFXIVClassic Map Server/actors/chara/ai/controllers/AllyController.cs
new file mode 100644
index 00000000..b5820871
--- /dev/null
+++ b/FFXIVClassic Map Server/actors/chara/ai/controllers/AllyController.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FFXIVClassic_Map_Server.Actors;
+using FFXIVClassic_Map_Server.actors.chara.npc;
+
+namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
+{
+ // todo: this is probably not needed, can do everything in their script
+ class AllyController : BattleNpcController
+ {
+ protected new Ally owner;
+ public AllyController(Ally owner) :
+ base(owner)
+ {
+ this.owner = owner;
+ }
+
+ // server really likes to hang whenever scripts iterate area's actorlist
+ protected override void DoCombatTick(DateTime tick, List contentGroupCharas = null)
+ {
+ if (owner.currentContentGroup != null)
+ {
+ contentGroupCharas = new List(owner.currentContentGroup.GetMemberCount());
+ foreach (var charaId in owner.currentContentGroup.GetMembers())
+ {
+ var chara = owner.zone.FindActorInArea(charaId);
+
+ if (chara != null)
+ contentGroupCharas.Add(chara);
+ }
+ }
+ base.DoCombatTick(tick, contentGroupCharas);
+ }
+ }
+}
diff --git a/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs b/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs
index 3a78aba8..cd8e1961 100644
--- a/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs
+++ b/FFXIVClassic Map Server/actors/chara/ai/controllers/BattleNpcController.cs
@@ -15,19 +15,19 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
{
class BattleNpcController : Controller
{
- private DateTime lastActionTime;
- private DateTime lastSpellCastTime;
- private DateTime lastSkillTime;
- private DateTime lastSpecialSkillTime; // todo: i dont think monsters have "2hr" cooldowns like ffxi
- private DateTime deaggroTime;
- private DateTime neutralTime;
- private DateTime waitTime;
+ protected DateTime lastActionTime;
+ protected DateTime lastSpellCastTime;
+ protected DateTime lastSkillTime;
+ protected DateTime lastSpecialSkillTime; // todo: i dont think monsters have "2hr" cooldowns like ffxi
+ protected DateTime deaggroTime;
+ protected DateTime neutralTime;
+ protected DateTime waitTime;
private bool firstSpell = true;
- private DateTime lastRoamUpdate;
- private DateTime battleStartTime;
+ protected DateTime lastRoamUpdate;
+ protected DateTime battleStartTime;
- private new BattleNpc owner;
+ protected new BattleNpc owner;
public BattleNpcController(BattleNpc owner) :
base(owner)
{
@@ -84,7 +84,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
return canEngage;
}
- private bool TryEngage(Character target)
+ protected bool TryEngage(Character target)
{
// todo:
return true;
@@ -127,7 +127,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
// todo:
}
- private void DoRoamTick(DateTime tick)
+ protected virtual void DoRoamTick(DateTime tick)
{
if (owner.hateContainer.GetHateList().Count > 0)
{
@@ -166,15 +166,18 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
{
if (!owner.neutral && owner.IsAlive())
{
- foreach (var player in owner.zone.GetActorsAroundActor(owner, 50))
+ foreach (var chara in owner.zone.GetActorsAroundActor(owner, 50))
{
+ if (owner.allegiance == chara.allegiance)
+ continue;
+
if (!owner.isMovingToSpawn && owner.aiContainer.pathFind.AtPoint() && owner.detectionType != DetectionType.None)
{
- uint levelDifference = (uint)Math.Abs(owner.charaWork.parameterSave.state_mainSkillLevel - player.charaWork.parameterSave.state_mainSkillLevel);
+ uint levelDifference = (uint)Math.Abs(owner.charaWork.parameterSave.state_mainSkillLevel - chara.charaWork.parameterSave.state_mainSkillLevel);
- if (levelDifference <= 10 || (owner.detectionType & DetectionType.IgnoreLevelDifference) != 0 && CanAggroTarget(player))
+ if (levelDifference <= 10 || (owner.detectionType & DetectionType.IgnoreLevelDifference) != 0 && CanAggroTarget(chara))
{
- owner.hateContainer.AddBaseHate(player);
+ owner.hateContainer.AddBaseHate(chara);
break;
}
}
@@ -188,7 +191,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
}
}
- private void DoCombatTick(DateTime tick)
+ protected virtual void DoCombatTick(DateTime tick, List contentGroupCharas = null)
{
HandleHate();
@@ -200,10 +203,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
}
Move();
- lua.LuaEngine.CallLuaBattleFunction(owner, "onCombatTick", owner, owner.target, Utils.UnixTimeStampUTC(tick));
+ lua.LuaEngine.CallLuaBattleFunction(owner, "onCombatTick", owner, owner.target, Utils.UnixTimeStampUTC(tick), contentGroupCharas);
}
- private void Move()
+ protected virtual void Move()
{
if (!owner.aiContainer.CanFollowPath())
{
@@ -257,7 +260,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
}
}
- private void FaceTarget()
+ protected void FaceTarget()
{
// todo: check if stunned etc
if (owner.statusEffects.HasStatusEffectsByFlag(StatusEffectFlags.PreventAction))
@@ -269,7 +272,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
}
}
- private bool CanMoveForward(float distance)
+ protected bool CanMoveForward(float distance)
{
// todo: check spawn leash and stuff
if (!owner.IsCloseToSpawn())
@@ -283,7 +286,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
return true;
}
- public bool CanAggroTarget(Character target)
+ public virtual bool CanAggroTarget(Character target)
{
if (owner.neutral || owner.detectionType == DetectionType.None || owner.IsDead())
{
@@ -303,7 +306,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
return false;
}
- public bool CanDetectTarget(Character target, bool forceSight = false)
+ public virtual bool CanDetectTarget(Character target, bool forceSight = false)
{
if (owner.IsDead())
return false;
@@ -359,12 +362,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
return false;
}
- public bool CanSeePoint(float x, float y, float z)
+ public virtual bool CanSeePoint(float x, float y, float z)
{
return NavmeshUtils.CanSee((Zone)owner.zone, owner.positionX, owner.positionY, owner.positionZ, x, y, z);
}
- private void HandleHate()
+ protected virtual void HandleHate()
{
ChangeTarget(owner.hateContainer.GetMostHatedTarget());
}
diff --git a/FFXIVClassic Map Server/actors/chara/ai/state/DespawnState.cs b/FFXIVClassic Map Server/actors/chara/ai/state/DespawnState.cs
index fc80251c..4ba940b2 100644
--- a/FFXIVClassic Map Server/actors/chara/ai/state/DespawnState.cs
+++ b/FFXIVClassic Map Server/actors/chara/ai/state/DespawnState.cs
@@ -24,6 +24,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
{
if (tick >= respawnTime)
{
+ owner.ResetTempVars();
owner.Spawn(tick);
return true;
}
diff --git a/FFXIVClassic Map Server/actors/chara/npc/Ally.cs b/FFXIVClassic Map Server/actors/chara/npc/Ally.cs
new file mode 100644
index 00000000..5ef2546b
--- /dev/null
+++ b/FFXIVClassic Map Server/actors/chara/npc/Ally.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FFXIVClassic_Map_Server.Actors;
+using FFXIVClassic_Map_Server.actors.chara.ai;
+using FFXIVClassic_Map_Server.actors.chara.ai.controllers;
+
+namespace FFXIVClassic_Map_Server.actors.chara.npc
+{
+ class Ally : BattleNpc
+ {
+ // todo: ally class is probably not necessary
+ public Ally(int actorNumber, ActorClass actorClass, string uniqueId, Area spawnedArea, float posX, float posY, float posZ, float rot,
+ ushort actorState, uint animationId, string customDisplayName)
+ : base(actorNumber, actorClass, uniqueId, spawnedArea, posX, posY, posZ, rot, actorState, animationId, customDisplayName)
+ {
+ aiContainer = new AIContainer(this, new AllyController(this), new PathFind(this), new TargetFind(this));
+ this.allegiance = CharacterTargetingAllegiance.Player;
+ }
+ }
+}
diff --git a/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs b/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs
index 9c9c9bc6..e90bb91f 100644
--- a/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs
+++ b/FFXIVClassic Map Server/actors/chara/npc/BattleNpc.cs
@@ -54,10 +54,10 @@ namespace FFXIVClassic_Map_Server.Actors
public DetectionType detectionType;
public KindredType kindredType;
public bool neutral;
- private uint despawnTime;
- private uint respawnTime;
- private uint spawnDistance;
- private uint bnpcId;
+ protected uint despawnTime;
+ protected uint respawnTime;
+ protected uint spawnDistance;
+ protected uint bnpcId;
public Character lastAttacker;
public uint spellListId, skillListId, dropListId;
@@ -69,7 +69,7 @@ namespace FFXIVClassic_Map_Server.Actors
public ModifierList genusMods;
public ModifierList spawnMods;
- private Dictionary mobModifiers = new Dictionary();
+ protected Dictionary mobModifiers = new Dictionary();
public BattleNpc(int actorNumber, ActorClass actorClass, string uniqueId, Area spawnedArea, float posX, float posY, float posZ, float rot,
ushort actorState, uint animationId, string customDisplayName)
@@ -379,16 +379,30 @@ namespace FFXIVClassic_Map_Server.Actors
public override void OnCast(State state, BattleAction[] actions, ref BattleAction[] errors)
{
base.OnCast(state, actions, ref errors);
+
+ if (GetMobMod((uint)MobModifier.SpellScript) != 0)
+ foreach (var action in actions)
+ lua.LuaEngine.CallLuaBattleFunction(this, "onCast", this, zone.FindActorInArea(action.targetId), ((MagicState)state).GetSpell(), action);
}
public override void OnAbility(State state, BattleAction[] actions, ref BattleAction[] errors)
{
base.OnAbility(state, actions, ref errors);
+
+ /*
+ if (GetMobMod((uint)MobModifier.AbilityScript) != 0)
+ foreach (var action in actions)
+ lua.LuaEngine.CallLuaBattleFunction(this, "onAbility", this, zone.FindActorInArea(action.targetId), ((AbilityState)state).GetAbility(), action);
+ */
}
public override void OnWeaponSkill(State state, BattleAction[] actions, ref BattleAction[] errors)
{
base.OnWeaponSkill(state, actions, ref errors);
+
+ if (GetMobMod((uint)MobModifier.WeaponSkillScript) != 0)
+ foreach (var action in actions)
+ lua.LuaEngine.CallLuaBattleFunction(this, "onWeaponSkill", this, zone.FindActorInArea(action.targetId), ((WeaponSkillState)state).GetWeaponSkill(), action);
}
public override void OnSpawn()
@@ -434,10 +448,10 @@ namespace FFXIVClassic_Map_Server.Actors
mobModifiers.Add((MobModifier)mobModId, val);
}
- public override void OnDamageTaken(Character attacker, BattleAction action)
+ public override void OnDamageTaken(Character attacker, BattleAction action, DamageTakenType damageTakenType)
{
if (GetMobMod((uint)MobModifier.DefendScript) != 0)
- lua.LuaEngine.CallLuaBattleFunction(this, "onDamageTaken", this, attacker, action.amount);
+ lua.LuaEngine.CallLuaBattleFunction(this, "onDamageTaken", this, attacker, action.amount, (uint)damageTakenType);
}
}
}
diff --git a/FFXIVClassic Map Server/actors/chara/npc/MobModifier.cs b/FFXIVClassic Map Server/actors/chara/npc/MobModifier.cs
index 7b2cc67b..21a75d53 100644
--- a/FFXIVClassic Map Server/actors/chara/npc/MobModifier.cs
+++ b/FFXIVClassic Map Server/actors/chara/npc/MobModifier.cs
@@ -28,7 +28,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.npc
AttackScript = 17, // call my script's onAttack whenever i attack
DefendScript = 18, // call my script's onDamageTaken whenever i take damage
SpellScript = 19, // call my script's onSpellCast whenever i finish casting
- WeaponskillScript = 20, // call my script's onWeaponSkill whenever i finish using a weaponskill
+ WeaponSkillScript = 20, // call my script's onWeaponSkill whenever i finish using a weaponskill
AbilityScript = 21, // call my script's onAbility whenever i finish using an ability
CallForHelp = 22, // actor with this id outside of target's party with this can attack me
FreeForAll = 23, // any actor can attack me
diff --git a/FFXIVClassic Map Server/actors/group/ContentGroup.cs b/FFXIVClassic Map Server/actors/group/ContentGroup.cs
index f5353198..4370f1c4 100644
--- a/FFXIVClassic Map Server/actors/group/ContentGroup.cs
+++ b/FFXIVClassic Map Server/actors/group/ContentGroup.cs
@@ -169,5 +169,9 @@ namespace FFXIVClassic_Map_Server.actors.group
DeleteGroup();
}
+ public List GetMembers()
+ {
+ return members;
+ }
}
}
diff --git a/data/scripts/ally.lua b/data/scripts/ally.lua
new file mode 100644
index 00000000..97d797dd
--- /dev/null
+++ b/data/scripts/ally.lua
@@ -0,0 +1,78 @@
+require ("global")
+require ("magic")
+require ("weaponskill")
+
+allyGlobal =
+{
+};
+
+function allyGlobal.onSpawn(ally, target)
+
+end;
+
+function allyGlobal.onEngage(ally, target)
+
+end;
+
+function allyGlobal.onAttack(ally, target, damage)
+
+end;
+
+function allyGlobal.onDamageTaken(ally, attacker, damage)
+
+end;
+
+function allyGlobal.onCombatTick(ally, target, tick, contentGroupCharas)
+ allyGlobal.HelpPlayers(ally, contentGroupCharas);
+end;
+
+function allyGlobal.onDeath(ally, player, lastAttacker)
+
+end;
+
+function allyGlobal.onDespawn(ally)
+
+end;
+
+function allyGlobal.HelpPlayers(ally, contentGroupCharas, pickRandomTarget)
+ if contentGroupCharas then
+ for _, chara in pairs(contentGroupCharas) do
+ if chara then
+ -- probably a player, or another ally
+ -- todo: queue support actions, heal, try pull hate off player etc
+ if chara.IsPlayer() then
+ -- do stuff
+ if not ally.IsEngaged() then
+ if chara.IsEngaged() then
+ allyGlobal.EngageTarget(ally, target, nil);
+ end;
+ end;
+ elseif chara.IsMonster() and chara.IsEngaged() then
+
+ end;
+ end;
+ end;
+ end;
+end;
+
+function allyGlobal.HealPlayer(ally, player)
+
+end;
+
+function allyGlobal.SupportAction(ally, player)
+
+end;
+
+function allyGlobal.EngageTarget(ally, target, contentGroupCharas)
+ if contentGroupCharas then
+ for _, chara in pairs(contentGroupCharas) do
+ if chara.IsMonster() then
+ if chara.allegiance ~= ally.allegiance then
+ ally.Engage(chara);
+ end;
+ end;
+ end;
+ elseif target then
+ ally.Engage(target);
+ end;
+end;
\ No newline at end of file
diff --git a/data/scripts/commands/weaponskill/skull_sunder.lua b/data/scripts/commands/weaponskill/skull_sunder.lua
new file mode 100644
index 00000000..e44a637d
--- /dev/null
+++ b/data/scripts/commands/weaponskill/skull_sunder.lua
@@ -0,0 +1,27 @@
+require("global");
+require("weaponskill");
+
+function onSkillPrepare(caster, target, spell)
+ return 0;
+end;
+
+function onSkillStart(caster, target, spell)
+ return 0;
+end;
+
+function onSkillFinish(caster, target, spell, action)
+ local damage = math.random(10, 100);
+
+ -- todo: populate a global script with statuses and modifiers
+ action.worldMasterTextId = 0x765D;
+
+ -- todo: populate a global script with statuses and modifiers
+ -- magic.HandleAttackSkill(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.UpdateHate(caster, damage);
+ end;
+ return damage;
+end;
\ No newline at end of file
diff --git a/data/scripts/directors/OpeningDirector.lua b/data/scripts/directors/OpeningDirector.lua
index b9952fad..bc226d81 100644
--- a/data/scripts/directors/OpeningDirector.lua
+++ b/data/scripts/directors/OpeningDirector.lua
@@ -28,7 +28,7 @@ function onUpdate()
end
function onTalkEvent(player, npc)
-;
+
if (player:HasQuest(110001) == true) then
man0l0Quest = player:GetQuest("man0l0");
diff --git a/data/scripts/directors/Quest/QuestDirectorMan0g001.lua b/data/scripts/directors/Quest/QuestDirectorMan0g001.lua
index 83b06b38..26c73050 100644
--- a/data/scripts/directors/Quest/QuestDirectorMan0g001.lua
+++ b/data/scripts/directors/Quest/QuestDirectorMan0g001.lua
@@ -1,5 +1,6 @@
require ("global")
require ("tutorial")
+require ("modifiers")
require ("quests/man/man0g0")
--processTtrBtl001: Active Mode Tutorial
@@ -9,6 +10,37 @@ function init()
return "/Director/Quest/QuestDirectorMan0g001";
end
+function onCreateContentArea(players, director, contentArea, contentGroup)
+
+ local worldManager = GetWorldManager();
+
+ yshtola = GetWorldManager():SpawnBattleNpcById(6, contentArea);
+ stahlmann = GetWorldManager():SpawnBattleNpcById(7, contentArea);
+
+ mob1 = GetWorldManager():SpawnBattleNpcById(3, contentArea);
+ mob2 = GetWorldManager():SpawnBattleNpcById(4, contentArea);
+ mob3 = GetWorldManager():SpawnBattleNpcById(5, contentArea);
+
+ local added = false;
+ for _, player in pairs(players) do
+ if player.currentParty and not added then
+ player.currentParty.AddMember(yshtola);
+ player.currentParty.AddMember(stahlmann);
+ added = true;
+ end;
+ -- dont let player die
+ player.SetModifier(modifiersGlobal.MinimumHpLock, 1);
+
+ contentGroup:AddMember(player);
+ end;
+ contentGroup:AddMember(director);
+ contentGroup:AddMember(yshtola);
+ contentGroup:AddMember(stahlmann);
+ contentGroup:AddMember(mob1);
+ contentGroup:AddMember(mob2);
+ contentGroup:AddMember(mob3);
+end
+
function onEventStarted(player, actor, triggerName)
man0g0Quest = player:GetQuest("Man0g0");
@@ -16,30 +48,20 @@ function onEventStarted(player, actor, triggerName)
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrBtl001", nil, nil, nil);
player:EndEvent();
waitForSignal("playerActive");
- wait(1); --If this isn't here, the scripts bugs out. TODO: Find a better alternative.
+ wait(2); --If this isn't here, the scripts bugs out. TODO: Find a better alternative.
kickEventContinue(player, actor, "noticeEvent", "noticeEvent");
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrBtl002", nil, nil, nil);
player:EndEvent();
- wait(4);
+
closeTutorialWidget(player);
- showTutorialSuccessWidget(player, 9055); --Open TutorialSuccessWidget for attacking enemy
wait(3);
+
+ man0g0Quest:NextPhase(5);
openTutorialWidget(player, CONTROLLER_KEYBOARD, TUTORIAL_TP);
- wait(5);
- closeTutorialWidget(player);
- openTutorialWidget(player, CONTROLLER_KEYBOARD, TUTORIAL_WEAPONSKILLS);
- wait(4); --Should be wait for weaponskillUsed signal
- closeTutorialWidget(player);
- showTutorialSuccessWidget(player, 9065); --Open TutorialSuccessWidget for weapon skill
+ wait(5);
- wait(6); --Should be wait for mobkill
- worldMaster = GetWorldMaster();
- player:SendDataPacket("attention", worldMaster, "", 51073, 2);
- wait(7);
- player:ChangeMusic(7);
- player:ChangeState(0);
- kickEventContinue(player, actor, "noticeEvent", "noticeEvent");
- callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent020_1", nil, nil, nil);
+ man0g0Quest:NextPhase(6);
+ closeTutorialWidget(player);
--[[
IF DoW:
@@ -54,10 +76,10 @@ function onEventStarted(player, actor, triggerName)
OpenWidget (DEFEAT ENEMY)
]]
- man0g0Quest:NextPhase(10);
- player:EndEvent();
+ --man0g0Quest:NextPhase(10);
+ --player:EndEvent();
- GetWorldManager():DoZoneChange(player, 155, "PrivateAreaMasterPast", 1, 15, 175.38, -1.21, -1156.51, -2.1);
+ --GetWorldManager():DoZoneChange(player, 155, "PrivateAreaMasterPast", 1, 15, 175.38, -1.21, -1156.51, -2.1);
end
diff --git a/data/scripts/directors/Quest/QuestDirectorMan0l001.lua b/data/scripts/directors/Quest/QuestDirectorMan0l001.lua
index f26b1094..eb6d4d75 100644
--- a/data/scripts/directors/Quest/QuestDirectorMan0l001.lua
+++ b/data/scripts/directors/Quest/QuestDirectorMan0l001.lua
@@ -15,7 +15,9 @@ function onCreateContentArea(players, director, contentArea, contentGroup)
mob2 = contentArea:SpawnActor(2205403, "mob2", -3.02, 17.35, 14.24, -2.81);
mob3 = contentArea:SpawnActor(2205403, "mob3", -3.02-3, 17.35, 14.24, -2.81);
- contentGroup:AddMember(player);
+ for _, player in pairs(players) do
+ contentGroup:AddMember(player);
+ end;
contentGroup:AddMember(director);
contentGroup:AddMember(yshtola);
contentGroup:AddMember(stahlmann);
diff --git a/data/scripts/global.lua b/data/scripts/global.lua
index a133f32f..b26475fb 100644
--- a/data/scripts/global.lua
+++ b/data/scripts/global.lua
@@ -108,7 +108,15 @@ STAT_CRAFT_PROCESS_CONTROL = 32;
STAT_HARVEST_POTENCY = 33;
STAT_HARVEST_LIMIT = 34;
STAT_HARVEST_RATE = 35;
-
+
+-- DAMAGE TAKEN TYPE
+DAMAGE_TAKEN_TYPE_NONE = 0;
+DAMAGE_TAKEN_TYPE_ATTACK = 1;
+DAMAGE_TAKEN_TYPE_MAGIC = 2;
+DAMAGE_TAKEN_TYPE_WEAPONSKILL = 3;
+DAMAGE_TAKEN_TYPE_ABILITY = 4;
+
+
--UTILS
diff --git a/data/scripts/player.lua b/data/scripts/player.lua
index 6b1ee460..542e0aae 100644
--- a/data/scripts/player.lua
+++ b/data/scripts/player.lua
@@ -19,7 +19,7 @@ function onBeginLogin(player)
end
--For Opening. Set Director and reset position incase d/c
- if (player:HasQuest(110001) == true and player:GetZoneID() == 193) then
+ if (player:HasQuest(110001) == true and player:GetZoneID() == 193) then
director = player:GetZone():CreateDirector("OpeningDirector", false);
player:AddDirector(director);
director:StartDirector(true);
diff --git a/data/scripts/unique/fst0Battle03/Monster/bloodthirsty_wolf.lua b/data/scripts/unique/fst0Battle03/Monster/bloodthirsty_wolf.lua
new file mode 100644
index 00000000..d0f3b4cb
--- /dev/null
+++ b/data/scripts/unique/fst0Battle03/Monster/bloodthirsty_wolf.lua
@@ -0,0 +1,58 @@
+require ("global")
+require ("modifiers")
+require ("ally")
+
+function onSpawn(mob)
+
+end;
+
+function onDamageTaken(mob, attacker, damage, damageType)
+ if attacker.IsPlayer() then
+ local man0g0Quest = attacker:GetQuest("Man0g0");
+ if damageType == DAMAGE_TAKEN_TYPE_ATTACK then
+ if man0g0Quest:GetPhase() == 5 then
+ closeTutorialWidget(player);
+ showTutorialSuccessWidget(player, 9055); --Open TutorialSuccessWidget for attacking enemy
+ man0g0Quest:NextPhase(6);
+ end;
+ elseif damageType == DAMAGE_TAKEN_TYPE_WEAPONSKILL or damageType == DAMAGE_TAKEN_TYPE_MAGIC then
+ if man0g0Quest:GetPhase() == 6 then
+ closeTutorialWidget(player);
+ showTutorialSuccessWidget(player, 9065); --Open TutorialSuccessWidget for weapon skill
+ man0g0Quest:NextPhase(7);
+ end;
+ end;
+ end;
+end;
+
+function onDeath(mob, player, lastAttacker)
+ if player then
+ local man0g0Quest = player:GetQuest("Man0g0");
+ if man0g0Quest and man0g0Quest:GetPhase() >= 7 then
+ man0g0Quest:NextPhase(man0g0Quest:GetPhase() + 1);
+ mob:SetTempVar("playerId", player.actorId);
+ if man0g0Quest:GetPhase() == 10 then
+ local worldMaster = GetWorldMaster();
+ player:SendDataPacket("attention", worldMaster, "", 51073, 1);
+ kickEventContinue(player, director, "noticeEvent", "noticeEvent");
+ callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent020_1", nil, nil, nil);
+ player:ChangeMusic(7);
+ player:Disengage(0x0000);
+ mob:SetTempVar("complete", 1);
+ end;
+ end;
+ end;
+end;
+
+function onDespawn(mob)
+ if zone then
+ local player = zone.FindActorInArea(mob:GetTempVar("playerId"));
+
+ if player and mob:GetTempVar("complete") == 1 then
+ local man0g0Quest = player:GetQuest("Man0g0");
+ player:GetZone():ContentFinished();
+ player:EndEvent();
+ GetWorldManager():DoZoneChange(player, 155, "PrivateAreaMasterPast", 1, 15, 175.38, -1.21, -1156.51, -2.1);
+ end;
+ end;
+end;
\ No newline at end of file
diff --git a/data/scripts/unique/fst0Battle03/Monster/papalymo.lua b/data/scripts/unique/fst0Battle03/Monster/papalymo.lua
new file mode 100644
index 00000000..a262f46b
--- /dev/null
+++ b/data/scripts/unique/fst0Battle03/Monster/papalymo.lua
@@ -0,0 +1,11 @@
+require ("global")
+
+require ("ally")
+
+function onSpawn(ally)
+ ally.isAutoAttackEnabled = false;
+end;
+
+function onCombatTick(ally, target, tick, contentGroupCharas)
+ allyGlobal.onCombatTick(ally, target, tick, contentGroupCharas);
+end;
\ No newline at end of file
diff --git a/data/scripts/unique/fst0Battle03/Monster/yda.lua b/data/scripts/unique/fst0Battle03/Monster/yda.lua
new file mode 100644
index 00000000..a262f46b
--- /dev/null
+++ b/data/scripts/unique/fst0Battle03/Monster/yda.lua
@@ -0,0 +1,11 @@
+require ("global")
+
+require ("ally")
+
+function onSpawn(ally)
+ ally.isAutoAttackEnabled = false;
+end;
+
+function onCombatTick(ally, target, tick, contentGroupCharas)
+ allyGlobal.onCombatTick(ally, target, tick, contentGroupCharas);
+end;
\ No newline at end of file
diff --git a/sql/server_battlenpc_genus.sql b/sql/server_battlenpc_genus.sql
index 67da55e0..cb6ad985 100644
--- a/sql/server_battlenpc_genus.sql
+++ b/sql/server_battlenpc_genus.sql
@@ -53,8 +53,9 @@ CREATE TABLE `server_battlenpc_genus` (
`lightning` float NOT NULL DEFAULT '1',
`earth` float NOT NULL DEFAULT '1',
`water` float NOT NULL DEFAULT '1',
+ `element` tinyint(4) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`genusId`)
-) ENGINE=InnoDB AUTO_INCREMENT=67 DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -64,71 +65,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,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);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
+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,0);
/*!40000 ALTER TABLE `server_battlenpc_genus` ENABLE KEYS */;
UNLOCK TABLES;
commit;
@@ -142,4 +143,4 @@ commit;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2017-09-11 23:51:16
+-- Dump completed on 2017-09-16 2:42:51
diff --git a/sql/server_battlenpc_genus_mods.sql b/sql/server_battlenpc_genus_mods.sql
index 8e205061..1449d99f 100644
--- a/sql/server_battlenpc_genus_mods.sql
+++ b/sql/server_battlenpc_genus_mods.sql
@@ -50,4 +50,4 @@ commit;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2017-09-11 23:52:18
+-- Dump completed on 2017-09-16 2:43:01
diff --git a/sql/server_battlenpc_groups.sql b/sql/server_battlenpc_groups.sql
index 301da539..e04c0014 100644
--- a/sql/server_battlenpc_groups.sql
+++ b/sql/server_battlenpc_groups.sql
@@ -25,7 +25,6 @@ DROP TABLE IF EXISTS `server_battlenpc_groups`;
CREATE TABLE `server_battlenpc_groups` (
`groupId` int(10) unsigned NOT NULL DEFAULT '0',
`poolId` int(10) unsigned NOT NULL DEFAULT '0',
- `actorClassId` int(10) unsigned NOT NULL,
`scriptName` varchar(50) NOT NULL,
`minLevel` tinyint(3) unsigned NOT NULL DEFAULT '1',
`maxLevel` tinyint(3) unsigned NOT NULL DEFAULT '1',
@@ -51,7 +50,10 @@ CREATE TABLE `server_battlenpc_groups` (
LOCK TABLES `server_battlenpc_groups` WRITE;
/*!40000 ALTER TABLE `server_battlenpc_groups` DISABLE KEYS */;
set autocommit=0;
-INSERT INTO `server_battlenpc_groups` VALUES (1,1,2104001,'wharf_rat',1,1,10,0,0,0,0,0,0,0,'',0,170);
+INSERT INTO `server_battlenpc_groups` VALUES (1,1,'wharf_rat',1,1,10,0,0,0,0,0,0,0,'',0,170);
+INSERT INTO `server_battlenpc_groups` VALUES (2,2,'bloodthirsty_wolf',1,1,0,0,0,0,0,1,0,0,'',0,166);
+INSERT INTO `server_battlenpc_groups` VALUES (3,3,'yda',1,1,0,0,0,0,1,1,0,0,'',0,166);
+INSERT INTO `server_battlenpc_groups` VALUES (4,4,'papalymo',1,1,0,0,0,0,1,1,0,0,'',0,166);
/*!40000 ALTER TABLE `server_battlenpc_groups` ENABLE KEYS */;
UNLOCK TABLES;
commit;
@@ -65,4 +67,4 @@ commit;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2017-09-07 21:54:42
+-- Dump completed on 2017-09-16 2:42:34
diff --git a/sql/server_battlenpc_pool_mods.sql b/sql/server_battlenpc_pool_mods.sql
index ed03b238..affc751a 100644
--- a/sql/server_battlenpc_pool_mods.sql
+++ b/sql/server_battlenpc_pool_mods.sql
@@ -26,7 +26,8 @@ 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'
+ `isMobMod` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`poolId`,`modId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -37,6 +38,8 @@ CREATE TABLE `server_battlenpc_pool_mods` (
LOCK TABLES `server_battlenpc_pool_mods` WRITE;
/*!40000 ALTER TABLE `server_battlenpc_pool_mods` DISABLE KEYS */;
set autocommit=0;
+INSERT INTO `server_battlenpc_pool_mods` VALUES (2,2,3,1);
+INSERT INTO `server_battlenpc_pool_mods` VALUES (2,3,3,1);
/*!40000 ALTER TABLE `server_battlenpc_pool_mods` ENABLE KEYS */;
UNLOCK TABLES;
commit;
@@ -50,4 +53,4 @@ commit;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2017-09-11 23:52:06
+-- Dump completed on 2017-09-16 2:43:11
diff --git a/sql/server_battlenpc_pools.sql b/sql/server_battlenpc_pools.sql
index 016111fc..e7bb7073 100644
--- a/sql/server_battlenpc_pools.sql
+++ b/sql/server_battlenpc_pools.sql
@@ -35,7 +35,7 @@ CREATE TABLE `server_battlenpc_pools` (
`immunity` int(10) unsigned NOT NULL DEFAULT '0',
`linkType` tinyint(3) unsigned NOT NULL DEFAULT '0',
`spellListId` int(10) unsigned NOT NULL DEFAULT '0',
- `skillListId` int(10) unsigned NOT NULL,
+ `skillListId` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`poolId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -46,11 +46,12 @@ CREATE TABLE `server_battlenpc_pools` (
LOCK TABLES `server_battlenpc_pools` WRITE;
/*!40000 ALTER TABLE `server_battlenpc_pools` DISABLE KEYS */;
-set autocommit=0;
INSERT INTO `server_battlenpc_pools` VALUES (1,2104001,'wharf_rat',12,0,1,4200,1,0,0,0,0,0);
+INSERT INTO `server_battlenpc_pools` VALUES (2,2205403,'bloodthirsty_wolf',3,0,1,4200,1,0,0,0,0,0);
+INSERT INTO `server_battlenpc_pools` VALUES (3,2290001,'yda',29,2,1,4200,1,0,0,0,0,0);
+INSERT INTO `server_battlenpc_pools` VALUES (4,2290002,'papalymo',29,22,1,4200,1,0,0,0,0,0);
/*!40000 ALTER TABLE `server_battlenpc_pools` ENABLE KEYS */;
UNLOCK TABLES;
-commit;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
@@ -61,4 +62,4 @@ commit;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2017-09-11 23:51:35
+-- Dump completed on 2017-09-16 2:40:29
diff --git a/sql/server_battlenpc_spawn_locations.sql b/sql/server_battlenpc_spawn_locations.sql
index 7119f200..4e6bbdaa 100644
--- a/sql/server_battlenpc_spawn_locations.sql
+++ b/sql/server_battlenpc_spawn_locations.sql
@@ -31,7 +31,7 @@ CREATE TABLE `server_battlenpc_spawn_locations` (
`positionZ` float NOT NULL,
`rotation` float NOT NULL,
PRIMARY KEY (`bnpcId`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -43,6 +43,11 @@ LOCK TABLES `server_battlenpc_spawn_locations` WRITE;
set autocommit=0;
INSERT INTO `server_battlenpc_spawn_locations` VALUES (1,'test',1,25.584,200,-450,-2.514);
INSERT INTO `server_battlenpc_spawn_locations` VALUES (2,'test',1,20,200,-444,-3.14);
+INSERT INTO `server_battlenpc_spawn_locations` VALUES (3,'bloodthirsty_wolf',2,-3.02,17.35,14.24,-2.81);
+INSERT INTO `server_battlenpc_spawn_locations` VALUES (4,'bloodthirsty_wolf',2,0.02,17.35,14.24,-2.81);
+INSERT INTO `server_battlenpc_spawn_locations` VALUES (5,'bloodthirsty_wolf',2,-6.02,17.35,14.24,-2.81);
+INSERT INTO `server_battlenpc_spawn_locations` VALUES (6,'yshtola',3,-8,16.35,6,0.5);
+INSERT INTO `server_battlenpc_spawn_locations` VALUES (7,'papalymo',4,0,16.35,22,3);
/*!40000 ALTER TABLE `server_battlenpc_spawn_locations` ENABLE KEYS */;
UNLOCK TABLES;
commit;
@@ -56,4 +61,4 @@ commit;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2017-09-11 23:51:12
+-- Dump completed on 2017-09-16 2:43:52
diff --git a/sql/server_battlenpc_spawn_mods.sql b/sql/server_battlenpc_spawn_mods.sql
index d1d713fd..190ab72e 100644
--- a/sql/server_battlenpc_spawn_mods.sql
+++ b/sql/server_battlenpc_spawn_mods.sql
@@ -50,4 +50,4 @@ commit;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2017-09-11 23:51:53
+-- Dump completed on 2017-09-16 2:43:42