mirror of
https://github.com/riperiperi/FreeSO
synced 2026-08-13 20:26:13 -04:00
95 lines
3.8 KiB
C#
95 lines
3.8 KiB
C#
using FSO.SimAntics.Model;
|
|
using FSO.SimAntics.Model.Platform;
|
|
using FSO.SimAntics.Model.TSOPlatform;
|
|
using System.IO;
|
|
|
|
namespace FSO.SimAntics.NetPlay.Model.Commands
|
|
{
|
|
public class VMNetSendToInventoryCmd : VMNetCommandBodyAbstract
|
|
{
|
|
public uint ObjectPID;
|
|
public bool Verified;
|
|
public bool InternalDispatch;
|
|
public bool Success;
|
|
|
|
public override bool Execute(VM vm, VMAvatar caller)
|
|
{
|
|
//inventory move completed in verification, delete it now.
|
|
//TODO: some modes for this command. LOCK object (so it cannot be used while we save it), DELETE LOCKED, UNLOCK object (something bad happened)
|
|
|
|
var obj = vm.GetObjectByPersist(ObjectPID);
|
|
if (obj != null && obj is VMGameObject)
|
|
{
|
|
if (Success)
|
|
{
|
|
//was this my sim's object? try add it to our local inventory representaton
|
|
if (((VMTSOObjectState)obj.TSOState).OwnerID == vm.MyUID)
|
|
{
|
|
vm.MyInventory.Add(new VMInventoryItem()
|
|
{
|
|
ObjectPID = ObjectPID,
|
|
GUID = (obj.MasterDefinition?.GUID) ?? obj.Object.OBJ.GUID,
|
|
Name = obj.MultitileGroup.Name,
|
|
Value = (uint)obj.MultitileGroup.Price,
|
|
Graphic = (ushort)obj.GetValue(VMStackObjectVariable.Graphic),
|
|
DynFlags1 = obj.DynamicSpriteFlags,
|
|
DynFlags2 = obj.DynamicSpriteFlags2,
|
|
});
|
|
}
|
|
vm.Context.ObjectQueries.RemoveMultitilePersist(vm, obj.PersistID);
|
|
foreach (var o in obj.MultitileGroup.Objects) o.PersistID = 0; //no longer representative of the object in db.
|
|
obj.Delete(true, vm.Context);
|
|
} else
|
|
{
|
|
foreach (var o in obj.MultitileGroup.Objects)
|
|
((VMGameObject)o).Disabled &= ~VMGameObjectDisableFlags.TransactionIncomplete;
|
|
}
|
|
}
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
public override bool Verify(VM vm, VMAvatar caller)
|
|
{
|
|
if (Verified) return true;
|
|
if (ObjectPID == 0) return false;
|
|
var targObj = vm.GetObjectByPersist(ObjectPID);
|
|
if (targObj == null) return false;
|
|
if (!InternalDispatch && (caller == null || //caller must be on lot, be a roommate.
|
|
caller.AvatarState.Permissions < VMTSOAvatarPermissions.Roommate
|
|
|| targObj.PersistID == 0 || targObj is VMAvatar || targObj.IsUserMovable(vm.Context, true) != VMPlacementError.Success))
|
|
return false;
|
|
|
|
if (vm.PlatformState.Validator.GetDeleteMode(DeleteMode.Sendback, caller, targObj) != DeleteMode.Sendback) return false;
|
|
|
|
if ((((VMGameObject)targObj).Disabled & VMGameObjectDisableFlags.TransactionIncomplete) > 0) return false;
|
|
VMNetLockCmd.LockObj(vm, targObj);
|
|
vm.GlobalLink.MoveToInventory(vm, targObj.MultitileGroup, (bool success, uint pid) =>
|
|
{
|
|
Success = success;
|
|
Verified = true;
|
|
vm.ForwardCommand(this);
|
|
});
|
|
return false;
|
|
}
|
|
|
|
#region VMSerializable Members
|
|
|
|
public override void SerializeInto(BinaryWriter writer)
|
|
{
|
|
base.SerializeInto(writer);
|
|
writer.Write(ObjectPID);
|
|
writer.Write(Success);
|
|
}
|
|
|
|
public override void Deserialize(BinaryReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
ObjectPID = reader.ReadUInt32();
|
|
Success = reader.ReadBoolean();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|