Fixed block name print regex Made Game.WorkshopId obsolete as it's removed from the game Fixed removing blocks
134 lines
4.2 KiB
C#
134 lines
4.2 KiB
C#
using System;
|
|
using HarmonyLib;
|
|
|
|
using RobocraftX;
|
|
using RobocraftX.Common;
|
|
using RobocraftX.GUI;
|
|
using RobocraftX.GUI.MyGamesScreen;
|
|
using Svelto.ECS;
|
|
using Svelto.ECS.Experimental;
|
|
using Techblox.Services.Machines;
|
|
using TechbloxModdingAPI.Engines;
|
|
using TechbloxModdingAPI.Utility;
|
|
|
|
namespace TechbloxModdingAPI.App
|
|
{
|
|
public class GameMenuEngine : IFactoryEngine
|
|
{
|
|
public IEntityFactory Factory { set; private get; }
|
|
|
|
public string Name => "TechbloxModdingAPIGameInfoGameEngine";
|
|
|
|
public bool isRemovable => false;
|
|
|
|
public EntitiesDB entitiesDB { set; private get; }
|
|
|
|
public void Dispose()
|
|
{
|
|
IsInMenu = false;
|
|
}
|
|
|
|
public void Ready()
|
|
{
|
|
IsInMenu = true;
|
|
}
|
|
|
|
// game functionality
|
|
|
|
public bool IsInMenu
|
|
{
|
|
get;
|
|
private set;
|
|
} = false;
|
|
|
|
public bool CreateMyGame(EGID id, string path = "", uint thumbnailId = 0, string gameName = "", string creatorName = "", string description = "", long createdDate = 0L)
|
|
{
|
|
EntityInitializer eci = Factory.BuildEntity<MyGameDataEntityDescriptor_DamnItFJWhyDidYouMakeThisInternal>(id);
|
|
eci.Init(new MyGameDataEntityStruct
|
|
{
|
|
SavedGamePath = new ECSString(path),
|
|
ThumbnailId = thumbnailId,
|
|
GameName = new ECSString(gameName),
|
|
CreatorName = new ECSString(creatorName),
|
|
GameDescription = new ECSString(description),
|
|
CreatedDate = createdDate,
|
|
});
|
|
// entitiesDB.PublishEntityChange<MyGameDataEntityStruct>(id); // this will always fail
|
|
return true;
|
|
}
|
|
|
|
public uint HighestID()
|
|
{
|
|
EntityCollection<MyGameDataEntityStruct> games = entitiesDB.QueryEntities<MyGameDataEntityStruct>(MyGamesScreenExclusiveGroups.MyGames);
|
|
var gamesB = games.ToBuffer().buffer;
|
|
uint max = 0;
|
|
for (int i = 0; i < games.count; i++)
|
|
{
|
|
if (gamesB[i].ID.entityID > max)
|
|
{
|
|
max = gamesB[i].ID.entityID;
|
|
}
|
|
}
|
|
return max;
|
|
}
|
|
|
|
public bool EnterGame(EGID id)
|
|
{
|
|
if (!ExistsGameInfo(id)) return false;
|
|
ref MyGameDataEntityStruct mgdes = ref GetGameInfo(id);
|
|
return EnterGame(mgdes.GameName, mgdes.SavedGamePath);
|
|
}
|
|
|
|
public bool EnterGame(string gameName, string path, bool autoEnterSim = false)
|
|
{
|
|
GameMode.CurrentMode = autoEnterSim ? RCXMode.Play : RCXMode.Build;
|
|
GameMode.SaveGameDetails = new SaveGameDetails(MachineStorageId.CreateNew().ToString(),
|
|
SaveGameMode.NewSave, gameName, path);
|
|
// the private FullGameCompositionRoot.SwitchToGame() method gets passed to menu items for this reason
|
|
AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToGame").Invoke(FullGameFields.Instance, Array.Empty<object>());
|
|
return true;
|
|
}
|
|
|
|
public bool SetGameName(EGID id, string name)
|
|
{
|
|
if (!ExistsGameInfo(id)) return false;
|
|
GetGameInfo(id).GameName.Set(name);
|
|
GetGameViewInfo(id).MyGamesSlotComponent.GameName = StringUtil.SanitiseString(name);
|
|
return true;
|
|
}
|
|
|
|
public bool SetGameDescription(EGID id, string name)
|
|
{
|
|
if (!ExistsGameInfo(id)) return false;
|
|
GetGameInfo(id).GameDescription.Set(name);
|
|
GetGameViewInfo(id).MyGamesSlotComponent.GameDescription = StringUtil.SanitiseString(name);
|
|
return true;
|
|
}
|
|
|
|
public bool ExistsGameInfo(EGID id)
|
|
{
|
|
return entitiesDB.Exists<MyGameDataEntityStruct>(id);
|
|
}
|
|
|
|
public ref MyGameDataEntityStruct GetGameInfo(EGID id)
|
|
{
|
|
return ref GetComponent<MyGameDataEntityStruct>(id);
|
|
}
|
|
|
|
public dynamic GetGameViewInfo(EGID id)
|
|
{
|
|
dynamic structOptional = AccessTools.Method("TechbloxModdingAPI.Utility.NativeApiExtensions:QueryEntityOptional", new []{typeof(EntitiesDB), typeof(EGID)})
|
|
.MakeGenericMethod(AccessTools.TypeByName("RobocraftX.GUI.MyGamesScreen.MyGamesSlotEntityViewStruct"))
|
|
.Invoke(null, new object[] {entitiesDB, new EGID(id.entityID, MyGamesScreenExclusiveGroups.GameSlotGuiEntities)});
|
|
if (structOptional == null) throw new Exception("Could not get game slot entity");
|
|
return structOptional ? structOptional : null;
|
|
}
|
|
|
|
public ref T GetComponent<T>(EGID id) where T: unmanaged, IEntityComponent
|
|
{
|
|
return ref entitiesDB.QueryEntity<T>(id);
|
|
}
|
|
}
|
|
|
|
internal class MyGameDataEntityDescriptor_DamnItFJWhyDidYouMakeThisInternal : GenericEntityDescriptor<MyGameDataEntityStruct> { }
|
|
}
|