using System; using HarmonyLib; using RobocraftX; using RobocraftX.Common; using RobocraftX.GUI; using RobocraftX.GUI.MyGamesScreen; using Svelto.ECS; using Svelto.ECS.Experimental; using Svelto.DataStructures; using TechbloxModdingAPI.Engines; using TechbloxModdingAPI.Utility; namespace TechbloxModdingAPI.App { public class GameMenuEngine : IFactoryEngine { public IEntityFactory Factory { set; private get; } public string Name => "GamecraftModdingAPIGameInfoGameEngine"; 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(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(id); // this will always fail return true; } public uint HighestID() { EntityCollection games = entitiesDB.QueryEntities(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, ulong workshopId = 0uL, bool autoEnterSim = false) { GameMode.CurrentMode = autoEnterSim ? RCXMode.Play : RCXMode.Build; GameMode.SaveGameDetails = new SaveGameDetails(gameName, path, workshopId); // the private FullGameCompositionRoot.SwitchToGame() method gets passed to menu items for this reason AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToGame").Invoke(FullGameFields.Instance, new object[0]); 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); - TODO: Input field struct 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); - TODO return true; } public bool ExistsGameInfo(EGID id) { return entitiesDB.Exists(id); } public ref MyGameDataEntityStruct GetGameInfo(EGID id) { return ref GetComponent(id); } /*public ref MyGamesSlotEntityViewStruct GetGameViewInfo(EGID id) { EntityCollection entities = entitiesDB.QueryEntities(MyGamesScreenExclusiveGroups.GameSlotGuiEntities); var entitiesB = entities.ToBuffer().buffer; for (int i = 0; i < entities.count; i++) { if (entitiesB[i].ID.entityID == id.entityID) { return ref entitiesB[i]; } } MyGamesSlotEntityViewStruct[] defRef = new MyGamesSlotEntityViewStruct[1]; return ref defRef[0]; - TODO: The struct is internal now }*/ public ref T GetComponent(EGID id) where T: unmanaged, IEntityComponent { return ref entitiesDB.QueryEntity(id); } } internal class MyGameDataEntityDescriptor_DamnItFJWhyDidYouMakeThisInternal : GenericEntityDescriptor { } }