mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-06-08 21:44:35 +02:00
Added implementations of the event receive/send packets. Added lua scripting stuff. Added some utils.
This commit is contained in:
parent
d60938346b
commit
734a3f4e7f
15 changed files with 603 additions and 261 deletions
77
FFXIVClassic Map Server/lua/LuaEngine.cs
Normal file
77
FFXIVClassic Map Server/lua/LuaEngine.cs
Normal file
|
@ -0,0 +1,77 @@
|
|||
using FFXIVClassic_Lobby_Server.packets;
|
||||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.dataobjects.actors;
|
||||
using FFXIVClassic_Map_Server.dataobjects.chara;
|
||||
using FFXIVClassic_Map_Server.dataobjects.chara.npc;
|
||||
using FFXIVClassic_Map_Server.packets.receive.events;
|
||||
using FFXIVClassic_Map_Server.packets.send;
|
||||
using FFXIVClassic_Map_Server.packets.send.events;
|
||||
using NLua;
|
||||
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
|
||||
{
|
||||
const string FILEPATH_COMMANDS = "./scripts/command/{0}.lua";
|
||||
const string FILEPATH_EVENTS = "./scripts/talk/{0}.lua";
|
||||
|
||||
Lua lstate = new Lua();
|
||||
|
||||
public LuaEngine()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public void doEventStart(ConnectedPlayer player, Actor target, EventStartPacket packet)
|
||||
{
|
||||
string luaPath;
|
||||
|
||||
if (target is Command)
|
||||
luaPath = String.Format(FILEPATH_COMMANDS, target.getName());
|
||||
else if (target is Npc)
|
||||
luaPath = String.Format(FILEPATH_EVENTS, target.getName());
|
||||
else
|
||||
luaPath = "";
|
||||
|
||||
if (File.Exists(luaPath))
|
||||
{
|
||||
lstate.DoFile(luaPath);
|
||||
var eventStarted = lstate["eventStarted"] as LuaFunction;
|
||||
eventStarted.Call(new LuaPlayer(player), player.eventCurrentOwner, LuaUtils.createLuaParamObjectList(packet.luaParams));
|
||||
}
|
||||
else
|
||||
{
|
||||
List<SubPacket> sendError = new List<SubPacket>();
|
||||
sendError.Add(EndEventPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter));
|
||||
sendError.Add(SendMessagePacket.buildPacket(player.actorID, player.actorID, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "ERROR: Could not find script for event"));
|
||||
player.queuePacket(BasePacket.createPacket(sendError, true, false));
|
||||
}
|
||||
}
|
||||
|
||||
public void doEventUpdated(ConnectedPlayer player, Actor target, EventUpdatePacket packet)
|
||||
{
|
||||
string luaPath = String.Format(FILEPATH_EVENTS, ((Command)target).getName());
|
||||
|
||||
if (File.Exists(luaPath))
|
||||
{
|
||||
lstate.DoFile(luaPath);
|
||||
var eventStarted = lstate["eventUpdated"] as LuaFunction;
|
||||
eventStarted.Call(new LuaPlayer(player), player.eventCurrentOwner, packet.step, LuaUtils.createLuaParamObjectList(packet.luaParams));
|
||||
}
|
||||
else
|
||||
{
|
||||
List<SubPacket> sendError = new List<SubPacket>();
|
||||
sendError.Add(EndEventPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter));
|
||||
sendError.Add(SendMessagePacket.buildPacket(player.actorID, player.actorID, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "ERROR: Could not find script for event"));
|
||||
player.queuePacket(BasePacket.createPacket(sendError, true, false));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
22
FFXIVClassic Map Server/lua/LuaEvent.cs
Normal file
22
FFXIVClassic Map Server/lua/LuaEvent.cs
Normal file
|
@ -0,0 +1,22 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.lua
|
||||
{
|
||||
class LuaEvent
|
||||
{
|
||||
public static void getStep()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public static void getParam()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
20
FFXIVClassic Map Server/lua/LuaParam.cs
Normal file
20
FFXIVClassic Map Server/lua/LuaParam.cs
Normal file
|
@ -0,0 +1,20 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.lua
|
||||
{
|
||||
class LuaParam
|
||||
{
|
||||
public int typeID;
|
||||
public Object value;
|
||||
|
||||
public LuaParam(int type, Object value)
|
||||
{
|
||||
this.typeID = type;
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
}
|
74
FFXIVClassic Map Server/lua/LuaPlayer.cs
Normal file
74
FFXIVClassic Map Server/lua/LuaPlayer.cs
Normal file
|
@ -0,0 +1,74 @@
|
|||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.packets.send;
|
||||
using FFXIVClassic_Map_Server.packets.send.events;
|
||||
using NLua;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.lua
|
||||
{
|
||||
class LuaPlayer
|
||||
{
|
||||
private ConnectedPlayer player;
|
||||
|
||||
public LuaPlayer(ConnectedPlayer player)
|
||||
{
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public void setMusic(ushort musicID, ushort playMode)
|
||||
{
|
||||
player.queuePacket(SetMusicPacket.buildPacket(player.actorID, musicID, playMode), true, false);
|
||||
}
|
||||
|
||||
public void setWeather(uint weatherID)
|
||||
{
|
||||
player.queuePacket(SetWeatherPacket.buildPacket(player.actorID, weatherID), true, false);
|
||||
}
|
||||
|
||||
public void getParameter(string paramName)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void setParameter(string paramName, object value, string uiToRefresh)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void getAttributePoints()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void setAttributePoints(int str, int vit, int dex, int inte, int min, int pie)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void logout()
|
||||
{
|
||||
player.queuePacket(LogoutPacket.buildPacket(player.actorID), true, false);
|
||||
}
|
||||
|
||||
public void quitGame()
|
||||
{
|
||||
player.queuePacket(QuitPacket.buildPacket(player.actorID), true, false);
|
||||
}
|
||||
|
||||
public void runEvent(string functionName, params object[] parameters)
|
||||
{
|
||||
List<LuaParam> lParams = LuaUtils.createLuaParamList(parameters);
|
||||
player.getConnection1().queuePacket(RunEventFunctionPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter, functionName, lParams), true, false);
|
||||
}
|
||||
|
||||
public void endEvent()
|
||||
{
|
||||
player.getConnection1().queuePacket(EndEventPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter), true, false);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
241
FFXIVClassic Map Server/lua/LuaUtils.cs
Normal file
241
FFXIVClassic Map Server/lua/LuaUtils.cs
Normal file
|
@ -0,0 +1,241 @@
|
|||
using FFXIVClassic_Lobby_Server.common;
|
||||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.lua;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server
|
||||
{
|
||||
class LuaUtils
|
||||
{
|
||||
|
||||
public static List<LuaParam> readLuaParams(BinaryReader reader)
|
||||
{
|
||||
List<LuaParam> luaParams = new List<LuaParam>();
|
||||
|
||||
bool isDone = false;
|
||||
while (true)
|
||||
{
|
||||
byte code = reader.ReadByte();
|
||||
object value = null;
|
||||
bool wasNil = false;
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case 0x0: //Int32
|
||||
value = Utils.swapEndian(reader.ReadUInt32());
|
||||
break;
|
||||
case 0x1: //Int32
|
||||
value = Utils.swapEndian(reader.ReadUInt32());
|
||||
break;
|
||||
case 0x2: //Null Termed String
|
||||
List<byte> list = new List<byte>();
|
||||
while(true){
|
||||
byte readByte = reader.ReadByte();
|
||||
if (readByte == 0)
|
||||
break;
|
||||
list.Add(readByte);
|
||||
}
|
||||
value = Encoding.ASCII.GetString(list.ToArray());
|
||||
break;
|
||||
case 0x3: //Boolean False
|
||||
value = false;
|
||||
break;
|
||||
case 0x4: //Boolean True
|
||||
value = true;
|
||||
break;
|
||||
case 0x5: //Nil
|
||||
wasNil = true;
|
||||
break;
|
||||
case 0x6: //Actor (By Id)
|
||||
value = Utils.swapEndian(reader.ReadUInt32());
|
||||
break;
|
||||
case 0x10: //Byte?
|
||||
value = reader.ReadByte();
|
||||
break;
|
||||
case 0x1B: //Short?
|
||||
value = reader.ReadUInt16();
|
||||
break;
|
||||
case 0xF: //End
|
||||
isDone = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isDone)
|
||||
break;
|
||||
|
||||
if (value != null)
|
||||
luaParams.Add(new LuaParam(code, value));
|
||||
else if (wasNil)
|
||||
luaParams.Add(new LuaParam(code, value));
|
||||
}
|
||||
|
||||
return luaParams;
|
||||
}
|
||||
|
||||
public static List<LuaParam> readLuaParams(byte[] bytesIn)
|
||||
{
|
||||
List<LuaParam> luaParams = new List<LuaParam>();
|
||||
|
||||
using (MemoryStream memStream = new MemoryStream(bytesIn))
|
||||
{
|
||||
using (BinaryReader reader = new BinaryReader(memStream))
|
||||
{
|
||||
bool isDone = false;
|
||||
while (true)
|
||||
{
|
||||
byte code = reader.ReadByte();
|
||||
object value = null;
|
||||
bool wasNil = false;
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case 0x0: //Int32
|
||||
value = Utils.swapEndian(reader.ReadUInt32());
|
||||
break;
|
||||
case 0x1: //Int32
|
||||
value = Utils.swapEndian(reader.ReadUInt32());
|
||||
break;
|
||||
case 0x2: //Null Termed String
|
||||
List<byte> list = new List<byte>();
|
||||
while (true)
|
||||
{
|
||||
byte readByte = reader.ReadByte();
|
||||
if (readByte == 0)
|
||||
break;
|
||||
list.Add(readByte);
|
||||
}
|
||||
value = Encoding.ASCII.GetString(list.ToArray());
|
||||
break;
|
||||
case 0x3: //Boolean False
|
||||
value = false;
|
||||
break;
|
||||
case 0x4: //Boolean True
|
||||
value = true;
|
||||
break;
|
||||
case 0x5: //Nil
|
||||
wasNil = true;
|
||||
break;
|
||||
case 0x6: //Actor (By Id)
|
||||
value = Utils.swapEndian(reader.ReadUInt32());
|
||||
break;
|
||||
case 0x10: //Byte?
|
||||
value = reader.ReadByte();
|
||||
break;
|
||||
case 0x1B: //Short?
|
||||
value = reader.ReadUInt16();
|
||||
break;
|
||||
case 0xF: //End
|
||||
isDone = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isDone)
|
||||
break;
|
||||
|
||||
if (value != null)
|
||||
luaParams.Add(new LuaParam(code, value));
|
||||
else if (wasNil)
|
||||
luaParams.Add(new LuaParam(code, value));
|
||||
}
|
||||
}
|
||||
}
|
||||
return luaParams;
|
||||
}
|
||||
|
||||
public static List<LuaParam> createLuaParamList(object[] list)
|
||||
{
|
||||
List<LuaParam> luaParams = new List<LuaParam>();
|
||||
|
||||
foreach (object o in list)
|
||||
{
|
||||
if (o is uint)
|
||||
{
|
||||
luaParams.Add(new LuaParam(0x0, (uint)o));
|
||||
}
|
||||
else if (o is string)
|
||||
{
|
||||
luaParams.Add(new LuaParam(0x2, (string)o));
|
||||
}
|
||||
else if (o is bool)
|
||||
{
|
||||
if (((bool)o))
|
||||
luaParams.Add(new LuaParam(0x4, null));
|
||||
else
|
||||
luaParams.Add(new LuaParam(0x3, null));
|
||||
}
|
||||
else if (o == null)
|
||||
{
|
||||
luaParams.Add(new LuaParam(0x5, null));
|
||||
}
|
||||
else if (o is Actor)
|
||||
{
|
||||
luaParams.Add(new LuaParam(0x6, ((Actor)o).actorID));
|
||||
}
|
||||
}
|
||||
|
||||
return luaParams;
|
||||
}
|
||||
|
||||
public static object[] createLuaParamObjectList(List <LuaParam> luaParams)
|
||||
{
|
||||
object[] list = new object[luaParams.Count];
|
||||
|
||||
for (int i = 0; i < list.Length; i++)
|
||||
list[i] = luaParams[i].value;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
public static string dumpParams(List<LuaParam> lParams)
|
||||
{
|
||||
string dumpString = "";
|
||||
for (int i = 0; i < lParams.Count; i++)
|
||||
{
|
||||
switch (lParams[i].typeID)
|
||||
{
|
||||
case 0x0: //Int32
|
||||
dumpString += String.Format("0x{0:X}", (uint)lParams[i].value);
|
||||
break;
|
||||
case 0x1: //Int32
|
||||
dumpString += String.Format("0x{0:X}", (uint)lParams[i].value);
|
||||
break;
|
||||
case 0x2: //Null Termed String
|
||||
dumpString += String.Format("\"{0}\"", (string)lParams[i].value);
|
||||
break;
|
||||
case 0x3: //Boolean False
|
||||
dumpString += "false";
|
||||
break;
|
||||
case 0x4: //Boolean True
|
||||
dumpString += "true";
|
||||
break;
|
||||
case 0x5: //NULL???
|
||||
dumpString += "nil";
|
||||
break;
|
||||
case 0x6: //Actor (By Id)
|
||||
dumpString += String.Format("0x{0:X}", (uint)lParams[i].value);
|
||||
break;
|
||||
case 0x10: //Byte?
|
||||
dumpString += String.Format("0x{0:X}", (byte)lParams[i].value);
|
||||
break;
|
||||
case 0x1B: //Short?
|
||||
dumpString += String.Format("0x{0:X}", (ushort)lParams[i].value);
|
||||
break;
|
||||
case 0xF: //End
|
||||
break;
|
||||
}
|
||||
|
||||
if (i != lParams.Count - 1)
|
||||
dumpString += ", ";
|
||||
}
|
||||
|
||||
return dumpString;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue