Aetheria/Assets/Scripts/ServerShared/Behaviors/SurveyController.cs
Reinier Vens 357f9db329 Weapon Scripting Overhaul
Weapons are now monolithic behaviors
Various new weapon behavior types implemented
All weapons have optional magazine and reload mechanic
Visibility now decays globally
2021-01-25 05:53:36 +00:00

155 lines
No EOL
5.8 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 System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using MessagePack;
using Newtonsoft.Json;
using RethinkDb.Driver.Ast;
using Unity.Mathematics;
using static Unity.Mathematics.math;
[MessagePackObject, JsonObject(MemberSerialization.OptIn), EntityTypeRestriction(HullType.Ship), Order(-100)]
public class SurveyControllerData : ControllerData
{
public override IBehavior CreateInstance(ItemManager context, Entity entity, EquippedItem item)
{
return new SurveyController(context, this, entity, item);
}
}
public class SurveyController : ControllerBase<Survey>, IBehavior, IPersistentBehavior, IInitializableBehavior
{
private EquippedItem Item { get; }
private SurveyControllerData _data;
private bool _taskStarted;
private ResourceScanner _scanningTool;
private Switch _toolSwitch;
private Guid _targetPlanet;
private int _asteroid = -1;
public SurveyController(ItemManager itemManager, SurveyControllerData data, Entity entity, EquippedItem item) : base(itemManager, data, entity)
{
_data = data;
Item = item;
}
public new void Initialize()
{
_scanningTool = Entity.GetBehavior<ResourceScanner>();
// _toolSwitch = Entity.GetSwitch<ResourceScanner>();
base.Initialize();
}
public new bool Execute(float delta)
{
// var corporation = _context.ItemData.Get<Corporation>(_entity.Corporation);
// if (surveyTask != null)
// {
// if (!_taskStarted)
// {
// if (surveyTask.Planets.Any())
// {
// _entity.SetMessage("Moving to survey target.");
// NextPlanet();
// _scanningTool.ScanTarget = _targetPlanet;
// _scanningTool.Asteroid = _asteroid;
// if (!corporation.PlanetSurveyFloor.ContainsKey(_targetPlanet) ||
// corporation.PlanetSurveyFloor[_targetPlanet] + .5f < _scanningTool.MinimumDensity)
// {
// var planetData = _context.ItemData.Get<BodyData>(_targetPlanet);
// MoveTo(() =>
// {
// var target = GetPosition(planetData, _asteroid);
// var targetToUs = _entity.Position - target;
// return target + normalize(targetToUs) * _scanningTool.Range / 2;
// },
// () => GetVelocity(planetData, _asteroid),
// () => _entity.SetMessage("Arrived at target. Scanning for resources."));
// _taskStarted = true;
// }
// else
// surveyTask.Planets.Remove(_targetPlanet);
// }
// else
// {
// _entity.SetMessage("Survey complete. Returning Home.");
// FinishTask();
// }
// }
// else
// {
// if (!Moving)
// {
// var planetData = _context.ItemData.Get<BodyData>(_targetPlanet);
// if ((!corporation.PlanetSurveyFloor.ContainsKey(_targetPlanet) ||
// corporation.PlanetSurveyFloor[_targetPlanet] + .5f < _scanningTool.MinimumDensity) &&
// length(_entity.Position - GetPosition(planetData, _asteroid)) < _scanningTool.Range)
// {
// _toolSwitch.Activated = true;
// Aim.Objective = GetPosition(planetData, _asteroid);
// Aim.Update(delta);
// }
// else
// {
// _toolSwitch.Activated = false;
// _taskStarted = false;
// }
// }
// }
// }
return base.Execute(delta);
}
private void NextPlanet()
{
var planets = Task.Planets.Select(id => Zone.Planets[id]);
var nearestPlanet = planets.MinBy(p => lengthsq(Entity.Position.xz - GetPosition(p)));
_asteroid = nearestPlanet is AsteroidBeltData ? Zone.NearestAsteroid(nearestPlanet.ID, Entity.Position.xz) : -1;
_targetPlanet = nearestPlanet.ID;
}
private float2 GetPosition(BodyData planet, int asteroid = -1)
{
if (planet is AsteroidBeltData)
{
if(asteroid == -1) asteroid = Zone.NearestAsteroid(planet.ID, Entity.Position.xz);
return Zone.AsteroidBelts[planet.ID].Positions[asteroid].xz;
}
return Zone.GetOrbitPosition(planet.Orbit);
}
private float2 GetVelocity(BodyData planet, int asteroid = -1)
{
if (planet is AsteroidBeltData)
{
if(asteroid == -1) asteroid = Zone.NearestAsteroid(planet.ID, Entity.Position.xz);
return Zone.AsteroidBelts[planet.ID].Velocities[asteroid];
}
return Zone.GetOrbitVelocity(planet.Orbit);
}
public PersistentBehaviorData Store()
{
return new SurveyControllerPersistence
{
Task = Task
};
}
public void Restore(PersistentBehaviorData data)
{
var surveyControllerPersistence = data as SurveyControllerPersistence;
Task = surveyControllerPersistence.Task;
}
}
public class SurveyControllerPersistence : PersistentBehaviorData
{
[JsonProperty("task"), Key(0)]
public Survey Task;
}