LADXHD/InGame/GameObjects/Things/ObjObjectRespawner.cs
2023-12-14 17:21:22 -05:00

111 lines
3.7 KiB
C#

using Microsoft.Xna.Framework;
using ProjectZ.Base;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.Map;
using ProjectZ.InGame.SaveLoad;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.Things
{
internal class ObjObjectRespawner : GameObject
{
private GameObject _spawnedObject;
private Box _spawnBox;
private readonly string _strDisableKey;
private readonly string _strSpawnObjectId;
private readonly object[] _objParameter;
private const int SpawnTime = 250;
private float _spawnCounter;
private bool _isActive = true;
public ObjObjectRespawner() : base("editor object respawner") { }
public ObjObjectRespawner(Map.Map map, int posX, int posY, string strDisableKey, string strSpawnObjectId, string strSpawnParameter) : base(map)
{
EntityPosition = new CPosition(posX, posY, 0);
EntitySize = new Rectangle(0, 0, 16, 16);
_spawnBox = new Box(posX, posY, 0, 16, 16, 8);
_strDisableKey = strDisableKey;
_strSpawnObjectId = strSpawnObjectId;
string[] parameter = null;
if (strSpawnParameter != null)
{
parameter = strSpawnParameter.Split('.');
// @HACK: some objects have stings with dots in them...
for (var i = 0; i < parameter.Length; i++)
parameter[i] = parameter[i].Replace("$", ".");
}
_objParameter = MapData.GetParameter(strSpawnObjectId, parameter);
if (_objParameter != null)
{
_objParameter[1] = posX;
_objParameter[2] = posY;
}
if (_strSpawnObjectId == null)
{
IsDead = true;
return;
}
// add key change listener
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
if (!string.IsNullOrEmpty(_strDisableKey))
AddComponent(KeyChangeListenerComponent.Index, new KeyChangeListenerComponent(OnKeyChange));
OnKeyChange();
SpawnObject();
}
private void OnKeyChange()
{
if (string.IsNullOrEmpty(_strDisableKey))
return;
var state = Game1.GameManager.SaveManager.GetString(_strDisableKey, "0");
_isActive = state != "1";
}
private void Update()
{
if (!_isActive || (_spawnedObject != null && _spawnedObject.Map != null))
{
_spawnCounter = SpawnTime;
return;
}
_spawnCounter -= Game1.DeltaTime;
if (_spawnCounter > 0)
return;
// return if there is something there
var outBox = Box.Empty;
if (Map.Objects.Collision(_spawnBox, Box.Empty, Values.CollisionTypes.Normal | Values.CollisionTypes.Player, 0, 0, ref outBox))
{
_spawnCounter = SpawnTime * 0.25f;
return;
}
SpawnObject();
Game1.GameManager.PlaySoundEffect("D360-15-0F");
// spawn explosion effect
Map.Objects.SpawnObject(new ObjAnimator(Map, (int)EntityPosition.X, (int)EntityPosition.Y, Values.LayerTop, "Particles/spawn", "run", true));
}
private void SpawnObject()
{
_spawnedObject = ObjectManager.GetGameObject(Map, _strSpawnObjectId, _objParameter);
Map.Objects.SpawnObject(_spawnedObject);
}
}
}