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

95 lines
3.2 KiB
C#

using Microsoft.Xna.Framework;
using ProjectZ.InGame.GameObjects.Base;
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 ObjObjectSpawner : GameObject
{
private readonly GameObject _spawnObject;
private readonly string _strKey;
private readonly string _strValue;
private readonly string _strSpawnObjectId;
private readonly object[] _objParameter;
private readonly bool _canDespawn;
private bool _isSpawned;
public ObjObjectSpawner() : base("editor object spawner") { }
public ObjObjectSpawner(Map.Map map, int posX, int posY, string strKey, string strValue, string strSpawnObjectId, string strSpawnParameter, bool canDespawn = true) : base(map)
{
_strKey = strKey;
_strValue = string.IsNullOrEmpty(strValue) ? "0" : strValue;
_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("$", ".");
}
_canDespawn = canDespawn;
_objParameter = MapData.GetParameter(strSpawnObjectId, parameter);
if (_objParameter != null)
{
_objParameter[1] = posX;
_objParameter[2] = posY;
}
if (_strSpawnObjectId != null)
_spawnObject = ObjectManager.GetGameObject(map, _strSpawnObjectId, _objParameter);
if (_spawnObject == null)
{
IsDead = true;
return;
}
// spawn object deactivated
Map.Objects.SpawnObject(_spawnObject);
// add key change listener
if (!string.IsNullOrEmpty(_strKey))
{
_spawnObject.IsActive = false;
AddComponent(KeyChangeListenerComponent.Index, new KeyChangeListenerComponent(KeyChanged));
}
}
private void KeyChanged()
{
var value = Game1.GameManager.SaveManager.GetString(_strKey, "0");
if (!_isSpawned && value == _strValue)
{
// activate the object
_spawnObject.IsActive = true;
_isSpawned = true;
// remove the spawner if it does not despawn the object
if (!_canDespawn)
Map.Objects.DeleteObjects.Add(this);
}
else if (_isSpawned && value != _strValue)
{
// despawn the object
if (_canDespawn)
_spawnObject.IsActive = false;
else
Map.Objects.DeleteObjects.Add(_spawnObject);
_isSpawned = false;
}
}
}
}