diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
index 6b81af4d..1b165c55 100644
--- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
+++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
@@ -121,6 +121,7 @@
+
diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs
index ae0bd12c..260d13df 100644
--- a/FFXIVClassic Map Server/PacketProcessor.cs
+++ b/FFXIVClassic Map Server/PacketProcessor.cs
@@ -221,19 +221,19 @@ namespace FFXIVClassic_Lobby_Server
case 0x012D:
subpacket.debugPrintSubPacket();
EventStartPacket eventStart = new EventStartPacket(subpacket.data);
- player.eventCurrentOwner = eventStart.scriptOwnerActorID;
- player.eventCurrentStarter = eventStart.eventStarter;
+ player.getActor().eventCurrentOwner = eventStart.scriptOwnerActorID;
+ player.getActor().eventCurrentStarter = eventStart.eventStarter;
//Is it a static actor? If not look in the player's instance
- Actor ownerActor = Server.getStaticActors(player.eventCurrentOwner);
+ Actor ownerActor = Server.getStaticActors(player.getActor().eventCurrentOwner);
if (ownerActor == null)
{
- ownerActor = mServer.GetWorldManager().GetActorInWorld(player.eventCurrentOwner);
+ ownerActor = mServer.GetWorldManager().GetActorInWorld(player.getActor().eventCurrentOwner);
if (ownerActor == null)
break;
}
- mServer.GetLuaEngine().doActorOnEventStarted(player.getActor(), ownerActor);
+ mServer.GetLuaEngine().doActorOnEventStarted(player.getActor(), ownerActor, eventStart);
Log.debug(String.Format("\n===Event START===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nEvent Starter: {4}\nParams: {5}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.val1, eventStart.val2, eventStart.eventStarter, LuaUtils.dumpParams(eventStart.luaParams)));
break;
@@ -244,10 +244,10 @@ namespace FFXIVClassic_Lobby_Server
Log.debug(String.Format("\n===Event UPDATE===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nStep: 0x{4:X}\nParams: {5}", eventUpdate.actorID, eventUpdate.scriptOwnerActorID, eventUpdate.val1, eventUpdate.val2, eventUpdate.step, LuaUtils.dumpParams(eventUpdate.luaParams)));
//Is it a static actor? If not look in the player's instance
- Actor updateOwnerActor = Server.getStaticActors(player.eventCurrentOwner);
+ Actor updateOwnerActor = Server.getStaticActors(player.getActor().eventCurrentOwner);
if (updateOwnerActor == null)
{
- updateOwnerActor = mServer.GetWorldManager().GetActorInWorld(player.eventCurrentOwner);
+ updateOwnerActor = mServer.GetWorldManager().GetActorInWorld(player.getActor().eventCurrentOwner);
if (updateOwnerActor == null)
break;
}
diff --git a/FFXIVClassic Map Server/Program.cs b/FFXIVClassic Map Server/Program.cs
index 06279513..5c9cc061 100644
--- a/FFXIVClassic Map Server/Program.cs
+++ b/FFXIVClassic Map Server/Program.cs
@@ -15,9 +15,8 @@ namespace FFXIVClassic_Lobby_Server
{
class Program
{
-
static void Main(string[] args)
- {
+ {
#if DEBUG
TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(myWriter);
diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs
index b71b618c..5e3b52d9 100644
--- a/FFXIVClassic Map Server/actors/Actor.cs
+++ b/FFXIVClassic Map Server/actors/Actor.cs
@@ -221,6 +221,11 @@ namespace FFXIVClassic_Map_Server.Actors
return className;
}
+ public ushort getState()
+ {
+ return currentMainState;
+ }
+
public List getLuaParams()
{
return classParams;
@@ -230,7 +235,9 @@ namespace FFXIVClassic_Map_Server.Actors
{
currentMainState = newState;
SubPacket changeStatePacket = SetActorStatePacket.buildPacket(actorId, actorId, newState, currentSubState);
+ SubPacket battleActionPacket = BattleAction1Packet.buildPacket(actorId, actorId);
zone.broadcastPacketAroundActor(this, changeStatePacket);
+ zone.broadcastPacketAroundActor(this, battleActionPacket);
}
public void changeSpeed(int type, float value)
diff --git a/FFXIVClassic Map Server/actors/area/Zone.cs b/FFXIVClassic Map Server/actors/area/Zone.cs
index 147e9cb2..c054baf3 100644
--- a/FFXIVClassic Map Server/actors/area/Zone.cs
+++ b/FFXIVClassic Map Server/actors/area/Zone.cs
@@ -28,7 +28,7 @@ namespace FFXIVClassic_Map_Server.Actors
private Dictionary mActorList = new Dictionary();
private List[,] mActorBlock;
- public Zone(uint id, string zoneName, ushort regionId, ushort bgmDay, ushort bgmNight, ushort bgmBattle, bool canStealth, bool isInn, bool canRideChocobo, bool isInstanceRaid)
+ public Zone(uint id, string zoneName, ushort regionId, ushort bgmDay, ushort bgmNight, ushort bgmBattle, bool isInn, bool canRideChocobo, bool canStealth, bool isInstanceRaid)
: base(id)
{
@@ -68,7 +68,7 @@ namespace FFXIVClassic_Map_Server.Actors
public override SubPacket createScriptBindPacket(uint playerActorId)
{
List lParams;
- lParams = LuaUtils.createLuaParamList("/Area/Zone/ZoneMasterPrvI0", false, true, zoneName, "", 0xFFFFFFFF, false, false, canStealth, isInn, false, false, false, false, false, false);
+ lParams = LuaUtils.createLuaParamList("/Area/Zone/ZoneMasterPrvI0", false, true, zoneName, "", -1, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, false, false, false);
return ActorInstantiatePacket.buildPacket(actorId, playerActorId, actorName, className, lParams);
}
@@ -82,6 +82,7 @@ namespace FFXIVClassic_Map_Server.Actors
subpackets.Add(createStatePacket(playerActorId));
subpackets.Add(createIsZoneingPacket(playerActorId));
subpackets.Add(createScriptBindPacket(playerActorId));
+ subpackets[6].debugPrintSubPacket();
return BasePacket.createPacket(subpackets, true, false);
}
@@ -291,19 +292,16 @@ namespace FFXIVClassic_Map_Server.Actors
public void broadcastPacketAroundActor(Actor actor, SubPacket packet)
{
- if (zone != null)
+ List aroundActor = getActorsAroundActor(actor, 50);
+ foreach (Actor a in aroundActor)
{
- List aroundActor = getActorsAroundActor(actor, 50);
- foreach (Actor a in aroundActor)
+ if (a is Player)
{
- if (a is Player)
- {
- SubPacket clonedPacket = new SubPacket(packet, actor.actorId);
- Player p = (Player)a;
- p.queuePacket(clonedPacket);
- }
+ SubPacket clonedPacket = new SubPacket(packet, actor.actorId);
+ Player p = (Player)a;
+ p.queuePacket(clonedPacket);
}
- }
+ }
}
}
diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs
index c909a770..53831dd5 100644
--- a/FFXIVClassic Map Server/actors/chara/player/Player.cs
+++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs
@@ -48,18 +48,25 @@ namespace FFXIVClassic_Map_Server.Actors
public uint[] timers = new uint[20];
public ushort currentJob;
-
public uint currentTitle;
+ //GC Related
public byte gcCurrent;
public byte gcRankLimsa;
public byte gcRankGridania;
public byte gcRankUldah;
+ //Mount Related
public bool hasChocobo;
public bool hasGoobbue;
public byte chocoboAppearance;
public string chocoboName;
+ public byte mountState = 0;
+
+ //Event Related
+ public uint eventCurrentOwner = 0;
+ public string eventCurrentStarter = "";
+ public uint eventMenuId = 0;
public uint achievementPoints;
@@ -598,7 +605,25 @@ namespace FFXIVClassic_Map_Server.Actors
{
playerSession.queuePacket(packet, true, false);
}
-
+
+ public void broadcastPacket(SubPacket packet)
+ {
+ foreach (Actor a in playerSession.actorInstanceList)
+ {
+ if (a is Player)
+ {
+ Player p = (Player)a;
+ SubPacket clonedPacket = new SubPacket(packet, a.actorId);
+ p.queuePacket(clonedPacket);
+ }
+ }
+ }
+
+ public Zone getZone()
+ {
+ return zone;
+ }
+
public void sendMessage(uint logType, string sender, string message)
{
queuePacket(SendMessagePacket.buildPacket(actorId, actorId, logType, sender, message));
@@ -628,10 +653,54 @@ namespace FFXIVClassic_Map_Server.Actors
{
queuePacket(SetCurrentMountGoobbuePacket.buildPacket(actorId, 1));
}
-
- public void sendWorldMessage(ushort worldMasterId, params object[] msgParams)
+
+ public void setMountState(byte mountState)
{
- //queuePacket(WorldMasterPacket.buildPacket());
+ this.mountState = mountState;
+ }
+
+ public byte getMountState()
+ {
+ return mountState;
+ }
+
+ public void doEmote(uint emoteId)
+ {
+ broadcastPacket(ActorDoEmotePacket.buildPacket(actorId, actorId, emoteId));
+ }
+
+ public void sendGameMessage(Actor sourceActor, Actor textIdOwner, ushort textId, byte log, params object[] msgParams)
+ {
+ if (msgParams.Length == 0)
+ {
+ queuePacket(GameMessagePacket.buildPacket(Server.getServer().GetWorldManager().GetActor().actorId, actorId, sourceActor.actorId, textIdOwner.actorId, textId, log));
+ }
+ else
+ queuePacket(GameMessagePacket.buildPacket(Server.getServer().GetWorldManager().GetActor().actorId, actorId, sourceActor.actorId, textIdOwner.actorId, textId, log, LuaUtils.createLuaParamList(msgParams)));
+ }
+
+ public void sendGameMessage(Actor textIdOwner, ushort textId, byte log, params object[] msgParams)
+ {
+ if (msgParams.Length == 0)
+ queuePacket(GameMessagePacket.buildPacket(Server.getServer().GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, log));
+ else
+ queuePacket(GameMessagePacket.buildPacket(Server.getServer().GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, log, LuaUtils.createLuaParamList(msgParams)));
+ }
+
+ public void sendGameMessage(Actor textIdOwner, ushort textId, byte log, string customSender, params object[] msgParams)
+ {
+ if (msgParams.Length == 0)
+ queuePacket(GameMessagePacket.buildPacket(Server.getServer().GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, customSender, log));
+ else
+ queuePacket(GameMessagePacket.buildPacket(Server.getServer().GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, customSender, log, LuaUtils.createLuaParamList(msgParams)));
+ }
+
+ public void sendGameMessage(Actor textIdOwner, ushort textId, byte log, uint displayId, params object[] msgParams)
+ {
+ if (msgParams.Length == 0)
+ queuePacket(GameMessagePacket.buildPacket(Server.getServer().GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, displayId, log));
+ else
+ queuePacket(GameMessagePacket.buildPacket(Server.getServer().GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, displayId, log, LuaUtils.createLuaParamList(msgParams)));
}
public void broadcastWorldMessage(ushort worldMasterId, params object[] msgParams)
@@ -643,16 +712,29 @@ namespace FFXIVClassic_Map_Server.Actors
public void runEventFunction(string functionName, params object[] parameters)
{
List lParams = LuaUtils.createLuaParamList(parameters);
- SubPacket spacket = RunEventFunctionPacket.buildPacket(actorId, playerSession.eventCurrentOwner, playerSession.eventCurrentStarter, functionName, lParams);
+ SubPacket spacket = RunEventFunctionPacket.buildPacket(actorId, eventCurrentOwner, eventCurrentStarter, functionName, lParams);
spacket.debugPrintSubPacket();
queuePacket(spacket);
}
public void endEvent()
{
- SubPacket p = EndEventPacket.buildPacket(actorId, playerSession.eventCurrentOwner, playerSession.eventCurrentStarter);
- p.debugPrintSubPacket();
+ SubPacket p = EndEventPacket.buildPacket(actorId, eventCurrentOwner, eventCurrentStarter);
queuePacket(p);
+
+ eventCurrentOwner = 0;
+ eventCurrentStarter = "";
+ eventMenuId = 0;
+ }
+
+ public void setCurrentMenuId(uint id)
+ {
+ eventMenuId = id;
+ }
+
+ public uint getCurrentMenuId()
+ {
+ return eventMenuId;
}
}
diff --git a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs
index 92150cbc..1138d031 100644
--- a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs
+++ b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs
@@ -15,10 +15,7 @@ namespace FFXIVClassic_Map_Server.dataobjects
public uint actorID = 0;
Player playerActor;
public List actorInstanceList = new List();
-
- public uint eventCurrentOwner = 0;
- public string eventCurrentStarter = "";
-
+
private ClientConnection zoneConnection;
private ClientConnection chatConnection;
diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs
index 823efbfa..bacab91a 100644
--- a/FFXIVClassic Map Server/lua/LuaEngine.cs
+++ b/FFXIVClassic Map Server/lua/LuaEngine.cs
@@ -7,6 +7,7 @@ using FFXIVClassic_Map_Server.packets.send;
using FFXIVClassic_Map_Server.packets.send.events;
using MoonSharp.Interpreter;
using MoonSharp.Interpreter.Interop;
+using MoonSharp.Interpreter.Loaders;
using System;
using System.Collections.Generic;
using System.IO;
@@ -36,7 +37,9 @@ namespace FFXIVClassic_Map_Server.lua
if (File.Exists(luaPath))
{
Script script = new Script();
+ ((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
script.Globals["getStaticActor"] = (Func)Server.getStaticActors;
+ script.Globals["getWorldMaster"] = (Func)Server.getServer().GetWorldManager().GetActor;
script.DoFile(luaPath);
DynValue result = script.Call(script.Globals["onInstantiate"], target);
List lparams = LuaUtils.createLuaParamList(result);
@@ -45,7 +48,7 @@ namespace FFXIVClassic_Map_Server.lua
else
{
List sendError = new List();
- sendError.Add(EndEventPacket.buildPacket(player.actorId, player.playerSession.eventCurrentOwner, player.playerSession.eventCurrentStarter));
+ sendError.Add(EndEventPacket.buildPacket(player.actorId, player.eventCurrentOwner, player.eventCurrentStarter));
player.sendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", String.Format("ERROR: Could not find script for actor {0}.", target.getName()));
player.playerSession.queuePacket(BasePacket.createPacket(sendError, true, false));
return null;
@@ -55,106 +58,78 @@ namespace FFXIVClassic_Map_Server.lua
return null;
}
- public void doActorOnEventStarted(Player player, Actor target)
+ public void doActorOnEventStarted(Player player, Actor target, EventStartPacket eventStart)
{
string luaPath;
if (target is Command)
{
luaPath = String.Format(FILEPATH_COMMANDS, target.getName());
- if (File.Exists(luaPath))
- {
- Script script = new Script();
- script.Globals["getStaticActor"] = (Func)Server.getStaticActors;
- script.DoFile(luaPath);
- DynValue result = script.Call(script.Globals["onEventStarted"], player, target);
- }
- else
- {
- List sendError = new List();
- sendError.Add(EndEventPacket.buildPacket(player.actorId, player.playerSession.eventCurrentOwner, player.playerSession.eventCurrentStarter));
- player.sendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", String.Format("ERROR: Could not find script for actor {0}.", target.getName()));
- player.playerSession.queuePacket(BasePacket.createPacket(sendError, true, false));
- }
}
- else if (target is Npc)
- {
+ else
luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.getName());
- if (File.Exists(luaPath))
- {
- Script script = new Script();
- script.Globals["getStaticActor"] = (Func)Server.getStaticActors;
- script.DoFile(luaPath);
- DynValue result = script.Call(script.Globals["onEventStarted"], player, target);
- }
- else
- {
- List sendError = new List();
- sendError.Add(EndEventPacket.buildPacket(player.actorId, player.playerSession.eventCurrentOwner, player.playerSession.eventCurrentStarter));
- player.sendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", String.Format("ERROR: Could not find script for actor {0}.", target.getName()));
- player.playerSession.queuePacket(BasePacket.createPacket(sendError, true, false));
- }
+
+ if (File.Exists(luaPath))
+ {
+ Script script = new Script();
+ ((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
+ script.Globals["getStaticActor"] = (Func)Server.getStaticActors;
+ script.Globals["getWorldMaster"] = (Func)Server.getServer().GetWorldManager().GetActor;
+ script.DoFile(luaPath);
+
+ //Have to do this to combine LuaParams
+ List