New style of scripting for better complex menus.

This commit is contained in:
Filip Maj 2016-06-17 23:17:24 -04:00
parent cdf4b3a2f2
commit 4e69022072
8 changed files with 170 additions and 58 deletions

View file

@ -273,8 +273,8 @@ namespace FFXIVClassic_Map_Server
}
}
}
LuaEngine.DoActorOnEventStarted(player.GetActor(), ownerActor, eventStart);
player.GetActor().StartEvent(ownerActor, eventStart);
Program.Log.Debug("\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.triggerName, LuaUtils.DumpParams(eventStart.luaParams));
break;
@ -286,7 +286,7 @@ namespace FFXIVClassic_Map_Server
subpacket.DebugPrintSubPacket();
EventUpdatePacket eventUpdate = new EventUpdatePacket(subpacket.data);
Program.Log.Debug("\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.GetActor().currentEventOwner);
if (updateOwnerActor == null)
@ -299,8 +299,10 @@ namespace FFXIVClassic_Map_Server
if (updateOwnerActor == null)
break;
}
*/
player.GetActor().UpdateEvent(eventUpdate);
LuaEngine.DoActorOnEventUpdated(player.GetActor(), updateOwnerActor, eventUpdate);
//LuaEngine.DoActorOnEventUpdated(player.GetActor(), updateOwnerActor, eventUpdate);
break;
case 0x012F:

View file

@ -181,6 +181,11 @@ namespace FFXIVClassic_Map_Server.Actors
return BasePacket.CreatePacket(propPacketUtil.Done(), true, false);
}
public string GetUniqueId()
{
return uniqueIdentifier;
}
public uint GetActorClassId()
{
return actorClassId;
@ -322,7 +327,7 @@ namespace FFXIVClassic_Map_Server.Actors
return lparams;
}
public void DoEventStart(Player player, EventStartPacket eventStart)
public Coroutine GetEventStartCoroutine(Player player)
{
Script parent = null, child = null;
@ -331,31 +336,23 @@ namespace FFXIVClassic_Map_Server.Actors
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)
if (parent == null && child == null)
{
LuaEngine.SendError(player, String.Format("ERROR: Could not find script for actor {0}.", GetName()));
return;
return null;
}
//Have to do this to combine LuaParams
List<Object> objects = new List<Object>();
objects.Add(player);
objects.Add(this);
objects.Add(eventStart.triggerName);
if (eventStart.luaParams != null)
objects.AddRange(LuaUtils.CreateLuaParamObjectList(eventStart.luaParams));
//Run Script
DynValue result;
Coroutine coroutine;
if (child != null && !child.Globals.Get("onEventStarted").IsNil())
result = child.Call(child.Globals["onEventStarted"], objects.ToArray());
coroutine = child.CreateCoroutine(child.Globals["onEventStarted"]).Coroutine;
else if (!parent.Globals.Get("onEventStarted").IsNil())
result = parent.Call(parent.Globals["onEventStarted"], objects.ToArray());
coroutine = parent.CreateCoroutine(parent.Globals["onEventStarted"]).Coroutine;
else
return;
return null;
return coroutine;
}
public void DoEventUpdate(Player player, EventUpdatePacket eventUpdate)

View file

