From d72a2af641d44cf71679338eb90934161391154f Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Sat, 27 May 2017 02:17:25 +0100 Subject: [PATCH] initial navmesh stuff --- .gitmodules | 3 + .../FFXIVClassic Common Class Lib.csproj | 2 + FFXIVClassic Common Class Lib/Utils.cs | 27 ++ FFXIVClassic Map Server/App.config | 13 +- .../FFXIVClassic Map Server.csproj | 31 +- FFXIVClassic Map Server/Program.cs | 7 +- .../Properties/Resources.Designer.cs | 26 +- FFXIVClassic Map Server/SharpNav.dll | Bin 0 -> 199168 bytes FFXIVClassic Map Server/actors/Actor.cs | 209 +++++++++++- FFXIVClassic Map Server/actors/area/Zone.cs | 25 +- .../actors/chara/npc/Npc.cs | 4 +- .../bin/Debug/scripts/commands/gm/yolo.lua | 169 ++++++++++ .../dataobjects/Session.cs | 20 +- FFXIVClassic Map Server/lua/LuaEngine.cs | 8 +- FFXIVClassic Map Server/navmesh/rcdtcs | 1 + FFXIVClassic Map Server/packages.config | 2 +- FFXIVClassic Map Server/utils/NavmeshUtils.cs | 313 ++++++++++++++++++ sql/gamedata_actor_class.sql | 3 + sql/server_spawn_locations.sql | 1 + 19 files changed, 831 insertions(+), 33 deletions(-) create mode 100644 .gitmodules create mode 100644 FFXIVClassic Map Server/SharpNav.dll create mode 100644 FFXIVClassic Map Server/bin/Debug/scripts/commands/gm/yolo.lua create mode 160000 FFXIVClassic Map Server/navmesh/rcdtcs create mode 100644 FFXIVClassic Map Server/utils/NavmeshUtils.cs diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..e0e89768 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "FFXIVClassic Map Server/navmesh/rcdtcs"] + path = FFXIVClassic Map Server/navmesh/rcdtcs + url = https://github.com/jlalleve/rcdtcs diff --git a/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj b/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj index a08e253f..b5c7bcb2 100644 --- a/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj +++ b/FFXIVClassic Common Class Lib/FFXIVClassic Common Class Lib.csproj @@ -36,6 +36,7 @@ prompt 4 false + true @@ -51,6 +52,7 @@ + diff --git a/FFXIVClassic Common Class Lib/Utils.cs b/FFXIVClassic Common Class Lib/Utils.cs index a6479b78..a3b596ff 100644 --- a/FFXIVClassic Common Class Lib/Utils.cs +++ b/FFXIVClassic Common Class Lib/Utils.cs @@ -351,5 +351,32 @@ namespace FFXIVClassic.Common { return (value >> bits) | (value << (16 - bits)); } + + public static float Clamp(float val, float min, float max) + { + + return Math.Max(Math.Min(max, val), min); + } + + public static float Distance(float x, float y, float z, float x2, float y2, float z2) + { + if (x == x2 && y == y2 && z == z2) + return 0.0f; + + return (float)Math.Sqrt(DistanceSquared(x, y, z, x2, y2, z2)); + } + + public static float DistanceSquared(float x, float y, float z, float x2, float y2, float z2) + { + if (x == x2 && y == y2 && z == z2) + return 0.0f; + + // todo: my maths is shit + var dx = x - x2; + var dy = y - y2; + var dz = z - z2; + + return dx * dx + dy * dy + dz * dz; + } } } \ No newline at end of file diff --git a/FFXIVClassic Map Server/App.config b/FFXIVClassic Map Server/App.config index 63198b4c..46fa2bf4 100644 --- a/FFXIVClassic Map Server/App.config +++ b/FFXIVClassic Map Server/App.config @@ -1,11 +1,20 @@  - + - \ No newline at end of file + + + + + + + + + + diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 5934570c..131d6716 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -10,9 +10,10 @@ Properties FFXIVClassic_Map_Server FFXIVClassic Map Server - v4.5 + v4.5.1 512 1d22ec4a + AnyCPU @@ -24,6 +25,7 @@ prompt 4 true + true AnyCPU @@ -58,16 +60,20 @@ ..\packages\MySql.Data.6.9.8\lib\net45\MySql.Data.dll True - - ..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll - True + + ..\packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll ..\packages\NLog.4.3.5\lib\net45\NLog.dll True + + False + .\SharpNav.dll + + @@ -131,6 +137,21 @@ + + + + + + + + + + + + + + + @@ -310,6 +331,7 @@ + @@ -332,6 +354,7 @@ Resources.Designer.cs + xcopy "$(SolutionDir)data\map_config.ini" "$(SolutionDir)$(ProjectName)\$(OutDir)" /d diff --git a/FFXIVClassic Map Server/Program.cs b/FFXIVClassic Map Server/Program.cs index eb24fc4f..e4105a8d 100644 --- a/FFXIVClassic Map Server/Program.cs +++ b/FFXIVClassic Map Server/Program.cs @@ -16,6 +16,8 @@ namespace FFXIVClassic_Map_Server class Program { public static Logger Log; + public static Server Server; + public static Random Random; static void Main(string[] args) { @@ -55,9 +57,10 @@ namespace FFXIVClassic_Map_Server //Start server if A-OK if (startServer) { - Server server = new Server(); + Random = new Random(); + Server = new Server(); - server.StartServer(); + Server.StartServer(); while (startServer) { diff --git a/FFXIVClassic Map Server/Properties/Resources.Designer.cs b/FFXIVClassic Map Server/Properties/Resources.Designer.cs index 75ee4efc..11a22948 100644 --- a/FFXIVClassic Map Server/Properties/Resources.Designer.cs +++ b/FFXIVClassic Map Server/Properties/Resources.Designer.cs @@ -17,7 +17,7 @@ namespace FFXIVClassic_Map_Server.Properties { /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. - // To add or Remove a member, edit your .ResX file then rerun ResGen + // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -105,7 +105,7 @@ namespace FFXIVClassic_Map_Server.Properties { /// ///Available commands: ///Standard: mypos, music, warp - ///Server Administration: givecurrency, giveitem, givekeyitem, Removecurrency, Removekeyitem, reloaditems, reloadzones + ///Server Administration: givecurrency, giveitem, givekeyitem, removecurrency, removekeyitem, reloaditems, reloadzones ///Test: test weather. /// public static string CPhelp { @@ -176,38 +176,38 @@ namespace FFXIVClassic_Map_Server.Properties { /// /// Looks up a localized string similar to Removes the specified currency from the current player's inventory /// - ///*Syntax: Removecurrency <quantity> - /// Removecurrency <type> <quantity> + ///*Syntax: removecurrency <quantity> + /// removecurrency <type> <quantity> ///<type> is the specific type of currency desired, defaults to gil if no type specified. /// - public static string CPRemovecurrency { + public static string CPremovecurrency { get { - return ResourceManager.GetString("CPRemovecurrency", resourceCulture); + return ResourceManager.GetString("CPremovecurrency", resourceCulture); } } /// /// Looks up a localized string similar to Removes the specified items to the current player's inventory /// - ///*Syntax: Removeitem <itemid> - /// Removeitem <itemid> <quantity> + ///*Syntax: removeitem <itemid> + /// removeitem <itemid> <quantity> ///<item id> is the item's specific id as defined in the server database. /// - public static string CPRemoveitem { + public static string CPremoveitem { get { - return ResourceManager.GetString("CPRemoveitem", resourceCulture); + return ResourceManager.GetString("CPremoveitem", resourceCulture); } } /// /// Looks up a localized string similar to Removes the specified key item to the current player's inventory /// - ///*Syntax: Removekeyitem <itemid> + ///*Syntax: removekeyitem <itemid> ///<item id> is the key item's specific id as defined in the server database. /// - public static string CPRemovekeyitem { + public static string CPremovekeyitem { get { - return ResourceManager.GetString("CPRemovekeyitem", resourceCulture); + return ResourceManager.GetString("CPremovekeyitem", resourceCulture); } } diff --git a/FFXIVClassic Map Server/SharpNav.dll b/FFXIVClassic Map Server/SharpNav.dll new file mode 100644 index 0000000000000000000000000000000000000000..3c648e5cb0ab5e20127a2777fbdaeb7157d6ab96 GIT binary patch literal 199168 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

