132 lines
3.6 KiB
C#
132 lines
3.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using HarmonyLib;
|
|
|
|
using RobocraftX;
|
|
using RobocraftX.Common;
|
|
using RobocraftX.Schedulers;
|
|
using RobocraftX.SimulationModeState;
|
|
using Svelto.ECS;
|
|
using Svelto.Tasks;
|
|
using Svelto.Tasks.Lean;
|
|
|
|
using GamecraftModdingAPI.Blocks;
|
|
using GamecraftModdingAPI.Engines;
|
|
using GamecraftModdingAPI.Utility;
|
|
using RobocraftX.Blocks;
|
|
|
|
namespace GamecraftModdingAPI.App
|
|
{
|
|
public class GameGameEngine : IApiEngine
|
|
{
|
|
public event EventHandler<GameEventArgs> EnterGame;
|
|
|
|
public event EventHandler<GameEventArgs> ExitGame;
|
|
|
|
public string Name => "GamecraftModdingAPIGameInfoMenuEngine";
|
|
|
|
public bool isRemovable => false;
|
|
|
|
public EntitiesDB entitiesDB { set; private get; }
|
|
|
|
public void Dispose()
|
|
{
|
|
ExceptionUtil.InvokeEvent(ExitGame, this, new GameEventArgs { GameName = GameMode.SaveGameDetails.Name, GamePath = GameMode.SaveGameDetails.Folder });
|
|
IsInGame = false;
|
|
}
|
|
|
|
public void Ready()
|
|
{
|
|
ExceptionUtil.InvokeEvent(EnterGame, this, new GameEventArgs { GameName = GameMode.SaveGameDetails.Name, GamePath = GameMode.SaveGameDetails.Folder });
|
|
IsInGame = true;
|
|
}
|
|
|
|
// game functionality
|
|
|
|
public bool IsInGame
|
|
{
|
|
get;
|
|
private set;
|
|
} = false;
|
|
|
|
public void ExitCurrentGame(bool async = false)
|
|
{
|
|
if (async)
|
|
{
|
|
ExitCurrentGameAsync().RunOn(Lean.EveryFrameStepRunner_TimeRunningAndStopped);
|
|
}
|
|
else
|
|
{
|
|
entitiesDB.QueryEntity<GameSceneEntityStruct>(CommonExclusiveGroups.GameSceneEGID).WantsToQuit = true;
|
|
entitiesDB.PublishEntityChange<GameSceneEntityStruct>(CommonExclusiveGroups.GameSceneEGID);
|
|
}
|
|
|
|
}
|
|
|
|
public IEnumerator<TaskContract> ExitCurrentGameAsync()
|
|
{
|
|
/*
|
|
while (Lean.EveryFrameStepRunner_RUNS_IN_TIME_STOPPED_AND_RUNNING.isStopping) { yield return Yield.It; }
|
|
AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToMenu").Invoke(FullGameFields.Instance, new object[0]);*/
|
|
yield return Yield.It;
|
|
entitiesDB.QueryEntity<GameSceneEntityStruct>(CommonExclusiveGroups.GameSceneEGID).WantsToQuit = true;
|
|
entitiesDB.PublishEntityChange<GameSceneEntityStruct>(CommonExclusiveGroups.GameSceneEGID);
|
|
}
|
|
|
|
public void SaveCurrentGame()
|
|
{
|
|
ref GameSceneEntityStruct gses = ref entitiesDB.QueryEntity<GameSceneEntityStruct>(CommonExclusiveGroups.GameSceneEGID);
|
|
gses.LoadAfterSaving = false;
|
|
gses.SaveNow = true;
|
|
entitiesDB.PublishEntityChange<GameSceneEntityStruct>(CommonExclusiveGroups.GameSceneEGID);
|
|
}
|
|
|
|
public bool IsTimeRunningMode()
|
|
{
|
|
return TimeRunningModeUtil.IsTimeRunningMode(entitiesDB);
|
|
}
|
|
|
|
public bool IsTimeStoppedMode()
|
|
{
|
|
return TimeRunningModeUtil.IsTimeStoppedMode(entitiesDB);
|
|
}
|
|
|
|
public void ToggleTimeMode()
|
|
{
|
|
TimeRunningModeUtil.ToggleTimeRunningState(entitiesDB);
|
|
}
|
|
|
|
public EGID[] GetAllBlocksInGame(BlockIDs filter = BlockIDs.Invalid)
|
|
{
|
|
var allBlocks = entitiesDB.QueryEntities<BlockTagEntityStruct>();
|
|
List<EGID> blockEGIDs = new List<EGID>();
|
|
if (filter == BlockIDs.Invalid)
|
|
{
|
|
foreach (var (blocks, _) in allBlocks)
|
|
{
|
|
var buffer = blocks.ToBuffer().buffer;
|
|
for (int i = 0; i < buffer.capacity; i++)
|
|
blockEGIDs.Add(buffer[i].ID);
|
|
}
|
|
|
|
return blockEGIDs.ToArray();
|
|
}
|
|
else
|
|
{
|
|
foreach (var (blocks, _) in allBlocks)
|
|
{
|
|
var array = blocks.ToBuffer().buffer;
|
|
for (var index = 0; index < array.capacity; index++)
|
|
{
|
|
var block = array[index];
|
|
uint dbid = entitiesDB.QueryEntity<DBEntityStruct>(block.ID).DBID;
|
|
if (dbid == (ulong) filter)
|
|
blockEGIDs.Add(block.ID);
|
|
}
|
|
}
|
|
|
|
return blockEGIDs.ToArray();
|
|
}
|
|
}
|
|
}
|
|
}
|