freeso/TSOClient/tso.simantics/NetPlay/Model/Commands/VMNetMoveObjectCmd.cs

68 lines
2.3 KiB
C#

using System.IO;
using FSO.LotView.Model;
using FSO.SimAntics.Model;
using FSO.SimAntics.Model.TSOPlatform;
namespace FSO.SimAntics.NetPlay.Model.Commands
{
public class VMNetMoveObjectCmd : VMNetCommandBodyAbstract
{
public short ObjectID;
public short x;
public short y;
public sbyte level;
public Direction dir;
public override bool Execute(VM vm, VMAvatar caller)
{
VMEntity obj = vm.GetObjectById(ObjectID);
if (!vm.TS1) {
if (obj == null || caller == null || (obj is VMAvatar) ||
(caller.AvatarState.Permissions < VMTSOAvatarPermissions.Admin
&& obj.IsUserMovable(vm.Context, false) != VMPlacementError.Success))
return false;
if (!vm.PlatformState.Validator.CanMoveObject(caller, obj)) return false;
} else if (obj == null) return false;
var result = obj.SetPosition(new LotTilePos(x, y, level), dir, vm.Context, VMPlaceRequestFlags.UserPlacement);
if (result.Status == VMPlacementError.Success)
{
obj.MultitileGroup.ExecuteEntryPoint(11, vm.Context); //User Placement
vm.SignalChatEvent(new VMChatEvent(caller, VMChatEventType.Arch,
caller?.Name ?? "Unknown",
vm.GetUserIP(caller?.PersistID ?? 0),
"moved " + obj.ToString() +" to (" + x / 16f + ", " + y / 16f + ", " + level + ")"
));
return true;
} else
{
return false;
}
}
#region VMSerializable Members
public override void SerializeInto(BinaryWriter writer)
{
base.SerializeInto(writer);
writer.Write(ObjectID);
writer.Write(x);
writer.Write(y);
writer.Write(level);
writer.Write((byte)dir);
}
public override void Deserialize(BinaryReader reader)
{
base.Deserialize(reader);
ObjectID = reader.ReadInt16();
x = reader.ReadInt16();
y = reader.ReadInt16();
level = reader.ReadSByte();
dir = (Direction)reader.ReadByte();
}
#endregion
}
}