mirror of
https://github.com/riperiperi/FreeSO
synced 2026-08-13 20:26:13 -04:00
77 lines
2.2 KiB
C#
77 lines
2.2 KiB
C#
using FSO.SimAntics.NetPlay.Drivers;
|
|
using System.IO;
|
|
using System.Linq;
|
|
|
|
namespace FSO.SimAntics.NetPlay.Model.Commands
|
|
{
|
|
public class VMNetDirectControlToggleCommand : VMNetCommandBodyAbstract
|
|
{
|
|
public bool Enable;
|
|
|
|
public override bool Execute(VM vm, VMAvatar avatar)
|
|
{
|
|
if (avatar == null) return false;
|
|
|
|
avatar.SetPersonData(SimAntics.Model.VMPersonDataVariable.UnusedAndDoNotUse2, (short)(Enable ? 32767 : 0));
|
|
// Set avatar variable that controls whether direct control should be enabled.
|
|
|
|
if (!Enable)
|
|
{
|
|
var dcInteraction = avatar.Thread.Queue.FirstOrDefault(action => action.Flags.HasFlag(Files.Formats.IFF.Chunks.TTABFlags.FSODirectControl));
|
|
|
|
if (dcInteraction != null)
|
|
{
|
|
avatar.Thread.CancelAction(dcInteraction.UID);
|
|
}
|
|
|
|
avatar.Avatar.HeadSeekWeight = 0f;
|
|
}
|
|
else
|
|
{
|
|
avatar.Thread.EnsureDirectControlAction();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override bool Verify(VM vm, VMAvatar caller)
|
|
{
|
|
if (!base.Verify(vm, caller))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
var enable = vm.Tuning.GetTuning("aprilfools", 0, 2023) ?? 0;
|
|
|
|
if (enable == 0 && Enable) return false;
|
|
|
|
if (enable == 2 && !Enable)
|
|
{
|
|
var server = (vm.Driver as VMServerDriver);
|
|
server.SendGenericMessage(caller.PersistID, "3D Only", "This property can only be joined in 3D mode. Launch your game with the -3d option.");
|
|
server.DisconnectClient(caller.PersistID);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
#region VMSerializable Members
|
|
|
|
public override void SerializeInto(BinaryWriter writer)
|
|
{
|
|
base.SerializeInto(writer);
|
|
|
|
writer.Write(Enable);
|
|
}
|
|
|
|
public override void Deserialize(BinaryReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
|
|
Enable = reader.ReadBoolean();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|