gg.easy.airship 0.1.2116 → 0.1.2118

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/Runtime/Code/AirshipConst.cs +3 -3
  2. package/Runtime/Code/Bundles/SystemRoot.cs +57 -0
  3. package/Runtime/Code/Components/AirshipScrollRectConfig.cs +1 -1
  4. package/Runtime/Code/Health/AirshipProfileExporter.cs +24 -10
  5. package/Runtime/Code/Luau/LuauCompiler.cs +1 -1
  6. package/Runtime/Code/Luau/LuauPlugin.cs +19 -0
  7. package/Runtime/Code/Luau/ThreadManager.cs +1 -1
  8. package/Runtime/Code/LuauAPI/Bridge.cs +6 -2
  9. package/Runtime/Code/Platform/Shared/AirshipPlatformUrl.cs +4 -0
  10. package/Runtime/Code/Player/Accessories/AccessoryBuilder.cs +23 -8
  11. package/Runtime/Code/Player/Character/Animation/CharacterAnimationHelper.cs +1 -1
  12. package/Runtime/Code/Player/Character/Animation/ClipReplacer/AnimatorClipReplacer.cs +2 -3
  13. package/Runtime/Code/TSCodeGen/TypeGenerator.cs +1 -0
  14. package/Runtime/Code/UI/InternalAirshipUIUtil.cs +1 -2
  15. package/Runtime/Code/Util/CrossPlatformFileAPI.cs +41 -0
  16. package/Runtime/Code/Util/CrossPlatformFileAPI.cs.meta +3 -0
  17. package/Runtime/DevConsole/Resources/Prefabs/FAB_DevConsole.Instance.prefab +293 -2
  18. package/Runtime/DevConsole/Runtime/Airship.DevConsole.asmdef +2 -1
  19. package/Runtime/DevConsole/Runtime/DevConsoleMono.cs +9 -6
  20. package/Runtime/Plugins/Android/libLuauPlugin.so +0 -0
  21. package/Runtime/Plugins/Linux/libLuauPlugin.so +0 -0
  22. package/Runtime/Plugins/Mac/LuauPlugin.bundle/Contents/MacOS/LuauPlugin +0 -0
  23. package/Runtime/Plugins/Windows/x64/LuauPlugin.dll +0 -0
  24. package/Runtime/Plugins/Windows/x64/LuauPlugin.pdb +0 -0
  25. package/Runtime/Plugins/iOS/LuauPluginIos.a +0 -0
  26. package/package.json +1 -1
  27. package/temp.txt +0 -0
  28. package/{Editor/AuthConfigData.confg.meta → temp.txt.meta} +2 -2
  29. package/Editor/AuthConfigData.confg +0 -16
@@ -1,11 +1,11 @@
1
1
  // ReSharper disable InconsistentNaming
2
2
  namespace Code {
3
3
  public static class AirshipConst {
4
- public const int playerVersion = 2;
4
+ public const int playerVersion = 3;
5
5
 
6
6
  /// <summary>
7
7
  /// The server will kick clients that have a playerVersion lower than this value.
8
8
  /// </summary>
9
- public const int minAcceptedPlayerVersionOnServer = 2;
9
+ public const int minAcceptedPlayerVersionOnServer = 3;
10
10
  }
11
- }
11
+ }
@@ -6,6 +6,7 @@ using System.IO.Compression;
6
6
  using Code.Bootstrap;
7
7
  using Luau;
8
8
  using System;
9
+ using System.Text;
9
10
  using Airship.DevConsole;
10
11
  using Code.Bundles;
11
12
  using JetBrains.Annotations;
@@ -676,6 +677,62 @@ public class SystemRoot : Singleton<SystemRoot> {
676
677
  Debug.Log(registryDump);
677
678
  }));
678
679
 
