Tanoda
ReplayLogic.cs
Go to the documentation of this file.
1using System.Collections;
2using System.Collections.Generic;
3using GILES;
4using GILES.Interface;
5using NaughtyAttributes;
6using UnityEngine;
7#if !UNITY_WEBGL
8using Valve.VR;
9#endif
10
11public class ReplayLogic : pb_MonoBehaviourSingleton<ReplayLogic>
12{
13 [SerializeField]
14 [ReadOnly]
15 private float lastInVRTime = -1;
16 [Tooltip("User timeout in minutes")]
17 public float UserTimeout = 15f;
18
19 public bool StageStarted = false;
20
21 [SerializeField]
22 private bool isEditor = false;
23
24 [Button]
25 public void ReplayLevel()
26 {
27 var statistics = FindObjectsOfType<StatisticHelper>();
28 foreach (var item in statistics)
29 {
30 Destroy(item.gameObject);
31 }
32 var footprints = FindObjectOfType<FoodPrintManager>().History.GetComponentsInChildren<SpriteRenderer>(true);
33 foreach (var footprint in footprints)
34 {
35 Destroy(footprint.gameObject);
36 }
37
38 var scene = pb_Scene.instance.transform;
39 StartCoroutine(FadeScene(scene));
40 //isEditor = FindObjectOfType<StartStageOnLoad>() != null;
41 isEditor = SavedUser.instance.isEditor;
42#if !DANA
43 DontDestroyOnLoad(UserManager.instance.gameObject);
44#endif
45 }
46
47 bool UserInVR()
48 {
49#if UNITY_WEBGL
50 return false;
51#else
52 if (OpenVR.System == null) return false;
53 return OpenVR.System.GetTrackedDeviceActivityLevel(0) == EDeviceActivityLevel.k_EDeviceActivityLevel_UserInteraction;
54#endif
55 }
56
57 private void Start()
58 {
59#if UNITY_EDITOR
60 isEditor = true;
61#endif
62 isEditor = SavedUser.instance.isEditor;
63 StartCoroutine(InactivityCheck());
64 }
65
66 IEnumerator InactivityCheck()
67 {
68 while (true)
69 {
70 if (isEditor)
71 {
72 lastInVRTime = -1;
73 }
74 //Debug.Log("UserInVR: " + UserInVR());
75 if (!StageStarted || isEditor)
76 {
77 yield return new WaitForSecondsRealtime(1);
78 }
79 if (UserInVR())
80 {
81 lastInVRTime = Time.time;
82 }
83 else
84 {
85 if (lastInVRTime != -1 && lastInVRTime < Time.time - UserTimeout * 60)
86 {
87 lastInVRTime = -1;
89 }
90 }
91 yield return new WaitForSecondsRealtime(1);
92 }
93 //yield return null;
94 }
95
96 IEnumerator FadeScene(Transform scene)
97 {
98 for (float i = 1; i >= 0; i -= 0.01f)
99 {
100 foreach (var renderer in scene.GetComponentsInChildren<Renderer>())
101 {
102 changeMaterialModeToFadeMode(renderer);
103 int j = 0;
104 foreach (var mat in renderer.materials)
105 {
106 Color meshColor = mat.color;
107 meshColor.a = i;
108 renderer.materials[j].color = meshColor;
109 j++;
110 }
111 }
112 yield return new WaitForEndOfFrame();
113 }
115 //HashingManager.instance.ClearHashTable();
116 //pb_Scene.instance.Clear();
117 //Controller.Instance.ClearAll();
118 //
119 //StartCoroutine(FindObjectOfType<LevelEditorOnLoaded>().Replay());
120
121
122 FastReplay();
123
124 yield return null;
125 }
126
127 internal void FastReplay()
128 {
129
130#if !UNITY_WEBGL
131 //Fast Replay
132 HashingManager.instance.ClearHashTable();
133 //pb_Scene.instance.Clear();
134 pb_Hierarchy.instance.RebuildInspector();
136 PanoramaManager.instance.ClearImage();
137
138 VRPopupManager.instance.HidePopup();
139
140 var hands = FindObjectsOfType<HackedHand>();
141 foreach (var hand in hands)
142 {
143 hand.ForceDrop();
144 }
145
146 var replaybutton = GameObject.Find("ReplayPOI");
147 if (replaybutton)
148 replaybutton.SetActive(false);
149
150 pb_Scene.instance.currentLevelName = LevelEditorOnLoaded.instance.lastLoadedName;
151 pb_Scene.instance.onLevelLoaded += OnReloaded;
152 pb_Scene.LoadLevel(LevelEditorOnLoaded.instance.lastLoadedJson, true);
153#endif
154 }
155
156 private void OnReloaded()
157 {
158 pb_Scene.instance.onLevelLoaded -= OnReloaded;
159 GameObject.Find("EpilepsyFixer")?.SetActive(false);
160
161 //pb_Scene.instance.EnablePhysics();
162
163#if !UNITY_WEBGL
164 var allTcd = pb_Scene.instance.transform.GetComponentsInChildren<ThrowableCanDisable>();
165 foreach (var tcd in allTcd)
166 {
167 tcd.ResetPosition();
168 }
169#endif
170 pb_Scene.instance.ThisIsAReload();
171 }
172
173 void changeMaterialModeToFadeMode(Renderer rd)
174 {
175 foreach (var material in rd.materials)
176 {
177 material.SetFloat("_Mode", 2);
178 material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
179 material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
180 material.SetInt("_ZWrite", 0);
181 material.DisableKeyword("_ALPHATEST_ON");
182 material.EnableKeyword("_ALPHABLEND_ON");
183 material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
184 material.renderQueue = 3000;
185 }
186 }
187}
UnityEngine.UI.Button Button
Definition: Pointer.cs:7
UnityEngine.Color Color
Definition: TestScript.cs:32
void ClearAll()
Definition: Controller.cs:719
static Controller Instance
Definition: Controller.cs:16
static void LoadLevel(string levelJson, bool ssol=false)
Definition: pb_Scene.cs:238
static LevelEditorOnLoaded instance
void ReplayLevel()
Definition: ReplayLogic.cs:25
bool StageStarted
Definition: ReplayLogic.cs:19
float UserTimeout
Definition: ReplayLogic.cs:17
void ResetPosition(bool silent=false)