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