Add target object to object builder

Assign all properties in ApplyChanges
This commit is contained in:
Oliver Booth 2022-12-04 19:20:24 +00:00
parent 61bafac567
commit a9a613f424
No known key found for this signature in database
GPG Key ID: 32A00B35503AF634
4 changed files with 52 additions and 24 deletions

View File

@ -53,7 +53,7 @@ public class VirtualParadiseModelObject : VirtualParadiseObject
{ {
ArgumentNullException.ThrowIfNull(action); ArgumentNullException.ThrowIfNull(action);
var builder = new VirtualParadiseModelObjectBuilder(Client, ObjectBuilderMode.Modify); var builder = new VirtualParadiseModelObjectBuilder(Client, this, ObjectBuilderMode.Modify);
await Task.Run(() => action(builder)).ConfigureAwait(false); await Task.Run(() => action(builder)).ConfigureAwait(false);
lock (Client.Lock) lock (Client.Lock)

View File

@ -11,8 +11,12 @@ namespace VpSharp.Entities;
/// </summary> /// </summary>
public sealed class VirtualParadiseModelObjectBuilder : VirtualParadiseObjectBuilder public sealed class VirtualParadiseModelObjectBuilder : VirtualParadiseObjectBuilder
{ {
internal VirtualParadiseModelObjectBuilder(VirtualParadiseClient client, ObjectBuilderMode mode) internal VirtualParadiseModelObjectBuilder(
: base(client, mode) VirtualParadiseClient client,
VirtualParadiseModelObject targetObject,
ObjectBuilderMode mode
)
: base(client, targetObject, mode)
{ {
} }
@ -106,21 +110,11 @@ public sealed class VirtualParadiseModelObjectBuilder : VirtualParadiseObjectBui
internal void ApplyChanges() internal void ApplyChanges()
{ {
nint handle = Client.NativeInstanceHandle; nint handle = Client.NativeInstanceHandle;
var targetObject = (VirtualParadiseModelObject)TargetObject;
if (Action is { } action) vp_string_set(handle, StringAttribute.ObjectModel, Model ?? targetObject.Model);
{ vp_string_set(handle, StringAttribute.ObjectDescription, Description ?? targetObject.Description);
vp_string_set(handle, StringAttribute.ObjectAction, action); vp_string_set(handle, StringAttribute.ObjectAction, Action ?? targetObject.Action);
}
if (Description is { } description)
{
vp_string_set(handle, StringAttribute.ObjectDescription, description);
}
if (Model is { } model)
{
vp_string_set(handle, StringAttribute.ObjectModel, model);
}
if (Position is { } position) if (Position is { } position)
{ {
@ -133,6 +127,13 @@ public sealed class VirtualParadiseModelObjectBuilder : VirtualParadiseObjectBui
{ {
throw new ArgumentException("Position must be assigned when creating a new object."); throw new ArgumentException("Position must be assigned when creating a new object.");
} }
else
{
(double x, double y, double z) = targetObject.Location.Position;
_ = vp_double_set(handle, FloatAttribute.ObjectX, x);
_ = vp_double_set(handle, FloatAttribute.ObjectY, y);
_ = vp_double_set(handle, FloatAttribute.ObjectZ, z);
}
if (Rotation is null && Mode == ObjectBuilderMode.Create) if (Rotation is null && Mode == ObjectBuilderMode.Create)
{ {
@ -154,6 +155,14 @@ public sealed class VirtualParadiseModelObjectBuilder : VirtualParadiseObjectBui
_ = vp_double_set(handle, FloatAttribute.ObjectRotationZ, z); _ = vp_double_set(handle, FloatAttribute.ObjectRotationZ, z);
_ = vp_double_set(handle, FloatAttribute.ObjectRotationAngle, angle); _ = vp_double_set(handle, FloatAttribute.ObjectRotationAngle, angle);
} }
else
{
targetObject.Location.Rotation.ToAxisAngle(out Vector3 axis, out float angle);
_ = vp_double_set(handle, FloatAttribute.ObjectRotationX, axis.X);
_ = vp_double_set(handle, FloatAttribute.ObjectRotationY, axis.Y);
_ = vp_double_set(handle, FloatAttribute.ObjectRotationZ, axis.Z);
_ = vp_double_set(handle, FloatAttribute.ObjectRotationAngle, angle);
}
if (ModificationTimestamp is { } modificationTimestamp) if (ModificationTimestamp is { } modificationTimestamp)
{ {
@ -164,6 +173,10 @@ public sealed class VirtualParadiseModelObjectBuilder : VirtualParadiseObjectBui
_ = vp_int_set(handle, IntegerAttribute.ObjectTime, (int)modificationTimestamp.ToUnixTimeSeconds()); _ = vp_int_set(handle, IntegerAttribute.ObjectTime, (int)modificationTimestamp.ToUnixTimeSeconds());
} }
else
{
_ = vp_int_set(handle, IntegerAttribute.ObjectTime, (int)targetObject.ModificationTimestamp.ToUnixTimeSeconds());
}
if (Owner is { } owner) if (Owner is { } owner)
{ {
@ -174,5 +187,9 @@ public sealed class VirtualParadiseModelObjectBuilder : VirtualParadiseObjectBui
_ = vp_int_set(handle, IntegerAttribute.ObjectUserId, owner.Id); _ = vp_int_set(handle, IntegerAttribute.ObjectUserId, owner.Id);
} }
else
{
_ = vp_int_set(handle, IntegerAttribute.ObjectUserId, targetObject.Owner.Id);
}
} }
} }

View File

@ -7,13 +7,20 @@ namespace VpSharp.Entities;
/// </summary> /// </summary>
public abstract class VirtualParadiseObjectBuilder public abstract class VirtualParadiseObjectBuilder
{ {
private protected VirtualParadiseObjectBuilder(VirtualParadiseClient client, ObjectBuilderMode mode) private protected VirtualParadiseObjectBuilder(
VirtualParadiseClient client,
VirtualParadiseObject targetObject,
ObjectBuilderMode mode
)
{ {
Client = client; Client = client;
TargetObject = targetObject;
Mode = mode; Mode = mode;
} }
private protected VirtualParadiseClient Client { get; } private protected VirtualParadiseClient Client { get; }
private protected ObjectBuilderMode Mode { get; } private protected ObjectBuilderMode Mode { get; }
private protected VirtualParadiseObject TargetObject { get; }
} }

View File

@ -14,8 +14,12 @@ namespace VpSharp.Entities;
/// </summary> /// </summary>
public sealed class VirtualParadiseParticleEmitterObjectBuilder : VirtualParadiseObjectBuilder public sealed class VirtualParadiseParticleEmitterObjectBuilder : VirtualParadiseObjectBuilder
{ {
internal VirtualParadiseParticleEmitterObjectBuilder(VirtualParadiseClient client, ObjectBuilderMode mode) internal VirtualParadiseParticleEmitterObjectBuilder(
: base(client, mode) VirtualParadiseClient client,
VirtualParadiseParticleEmitterObject targetObject,
ObjectBuilderMode mode
)
: base(client, targetObject, mode)
{ {
} }
@ -201,14 +205,14 @@ public sealed class VirtualParadiseParticleEmitterObjectBuilder : VirtualParadis
/// </summary> /// </summary>
/// <value>The tag, or <see langword="null" /> to leave unchanged.</value> /// <value>The tag, or <see langword="null" /> to leave unchanged.</value>
[SerializationKey("tag")] [SerializationKey("tag")]
public string Tag { get; set; } public string? Tag { get; set; }
/// <summary> /// <summary>
/// Gets or sets the texture. /// Gets or sets the texture.
/// </summary> /// </summary>
/// <value>The texture, or <see langword="null" /> to leave unchanged.</value> /// <value>The texture, or <see langword="null" /> to leave unchanged.</value>
[SerializationKey("texture")] [SerializationKey("texture")]
public string Texture { get; set; } public string? Texture { get; set; }
/// <summary> /// <summary>
/// Sets the maximum volume. /// Sets the maximum volume.
@ -460,7 +464,7 @@ public sealed class VirtualParadiseParticleEmitterObjectBuilder : VirtualParadis
/// </summary> /// </summary>
/// <param name="value">The tag, or <see langword="null" /> to leave unchanged.</param> /// <param name="value">The tag, or <see langword="null" /> to leave unchanged.</param>
/// <returns>The current instance.</returns> /// <returns>The current instance.</returns>
public VirtualParadiseParticleEmitterObjectBuilder WithTag(string value) public VirtualParadiseParticleEmitterObjectBuilder WithTag(string? value)
{ {
Tag = value; Tag = value;
return this; return this;
@ -471,7 +475,7 @@ public sealed class VirtualParadiseParticleEmitterObjectBuilder : VirtualParadis
/// </summary> /// </summary>
/// <param name="value">The texture, or <see langword="null" /> to leave unchanged.</param> /// <param name="value">The texture, or <see langword="null" /> to leave unchanged.</param>
/// <returns>The current instance.</returns> /// <returns>The current instance.</returns>
public VirtualParadiseParticleEmitterObjectBuilder WithTexture(string value) public VirtualParadiseParticleEmitterObjectBuilder WithTexture(string? value)
{ {
Texture = value; Texture = value;
return this; return this;