diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index 66635197..b7ac9fa2 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -52,6 +52,7 @@ namespace FFXIVClassic_Map_Server mWorldManager.LoadActorClasses(); mWorldManager.LoadSpawnLocations(); mWorldManager.SpawnAllActors(); + mWorldManager.StartZoneThread(); IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(ConfigConstants.OPTIONS_BINDIP), int.Parse(ConfigConstants.OPTIONS_PORT)); diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index 2db7e281..e10141ea 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -20,6 +20,8 @@ using FFXIVClassic_Map_Server.actors.group; using FFXIVClassic_Map_Server.packets.send.group; using FFXIVClassic_Map_Server.packets.WorldPackets.Receive; using FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group; +using System.Threading; +using System.Diagnostics; namespace FFXIVClassic_Map_Server { @@ -37,6 +39,9 @@ namespace FFXIVClassic_Map_Server private Server mServer; + private const int MILIS_LOOPTIME = 10; + private Timer mZoneTimer; + public WorldManager(Server server) { mServer = server; @@ -801,6 +806,21 @@ namespace FFXIVClassic_Map_Server SubPacket groupInviteResultPacket = GroupInviteResultPacket.BuildPacket(player.playerSession, groupType, result); player.QueuePacket(groupInviteResultPacket); } + + public void StartZoneThread() + { + mZoneTimer = new Timer(ZoneThreadLoop, null, 0, MILIS_LOOPTIME); + Program.Log.Info("Zone Loop has started"); + } + + public void ZoneThreadLoop(Object state) + { + lock (zoneList) + { + foreach (Area area in zoneList.Values) + area.Update(MILIS_LOOPTIME); + } + } public Player GetPCInWorld(string name) { diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index 222b71c5..c7c3536b 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -303,6 +303,10 @@ namespace FFXIVClassic_Map_Server.Actors zone.BroadcastPacketAroundActor(this, ChangeSpeedPacket); } + public void Update(double deltaTime) + { + } + public void GenerateActorName(int actorNumber) { //Format Class Name diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs index 7540b9b8..b8783648 100644 --- a/FFXIVClassic Map Server/actors/area/Area.cs +++ b/FFXIVClassic Map Server/actors/area/Area.cs @@ -373,5 +373,14 @@ namespace FFXIVClassic_Map_Server.Actors } } } + + public void Update(double deltaTime) + { + lock (mActorList) + { + foreach (Actor a in mActorList.Values) + a.Update(deltaTime); + } + } } } diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index ecf6738f..1fc8389f 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -482,6 +482,30 @@ namespace FFXIVClassic_Map_Server.Actors return; } + public void Update(double deltaTime) + { + LuaScript parent = null, child = null; + + if (File.Exists("./scripts/base/" + classPath + ".lua")) + parent = LuaEngine.LoadScript("./scripts/base/" + classPath + ".lua"); + if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier))) + child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)); + + if (parent == null && child == null) + { + //LuaEngine.SendError(player, String.Format("ERROR: Could not find script for actor {0}.", GetName())); + return; + } + + //Run Script + if (child != null && child.Globals["onThink"] != null) + child.Call(child.Globals["onThink"], this, deltaTime); + else if (parent != null && parent.Globals["onThink"] != null) + parent.Call(parent.Globals["onThink"], this, deltaTime); + else + return; + } + //A party member list packet came, set the party /* public void SetParty(MonsterPartyGroup group) { diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 069c0904..aecb8269 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1361,5 +1361,10 @@ namespace FFXIVClassic_Map_Server.Actors currentParty = null; } + public void Update(double delta) + { + LuaEngine.OnPlayerUpdate(this, delta); + } + } } diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index 17722713..106d7c5e 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -203,6 +203,21 @@ namespace FFXIVClassic_Map_Server.lua } } + public static void OnPlayerUpdate(Player player, double delta) + { + if (File.Exists(FILEPATH_PLAYER)) + { + LuaScript script = LoadScript(FILEPATH_PLAYER); + + if (script == null) + return; + + //Run Script + if (!script.Globals.Get("onUpdate").IsNil()) + script.Call(script.Globals["onUpdate"], player); + } + } + #region RunGMCommand public static void RunGMCommand(Player player, String cmd, string[] param, bool help = false) {