680
+ DevConsole.AddCommand(Command.Create<string>("luauobjects", "", "Prints info about the Luau plugin", Parameter.Create("context", "Options: game, protected"), (val) => {
681
+ val = val.ToLower();
682
+
683
+ int[] instanceIds;
684
+ switch (val) {
685
+ case "game":
686
+ instanceIds = LuauPlugin.LuauDebugGetAllTrackedInstanceIds(LuauContext.Game);
687
+ break;
688
+ case "protected":
689
+ instanceIds = LuauPlugin.LuauDebugGetAllTrackedInstanceIds(LuauContext.Protected);
690
+ break;
691
+ default:
692
+ Debug.Log($"Invalid context: \"{val}\"");
693
+ return;
694
+ }
695
+
696
+ var sb = new StringBuilder("OBJECTS:\n");
697
+
698
+ // Count objects by unique name/type:
699
+ var countByName = new Dictionary<string, int>();
700
+ foreach (var instanceId in instanceIds) {
701
+ var obj = ThreadDataManager.GetObjectReference(IntPtr.Zero, instanceId, true, true);
702
+ if (obj is UnityEngine.Object unityObj) {
703
+ var t = unityObj.GetType();
704
+ var n = "(Destroyed)";
705
+ if (unityObj != null) {
706
+ n = unityObj.name;
707
+ }
708
+ var objName = $"[{t.Name}] {n}";
709
+ if (!countByName.TryAdd(objName, 1)) {
710
+ countByName[objName]++;
711
+ }
712
+ }
713
+ }
714
+
715
+ // Include top 20:
716
+ for (var i = 0; i < 20; i++) {
717
+ if (countByName.Count == 0) break;
718
+
719
+ // Find top item:
720
+ var topKey = "";
721
+ var topCount = 0;
722
+ foreach (var (key, count) in countByName) {
723
+ if (count > topCount) {
724
+ topKey = key;
725
+ topCount = count;
726
+ }
727
+ }
728
+
729
+ sb.AppendLine($"{topKey}: {topCount}");
730
+ countByName.Remove(topKey);
731
+ }
732
+
733
+ Debug.Log(sb.ToString());
734
+ }));
735
+
679
736
  DevConsole.AddCommand(Command.Create("version", "", "Prints version git hash", () => {
680
737
  var localVersion = AirshipVersion.GetVersionHash();
681
738
  Debug.Log("Client: #" + localVersion);
@@ -10,7 +10,7 @@ namespace Code.Components {
10
10
  if (Application.platform == RuntimePlatform.OSXPlayer || Application.platform == RuntimePlatform.OSXEditor) {
11
11
  scrollRect.scrollSensitivity = 15f;
12
12
  } else if (Application.platform is RuntimePlatform.WindowsPlayer or RuntimePlatform.WindowsEditor or RuntimePlatform.LinuxPlayer or RuntimePlatform.LinuxEditor) {
13
- scrollRect.scrollSensitivity = 30f;
13
+ scrollRect.scrollSensitivity = 36f;
14
14
  }
15
15
  }
16
16
  }
@@ -1,14 +1,17 @@
1
1
  using System;
2
+ using System.Diagnostics;
2
3
  using System.IO;
3
4
  using System.Threading.Tasks;
4
5
  using Airship.DevConsole;
5
6
  using Code.Http.Internal;
6
7
  using Code.Platform.Shared;
8
+ using Code.UI;
7
9
  using JetBrains.Annotations;
8
10
  using Mirror;
9
11
  using UnityEngine;
10
12
  using UnityEngine.Networking;
11
13
  using UnityEngine.Profiling;
14
+ using Debug = UnityEngine.Debug;
12
15
 
13
16
  struct SignedUrlRequest {
14
17
  public string type;
@@ -98,6 +101,11 @@ namespace Code.Health
98
101
  }
99
102
 
100
103
  if (context.Equals("client", StringComparison.OrdinalIgnoreCase)) {
104
+ if (!Debug.isDebugBuild) {
105
+ Debug.Log(
106
+ "Unable to capture profile log because debug mode is not enabled. Use the development build branch on Steam to enable debug mode.");
107
+ return;
108
+ }
101
109
  StartProfiling(d, null);
102
110
  } else if (context.Equals("server", StringComparison.OrdinalIgnoreCase)) {
103
111
  Debug.Log("Starting a server profile, view server console to monitor progress.");
@@ -164,7 +172,10 @@ namespace Code.Health
164
172
 
165
173
  var date = DateTime.Now.ToString("MM-dd-yyyy h.mm.ss");
166
174
  var fileName = RunCore.IsClient() ? $"Client-Profile-{date}.raw" : $"Server-Profile-{date}.raw";
167
- var logPath = Path.Combine(Application.persistentDataPath, fileName);
175
+ if (!Directory.Exists(Path.Combine(Application.persistentDataPath, "ClientProfiles"))) {
176
+ Directory.CreateDirectory(Path.Combine(Application.persistentDataPath, "ClientProfiles"));
177
+ }
178
+ var logPath = Path.Combine(Application.persistentDataPath, "ClientProfiles", fileName);
168
179
  if (File.Exists(logPath)) File.WriteAllText(logPath, "");
169
180
 
170
181
  Profiler.logFile = logPath;
@@ -179,19 +190,22 @@ namespace Code.Health
179
190
  await Task.Delay((int)(durationSecs * 1000));
180
191
  Profiler.enabled = false;
181
192
  var info = new FileInfo(logPath);
182
-
193
+
183
194
  Debug.Log($"Profiling completed. Retrieving upload URL...");
184
- if (RunCore.IsClient())
185
- {
186
- NetworkClient.Send(new ClientProfileUploadRequest
187
- {
195
+ if (RunCore.IsClient()) {
196
+ var profilesFolder = Path.Combine(Application.persistentDataPath, "ClientProfiles");
197
+ try {
198
+ CrossPlatformFileAPI.OpenPath(profilesFolder);
199
+ } catch (Exception e) {
200
+ Debug.LogError(e);
201
+ }
202
+
203
+ NetworkClient.Send(new ClientProfileUploadRequest {
188
204
  contentSize = info.Length,
189
205
  logLocation = logPath,
190
206
  fileName = fileName
191
207
  });
192
- }
193
- else
194
- {
208
+ } else {
195
209
  var urlData = await this.GetSignedUrl(fileName, durationSecs, info.Length);
196
210
  Upload(urlData, logPath, profileInitiator);
197
211
  }
@@ -219,7 +233,7 @@ namespace Code.Health
219
233
  Debug.Log("Uploading profile to backend...");
220
234
  var uploadFilePath = logPath;
221
235
  var fileData = await File.ReadAllBytesAsync(uploadFilePath);
222
- File.Delete(uploadFilePath);
236
+ // File.Delete(uploadFilePath);
223
237
 
224
238
  using var www = UnityWebRequest.Put(urlData.url, fileData);
225
239
  MonitorUploadProgress(www);
@@ -13,7 +13,7 @@ public class LuauCompiler {
13
13
  public const string IconFail = "Packages/gg.easy.airship/Editor/LuauErrorIcon.png";
14
14
 
15
15
  // Any globals in Luau that have values that change need to be added to this list (e.g. "Time" because "Time.time" changes):
16
- public static readonly string[] MutableGlobals = {"Time", "NetworkTime", "Physics", "Screen", "Input"};
16
+ public static readonly string[] MutableGlobals = {"Time", "NetworkTime", "Physics", "Screen", "Input", "math"};
17
17
 
18
18
  public struct CompilationResult {
19
19
  public IntPtr Data;
@@ -899,4 +899,23 @@ public static class LuauPlugin {
899
899
  var strLen = DebugCountAllRegistryItems(context, out var strPtr);
900
900
  return Marshal.PtrToStringUTF8(strPtr, strLen);
901
901
  }
902
+
903
+ /// <summary>
904
+ /// Fetch a list of all UnityObject Instance IDs tracked by the plugin.
905
+ /// </summary>
906
+ #if UNITY_IPHONE
907
+ [DllImport("__Internal")]
908
+ #else
909
+ [DllImport("LuauPlugin")]
910
+ #endif
911
+ private static extern int DebugGetAllTrackedInstanceIds(LuauContext context, out IntPtr ids);
912
+ public static int[] LuauDebugGetAllTrackedInstanceIds(LuauContext context) {
913
+ var listLen = DebugGetAllTrackedInstanceIds(context, out var arrPtr);
914
+ var list = new int[listLen];
915
+ var elementSize = Marshal.SizeOf<int>();
916
+ for (var i = 0; i < listLen; i++) {
917
+ list[i] = Marshal.ReadInt32(arrPtr, i * elementSize);
918
+ }
919
+ return list;
920
+ }
902
921
  }
@@ -150,7 +150,7 @@ namespace Luau {
150
150
 
151
151
  }
152
152
 
153
- if (!preventTrace) {
153
+ if (!preventTrace && thread != IntPtr.Zero) {
154
154
  LuauPlugin.LuauGetDebugTrace(thread);
155
155
  }
156
156
 
@@ -59,8 +59,12 @@ public static class Bridge {
59
59
  public static void RemoveMaterial(Renderer ren, int materialI) {
60
60
  var materials = new List<Material>();
61
61
  ren.GetMaterials(materials);
62
- materials.RemoveAt(materialI);
63
- ren.SetMaterials(materials);
62
+ if (materialI >= 0 && materialI < materials.Count) {
63
+ materials.RemoveAt(materialI);
64
+ ren.SetMaterials(materials);
65
+ } else {
66
+ //Debug.LogError("Trying to remove material that is out of bounds. Materials: " + materials.Count + " index: " + materialI);
67
+ }
64
68
  }
65
69
 
66
70
  public static void ClearAllMaterials(Renderer ren) {
@@ -9,6 +9,7 @@ namespace Code.Platform.Shared {
9
9
  public static string dataStoreService = "https://data-store-service-fxy2zritya-uc.a.run.app";
10
10
  public static string deploymentService = "https://deployment-service-fxy2zritya-uc.a.run.app";
11
11
  public static string analyticsService = "https://analytics-service-fxy2zritya-uc.a.run.app";
12
+ public static string moderationService = "https://moderation-service-fxy2zritya-uc.a.run.app";
12
13
  public static string gameCdn = "https://gcdn-staging.easy.gg";
13
14
  public static string cdn = "https://cdn-staging.easy.gg";
14
15
  public static string mainWeb = "https://staging.airship.gg";
@@ -20,6 +21,7 @@ namespace Code.Platform.Shared {
20
21
  public static string dataStoreService = "https://api-staging.airship.gg/data-store";
21
22
  public static string deploymentService = "https://api-staging.airship.gg/deployment";
22
23
  public static string analyticsService = "https://api-staging.airship.gg/analytics";
24
+ public static string moderationService = "https://api-staging.airship.gg/moderation";
23
25
  public static string gameCdn = "https://gcdn-staging.easy.gg";
24
26
  public static string cdn = "https://cdn-staging.easy.gg";
25
27
  public static string mainWeb = "https://staging.airship.gg";
@@ -33,6 +35,7 @@ namespace Code.Platform.Shared {
33
35
  public static string dataStoreService = "https://data-store-service-hwcvz2epka-uc.a.run.app";
34
36
  public static string deploymentService = "https://deployment-service-hwcvz2epka-uc.a.run.app";
35
37
  public static string analyticsService = "https://analytics-service-hwcvz2epka-uc.a.run.app";
38
+ public static string moderationService = "https://moderation-service-fxy2zritya-uc.a.run.app"; // TODO: Update this url to production url
36
39
  public static string cdn = "https://cdn.airship.gg";
37
40
  public static string gameCdn = "https://gcdn.airship.gg";
38
41
  public static string mainWeb = "https://airship.gg";
@@ -44,6 +47,7 @@ namespace Code.Platform.Shared {
44
47
  public static string dataStoreService = "https://api.airship.gg/data-store";
45
48
  public static string deploymentService = "https://api.airship.gg/deployment";
46
49
  public static string analyticsService = "https://api.airship.gg/analytics";
50
+ public static string moderationService = "https://api.airship.gg/moderation";
47
51
  public static string cdn = "https://cdn.airship.gg";
48
52
  public static string gameCdn = "https://gcdn.airship.gg";
49
53
  public static string mainWeb = "https://airship.gg";
@@ -593,35 +593,50 @@ public class AccessoryBuilder : MonoBehaviour {
593
593
  meshCombiner.outputSkinnedMeshRenderers[0]);
594
594
  }
595
595
 
596
- public Renderer[] GetAllAccessoryRenderers() {
597
- var renderers = new List<Renderer>();
596
+ private T[] GetAllAccessoryRenderersInternal<T>()where T: Renderer {
597
+ var renderers = new List<T>();
598
598
 
599
599
  //Main renderers
600
600
  foreach (var keyValuePair in activeAccessories) {
601
601
  //Main Renderers
602
602
  foreach (var ren in keyValuePair.Value.renderers) {
603
- renderers.Add(ren);
603
+ if (ren.GetType() == typeof(T) || ren.GetType().IsSubclassOf(typeof(T))) {
604
+ renderers.Add(ren as T);
605
+ }
604
606
  }
605
607
 
606
608
  //LOD Renderers
607
609
  foreach (var lodAcc in keyValuePair.Value.lods) {
608
610
  foreach (var ren in keyValuePair.Value.renderers) {
609
- renderers.Add(ren);
611
+ if (ren.GetType() == typeof(T) || ren.GetType().IsSubclassOf(typeof(T))) {
612
+ renderers.Add(ren as T);
613
+ }
610
614
  }
611
615
  }
612
616
  }
613
617
 
614
-
615
618
  //Combined renderers
616
- if (meshCombiner.enabled) {
619
+ if (meshCombiner.enabled && typeof(T) != typeof(MeshRenderer)) {
617
620
  for (var i = 0; i < meshCombiner.outputSkinnedMeshRenderers.Count; i++) {
618
- renderers.Add(meshCombiner.outputSkinnedMeshRenderers[i]);
621
+ renderers.Add(meshCombiner.outputSkinnedMeshRenderers[i] as T);
619
622
  }
620
- } else { }
623
+ }
621
624
 
622
625
  return renderers.ToArray();
623
626
  }
624
627
 
628
+ public Renderer[] GetAllAccessoryRenderers() {
629
+ return GetAllAccessoryRenderersInternal<Renderer>();
630
+ }
631
+
632
+ public MeshRenderer[] GetAllMeshRenderers() {
633
+ return GetAllAccessoryRenderersInternal<MeshRenderer>();
634
+ }
635
+
636
+ public SkinnedMeshRenderer[] GetAllSkinnedMeshRenderers() {
637
+ return GetAllAccessoryRenderersInternal<SkinnedMeshRenderer>();
638
+ }
639
+
625
640
  public Renderer[] GetAccessoryRenderers(AccessorySlot slot) {
626
641
  var activeAccessory = GetActiveAccessoryBySlot(slot);
627
642
  if (activeAccessory == null) {
@@ -257,7 +257,7 @@ public class CharacterAnimationHelper : MonoBehaviour {
257
257
  }
258
258
 
259
259
  public void PlayAnimation(AnimationClip clip, CharacterAnimationLayer layer, float fixedTransitionDuration) {
260
- if (!enabled || !this.gameObject.activeInHierarchy) {
260
+ if (!this.isActiveAndEnabled || !enabled || !this.gameObject.activeInHierarchy) {
261
261
  return;
262
262
  }
263
263
 
@@ -217,9 +217,8 @@ namespace Code.Player.Character
217
217
  return;
218
218
  }
219
219
 
220
- if (originalOverrides == null || originalOverrides.Count == 0)
221
- {
222
- Debug.LogWarning("No original overrides found to restore.");
220
+ if (originalOverrides == null || originalOverrides.Count == 0) {
221
+ // Debug.LogWarning("No original overrides found to restore.");
223
222
  return;
224
223
  }
225
224
 
@@ -330,6 +330,7 @@ public class TypeGenerator : MonoBehaviour
330
330
  "\\.Clothing$",
331
331
  "\\.ClothingManager$",
332
332
  "\\.MonoBehaviour$",
333
+ "\\.InternalCameraScreenshotRecorder$",
333
334
  };
334
335
 
335
336
  var options = new TypeScriptOptions
@@ -1,5 +1,4 @@
1
- using System;
2
- using UnityEngine;
1
+ using UnityEngine;
3
2
 
4
3
  namespace Code.UI {
5
4
  public class InternalAirshipUtil : MonoBehaviour {
@@ -0,0 +1,41 @@
1
+ using System.Runtime.InteropServices;
2
+ using System.IO;
3
+ using UnityEngine;
4
+
5
+ public static class CrossPlatformFileAPI {
6
+ #if UNITY_STANDALONE_WIN
7
+ [DllImport("shell32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
8
+ private static extern bool ShellExecuteW(
9
+ System.IntPtr hwnd,
10
+ string lpOperation,
11
+ string lpFile,
12
+ string lpParameters,
13
+ string lpDirectory,
14
+ int nShowCmd
15
+ );
16
+ #endif
17
+
18
+ #if UNITY_STANDALONE_OSX
19
+ [DllImport("libc")]
20
+ private static extern int system(string command);
21
+ #endif
22
+
23
+ public static void OpenPath(string path) {
24
+ if (!Directory.Exists(path) && !File.Exists(path)) {
25
+ Debug.LogWarning($"Directory does not exist: {path}");
26
+ return;
27
+ }
28
+
29
+ #if UNITY_STANDALONE_WIN
30
+ // Use ShellExecute (works in IL2CPP too)
31
+ ShellExecuteW(System.IntPtr.Zero, "open", path, null, null, 1);
32
+
33
+ #elif UNITY_STANDALONE_OSX
34
+ string openCommand = $"open \"{path}\"";
35
+ system(openCommand);
36
+
37
+ #else
38
+ Debug.LogWarning("OpenFolder is not supported on this platform.");
39
+ #endif
40
+ }
41
+ }
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 4756cccb56c14d5281525783cd167a4d
3
+ timeCreated: 1744349691
@@ -938,7 +938,7 @@ MonoBehaviour:
938
938
  m_IgnoreLayout: 0
939
939
  m_MinWidth: -1
940
940
  m_MinHeight: -1
941
- m_PreferredWidth: 100
941
+ m_PreferredWidth: 80
942
942
  m_PreferredHeight: -1
943
943
  m_FlexibleWidth: -1
944
944
  m_FlexibleHeight: -1
@@ -1008,7 +1008,7 @@ MonoBehaviour:
1008
1008
  m_OnCullStateChanged:
1009
1009
  m_PersistentCalls:
1010
1010
  m_Calls: []
1011
- m_text: open logs
1011
+ m_text: log file
1012
1012
  m_isRightToLeft: 0
1013
1013
  m_fontAsset: {fileID: 11400000, guid: f0ce55d58d63e4deab29e7ad50308632, type: 2}
1014
1014
  m_sharedMaterial: {fileID: 813049023685960433, guid: f0ce55d58d63e4deab29e7ad50308632, type: 2}
@@ -1295,6 +1295,7 @@ RectTransform:
1295
1295
  - {fileID: 8092397315146610953}
1296
1296
  - {fileID: 7701673732054800151}
1297
1297
  - {fileID: 7939003700229423427}
1298
+ - {fileID: 5809969181817808214}
1298
1299
  m_Father: {fileID: 3759786000585080057}
1299
1300
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
1300
1301
  m_AnchorMin: {x: 0, y: 0}
@@ -2244,6 +2245,142 @@ MonoBehaviour:
2244
2245
  m_OnValueChanged:
2245
2246
  m_PersistentCalls:
2246
2247
  m_Calls: []
2248
+ --- !u!1 &4564276395078990033
2249
+ GameObject:
2250
+ m_ObjectHideFlags: 0
2251
+ m_CorrespondingSourceObject: {fileID: 0}
2252
+ m_PrefabInstance: {fileID: 0}
2253
+ m_PrefabAsset: {fileID: 0}
2254
+ serializedVersion: 6
2255
+ m_Component:
2256
+ - component: {fileID: 7154688487266859026}
2257
+ - component: {fileID: 2433055827311457083}
2258
+ - component: {fileID: 7354500150139356307}
2259
+ m_Layer: 5
2260
+ m_Name: Text (TMP)
2261
+ m_TagString: Untagged
2262
+ m_Icon: {fileID: 0}
2263
+ m_NavMeshLayer: 0
2264
+ m_StaticEditorFlags: 0
2265
+ m_IsActive: 1
2266
+ --- !u!224 &7154688487266859026
2267
+ RectTransform:
2268
+ m_ObjectHideFlags: 0
2269
+ m_CorrespondingSourceObject: {fileID: 0}
2270
+ m_PrefabInstance: {fileID: 0}
2271
+ m_PrefabAsset: {fileID: 0}
2272
+ m_GameObject: {fileID: 4564276395078990033}
2273
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
2274
+ m_LocalPosition: {x: 0, y: 0, z: 0}
2275
+ m_LocalScale: {x: 1, y: 1, z: 1}
2276
+ m_ConstrainProportionsScale: 0
2277
+ m_Children: []
2278
+ m_Father: {fileID: 5809969181817808214}
2279
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
2280
+ m_AnchorMin: {x: 0, y: 0}
2281
+ m_AnchorMax: {x: 1, y: 1}
2282
+ m_AnchoredPosition: {x: 0, y: 0}
2283
+ m_SizeDelta: {x: 0, y: 0}
2284
+ m_Pivot: {x: 0.5, y: 0.5}
2285
+ --- !u!222 &2433055827311457083
2286
+ CanvasRenderer:
2287
+ m_ObjectHideFlags: 0
2288
+ m_CorrespondingSourceObject: {fileID: 0}
2289
+ m_PrefabInstance: {fileID: 0}
2290
+ m_PrefabAsset: {fileID: 0}
2291
+ m_GameObject: {fileID: 4564276395078990033}
2292
+ m_CullTransparentMesh: 1
2293
+ --- !u!114 &7354500150139356307
2294
+ MonoBehaviour:
2295
+ m_ObjectHideFlags: 0
2296
+ m_CorrespondingSourceObject: {fileID: 0}
2297
+ m_PrefabInstance: {fileID: 0}
2298
+ m_PrefabAsset: {fileID: 0}
2299
+ m_GameObject: {fileID: 4564276395078990033}
2300
+ m_Enabled: 1
2301
+ m_EditorHideFlags: 0
2302
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
2303
+ m_Name:
2304
+ m_EditorClassIdentifier:
2305
+ m_Material: {fileID: 0}
2306
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
2307
+ m_RaycastTarget: 1
2308
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
2309
+ m_Maskable: 1
2310
+ m_OnCullStateChanged:
2311
+ m_PersistentCalls:
2312
+ m_Calls: []
2313
+ m_text: profiles folder
2314
+ m_isRightToLeft: 0
2315
+ m_fontAsset: {fileID: 11400000, guid: f0ce55d58d63e4deab29e7ad50308632, type: 2}
2316
+ m_sharedMaterial: {fileID: 813049023685960433, guid: f0ce55d58d63e4deab29e7ad50308632, type: 2}
2317
+ m_fontSharedMaterials: []
2318
+ m_fontMaterial: {fileID: 0}
2319
+ m_fontMaterials: []
2320
+ m_fontColor32:
2321
+ serializedVersion: 2
2322
+ rgba: 4286347897
2323
+ m_fontColor: {r: 0.4745098, g: 0.47843137, b: 0.4862745, a: 1}
2324
+ m_enableVertexGradient: 0
2325
+ m_colorMode: 3
2326
+ m_fontColorGradient:
2327
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
2328
+ topRight: {r: 1, g: 1, b: 1, a: 1}
2329
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
2330
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
2331
+ m_fontColorGradientPreset: {fileID: 0}
2332
+ m_spriteAsset: {fileID: 0}
2333
+ m_tintAllSprites: 0
2334
+ m_StyleSheet: {fileID: 0}
2335
+ m_TextStyleHashCode: -1183493901
2336
+ m_overrideHtmlColors: 0
2337
+ m_faceColor:
2338
+ serializedVersion: 2
2339
+ rgba: 4294967295
2340
+ m_fontSize: 16
2341
+ m_fontSizeBase: 16
2342
+ m_fontWeight: 400
2343
+ m_enableAutoSizing: 0
2344
+ m_fontSizeMin: 18
2345
+ m_fontSizeMax: 72
2346
+ m_fontStyle: 0
2347
+ m_HorizontalAlignment: 2
2348
+ m_VerticalAlignment: 512
2349
+ m_textAlignment: 65535
2350
+ m_characterSpacing: 0
2351
+ m_wordSpacing: 0
2352
+ m_lineSpacing: 0
2353
+ m_lineSpacingMax: 0
2354
+ m_paragraphSpacing: 0
2355
+ m_charWidthMaxAdj: 0
2356
+ m_TextWrappingMode: 1
2357
+ m_wordWrappingRatios: 0.4
2358
+ m_overflowMode: 0
2359
+ m_linkedTextComponent: {fileID: 0}
2360
+ parentLinkedComponent: {fileID: 0}
2361
+ m_enableKerning: 1
2362
+ m_ActiveFontFeatures: 6e72656b
2363
+ m_enableExtraPadding: 0
2364
+ checkPaddingRequired: 0
2365
+ m_isRichText: 1
2366
+ m_EmojiFallbackSupport: 1
2367
+ m_parseCtrlCharacters: 1
2368
+ m_isOrthographic: 1
2369
+ m_isCullingEnabled: 0
2370
+ m_horizontalMapping: 0
2371
+ m_verticalMapping: 0
2372
+ m_uvLineOffset: 0
2373
+ m_geometrySortingOrder: 0
2374
+ m_IsTextObjectScaleStatic: 0
2375
+ m_VertexBufferAutoSizeReduction: 0
2376
+ m_useMaxVisibleDescender: 1
2377
+ m_pageToDisplay: 1
2378
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
2379
+ m_isUsingLegacyAnimationComponent: 0
2380
+ m_isVolumetricText: 0
2381
+ m_hasFontAssetChanged: 0
2382
+ m_baseMaterial: {fileID: 0}
2383
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
2247
2384
  --- !u!1 &5039477158916393225
2248
2385
  GameObject:
2249
2386
  m_ObjectHideFlags: 0
@@ -4442,6 +4579,160 @@ MonoBehaviour:
4442
4579
  m_FillOrigin: 0
4443
4580
  m_UseSpriteMesh: 0
4444
4581
  m_PixelsPerUnitMultiplier: 1
4582
+ --- !u!1 &8597128792922165307
4583
+ GameObject:
4584
+ m_ObjectHideFlags: 0
4585
+ m_CorrespondingSourceObject: {fileID: 0}
4586
+ m_PrefabInstance: {fileID: 0}
4587
+ m_PrefabAsset: {fileID: 0}
4588
+ serializedVersion: 6
4589
+ m_Component:
4590
+ - component: {fileID: 5809969181817808214}
4591
+ - component: {fileID: 4066300853767487851}
4592
+ - component: {fileID: 5446131395552516759}
4593
+ - component: {fileID: 801371686045038044}
4594
+ - component: {fileID: 1757328790056451712}
4595
+ m_Layer: 5
4596
+ m_Name: Open Profile Folder
4597
+ m_TagString: Untagged
4598
+ m_Icon: {fileID: 0}
4599
+ m_NavMeshLayer: 0
4600
+ m_StaticEditorFlags: 0
4601
+ m_IsActive: 1
4602
+ --- !u!224 &5809969181817808214
4603
+ RectTransform:
4604
+ m_ObjectHideFlags: 0
4605
+ m_CorrespondingSourceObject: {fileID: 0}
4606
+ m_PrefabInstance: {fileID: 0}
4607
+ m_PrefabAsset: {fileID: 0}
4608
+ m_GameObject: {fileID: 8597128792922165307}
4609
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
4610
+ m_LocalPosition: {x: 0, y: 0, z: 0}
4611
+ m_LocalScale: {x: 1, y: 1, z: 1}
4612
+ m_ConstrainProportionsScale: 0
4613
+ m_Children:
4614
+ - {fileID: 7154688487266859026}
4615
+ m_Father: {fileID: 1304341277271108516}
4616
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
4617
+ m_AnchorMin: {x: 0, y: 0}
4618
+ m_AnchorMax: {x: 0, y: 0}
4619
+ m_AnchoredPosition: {x: 0, y: 0}
4620
+ m_SizeDelta: {x: 0, y: 36}
4621
+ m_Pivot: {x: 0.5, y: 0.5}
4622
+ --- !u!222 &4066300853767487851
4623
+ CanvasRenderer:
4624
+ m_ObjectHideFlags: 0
4625
+ m_CorrespondingSourceObject: {fileID: 0}
4626
+ m_PrefabInstance: {fileID: 0}
4627
+ m_PrefabAsset: {fileID: 0}
4628
+ m_GameObject: {fileID: 8597128792922165307}
4629
+ m_CullTransparentMesh: 1
4630
+ --- !u!114 &5446131395552516759
4631
+ MonoBehaviour:
4632
+ m_ObjectHideFlags: 0
4633
+ m_CorrespondingSourceObject: {fileID: 0}
4634
+ m_PrefabInstance: {fileID: 0}
4635
+ m_PrefabAsset: {fileID: 0}
4636
+ m_GameObject: {fileID: 8597128792922165307}
4637
+ m_Enabled: 1
4638
+ m_EditorHideFlags: 0
4639
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
4640
+ m_Name:
4641
+ m_EditorClassIdentifier:
4642
+ m_Material: {fileID: 0}
4643
+ m_Color: {r: 0.19607843, g: 0.20784314, b: 0.21568628, a: 1}
4644
+ m_RaycastTarget: 1
4645
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
4646
+ m_Maskable: 1
4647
+ m_OnCullStateChanged:
4648
+ m_PersistentCalls:
4649
+ m_Calls: []
4650
+ m_Sprite: {fileID: 0}
4651
+ m_Type: 1
4652
+ m_PreserveAspect: 0
4653
+ m_FillCenter: 1
4654
+ m_FillMethod: 4
4655
+ m_FillAmount: 1
4656
+ m_FillClockwise: 1
4657
+ m_FillOrigin: 0
4658
+ m_UseSpriteMesh: 0
4659
+ m_PixelsPerUnitMultiplier: 1
4660
+ --- !u!114 &801371686045038044
4661
+ MonoBehaviour:
4662
+ m_ObjectHideFlags: 0
4663
+ m_CorrespondingSourceObject: {fileID: 0}
4664
+ m_PrefabInstance: {fileID: 0}
4665
+ m_PrefabAsset: {fileID: 0}
4666
+ m_GameObject: {fileID: 8597128792922165307}
4667
+ m_Enabled: 1
4668
+ m_EditorHideFlags: 0
4669
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
4670
+ m_Name:
4671
+ m_EditorClassIdentifier:
4672
+ m_Navigation:
4673
+ m_Mode: 3
4674
+ m_WrapAround: 0
4675
+ m_SelectOnUp: {fileID: 0}
4676
+ m_SelectOnDown: {fileID: 0}
4677
+ m_SelectOnLeft: {fileID: 0}
4678
+ m_SelectOnRight: {fileID: 0}
4679
+ m_Transition: 1
4680
+ m_Colors:
4681
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
4682
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
4683
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
4684
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
4685
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
4686
+ m_ColorMultiplier: 1
4687
+ m_FadeDuration: 0.1
4688
+ m_SpriteState:
4689
+ m_HighlightedSprite: {fileID: 0}
4690
+ m_PressedSprite: {fileID: 0}
4691
+ m_SelectedSprite: {fileID: 0}
4692
+ m_DisabledSprite: {fileID: 0}
4693
+ m_AnimationTriggers:
4694
+ m_NormalTrigger: Normal
4695
+ m_HighlightedTrigger: Highlighted
4696
+ m_PressedTrigger: Pressed
4697
+ m_SelectedTrigger: Selected
4698
+ m_DisabledTrigger: Disabled
4699
+ m_Interactable: 1
4700
+ m_TargetGraphic: {fileID: 5446131395552516759}
4701
+ m_OnClick:
4702
+ m_PersistentCalls:
4703
+ m_Calls:
4704
+ - m_Target: {fileID: 3982050654428888601}
4705
+ m_TargetAssemblyTypeName: Airship.DevConsole.DevConsoleMono, Airship.DevConsole
4706
+ m_MethodName: OpenProfilesFolder
4707
+ m_Mode: 1
4708
+ m_Arguments:
4709
+ m_ObjectArgument: {fileID: 0}
4710
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
4711
+ m_IntArgument: 0
4712
+ m_FloatArgument: 0
4713
+ m_StringArgument:
4714
+ m_BoolArgument: 0
4715
+ m_CallState: 2
4716
+ --- !u!114 &1757328790056451712
4717
+ MonoBehaviour:
4718
+ m_ObjectHideFlags: 0
4719
+ m_CorrespondingSourceObject: {fileID: 0}
4720
+ m_PrefabInstance: {fileID: 0}
4721
+ m_PrefabAsset: {fileID: 0}
4722
+ m_GameObject: {fileID: 8597128792922165307}
4723
+ m_Enabled: 1
4724
+ m_EditorHideFlags: 0
4725
+ m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
4726
+ m_Name:
4727
+ m_EditorClassIdentifier:
4728
+ m_IgnoreLayout: 0
4729
+ m_MinWidth: -1
4730
+ m_MinHeight: -1
4731
+ m_PreferredWidth: 130
4732
+ m_PreferredHeight: -1
4733
+ m_FlexibleWidth: -1
4734
+ m_FlexibleHeight: -1
4735
+ m_LayoutPriority: 1
4445
4736
  --- !u!1 &8970862260289576573
4446
4737
  GameObject:
4447
4738
  m_ObjectHideFlags: 0
@@ -11,7 +11,8 @@
11
11
  "SocketIO",
12
12
  "FishNet.Runtime",
13
13
  "GameKit.Dependencies",
14
- "GameKit.Utilities"
14
+ "GameKit.Utilities",
15
+ "Airship.Util"
15
16
  ],
16
17
  "includePlatforms": [],
17
18
  "excludePlatforms": [],
@@ -26,6 +26,7 @@ using TMPro;
26
26
  using UnityEngine.Serialization;
27
27
  using Enum = System.Enum;
28
28
  using System.Globalization;
29
+ using System.IO;
29
30
  using UnityEngine.Profiling;
30
31
  using Debug = UnityEngine.Debug;
31
32
  #if INPUT_SYSTEM_INSTALLED
@@ -684,13 +685,15 @@ namespace Airship.DevConsole
684
685
  public void OpenLogsFolder() {
685
686
  var path = Application.consoleLogPath;
686
687
  print("Opening console log path: " + path);
687
- if (Application.platform is RuntimePlatform.WindowsPlayer or RuntimePlatform.WindowsEditor) {
688
- Process.Start("explorer.exe", path);
689
- } else if (Application.platform is RuntimePlatform.OSXPlayer or RuntimePlatform.OSXEditor) {
690
- Process.Start("open", path);
691
- } else {
692
- Debug.LogError("Unable to open logs folder: unsupported platform.");
688
+ CrossPlatformFileAPI.OpenPath(path);
689
+ }
690
+
691
+ public void OpenProfilesFolder() {
692
+ var path = Path.Combine(Application.persistentDataPath, "ClientProfiles");
693
+ if (!Directory.Exists(path)) {
694
+ Directory.CreateDirectory(path);
693
695
  }
696
+ CrossPlatformFileAPI.OpenPath(path);
694
697
  }
695
698
 
696
699
  /// <summary>
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gg.easy.airship",
3
- "version": "0.1.2116",
3
+ "version": "0.1.2118",
4
4
  "displayName": "Airship",
5
5
  "unity": "2021.3",
6
6
  "unityRelease": "12f1",
package/temp.txt ADDED
File without changes
@@ -1,6 +1,6 @@
1
1
  fileFormatVersion: 2
2
- guid: b1ea32c2a8a910240ac3de70fc090037
3
- DefaultImporter:
2
+ guid: fe4111cb4d4b44103b5712d24b76209b
3
+ TextScriptImporter:
4
4
  externalObjects: {}
5
5
  userData:
6
6
  assetBundleName:
@@ -1,16 +0,0 @@
1
- %YAML 1.1
2
- %TAG !u! tag:unity3d.com,2011:
3
- --- !u!114 &1
4
- MonoBehaviour:
5
- m_ObjectHideFlags: 61
6
- m_CorrespondingSourceObject: {fileID: 0}
7
- m_PrefabInstance: {fileID: 0}
8
- m_PrefabAsset: {fileID: 0}
9
- m_GameObject: {fileID: 0}
10
- m_Enabled: 1
11
- m_EditorHideFlags: 0
12
- m_Script: {fileID: 11500000, guid: eb5f0228c1b74439f9a9b236649e6094, type: 3}
13
- m_Name:
14
- m_EditorClassIdentifier:
15
- deployKey: 91a24ccb-a8a5-4c14-80a2-812dd6b75505
16
- githubAccessToken: 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