using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using MyBox; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.Assertions.Must; using UnityEngine.SceneManagement; namespace SpacemarketSimulator { [BepInPlugin(PluginInfo.PLUGIN_GUID, PluginInfo.PLUGIN_NAME, PluginInfo.PLUGIN_VERSION)] public class Plugin : BaseUnityPlugin { public static Vector3 NPCArrivalPoint = new Vector3(6, -0.06f, 3); public static ConfigEntry SpaceShader; public static ConfigEntry MoveSkyboxWithPlayer; public static ManualLogSource SLogger; private void Awake() { SLogger = Logger; Logger.LogInfo($"Plugin {PluginInfo.PLUGIN_GUID} is loaded! Applying patch..."); Harmony harmony = new Harmony(PluginInfo.PLUGIN_GUID); harmony.PatchAll(); foreach (var shader in Resources.FindObjectsOfTypeAll()) { Logger.LogInfo("Available shader: " + shader.name); } SpaceShader = Config.Bind("", "Space Shader", "Universal Render Pipeline/Particles/Unlit"); MoveSkyboxWithPlayer = Config.Bind("", "Move Skybox with Player", true); SceneManager.sceneLoaded += SceneManager_sceneLoaded; } private Dictionary TextureCache { get; set; } = new(); public static GameObject Player { get; set; } private Texture2D LoadTexture(string name) { if (TextureCache.ContainsKey(name)) return TextureCache[name]; byte[] data = (byte[])Properties.Resources.ResourceManager.GetObject(name); Texture2D tex = new Texture2D(1024, 1024); tex.LoadImage(data); TextureCache[name] = tex; return tex; } private void ApplySkybox(Transform container) { float skyboxDistance = 500; float skyboxScale = 100; PrimitiveType type = PrimitiveType.Plane; var xmPlane = GameObject.CreatePrimitive(type); xmPlane.name = "xmPlane"; var xpPlane = GameObject.CreatePrimitive(type); xpPlane.name = "xpPlane"; var ymPlane = GameObject.CreatePrimitive(type); ymPlane.name = "ymPlane"; var ypPlane = GameObject.CreatePrimitive(type); ypPlane.name = "ypPlane"; var zmPlane = GameObject.CreatePrimitive(type); zmPlane.name = "zmPlane"; var zpPlane = GameObject.CreatePrimitive(type); zpPlane.name = "zpPlane"; var list = new List<(GameObject plane, string texture)> { (xpPlane, "front_galaxyfire1"), (xmPlane, "back_galaxyfire1"), (ypPlane, "down_galaxyfire1"), (ymPlane, "up_galaxyfire1"), (zpPlane, "left_galaxyfire1"), (zmPlane, "right_galaxyfire1") }; list.ForEach(x => { x.plane.transform.SetParent(container); var rend = x.plane.GetComponent(); rend.material.shader = Shader.Find(Plugin.SpaceShader.Value); rend.allowOcclusionWhenDynamic = false; rend.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; rend.receiveShadows = false; SpaceShader.SettingChanged += (a, b) => { try { rend.material.shader = Shader.Find(SpaceShader.Value); } catch (Exception e) { Logger.LogError(e); } }; rend.material.mainTexture = LoadTexture(x.texture); }); var ymtd = TransformDefiner.AddToGameObject(ymPlane); ymtd.localScale = new Vector3(skyboxScale, 1, skyboxScale); ymtd.eulerAngles = new Vector3(0, 90, 0); ymtd.position = new Vector3(0, -skyboxDistance + 0.001f, 0); var yptd = TransformDefiner.AddToGameObject(ypPlane); yptd.position = new Vector3(0, skyboxDistance - 0.001f, 0); yptd.eulerAngles = new Vector3(180, -90, 0); yptd.localScale = new Vector3(-skyboxScale, 1, -skyboxScale); var xmtd = TransformDefiner.AddToGameObject(xmPlane); xmtd.position = new Vector3(-skyboxDistance + 0.001f, 0, 0); xmtd.eulerAngles = new Vector3(90, 0, 90); xmtd.localScale = new Vector3(skyboxScale, -1, -skyboxScale); var xptd = TransformDefiner.AddToGameObject(xpPlane); xptd.localScale = new Vector3(skyboxScale, 1, skyboxScale); xptd.position = new Vector3(skyboxDistance - 0.001f, 0, 0); xptd.eulerAngles = new Vector3(-90, 0, 90); var zmtd = TransformDefiner.AddToGameObject(zmPlane); zmtd.position = new Vector3(0, 0, -skyboxDistance + 0.001f); zmtd.eulerAngles = new Vector3(90, 180, 180); zmtd.localScale = new Vector3(-skyboxScale, 1, -skyboxScale); var zptd = TransformDefiner.AddToGameObject(zpPlane); zptd.localScale = new Vector3(skyboxScale, 1, skyboxScale); zptd.position = new Vector3(0, 0, skyboxDistance - 0.001f); zptd.eulerAngles = new Vector3(-90, 0, 0); } public void Update() { if (Input.GetKeyDown(KeyCode.Backspace)) { Player.transform.position = new Vector3(4.52f, -0.06f, 4.85f); } } public static GameObject DisableStandardEnvironment() { string[] piecesToLeaveEnabled = new string[] { "Sidewalk_4x4_A_01 (1)", "Sidewalk_4x4_A_01 (3)", "Sidewalk_4x2_A_02 (3)", "Sidewalk_4x2_A_01 (2)", "Sidewalk_4x4_A_02 (3)", "Sidewalk_4x4_A_02 (1)", "Descent_Store (10)", "Street", "Showcase_Store_08", "Wall_2m_01", "Wall_4m_01", "NI_Wall_4m_01", "Store Status Sign", "Table Canvas", "Placement Obstacle", }; var standardEnvironmentContainer = GameObject.Find("Environment v0.1.1"); GameObject street = null; if (standardEnvironmentContainer == null) return null; for (int i = 0; i < standardEnvironmentContainer.transform.childCount; i++) { var child = standardEnvironmentContainer.transform.GetChild(i).gameObject; if (!piecesToLeaveEnabled.Contains(child.name)) child.SetActive(false); if (child.name == "Street") street = child; } for (int i = 0; i < street.transform.childCount; i++) { var child = street.transform.GetChild(i).gameObject; if (!piecesToLeaveEnabled.Contains(child.name)) child.SetActive(false); } for (int i = 2; i < 24; i++) { SLogger.LogInfo("Disabling Section " + i); var section = GameObject.Find("Section " + i); var tbd = section.transform.GetChild(0); for (int j = 0; j < tbd.childCount; j++) { var child = tbd.GetChild(j).gameObject; SLogger.LogInfo("Disabling " + child.name); string name = child.name.Split(" (")[0]; if (!piecesToLeaveEnabled.Contains(name)) child.SetActive(false); } } var streetLightsContainer = GameObject.Find("Street Lights"); streetLightsContainer.SetActive(false); return standardEnvironmentContainer; } private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1) { var standardEnvironmentContainer = DisableStandardEnvironment(); if (standardEnvironmentContainer == null) return; Player = GameObject.Find("Player"); var newContainer = new GameObject("Space Environment").transform; newContainer.SetParent(standardEnvironmentContainer.transform.parent); var skyboxContainer = new GameObject("Skybox").transform; skyboxContainer.SetParent(newContainer); //GameObject platform = GameObject.CreatePrimitive(PrimitiveType.Plane); //platform.transform.localScale = new Vector3(1, 1, 1); //platform.transform.position = new Vector3(6, 0, 6); //platform.transform.SetParent(newContainer); //var camera = GameObject.Find("Main Camera"); //(camera.GetComponent().ActiveVirtualCamera as CinemachineVirtualCamera).; //var renderer = platform.GetComponent(); //renderer.material.shader = Shader.Find("Universal Render Pipeline/Lit"); //renderer.material.mainTexture = LoadTexture("metalgrid3_basecolor"); //renderer.material.SetTexture("_NORMALMAP", LoadTexture("metalgrid3_normal-ogl")); //renderer.material.SetTexture("_METALLICGLOSSMAP", LoadTexture("metalgrid3_metallic")); //renderer.material.DisableKeyword("_SPECULAR_SETUP"); ApplySkybox(skyboxContainer); //RenderSettings.skybox.SetTexture("_BackTex", LoadTexture("back_galaxyfire")); //RenderSettings.skybox.SetTexture("_DownTex", LoadTexture("down_galaxyfire")); //RenderSettings.skybox.SetTexture("_FrontTex", LoadTexture("front_galaxyfire")); //RenderSettings.skybox.SetTexture("_LeftTex", LoadTexture("left_galaxyfire")); //RenderSettings.skybox.SetTexture("_RightTex", LoadTexture("right_galaxyfire")); //RenderSettings.skybox.SetTexture("_UpTex", LoadTexture("up_galaxyfire")); } } }