@ -15,6 +15,8 @@ using FFXIVClassic_Map_Server.packets.send.player;
using FFXIVClassic_Map_Server.utils;
using System;
using System.Collections.Generic;
using MoonSharp.Interpreter;
using FFXIVClassic_Map_Server.packets.receive.events;
namespace FFXIVClassic_Map_Server.Actors
{
@ -82,8 +84,8 @@ namespace FFXIVClassic_Map_Server.Actors
public uint currentCommand = 0;
public string currentCommandName = "";
public uint eventMenuId = 0;
public Coroutine currentEventRunning;
//Player Info
public uint[] timers = new uint[20];
@ -1118,6 +1120,35 @@ namespace FFXIVClassic_Map_Server.Actors
QueuePacket(spacket);
}
public void StartEvent(Actor owner, EventStartPacket start)
{
//Have to do this to combine LuaParams
List<Object> objects = new List<Object>();
objects.Add(this);
objects.Add(owner);
objects.Add(start.triggerName);
if (start.luaParams != null)
objects.AddRange(LuaUtils.CreateLuaParamObjectList(start.luaParams));
if (owner is Npc)
{
currentEventRunning = ((Npc)owner).GetEventStartCoroutine(this);
currentEventRunning.Resume(objects.ToArray());
}
else
LuaEngine.DoActorOnEventStarted(this, owner, start);
}
public void UpdateEvent(EventUpdatePacket update)
{
if (currentEventRunning == null)
return;
if (currentEventRunning.State == CoroutineState.Suspended)
currentEventRunning.Resume(LuaUtils.CreateLuaParamObjectList(update.luaParams));
}
public void KickEvent(Actor actor, string conditionName, params object[] parameters)
{
if (actor == null)
@ -1150,7 +1181,6 @@ namespace FFXIVClassic_Map_Server.Actors
currentEventOwner = 0;
currentEventName = "";
eventMenuId = 0;
}
public void EndCommand()
@ -1163,16 +1193,6 @@ namespace FFXIVClassic_Map_Server.Actors
currentCommandName = "";
}
public void SetCurrentMenuId(uint id)
{
eventMenuId = id;
}
public uint GetCurrentMenuId()
{
return eventMenuId;
}
public void SendInstanceUpdate()
{

View file

@ -47,7 +47,7 @@ namespace FFXIVClassic_Map_Server.dataobjects
break;
}
}
public bool IsClientConnectionsReady()
{
return (zoneConnection != null && chatConnection != null);
@ -57,7 +57,7 @@ namespace FFXIVClassic_Map_Server.dataobjects
{
zoneConnection.Disconnect();
chatConnection.Disconnect();
}
}
public bool IsDisconnected()
{
@ -71,7 +71,7 @@ namespace FFXIVClassic_Map_Server.dataobjects
public void QueuePacket(SubPacket subPacket, bool isAuthed, bool isEncrypted)
{
zoneConnection.QueuePacket(subPacket, isAuthed, isEncrypted);
zoneConnection.QueuePacket(subPacket, isAuthed, isEncrypted);
}
public Player GetActor()
@ -97,7 +97,7 @@ namespace FFXIVClassic_Map_Server.dataobjects
}
public void UpdatePlayerActorPosition(float x, float y, float z, float rot, ushort moveState)
{
{
playerActor.oldPositionX = playerActor.positionX;
playerActor.oldPositionY = playerActor.positionY;
playerActor.oldPositionZ = playerActor.positionZ;
@ -110,11 +110,11 @@ namespace FFXIVClassic_Map_Server.dataobjects
playerActor.moveState = moveState;
GetActor().zone.UpdateActorPosition(GetActor());
}
}
public void UpdateInstance(List<Actor> list)
{
{
List<BasePacket> basePackets = new List<BasePacket>();
List<SubPacket> RemoveActorSubpackets = new List<SubPacket>();
List<SubPacket> posUpdateSubpackets = new List<SubPacket>();
@ -125,7 +125,7 @@ namespace FFXIVClassic_Map_Server.dataobjects
if (!list.Contains(actorInstanceList[i]))
{
GetActor().QueuePacket(RemoveActorPacket.BuildPacket(playerActor.actorId, actorInstanceList[i].actorId));
actorInstanceList.RemoveAt(i);
actorInstanceList.RemoveAt(i);
}
}
@ -145,7 +145,7 @@ namespace FFXIVClassic_Map_Server.dataobjects
{
GetActor().QueuePacket(actor.GetSpawnPackets(playerActor.actorId, 1));
GetActor().QueuePacket(actor.GetInitPackets(playerActor.actorId));
GetActor().QueuePacket(actor.GetSetEventStatusPackets(playerActor.actorId));
GetActor().QueuePacket(actor.GetSetEventStatusPackets(playerActor.actorId));
actorInstanceList.Add(actor);
if (actor is Npc)

View file

@ -57,13 +57,7 @@ namespace FFXIVClassic_Map_Server.lua
}
public static void DoActorOnEventStarted(Player player, Actor target, EventStartPacket eventStart)
{
if (target is Npc)
{
((Npc)target).DoEventStart(player, eventStart);
return;
}
{
string luaPath;
if (target is Command)