1
Fork 0
mirror of https://github.com/thegeneralist01/Scene-Manager-DevRepo synced 2026-01-10 15:20:29 +01:00
Scene-Manager-DevRepo/SceneManager/Barriers/Barrier.cs
2021-07-07 07:19:16 -06:00

209 lines
7.2 KiB
C#

using Rage;
using SceneManager.Managers;
using SceneManager.Paths;
using SceneManager.Utils;
namespace SceneManager.Barriers
{
public class Barrier : IDeletable, IHandleable, ISpatial
{
private Object _object { get; }
public string ModelName { get; set; }
public Vector3 Position { get; set; }
public float Heading { get; set; }
public bool Invincible { get; set; }
public bool Immobile { get; set; }
public bool LightsEnabled { get; set; }
public int TextureVariation { get; set; }
internal Path Path { get; set; }
public PoolHandle Handle => ((IHandleable)_object).Handle;
private Barrier() { }
internal Barrier(Barrier obj, bool invincible, bool immobile, int textureVariation = 0, bool lightsEnabled = false)
{
ModelName = obj.ModelName;
Position = obj.Position;
Heading = obj.Heading;
Invincible = invincible;
Immobile = immobile;
TextureVariation = textureVariation;
LightsEnabled = lightsEnabled;
if (obj.IsValid())
{
obj.Delete();
}
if (ModelName == "0xa2c44e80") // Flare
{
var flare = new Weapon("weapon_flare", Position, 1);
Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(flare, true);
_object = flare;
GameFiber.StartNew(() =>
{
Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(_object, true);
GameFiber.Sleep(1000);
Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(_object, false);
}, "Spawn Flare Fiber");
}
else // Any other barrier object
{
_object = new Object(ModelName, Position, Heading);
_object.SetPositionWithSnap(Position);
Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY<bool>(_object);
Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(_object, true);
if (Invincible)
{
Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(_object, true);
if (ModelName != "prop_barrier_wat_03a")
{
Rage.Native.NativeFunction.Natives.SET_DISABLE_BREAKING(_object, true);
}
}
_object.IsPositionFrozen = Immobile;
if (Settings.EnableAdvancedBarricadeOptions)
{
SetAdvancedOptions();
}
}
}
internal Barrier(Object obj, bool invincible, bool immobile, int textureVariation = 0, bool lightsEnabled = false)
{
ModelName = obj.Model.Name;
Position = obj.Position;
Heading = obj.Heading;
Invincible = invincible;
Immobile = immobile;
TextureVariation = textureVariation;
LightsEnabled = lightsEnabled;
if(BarrierManager.PlaceholderBarrier)
{
BarrierManager.PlaceholderBarrier.Delete();
}
if (ModelName == "0xa2c44e80") // Flare
{
_object = obj;
GameFiber.StartNew(() =>
{
Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(_object, true);
GameFiber.Sleep(1000);
Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(_object, false);
}, "Spawn Flare Fiber");
}
else // Any other barrier object
{
_object = new Object(ModelName, Position, Heading);
_object.SetPositionWithSnap(Position);
Rage.Native.NativeFunction.Natives.PLACE_OBJECT_ON_GROUND_PROPERLY<bool>(_object);
Rage.Native.NativeFunction.Natives.SET_ENTITY_DYNAMIC(_object, true);
if (Invincible)
{
Rage.Native.NativeFunction.Natives.SET_DISABLE_FRAG_DAMAGE(_object, true);
if (ModelName != "prop_barrier_wat_03a")
{
Rage.Native.NativeFunction.Natives.SET_DISABLE_BREAKING(_object, true);
}
}
_object.IsPositionFrozen = Immobile;
if (Settings.EnableAdvancedBarricadeOptions)
{
SetAdvancedOptions();
}
}
}
private void SetAdvancedOptions()
{
Rage.Native.NativeFunction.Natives.x971DA0055324D033(_object, TextureVariation);
if (LightsEnabled)
{
Rage.Native.NativeFunction.Natives.SET_ENTITY_LIGHTS(_object, false);
}
else
{
Rage.Native.NativeFunction.Natives.SET_ENTITY_LIGHTS(_object, true);
}
//Rage.Native.NativeFunction.Natives.SET_ENTITY_TRAFFICLIGHT_OVERRIDE(barrier, setBarrierTrafficLight.Index);
_object.IsPositionFrozen = true;
GameFiber.Sleep(50);
if (_object && !Immobile)
{
_object.IsPositionFrozen = false;
}
}
internal void LoadFromImport(Path path)
{
Path = path;
Game.LogTrivial($"===== BARRIER DATA =====");
Game.LogTrivial($"Model: {ModelName}");
Game.LogTrivial($"Position: {Position}");
Game.LogTrivial($"Heading: {Heading}");
Game.LogTrivial($"Invincible: {Invincible}");
Game.LogTrivial($"Immobile: {Immobile}");
Game.LogTrivial($"LightsEnabled: {LightsEnabled}");
Game.LogTrivial($"Texture Variation: {TextureVariation}");
var barrier = new Barrier(this, Invincible, Immobile, TextureVariation, LightsEnabled);
Path.Barriers.Add(barrier);
BarrierManager.Barriers.Add(barrier);
}
public void Delete()
{
if (_object)
{
((IDeletable)_object).Delete();
}
}
public bool IsValid()
{
return _object != null;
}
public bool Equals(IHandleable other)
{
return ((System.IEquatable<IHandleable>)_object).Equals(other);
}
public float DistanceTo(Vector3 position)
{
return ((ISpatial)_object).DistanceTo(position);
}
public float DistanceTo(ISpatial spatialObject)
{
return ((ISpatial)_object).DistanceTo(spatialObject);
}
public float DistanceTo2D(Vector3 position)
{
return ((ISpatial)_object).DistanceTo2D(position);
}
public float DistanceTo2D(ISpatial spatialObject)
{
return ((ISpatial)_object).DistanceTo2D(spatialObject);
}
public float TravelDistanceTo(Vector3 position)
{
return ((ISpatial)_object).TravelDistanceTo(position);
}
public float TravelDistanceTo(ISpatial spatialObject)
{
return ((ISpatial)_object).TravelDistanceTo(spatialObject);
}
}
}