2020-02-29 18:20:03 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Reflection;
|
|
|
|
|
|
|
|
|
|
using RobocraftX.Blocks;
|
|
|
|
|
using Gamecraft.Wires;
|
|
|
|
|
|
|
|
|
|
using GamecraftModdingAPI.Utility;
|
|
|
|
|
using Svelto.ECS;
|
|
|
|
|
|
|
|
|
|
namespace GamecraftModdingAPI.Blocks
|
|
|
|
|
{
|
|
|
|
|
public class TweakableEngine : IApiEngine
|
|
|
|
|
{
|
|
|
|
|
public string Name { get; } = "GamecraftModdingAPITweakableGameEngine";
|
|
|
|
|
|
2020-03-12 22:36:23 +00:00
|
|
|
|
public EntitiesDB entitiesDB { set; private get; }
|
2020-02-29 18:20:03 +00:00
|
|
|
|
|
|
|
|
|
public bool IsInGame = false;
|
|
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
{
|
|
|
|
|
IsInGame = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Ready()
|
|
|
|
|
{
|
|
|
|
|
IsInGame = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Implementations for Tweakable static class
|
|
|
|
|
|
|
|
|
|
public T GetStatAny<T>(EGID blockID, TweakableStat stat)
|
|
|
|
|
{
|
|
|
|
|
switch (stat)
|
|
|
|
|
{
|
|
|
|
|
case TweakableStat.TopSpeed:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return (T)(object)entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID).maxVelocity;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Torque:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return (T)(object)entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID).maxForce;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxExtension:
|
|
|
|
|
if (entitiesDB.Exists<PistonReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return (T)(object)entitiesDB.QueryEntity<PistonReadOnlyStruct>(blockID).maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MinAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return (T)(object)entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID).minDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return (T)(object)entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID).maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Reverse:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return (T)(object)entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID).reverse;
|
|
|
|
|
}
|
|
|
|
|
else if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return (T)(object)entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID).reverse;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.StartValue:
|
|
|
|
|
if (entitiesDB.Exists<SignalGeneratorEntityStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return (T)(object)entitiesDB.QueryEntity<SignalGeneratorEntityStruct>(blockID).startValue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return default(T);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public T GetStatAny<T>(uint blockID, TweakableStat stat)
|
|
|
|
|
{
|
|
|
|
|
return GetStatAny<T>(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public dynamic GetStatDynamic(EGID blockID, TweakableStat stat)
|
|
|
|
|
{
|
|
|
|
|
switch (stat)
|
|
|
|
|
{
|
|
|
|
|
case TweakableStat.TopSpeed:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID).maxVelocity;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Torque:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID).maxForce;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxExtension:
|
|
|
|
|
if (entitiesDB.Exists<PistonReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return entitiesDB.QueryEntity<PistonReadOnlyStruct>(blockID).maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MinAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID).minDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID).maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Reverse:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID).reverse;
|
|
|
|
|
}
|
|
|
|
|
else if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID).reverse;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.StartValue:
|
|
|
|
|
if (entitiesDB.Exists<SignalGeneratorEntityStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
return entitiesDB.QueryEntity<SignalGeneratorEntityStruct>(blockID).startValue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public dynamic GetStatDynamic(uint blockID, TweakableStat stat)
|
|
|
|
|
{
|
|
|
|
|
return GetStatDynamic(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public T SetStatAny<T>(EGID blockID, TweakableStat stat, T value)
|
|
|
|
|
{
|
|
|
|
|
switch (stat)
|
|
|
|
|
{
|
|
|
|
|
case TweakableStat.TopSpeed:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxVelocity = (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.maxVelocity;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Torque:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxForce = (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.maxForce;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxExtension:
|
|
|
|
|
if (entitiesDB.Exists<PistonReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref PistonReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<PistonReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxDeviation = (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MinAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.minDeviation = (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.minDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxDeviation = (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Reverse:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.reverse = (bool)(object)value;
|
|
|
|
|
return (T)(object)refStruct.reverse;
|
|
|
|
|
}
|
|
|
|
|
else if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.reverse = (bool)(object)value;
|
|
|
|
|
return (T)(object)refStruct.reverse;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.StartValue:
|
|
|
|
|
if (entitiesDB.Exists<SignalGeneratorEntityStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref SignalGeneratorEntityStruct refStruct = ref entitiesDB.QueryEntity<SignalGeneratorEntityStruct>(blockID);
|
|
|
|
|
refStruct.startValue = (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.startValue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return default(T);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public T SetStatAny<T>(uint blockID, TweakableStat stat, T value)
|
|
|
|
|
{
|
|
|
|
|
return SetStatAny<T>(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public dynamic SetStatDynamic(EGID blockID, TweakableStat stat, dynamic value)
|
|
|
|
|
{
|
|
|
|
|
switch (stat)
|
|
|
|
|
{
|
|
|
|
|
case TweakableStat.TopSpeed:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxVelocity = value;
|
|
|
|
|
return refStruct.maxVelocity;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Torque:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxForce = value;
|
|
|
|
|
return refStruct.maxForce;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxExtension:
|
|
|
|
|
if (entitiesDB.Exists<PistonReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref PistonReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<PistonReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxDeviation = value;
|
|
|
|
|
return refStruct.maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MinAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.minDeviation = value;
|
|
|
|
|
return refStruct.minDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxDeviation = value;
|
|
|
|
|
return refStruct.maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Reverse:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.reverse = value;
|
|
|
|
|
return refStruct.reverse;
|
|
|
|
|
}
|
|
|
|
|
else if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.reverse = value;
|
|
|
|
|
return refStruct.reverse;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.StartValue:
|
|
|
|
|
if (entitiesDB.Exists<SignalGeneratorEntityStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref SignalGeneratorEntityStruct refStruct = ref entitiesDB.QueryEntity<SignalGeneratorEntityStruct>(blockID);
|
|
|
|
|
refStruct.startValue = value;
|
|
|
|
|
return refStruct.startValue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public dynamic SetStatDynamic(uint blockID, TweakableStat stat, dynamic value)
|
|
|
|
|
{
|
|
|
|
|
return SetStatDynamic(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public T AddStatAny<T>(EGID blockID, TweakableStat stat, T value)
|
|
|
|
|
{
|
|
|
|
|
switch (stat)
|
|
|
|
|
{
|
|
|
|
|
case TweakableStat.TopSpeed:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxVelocity += (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.maxVelocity;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Torque:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxForce += (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.maxForce;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxExtension:
|
|
|
|
|
if (entitiesDB.Exists<PistonReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref PistonReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<PistonReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxDeviation += (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MinAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.minDeviation += (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.minDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxDeviation += (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Reverse:
|
|
|
|
|
// '+' is associated with logical OR in some fields, so it technically isn't invalid to "add" booleans
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.reverse = refStruct.reverse || (bool)(object)value;
|
|
|
|
|
return (T)(object)refStruct.reverse;
|
|
|
|
|
}
|
|
|
|
|
else if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.reverse = refStruct.reverse || (bool)(object)value;
|
|
|
|
|
return (T)(object)refStruct.reverse;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.StartValue:
|
|
|
|
|
if (entitiesDB.Exists<SignalGeneratorEntityStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref SignalGeneratorEntityStruct refStruct = ref entitiesDB.QueryEntity<SignalGeneratorEntityStruct>(blockID);
|
|
|
|
|
refStruct.startValue += (float)(object)value;
|
|
|
|
|
return (T)(object)refStruct.startValue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return default(T);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public T AddStatAny<T>(uint blockID, TweakableStat stat, T value)
|
|
|
|
|
{
|
|
|
|
|
return AddStatAny<T>(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public dynamic AddStatDynamic(EGID blockID, TweakableStat stat, dynamic value)
|
|
|
|
|
{
|
|
|
|
|
switch (stat)
|
|
|
|
|
{
|
|
|
|
|
case TweakableStat.TopSpeed:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxVelocity += value;
|
|
|
|
|
return refStruct.maxVelocity;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Torque:
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxForce += value;
|
|
|
|
|
return refStruct.maxForce;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxExtension:
|
|
|
|
|
if (entitiesDB.Exists<PistonReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref PistonReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<PistonReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxDeviation += value;
|
|
|
|
|
return refStruct.maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MinAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.minDeviation += value;
|
|
|
|
|
return refStruct.minDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.MaxAngle:
|
|
|
|
|
if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.maxDeviation += value;
|
|
|
|
|
return refStruct.maxDeviation;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.Reverse:
|
|
|
|
|
// '+' is associated with logical OR in some fields, so it technically isn't invalid to "add" booleans
|
|
|
|
|
if (entitiesDB.Exists<MotorReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<MotorReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.reverse = refStruct.reverse || value;
|
|
|
|
|
return refStruct.reverse;
|
|
|
|
|
}
|
|
|
|
|
else if (entitiesDB.Exists<ServoReadOnlyStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity<ServoReadOnlyStruct>(blockID);
|
|
|
|
|
refStruct.reverse = refStruct.reverse || value;
|
|
|
|
|
return refStruct.reverse;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TweakableStat.StartValue:
|
|
|
|
|
if (entitiesDB.Exists<SignalGeneratorEntityStruct>(blockID))
|
|
|
|
|
{
|
|
|
|
|
ref SignalGeneratorEntityStruct refStruct = ref entitiesDB.QueryEntity<SignalGeneratorEntityStruct>(blockID);
|
|
|
|
|
refStruct.startValue += value;
|
|
|
|
|
return refStruct.startValue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public dynamic AddStatDynamic(uint blockID, TweakableStat stat, dynamic value)
|
|
|
|
|
{
|
|
|
|
|
return AddStatDynamic(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat, value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|