LoK`v-shH7fCn_$15dB_La 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 a>;D~5*^XZk2j-J7mGHYRqCScicAy8cR^@~M literal 0 HcmV?d00001 diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index d75077fd..72fe5f04 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -40,6 +40,13 @@ namespace FFXIVClassic_Map_Server.Actors public string className; public List classParams; + public List positionUpdates = new List(); + public DateTime lastAiUpdate; + public DateTime lastMoveUpdate; + public Actor target; + + public bool hasMoved = false; + public bool isAtSpawn = true; public EventList eventConditions; public Actor(uint actorId) @@ -126,7 +133,30 @@ namespace FFXIVClassic_Map_Server.Actors public SubPacket CreatePositionUpdatePacket(uint playerActorId) { - return MoveActorToPositionPacket.BuildPacket(actorId, playerActorId, positionX, positionY, positionZ, rotation, moveState); + int updateMs = 300; + var diffTime = (DateTime.Now - lastMoveUpdate); + + if (this.target != null) + { + updateMs = 150; + } + if (diffTime.Milliseconds >= updateMs && hasMoved) + { + hasMoved = (this.positionUpdates != null && this.positionUpdates.Count > 0); + if (hasMoved) + { + var pos = positionUpdates[0]; + positionUpdates.Remove(pos); + + positionX = pos.X; + positionY = pos.Y; + positionZ = pos.Z; + //Program.Server.GetInstance().mLuaEngine.OnPath(actor, position, positionUpdates) + } + lastMoveUpdate = DateTime.Now; + return MoveActorToPositionPacket.BuildPacket(actorId, playerActorId, positionX, positionY, positionZ, rotation, moveState); + } + return null; } public SubPacket CreateStatePacket(uint playerActorID) @@ -323,7 +353,78 @@ namespace FFXIVClassic_Map_Server.Actors } public void Update(double deltaTime) - { + { + // todo: this is retarded + if (this is Zone || this is Area || this is Player) + return; + + var diffTime = (DateTime.Now - lastAiUpdate); + + // todo: this too + if (diffTime.Milliseconds >= deltaTime) + { + bool foundActor = false; + foreach (var actor in ((Area)zone).GetActorsAroundActor(this, 50)) + { + if (actor is Player && actor != this) + { + var player = actor as Player; + + var distance = Utils.Distance(positionX, positionY, positionZ, player.positionX, player.positionY, player.positionZ); + + int maxDistance = player == target ? 25 : 15; + + if (distance <= maxDistance) + { + foundActor = true; + + if (!hasMoved) + { + if (distance >= 3) + { + FollowTarget(player, 2.0f); + } + // too close, spread out + else if (distance <= 0.64f) + { + var minRadius = 0.65f; + var maxRadius = 0.85f; + + var angle = Program.Random.NextDouble() * Math.PI * 2; + var radius = Math.Sqrt(Program.Random.NextDouble() * (maxRadius - minRadius)) + minRadius; + + float x = (float)(radius * Math.Cos(angle)); + float z = (float)(radius * Math.Sin(angle)); + + positionUpdates.Add(new utils.Vector3(positionX + x, positionY, positionZ + z)); + + hasMoved = true; + } + else if (target != null) + { + // todo: actually make IsFacing work + if(!IsFacing(target.positionX, target.positionY)) + LookAt(target); + } + } + } + break; + } + } + // 5 seconds before back to spawn + if ((DateTime.Now - lastMoveUpdate).Seconds >= 5 && !foundActor) + { + // 10 yalms spawn radius just because + this.isAtSpawn = Utils.Distance(positionX, positionY, positionZ, oldPositionX, oldPositionY, oldPositionZ) <= 18.0f; + + if (this.isAtSpawn != true && this.target == null && oldPositionX != 0.0f && oldPositionY != 0.0f && oldPositionZ != 0.0f) + PathTo(oldPositionX, oldPositionY, oldPositionZ, 3.0f); + + lastMoveUpdate = DateTime.Now; + this.target = null; + } + lastAiUpdate = DateTime.Now; + } } public void GenerateActorName(int actorNumber) @@ -492,6 +593,110 @@ namespace FFXIVClassic_Map_Server.Actors { return zoneId; } + + public bool IsFacing(float x, float y, byte checkAngle = 45) + { + var rot1 = this.rotation; + + var dX = this.positionX - x; + var dY = this.positionY - y; + + var rot2 = Math.Atan2(dY, dX); + + var dRot = Math.PI - rot2 + Math.PI / 2; + + Program.Log.Error("IsFacing Rotation {0} Rotation2 {1}", rot1, rot2); + return rot1 == rot2; + } + + public void LookAt(Actor actor) + { + if (actor != null) + { + LookAt(actor.positionX, actor.positionY); + } + else + { + Program.Log.Error("Actor.LookAt() unable to find actor!"); + } + } + + public void LookAt(float x, float y) + { + var rot1 = this.rotation; + + var dX = this.positionX - x; + var dY = this.positionY - y; + + var rot2 = Math.Atan2(dY, dX); + + var dRot = Math.PI - rot2 + Math.PI / 2; + + Program.Log.Error("LookAt Rotation {0} Rotation2 {1}", rot1, rot2); + + this.hasMoved = rot2 != rot1; + this.rotation = (float)dRot; + } + + public void PathTo(float x, float y, float z, float stepSize = 0.70f, int maxPath = 40) + { + var pos = new utils.Vector3(positionX, positionY, positionZ); + var dest = new utils.Vector3(x, y, z); + + var sw = new System.Diagnostics.Stopwatch(); + sw.Start(); + + var path = utils.NavmeshUtils.GetPath(((Zone)GetZone()), pos, dest, stepSize, maxPath); + + if (path != null) + { + if (oldPositionX == 0.0f && oldPositionY == 0.0f && oldPositionZ == 0.0f) + { + oldPositionX = positionX; + oldPositionY = positionY; + oldPositionZ = positionZ; + } + + // todo: something went wrong + if (path.Count == 0) + { + positionX = oldPositionX; + positionY = oldPositionY; + positionZ = oldPositionZ; + } + + positionUpdates = path; + + this.hasMoved = true; + this.isAtSpawn = false; + + sw.Stop(); + ((Zone)zone).pathCalls++; + ((Zone)zone).pathCallTime += sw.ElapsedMilliseconds; + Program.Log.Error("[{0}][{1}] Created {2} points in {3} milliseconds", actorId, actorName, path.Count, sw.ElapsedMilliseconds); + } + } + + public void FollowTarget(Actor target, float stepSize = 1.2f, int maxPath = 25) + { + if (target != null) + { + var player = target as Player; + + if (this.target != target) + this.target = target; + + this.moveState = player.moveState; + this.moveSpeeds = player.moveSpeeds; + + PathTo(player.positionX, player.positionY, player.positionZ, stepSize, maxPath); + } + } + + public void OnPath() + { + // todo: lua function onPath in mob script + } } } diff --git a/FFXIVClassic Map Server/actors/area/Zone.cs b/FFXIVClassic Map Server/actors/area/Zone.cs index 0f26abfb..a55165c8 100644 --- a/FFXIVClassic Map Server/actors/area/Zone.cs +++ b/FFXIVClassic Map Server/actors/area/Zone.cs @@ -10,6 +10,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.IO; + using FFXIVClassic_Map_Server.actors.director; namespace FFXIVClassic_Map_Server.actors.area @@ -20,10 +22,31 @@ namespace FFXIVClassic_Map_Server.actors.area Dictionary> contentAreas = new Dictionary>(); Object contentAreasLock = new Object(); + public Detour.dtNavMesh navMesh; + public SharpNav.TiledNavMesh tiledNavMesh; + public SharpNav.NavMeshQuery navMeshQuery; + public Int64 pathCalls; + public Int64 pathCallTime; + public Zone(uint id, string zoneName, ushort regionId, string classPath, ushort bgmDay, ushort bgmNight, ushort bgmBattle, bool isIsolated, bool isInn, bool canRideChocobo, bool canStealth, bool isInstanceRaid) : base(id, zoneName, regionId, classPath, bgmDay, bgmNight, bgmBattle, isIsolated, isInn, canRideChocobo, canStealth, isInstanceRaid) { - + // central thanalan navmesh + if (id == 170) + { + try + { + //navMesh = utils.NavmeshUtils.LoadNavmesh("wil_w0_fld01.bin"); + tiledNavMesh = utils.NavmeshUtils.LoadNavmesh(tiledNavMesh, "wil_w0_fld01.snb"); + navMeshQuery = new SharpNav.NavMeshQuery(tiledNavMesh, 100); + GC.Collect(2); + } + catch(Exception e) + { + Program.Log.Error(e.Message); + } + + } } public void AddPrivateArea(PrivateArea pa) diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index 05b694b0..d7a94eee 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -151,8 +151,8 @@ namespace FFXIVClassic_Map_Server.Actors isStatic = true; else { - // charaWork.property[2] = 1; - // npcWork.hateType = 1; + charaWork.property[2] = 1; + npcWork.hateType = 1; } if (lParams == null) diff --git a/FFXIVClassic Map Server/bin/Debug/scripts/commands/gm/yolo.lua b/FFXIVClassic Map Server/bin/Debug/scripts/commands/gm/yolo.lua new file mode 100644 index 00000000..9d2c364f --- /dev/null +++ b/FFXIVClassic Map Server/bin/Debug/scripts/commands/gm/yolo.lua @@ -0,0 +1,169 @@ +require("global"); + +properties = { + permissions = 0, + parameters = "ssss", + description = +[[ +yolo +]], +} + +local quests = +{ + [111807] = { level = 25, weight = 4, rewardexp = 1080 }, + [110868] = { level = 50, weight = 4, rewardexp = 4400 }, + [111603] = { level = 22, weight = 5, rewardexp = 1100 }, + [111602] = { level = 22, weight = 5, rewardexp = 1100 }, + [111420] = { level = 45, weight = 5, rewardexp = 4450 }, + [110811] = { level = 18, weight = 6, rewardexp = 780 }, + [110814] = { level = 18, weight = 6, rewardexp = 780 }, + [110707] = { level = 25, weight = 6, rewardexp = 1620 }, + [110682] = { level = 34, weight = 6, rewardexp = 3180 }, + [111202] = { level = 35, weight = 6, rewardexp = 3360 }, + [111222] = { level = 35, weight = 6, rewardexp = 3360 }, + [111302] = { level = 35, weight = 6, rewardexp = 3360 }, + [111223] = { level = 40, weight = 6, rewardexp = 4260 }, + [110819] = { level = 45, weight = 6, rewardexp = 5340 }, + [111224] = { level = 45, weight = 6, rewardexp = 5340 }, + [111225] = { level = 45, weight = 6, rewardexp = 5340 }, + [110867] = { level = 45, weight = 6, rewardexp = 5340 }, + [110869] = { level = 45, weight = 6, rewardexp = 5340 }, + [110708] = { level = 45, weight = 6, rewardexp = 5340 }, + [110627] = { level = 45, weight = 6, rewardexp = 5340 }, + [111434] = { level = 50, weight = 6, rewardexp = 6600 }, + [110850] = { level = 1, weight = 7, rewardexp = 40 }, + [110851] = { level = 1, weight = 7, rewardexp = 40 }, + [110841] = { level = 20, weight = 7, rewardexp = 1120 }, + [110642] = { level = 20, weight = 7, rewardexp = 1120 }, + [110840] = { level = 20, weight = 7, rewardexp = 1120 }, + [110727] = { level = 21, weight = 7, rewardexp = 1401 }, + [111221] = { level = 30, weight = 7, rewardexp = 2661 }, + [111241] = { level = 30, weight = 7, rewardexp = 2661 }, + [110687] = { level = 28, weight = 9, rewardexp = 2970 }, + [110016] = { level = 34, weight = 50, rewardexp = 26500 }, + [110017] = { level = 38, weight = 50, rewardexp = 32500 }, + [110019] = { level = 46, weight = 50, rewardexp = 46000 } +}; + +local expTable = { + 570, -- 1 + 700, + 880, + 1100, + 1500, + 1800, + 2300, + 3200, + 4300, + 5000, -- 10 + 5900, + 6800, + 7700, + 8700, + 9700, + 11000, + 12000, + 13000, + 15000, + 16000, -- 20 + 20000, + 22000, + 23000, + 25000, + 27000, + 29000, + 31000, + 33000, + 35000, + 38000, -- 30 + 45000, + 47000, + 50000, + 53000, + 56000, + 59000, + 62000, + 65000, + 68000, + 71000, -- 40 + 74000, + 78000, + 81000, + 85000, + 89000, + 92000, + 96000, + 100000, + 100000, + 110000 -- 50 +}; + +local commandCost = { + ["raise"] = 150, + ["cure"] = 40, + ["cura"] = 100, + ["curaga"] = 150, +}; +-- stone: (1, 9) (5, 12) (10, ) +-- cure: (1, 5) (5, 6) (10, ) +-- aero: (1, 9) (5, 12) (10, ) +-- protect: (1, 9) (5, 12) (10, ) +--[[ +function onTrigger(player, argc, id, level, weight) + id = tonumber(id) or 111807; + level = tonumber(level) or quests[id].level; + weight = tonumber(weight) or quests[id].weight; + local messageId = MESSAGE_TYPE_SYSTEM_ERROR; + local sender = "yolo"; + + if id == 1 then + return + end + local message = calcSkillPoint(player, level, weight); + if player then + player.SendMessage(messageId, sender, string.format("calculated %s | expected %s", message, quests[id].rewardexp)); + end; + printf("calculated %s | expected %s", message, quests[id].rewardexp); +end; +]] + +function onTrigger(player, argc, skillName, level) + local messageId = MESSAGE_TYPE_SYSTEM_ERROR; + local sender = "yolo"; + if player then + local pos = player:GetPos(); + local x = tonumber(pos[0]); + local y = tonumber(pos[1]); + local z = tonumber(pos[2]); + local rot = tonumber(pos[3]); + local zone = pos[4]; + + printf("%f %f %f", x, y, z); + --local x, y, z = player.GetPos(); + for i = 1, 1 do + + local actor = player.GetZone().SpawnActor(1000070, 'ass', x-(13 + 2*i), y, z); + + actor.FollowTarget(player, 3.2); + end; + return; + end + level = tonumber(level) or 1; + if player then + player.SendMessage(messageId, sender, string.format("name %s | cost %d | level %u", skillName, calculateCommandCost(player, skillName, level), level)); + end; +end; + +function calculateCommandCost(player, skillName, level) + if skillName and level and commandCost[skillName] then + return math.ceil((8000 + (level - 70) * 500) * (commandCost[skillName] * 0.001)); + end; + return 1; +end + +function calcSkillPoint(player, lvl, weight) + weight = weight / 100 + + return math.ceil(expTable[lvl] * weight) +end \ No newline at end of file diff --git a/FFXIVClassic Map Server/dataobjects/Session.cs b/FFXIVClassic Map Server/dataobjects/Session.cs index bdfcc561..fd7f69d1 100644 --- a/FFXIVClassic Map Server/dataobjects/Session.cs +++ b/FFXIVClassic Map Server/dataobjects/Session.cs @@ -120,6 +120,7 @@ namespace FFXIVClassic_Map_Server.dataobjects } + bool checkedThisTick = false; //Add new actors or move for (int i = 0; i < list.Count; i++) { @@ -131,10 +132,25 @@ namespace FFXIVClassic_Map_Server.dataobjects if (actorInstanceList.Contains(actor)) { //Don't send for static characters (npcs) - if (actor is Character && ((Character)actor).isStatic) + // todo: this is retarded, need actual mob class + if (actor is Character && !actor.hasMoved && ((Character)actor).isStatic) continue; - GetActor().QueuePacket(actor.CreatePositionUpdatePacket(playerActor.actorId)); + // todo: again, this is retarded but debug stuff + var zone = (actors.area.Zone)actor.zone; + if(zone != null && !checkedThisTick) + { + if (zone.pathCalls > 0) + { + checkedThisTick = true; + Program.Log.Error("Number of pathfinding calls {0} average time {1}", zone.pathCalls, zone.pathCallTime / zone.pathCalls); + } + } + + var packet = actor.CreatePositionUpdatePacket(playerActor.actorId); + + if (packet != null) + GetActor().QueuePacket(packet); } else { diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index 65f146d3..c3c77720 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -533,11 +533,11 @@ namespace FFXIVClassic_Map_Server.lua LuaParam.Insert(1, i - (playerNull ? 2 : 0)); // run the script - //script.Call(script.Globals["onTrigger"], LuaParam.ToArray()); + script.Call(script.Globals["onTrigger"], LuaParam.ToArray()); - Coroutine coroutine = script.CreateCoroutine(script.Globals["onTrigger"]).Coroutine; - DynValue value = coroutine.Resume(LuaParam.ToArray()); - GetInstance().ResolveResume(player, coroutine, value); + //Coroutine coroutine = script.CreateCoroutine(script.Globals["onTrigger"]).Coroutine; + //DynValue value = coroutine.Resume(LuaParam.ToArray()); + //GetInstance().ResolveResume(player, coroutine, value); return; } } diff --git a/FFXIVClassic Map Server/navmesh/rcdtcs b/FFXIVClassic Map Server/navmesh/rcdtcs new file mode 160000 index 00000000..8eea2772 --- /dev/null +++ b/FFXIVClassic Map Server/navmesh/rcdtcs @@ -0,0 +1 @@ +Subproject commit 8eea27727df5132c5f0e6732d1bd36238ce300ea diff --git a/FFXIVClassic Map Server/packages.config b/FFXIVClassic Map Server/packages.config index 4e137685..affb0e30 100644 --- a/FFXIVClassic Map Server/packages.config +++ b/FFXIVClassic Map Server/packages.config @@ -5,7 +5,7 @@ - + diff --git a/FFXIVClassic Map Server/utils/NavmeshUtils.cs b/FFXIVClassic Map Server/utils/NavmeshUtils.cs new file mode 100644 index 00000000..a2a00145 --- /dev/null +++ b/FFXIVClassic Map Server/utils/NavmeshUtils.cs @@ -0,0 +1,313 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; +using SharpNav; +using SharpNav.Pathfinding; +using SharpNav.Crowds; +using SharpNav.IO; + +namespace FFXIVClassic_Map_Server.utils +{ + public class Vector3 + { + public float X; + public float Y; + public float Z; + public static Vector3 Zero = new Vector3(); + + public Vector3(float x, float y, float z) + { + X = x; + Y = y; + Z = z; + } + + public Vector3() + { + X = 0.0f; + Y = 0.0f; + Z = 0.0f; + } + + public Vector3(SharpNav.Geometry.Vector3 vec) + { + X = vec.X; + Y = vec.Y; + Z = vec.Z; + } + + public static Vector3 operator +(Vector3 lhs, Vector3 rhs) + { + Vector3 newVec = new Vector3(lhs.X, lhs.Y, lhs.Z); + newVec.X += rhs.X; + newVec.Y += rhs.Y; + newVec.Z += rhs.Z; + return newVec; + } + + public static Vector3 operator -(Vector3 lhs, Vector3 rhs) + { + return new Vector3(lhs.X - rhs.X, lhs.Y - rhs.Y, lhs.Z - rhs.Z); + } + + public static Vector3 operator *(Vector3 lhs, Vector3 rhs) + { + return new Vector3(lhs.X * rhs.X, lhs.Y * rhs.Y, lhs.Z * rhs.Z); + } + + public static Vector3 operator *(float scalar, Vector3 rhs) + { + return new Vector3(scalar * rhs.X, scalar * rhs.Y, scalar * rhs.Z); + } + + public static Vector3 operator /(Vector3 lhs, Vector3 rhs) + { + return new Vector3(lhs.X - rhs.X, lhs.Y - rhs.Y, lhs.Z - rhs.Z); + } + + public float Length() + { + return (float)Math.Sqrt(this.LengthSquared()); + } + + public float LengthSquared() + { + return (this.X * this.X) + (this.Y * this.Y) + (this.Z * this.Z); + } + + public static float Dot(Vector3 lhs, Vector3 rhs) + { + return (lhs.X * rhs.X) + (lhs.Y * rhs.Y) + (lhs.Z * rhs.Z); + } + } + + class NavmeshUtils + { + + // navmesh + public static bool CanSee(float x1, float y1, float z1, float x2, float y2, float z2) + { + + return false; + } + + public static Detour.dtNavMesh LoadNavmesh(string path) + { + var bytes = File.ReadAllBytes(path); + var start = 0; + + var navmesh = Detour.NavMeshSetBuild.FromBytes(bytes, ref start); + return navmesh; + } + + public static SharpNav.TiledNavMesh LoadNavmesh(TiledNavMesh navmesh, string filePath) + { + var serialiser = new SharpNav.IO.Json.NavMeshJsonSerializer(); + return serialiser.Deserialize(filePath); + //return navmesh = new SharpNav.IO.Json.NavMeshJsonSerializer().Deserialize(filePath); + } + + public static List GetPath(Detour.dtNavMesh navmesh, Vector3 start, Vector3 end) + { + var path = new Vector3[] { }; + + + return path.ToList(); + } + + #region sharpnav stuff + // Copyright (c) 2013-2016 Robert Rouhani and other contributors (see CONTRIBUTORS file). + // Licensed under the MIT License - https://raw.github.com/Robmaister/SharpNav/master/LICENSE + + public static List GetPath(FFXIVClassic_Map_Server.actors.area.Zone zone, Vector3 startVec, Vector3 endVec, float stepSize = 0.70f, int pathSize = 2048) + { + var navMesh = zone.tiledNavMesh; + var navMeshQuery = zone.navMeshQuery; + + if (navMesh == null || (startVec.X == endVec.X && startVec.Y == endVec.Y && startVec.Z == endVec.Z)) + { + return null; + } + + float distanceSquared = FFXIVClassic.Common.Utils.DistanceSquared(startVec.X, startVec.Y, startVec.Z, endVec.X, endVec.Y, endVec.Z); + + // no point pathing if in range + if (distanceSquared < 4 && Math.Abs(startVec.Y - endVec.Y) < 1.1f) + { + return null; + } + + var smoothPath = new List(pathSize) { }; + + NavQueryFilter filter = new NavQueryFilter(); + + NavPoint startPt, endPt; + RaycastHit hit; + PathCorridor corridor = new PathCorridor(); + + try + { + SharpNav.Geometry.Vector3 c = new SharpNav.Geometry.Vector3(startVec.X, startVec.Y, startVec.Z); + SharpNav.Geometry.Vector3 ep = new SharpNav.Geometry.Vector3(endVec.X, endVec.Y, endVec.Z); + + SharpNav.Geometry.Vector3 e = new SharpNav.Geometry.Vector3(5, 5, 5); + navMeshQuery.FindNearestPoly(ref c, ref e, out startPt); + navMeshQuery.FindNearestPoly(ref ep, ref e, out endPt); + + //calculate the overall path, which contains an array of polygon references + int MAX_POLYS = 256; + var path = new SharpNav.Pathfinding.Path(); + + navMeshQuery.FindPath(ref startPt, ref endPt, filter, path); + + //find a smooth path over the mesh surface + int npolys = path.Count; + SharpNav.Geometry.Vector3 iterPos = new SharpNav.Geometry.Vector3(); + SharpNav.Geometry.Vector3 targetPos = new SharpNav.Geometry.Vector3(); + navMeshQuery.ClosestPointOnPoly(startPt.Polygon, startPt.Position, ref iterPos); + navMeshQuery.ClosestPointOnPoly(path[npolys - 1], endPt.Position, ref targetPos); + + smoothPath.Add(new Vector3(iterPos)); + + //float STEP_SIZE = 0.70f; + float SLOP = 0.15f; + while (npolys > 0 && smoothPath.Count < smoothPath.Capacity) + { + //find location to steer towards + SharpNav.Geometry.Vector3 steerPos = new SharpNav.Geometry.Vector3(); + StraightPathFlags steerPosFlag = 0; + NavPolyId steerPosRef = NavPolyId.Null; + + if (!GetSteerTarget(navMeshQuery, iterPos, targetPos, SLOP, path, ref steerPos, ref steerPosFlag, ref steerPosRef)) + break; + + bool endOfPath = (steerPosFlag & StraightPathFlags.End) != 0 ? true : false; + bool offMeshConnection = (steerPosFlag & StraightPathFlags.OffMeshConnection) != 0 ? true : false; + + //find movement delta + SharpNav.Geometry.Vector3 delta = steerPos - iterPos; + float len = (float)Math.Sqrt(SharpNav.Geometry.Vector3.Dot(delta, delta)); + + //if steer target is at end of path or off-mesh link + //don't move past location + if ((endOfPath || offMeshConnection) && len < stepSize) + len = 1; + else + len = stepSize / len; + + SharpNav.Geometry.Vector3 moveTgt = new SharpNav.Geometry.Vector3(); + VMad(ref moveTgt, iterPos, delta, len); + + //move + SharpNav.Geometry.Vector3 result = new SharpNav.Geometry.Vector3(); + List visited = new List(pathSize); + NavPoint startPoint = new NavPoint(path[0], iterPos); + navMeshQuery.MoveAlongSurface(ref startPoint, ref moveTgt, out result, visited); + path.FixupCorridor(visited); + npolys = path.Count; + float h = 0; + navMeshQuery.GetPolyHeight(path[0], result, ref h); + result.Y = h; + iterPos = result; + + //handle end of path when close enough + if (endOfPath && InRange(iterPos, steerPos, SLOP, 1000.0f)) + { + //reached end of path + iterPos = targetPos; + if (smoothPath.Count < smoothPath.Capacity) + { + smoothPath.Add(new Vector3(iterPos)); + } + break; + } + + //store results + if (smoothPath.Count < smoothPath.Capacity) + { + smoothPath.Add(new Vector3(iterPos)); + } + } + } + catch(Exception e) + { + Program.Log.Error(e.Message); + Program.Log.Error("Start pos {0} {1} {2} end pos {3} {4} {5}", startVec.X, startVec.Y, startVec.Z, endVec.X, endVec.Y, endVec.Z); + // todo: probably log this + return new List() { }; + } + return smoothPath; + } + + ///

+ /// Scaled vector addition + /// + /// Result + /// Vector 1 + /// Vector 2 + /// Scalar + private static void VMad(ref SharpNav.Geometry.Vector3 dest, SharpNav.Geometry.Vector3 v1, SharpNav.Geometry.Vector3 v2, float s) + { + dest.X = v1.X + v2.X * s; + dest.Y = v1.Y + v2.Y * s; + dest.Z = v1.Z + v2.Z * s; + } + + private static bool GetSteerTarget(NavMeshQuery navMeshQuery, SharpNav.Geometry.Vector3 startPos, SharpNav.Geometry.Vector3 endPos, float minTargetDist, SharpNav.Pathfinding.Path path, + ref SharpNav.Geometry.Vector3 steerPos, ref StraightPathFlags steerPosFlag, ref NavPolyId steerPosRef) + { + StraightPath steerPath = new StraightPath(); + navMeshQuery.FindStraightPath(startPos, endPos, path, steerPath, 0); + int nsteerPath = steerPath.Count; + if (nsteerPath == 0) + return false; + + //find vertex far enough to steer to + int ns = 0; + while (ns < nsteerPath) + { + if ((steerPath[ns].Flags & StraightPathFlags.OffMeshConnection) != 0 || + !InRange(steerPath[ns].Point.Position, startPos, minTargetDist, 1000.0f)) + break; + + ns++; + } + + //failed to find good point to steer to + if (ns >= nsteerPath) + return false; + + steerPos = steerPath[ns].Point.Position; + steerPos.Y = startPos.Y; + steerPosFlag = steerPath[ns].Flags; + if (steerPosFlag == StraightPathFlags.None && ns == (nsteerPath - 1)) + steerPosFlag = StraightPathFlags.End; // otherwise seeks path infinitely!!! + steerPosRef = steerPath[ns].Point.Polygon; + + return true; + } + + private static bool InRange(SharpNav.Geometry.Vector3 v1, SharpNav.Geometry.Vector3 v2, float r, float h) + { + float dx = v2.X - v1.X; + float dy = v2.Y - v1.Y; + float dz = v2.Z - v1.Z; + return (dx * dx + dz * dz) < (r * r) && Math.Abs(dy) < h; + } + #endregion + + public static Vector3 GamePosToNavmeshPos(float x, float y, float z) + { + return new Vector3(x, -z, y); + } + + public static Vector3 NavmeshPosToGamePos(float x, float y, float z) + { + return new Vector3(x, z, -y); + } + + } +} diff --git a/sql/gamedata_actor_class.sql b/sql/gamedata_actor_class.sql index 2941e324..6b10502f 100644 --- a/sql/gamedata_actor_class.sql +++ b/sql/gamedata_actor_class.sql @@ -8,6 +8,7 @@ Date: 6/19/2017 10:23:48 PM */ SET FOREIGN_KEY_CHECKS=0; +SET autocommit=0; -- ---------------------------- -- Table structure for gamedata_actor_class -- ---------------------------- @@ -8007,3 +8008,5 @@ INSERT INTO `gamedata_actor_class` VALUES ('9220405', '', '2', '0', null); INSERT INTO `gamedata_actor_class` VALUES ('9220406', '', '2', '0', null); INSERT INTO `gamedata_actor_class` VALUES ('9220407', '', '2', '0', null); INSERT INTO `gamedata_actor_class` VALUES ('9220408', '', '2', '0', null); + +COMMIT; \ No newline at end of file diff --git a/sql/server_spawn_locations.sql b/sql/server_spawn_locations.sql index 82e195f9..63bde218 100644 --- a/sql/server_spawn_locations.sql +++ b/sql/server_spawn_locations.sql @@ -6,6 +6,7 @@ Target Host: localhost Target Database: ffxiv_server Date: 6/19/2017 10:24:01 PM */ +DROP TABLE IF EXISTS `server_spawn_locations`; SET FOREIGN_KEY_CHECKS=0; -- ----------------------------