Aetheria/Assets/Scripts/ServerShared/Behaviors/WanderController.cs

75 lines
2.2 KiB
C#
Raw Normal View History

2020-06-02 21:41:31 +01:00
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 WanderControllerData : ControllerData
{
[InspectableField, JsonProperty("randomDockTime"), Key(6)]
public float RandomDockTime = 5;
public override IBehavior CreateInstance(ItemManager context, Entity entity, EquippedItem item)
2020-06-02 21:41:31 +01:00
{
return new WanderController(context, this, entity, item);
}
}
public class WanderController : ControllerBase<WanderTask>, IBehavior
2020-06-02 21:41:31 +01:00
{
public WanderTarget WanderTarget;
public BehaviorData Data => _data;
private WanderControllerData _data;
private EquippedItem Item { get; }
2020-06-02 21:41:31 +01:00
private Guid _target;
private float _dockTime = -1;
public WanderController(ItemManager itemManager, WanderControllerData data, Entity entity, EquippedItem item) : base(itemManager, data, entity)
2020-06-02 21:41:31 +01:00
{
_data = data;
Item = item;
2020-06-02 21:41:31 +01:00
}
public new bool Update(float delta)
{
if (!Moving && _dockTime < 0)
{
NextTarget();
}
_dockTime -= delta;
return base.Update(delta);
}
private void NextTarget()
{
if (WanderTarget == WanderTarget.Planets)
{
var planets = Zone.Planets.Values.ToArray();
var randomPlanet = planets[ItemManager.Random.NextInt(planets.Length)];
MoveTo(() => Zone.GetOrbitPosition(randomPlanet.Orbit), () => Zone.GetOrbitVelocity(randomPlanet.Orbit));
2020-06-02 21:41:31 +01:00
}
else if (WanderTarget == WanderTarget.Orbitals)
{
var entities = Zone.Entities.Where(e=>e is OrbitalEntity).ToArray();
var randomEntity = entities[ItemManager.Random.NextInt(entities.Length)];
2020-06-02 21:41:31 +01:00
MoveTo(randomEntity, true, () =>
{
Entity.SetParent(randomEntity);
_dockTime = ItemManager.Random.NextFloat(_data.RandomDockTime);
2020-06-02 21:41:31 +01:00
});
}
}
}
public enum WanderTarget
{
Planets,
Orbitals
}