mirror of
https://github.com/NotAKidoS/NAK_CVR_Mods.git
synced 2025-09-01 13:59:22 +00:00
101 lines
No EOL
3.4 KiB
C#
101 lines
No EOL
3.4 KiB
C#
using MoonSharp.Interpreter;
|
|
|
|
namespace NAK.LuaNetVars;
|
|
|
|
public partial class LuaNetVarController
|
|
{
|
|
internal void RegisterNetworkVar(string varName)
|
|
{
|
|
if (_registeredNetworkVars.ContainsKey(varName))
|
|
{
|
|
LuaNetVarsMod.Logger.Warning($"Network variable {varName} already registered!");
|
|
return;
|
|
}
|
|
|
|
_registeredNetworkVars[varName] = DynValue.Nil;
|
|
_luaClientBehaviour.script.Globals[varName] = DynValue.Nil;
|
|
|
|
RegisterGetterFunction(varName);
|
|
RegisterSetterFunction(varName);
|
|
|
|
LuaNetVarsMod.Logger.Msg($"Registered network variable {varName}");
|
|
}
|
|
|
|
private void RegisterGetterFunction(string varName)
|
|
{
|
|
_luaClientBehaviour.script.Globals["Get" + varName] = DynValue.NewCallback((context, args) =>
|
|
{
|
|
return _registeredNetworkVars.TryGetValue(varName, out var value) ? value : DynValue.Nil;
|
|
});
|
|
}
|
|
|
|
private void RegisterSetterFunction(string varName)
|
|
{
|
|
_luaClientBehaviour.script.Globals["Set" + varName] = DynValue.NewCallback((context, args) =>
|
|
{
|
|
if (args.Count < 1) return DynValue.Nil;
|
|
|
|
var newValue = args[0];
|
|
if (!IsSupportedDynValue(newValue))
|
|
{
|
|
LuaNetVarsMod.Logger.Error($"Unsupported DynValue type: {newValue.Type} for variable {varName}");
|
|
return DynValue.Nil;
|
|
}
|
|
|
|
if (_registeredNetworkVars.TryGetValue(varName, out var oldValue))
|
|
{
|
|
UpdateNetworkVariable(varName, oldValue, newValue);
|
|
}
|
|
|
|
return DynValue.Nil;
|
|
});
|
|
}
|
|
|
|
private void UpdateNetworkVariable(string varName, DynValue oldValue, DynValue newValue)
|
|
{
|
|
_registeredNetworkVars[varName] = newValue;
|
|
_luaClientBehaviour.script.Globals[varName] = newValue;
|
|
_dirtyVariables.Add(varName);
|
|
|
|
if (_registeredNotifyCallbacks.TryGetValue(varName, out var callback))
|
|
{
|
|
_luaClientBehaviour.script.Call(callback, DynValue.NewString(varName), oldValue, newValue);
|
|
}
|
|
}
|
|
|
|
internal void RegisterNotifyCallback(string varName, DynValue callback)
|
|
{
|
|
if (!ValidateCallback(callback) || !ValidateNetworkVar(varName)) return;
|
|
|
|
if (_registeredNotifyCallbacks.ContainsKey(varName))
|
|
LuaNetVarsMod.Logger.Warning($"Overwriting notify callback for {varName}");
|
|
|
|
_registeredNotifyCallbacks[varName] = callback;
|
|
LuaNetVarsMod.Logger.Msg($"Registered notify callback for {varName}");
|
|
}
|
|
|
|
internal void RegisterEventCallback(string eventName, DynValue callback)
|
|
{
|
|
if (!ValidateCallback(callback)) return;
|
|
|
|
if (_registeredEventCallbacks.ContainsKey(eventName))
|
|
LuaNetVarsMod.Logger.Warning($"Overwriting event callback for {eventName}");
|
|
|
|
_registeredEventCallbacks[eventName] = callback;
|
|
LuaNetVarsMod.Logger.Msg($"Registered event callback for {eventName}");
|
|
}
|
|
|
|
private bool ValidateCallback(DynValue callback)
|
|
{
|
|
if (callback?.Function != null) return true;
|
|
LuaNetVarsMod.Logger.Error("Passed DynValue must be a function");
|
|
return false;
|
|
}
|
|
|
|
private bool ValidateNetworkVar(string varName)
|
|
{
|
|
if (_registeredNetworkVars.ContainsKey(varName)) return true;
|
|
LuaNetVarsMod.Logger.Error($"Attempted to register notify callback for non-registered variable {varName}.");
|
|
return false;
|
|
}
|
|
} |