Aetheria/Assets/Scripts/ServerShared/Behaviors/Sensor.cs
Reinier Vens 4b10923448 Heat Performance Curves + Wear & Tear
Added heat variation option for Performance Stats
Ability to toggle radiators on/off using H key
Item durability loss (Wear) is now heat dependent and incurred only when used
Restricted equip/unequip to docked (inactive) entities
Fixed race condition causing exceptions in database sync code
2021-03-04 03:58:46 +00:00

88 lines
No EOL
3.6 KiB
C#

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
using MessagePack;
using Newtonsoft.Json;
using Unity.Mathematics;
using static Unity.Mathematics.math;
[InspectableField, MessagePackObject, JsonObject(MemberSerialization.OptIn), RuntimeInspectable]
public class SensorData : BehaviorData
{
[InspectableField, JsonProperty("sensitivity"), Key(3), RuntimeInspectable]
public PerformanceStat Sensitivity = new PerformanceStat();
[InspectableAnimationCurve, JsonProperty("sensitivityCurve"), Key(4), RuntimeInspectable]
public float4[] SensitivityCurve;
public override IBehavior CreateInstance(ItemManager context, Entity entity, EquippedItem item)
{
return new Sensor(context, this, entity, item);
}
}
public class Sensor : IBehavior
{
private SensorData _data;
private Entity Entity { get; }
private EquippedItem Item { get; }
private ItemManager Context { get; }
public BehaviorData Data => _data;
public Sensor(ItemManager context, SensorData data, Entity entity, EquippedItem item)
{
_data = data;
Entity = entity;
Item = item;
Context = context;
}
public bool Execute(float delta)
{
// TODO: Handle Active Detection / Visibility From Reflected Radiance
var hardpoint = Entity.Hardpoints[Item.Position.x, Item.Position.y];
var forward = hardpoint != null && Entity.HardpointTransforms.ContainsKey(hardpoint) ?
normalize(Entity.HardpointTransforms[hardpoint].direction.xz) :
Entity.Direction;
foreach (var entity in Entity.Zone.Entities)
{
if(entity != Entity)
{
var diff = entity.Position.xz - Entity.Position.xz;
var angle = acos(dot(forward, normalize(diff)));
var dist = length(diff);
float previous;
Entity.EntityInfoGathered.TryGetValue(entity, out previous);
var next = saturate(
previous +
entity.Visibility *
Context.Evaluate(_data.Sensitivity, Item) *
_data.SensitivityCurve.Evaluate(angle / PI) *
delta / dist);
next *= 1 - Context.GameplaySettings.TargetInfoDecay * delta;
//Context.Log($"{entity.Name} visibility {(int)(previous * 100)}% -> {(int)(next * 100)}%");
Entity.EntityInfoGathered[entity] = next;
}
}
return true;
// var ship = Hardpoint.Ship.Ship.transform;
// var contacts =
// Physics.OverlapSphere(ship.position, _data.Range.Evaluate(Hardpoint)).Where(c=>c.attachedRigidbody?.GetComponent<Targetable>()!=null).Select(c=>c.attachedRigidbody.GetComponent<Targetable>());
// foreach (var contact in contacts)
// {
// var diff = (contact.transform.position - ship.position).Flatland();
// var angle = acos(dot(ship.forward.Flatland().normalized,
// diff.normalized)) / (float)PI;
// var sens = _data.Sensitivity.Evaluate(Hardpoint) *
// Hardpoint.Ship.HullData.VisibilityCurve.Evaluate(saturate(angle));
// var vis = contact.Visibility / diff.sqrMagnitude;
// if(vis > 1/sens)
// Hardpoint.Ship.Contacts[contact] = Time.time;
// }
//
// Hardpoint.Ship.VisibilitySources[this] = _data.Radiance.Evaluate(Hardpoint) / _data.RadianceMasking.Evaluate(Hardpoint);
}
}