2016-01-25 01:10:43 -05:00
|
|
|
|
using FFXIVClassic_Lobby_Server;
|
|
|
|
|
using FFXIVClassic_Lobby_Server.packets;
|
2016-03-28 11:31:21 -04:00
|
|
|
|
using FFXIVClassic_Map_Server.actors.director;
|
2016-01-20 23:18:10 -05:00
|
|
|
|
using FFXIVClassic_Map_Server.Actors;
|
2016-01-01 14:03:55 -05:00
|
|
|
|
using FFXIVClassic_Map_Server.dataobjects;
|
|
|
|
|
using FFXIVClassic_Map_Server.packets.receive.events;
|
|
|
|
|
using FFXIVClassic_Map_Server.packets.send;
|
|
|
|
|
using FFXIVClassic_Map_Server.packets.send.events;
|
2016-01-24 17:11:35 -05:00
|
|
|
|
using MoonSharp.Interpreter;
|
|
|
|
|
using MoonSharp.Interpreter.Interop;
|
2016-02-03 00:45:11 -05:00
|
|
|
|
using MoonSharp.Interpreter.Loaders;
|
2016-01-01 14:03:55 -05:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
namespace FFXIVClassic_Map_Server.lua
|
|
|
|
|
{
|
|
|
|
|
class LuaEngine
|
|
|
|
|
{
|
2016-03-06 17:55:42 -05:00
|
|
|
|
const string FILEPATH_PLAYER = "./scripts/player.lua";
|
|
|
|
|
const string FILEPATH_ZONE = "./scripts/zones/{0}/zone.lua";
|
2016-01-28 23:24:20 -05:00
|
|
|
|
const string FILEPATH_COMMANDS = "./scripts/commands/{0}.lua";
|
2016-03-28 11:31:21 -04:00
|
|
|
|
const string FILEPATH_DIRECTORS = "./scripts/directors/{0}.lua";
|
2016-01-24 17:11:35 -05:00
|
|
|
|
const string FILEPATH_NPCS = "./scripts/zones/{0}/npcs/{1}.lua";
|
2016-01-01 14:03:55 -05:00
|
|
|
|
|
|
|
|
|
public LuaEngine()
|
2016-01-24 17:11:35 -05:00
|
|
|
|
{
|
|
|
|
|
UserData.RegistrationPolicy = InteropRegistrationPolicy.Automatic;
|
2016-01-01 14:03:55 -05:00
|
|
|
|
}
|
|
|
|
|
|
2016-03-06 17:55:42 -05:00
|
|
|
|
public static List<LuaParam> doActorOnInstantiate(Player player, Actor target)
|
2016-01-24 17:11:35 -05:00
|
|
|
|
{
|
|
|
|
|
string luaPath;
|
2016-01-01 14:03:55 -05:00
|
|
|
|
|
2016-01-24 17:11:35 -05:00
|
|
|
|
if (target is Npc)
|
|
|
|
|
{
|
|
|
|
|
luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.getName());
|
|
|
|
|
if (File.Exists(luaPath))
|
|
|
|
|
{
|
|
|
|
|
Script script = new Script();
|
2016-02-03 00:45:11 -05:00
|
|
|
|
((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
|
2016-01-25 01:10:43 -05:00
|
|
|
|
script.Globals["getStaticActor"] = (Func<string, Actor>)Server.getStaticActors;
|
2016-04-06 15:29:24 -07:00
|
|
|
|
script.Globals["getWorldMaster"] = (Func<Actor>)Server.getWorldManager().GetActor;
|
2016-03-12 02:52:34 -05:00
|
|
|
|
script.Globals["getItemGamedata"] = (Func<uint, Item>)Server.getItemGamedata;
|
2016-01-24 17:11:35 -05:00
|
|
|
|
script.DoFile(luaPath);
|
2016-01-28 23:24:20 -05:00
|
|
|
|
DynValue result = script.Call(script.Globals["onInstantiate"], target);
|
2016-01-24 17:11:35 -05:00
|
|
|
|
List<LuaParam> lparams = LuaUtils.createLuaParamList(result);
|
|
|
|
|
return lparams;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
List<SubPacket> sendError = new List<SubPacket>();
|
2016-02-03 00:45:11 -05:00
|
|
|
|
sendError.Add(EndEventPacket.buildPacket(player.actorId, player.eventCurrentOwner, player.eventCurrentStarter));
|
2016-01-24 17:11:35 -05:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
2016-01-25 01:10:43 -05:00
|
|
|
|
}
|
2016-01-24 17:11:35 -05:00
|
|
|
|
|
2016-03-06 17:55:42 -05:00
|
|
|
|
public static void doActorOnEventStarted(Player player, Actor target, EventStartPacket eventStart)
|
2016-01-01 14:03:55 -05:00
|
|
|
|
{
|
|
|
|
|
string luaPath;
|
|
|
|
|
|
|
|
|
|
if (target is Command)
|
|
|
|
|
{
|
2016-01-24 17:11:35 -05:00
|
|
|
|
luaPath = String.Format(FILEPATH_COMMANDS, target.getName());
|
2016-01-01 14:03:55 -05:00
|
|
|
|
}
|
2016-03-28 11:31:21 -04:00
|
|
|
|
else if (target is Director)
|
|
|
|
|
{
|
|
|
|
|
luaPath = String.Format(FILEPATH_DIRECTORS, target.getName());
|
|
|
|
|
}
|
2016-02-03 00:45:11 -05:00
|
|
|
|
else
|
2016-01-24 17:11:35 -05:00
|
|
|
|
luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.getName());
|
2016-02-03 00:45:11 -05:00
|
|
|
|
|
|
|
|
|
if (File.Exists(luaPath))
|
|
|
|
|
{
|
|
|
|
|
Script script = new Script();
|
|
|
|
|
((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
|
2016-04-06 15:29:24 -07:00
|
|
|
|
script.Globals["getWorldManager"] = (Func<WorldManager>)Server.getWorldManager;
|
2016-02-03 00:45:11 -05:00
|
|
|
|
script.Globals["getStaticActor"] = (Func<string, Actor>)Server.getStaticActors;
|
2016-04-06 15:29:24 -07:00
|
|
|
|
script.Globals["getWorldMaster"] = (Func<Actor>)Server.getWorldManager().GetActor;
|
2016-03-12 02:52:34 -05:00
|
|
|
|
script.Globals["getItemGamedata"] = (Func<uint, Item>)Server.getItemGamedata;
|
2016-02-03 00:45:11 -05:00
|
|
|
|
script.DoFile(luaPath);
|
|
|
|
|
|
|
|
|
|
//Have to do this to combine LuaParams
|
|
|
|
|
List<Object> objects = new List<Object>();
|
|
|
|
|
objects.Add(player);
|
|
|
|
|
objects.Add(target);
|
2016-03-20 21:18:46 -04:00
|
|
|
|
objects.Add(eventStart.triggerName);
|
2016-04-01 23:24:14 -04:00
|
|
|
|
|
|
|
|
|
if (eventStart.luaParams != null)
|
|
|
|
|
objects.AddRange(LuaUtils.createLuaParamObjectList(eventStart.luaParams));
|
2016-02-03 00:45:11 -05:00
|
|
|
|
|
|
|
|
|
//Run Script
|
|
|
|
|
DynValue result = script.Call(script.Globals["onEventStarted"], objects.ToArray());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
List<SubPacket> sendError = new List<SubPacket>();
|
|
|
|
|
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));
|
2016-01-01 14:03:55 -05:00
|
|
|
|
}
|
2016-02-03 00:45:11 -05:00
|
|
|
|
|
2016-01-01 14:03:55 -05:00
|
|
|
|
}
|
|
|
|
|
|
2016-03-06 17:55:42 -05:00
|
|
|
|
public static void doActorOnEventUpdated(Player player, Actor target, EventUpdatePacket eventUpdate)
|
2016-01-01 14:03:55 -05:00
|
|
|
|
{
|
2016-04-01 23:24:14 -04:00
|
|
|
|
string luaPath;
|
2016-01-01 14:03:55 -05:00
|
|
|
|
|
2016-02-03 00:45:11 -05:00
|
|
|
|
if (target is Command)
|
2016-01-24 17:11:35 -05:00
|
|
|
|
luaPath = String.Format(FILEPATH_COMMANDS, target.getName());
|
2016-04-01 23:24:14 -04:00
|
|
|
|
else if (target is Director)
|
|
|
|
|
luaPath = String.Format(FILEPATH_DIRECTORS, target.getName());
|
2016-02-03 00:45:11 -05:00
|
|
|
|
else
|
2016-04-01 23:24:14 -04:00
|
|
|
|
luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.getName());
|
2016-01-28 23:24:20 -05:00
|
|
|
|
|
2016-02-03 00:45:11 -05:00
|
|
|
|
if (File.Exists(luaPath))
|
2016-01-01 14:03:55 -05:00
|
|
|
|
{
|
2016-02-03 00:45:11 -05:00
|
|
|
|
Script script = new Script();
|
|
|
|
|
((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
|
2016-04-06 15:29:24 -07:00
|
|
|
|
script.Globals["getWorldManager"] = (Func<WorldManager>)Server.getWorldManager;
|
2016-02-03 00:45:11 -05:00
|
|
|
|
script.Globals["getStaticActor"] = (Func<string, Actor>)Server.getStaticActors;
|
2016-04-06 15:29:24 -07:00
|
|
|
|
script.Globals["getWorldMaster"] = (Func<Actor>)Server.getWorldManager().GetActor;
|
2016-03-12 02:52:34 -05:00
|
|
|
|
script.Globals["getItemGamedata"] = (Func<uint, Item>)Server.getItemGamedata;
|
2016-02-03 00:45:11 -05:00
|
|
|
|
script.DoFile(luaPath);
|
2016-01-24 17:11:35 -05:00
|
|
|
|
|
2016-02-03 00:45:11 -05:00
|
|
|
|
//Have to do this to combine LuaParams
|
|
|
|
|
List<Object> objects = new List<Object>();
|
|
|
|
|
objects.Add(player);
|
|
|
|
|
objects.Add(target);
|
|
|
|
|
objects.Add(eventUpdate.step);
|
|
|
|
|
objects.AddRange(LuaUtils.createLuaParamObjectList(eventUpdate.luaParams));
|
2016-01-24 17:11:35 -05:00
|
|
|
|
|
2016-02-03 00:45:11 -05:00
|
|
|
|
//Run Script
|
|
|
|
|
DynValue result = script.Call(script.Globals["onEventUpdate"], objects.ToArray());
|
2016-01-01 14:03:55 -05:00
|
|
|
|
}
|
2016-02-03 00:45:11 -05:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
List<SubPacket> sendError = new List<SubPacket>();
|
|
|
|
|
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));
|
|
|
|
|
}
|
2016-01-01 14:03:55 -05:00
|
|
|
|
}
|
2016-03-06 17:55:42 -05:00
|
|
|
|
|
|
|
|
|
public static void onZoneIn(Player player)
|
|
|
|
|
{
|
|
|
|
|
string luaPath = String.Format(FILEPATH_ZONE, player.getZone().actorId);
|
|
|
|
|
|
|
|
|
|
if (File.Exists(luaPath))
|
|
|
|
|
{
|
|
|
|
|
Script script = new Script();
|
|
|
|
|
((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
|
2016-04-06 15:29:24 -07:00
|
|
|
|
script.Globals["getWorldManager"] = (Func<WorldManager>)Server.getWorldManager;
|
2016-03-06 17:55:42 -05:00
|
|
|
|
script.Globals["getStaticActor"] = (Func<string, Actor>)Server.getStaticActors;
|
2016-04-06 15:29:24 -07:00
|
|
|
|
script.Globals["getWorldMaster"] = (Func<Actor>)Server.getWorldManager().GetActor;
|
2016-03-12 02:52:34 -05:00
|
|
|
|
script.Globals["getItemGamedata"] = (Func<uint, Item>)Server.getItemGamedata;
|
2016-03-06 17:55:42 -05:00
|
|
|
|
script.DoFile(luaPath);
|
|
|
|
|
|
|
|
|
|
//Run Script
|
|
|
|
|
DynValue result = script.Call(script.Globals["onZoneIn"], player);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void onLogin(Player player)
|
|
|
|
|
{
|
|
|
|
|
if (File.Exists(FILEPATH_PLAYER))
|
|
|
|
|
{
|
|
|
|
|
Script script = new Script();
|
|
|
|
|
((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
|
2016-04-06 15:29:24 -07:00
|
|
|
|
script.Globals["getWorldManager"] = (Func<WorldManager>)Server.getWorldManager;
|
2016-03-06 17:55:42 -05:00
|
|
|
|
script.Globals["getStaticActor"] = (Func<string, Actor>)Server.getStaticActors;
|
2016-04-06 15:29:24 -07:00
|
|
|
|
script.Globals["getWorldMaster"] = (Func<Actor>)Server.getWorldManager().GetActor;
|
2016-03-12 02:52:34 -05:00
|
|
|
|
script.Globals["getItemGamedata"] = (Func<uint, Item>)Server.getItemGamedata;
|
2016-03-06 17:55:42 -05:00
|
|
|
|
script.DoFile(FILEPATH_PLAYER);
|
|
|
|
|
|
|
|
|
|
//Run Script
|
|
|
|
|
DynValue result = script.Call(script.Globals["onLogin"], player);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-01 14:03:55 -05:00
|
|
|
|
}
|
|
|
|
|
}
|