From 3005cfc8aa85a40846c7ff1e734730d5b144131f Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Sun, 30 Jul 2023 01:20:46 +0200 Subject: [PATCH] upgrade CCK to v3.5 --- Assets/ABI.CCK/Components/AnimatorDriver.cs | 209 +++++++++++ .../ABI.CCK/Components/AnimatorDriver.cs.meta | 11 + Assets/ABI.CCK/Components/CVRAssetInfo.cs | 3 + Assets/ABI.CCK/Components/CVRAttachment.cs | 6 +- Assets/ABI.CCK/Components/CVRAvatar.cs | 6 +- .../Components/CVRInteractableAction.cs | 5 + .../CVRInteractableActionOperation.cs | 1 + Assets/ABI.CCK/Components/CombatSystem.cs | 3 + .../Components/GameInstanceController.cs | 2 + Assets/ABI.CCK/Components/GunController.cs | 9 + Assets/ABI.CCK/Components/ObjectHealth.cs | 5 + .../Components/PlayerMaterialParser.cs | 20 + .../Components/PlayerMaterialParser.cs.meta | 11 + .../Components/SpawnablePickupMarker.cs | 27 ++ .../Components/SpawnablePickupMarker.cs.meta | 11 + .../ABI.CCK/GUIAssets/CCK_UploaderHead.prefab | 2 +- Assets/ABI.CCK/Materials/UI Additive.mat | Bin 3259 -> 6036 bytes .../ABI.CCK/Materials/VideoPlayerSpeaker.mat | Bin 2060 -> 5052 bytes Assets/ABI.CCK/Materials/VideoScreen.mat | Bin 2155 -> 5044 bytes .../Prefabs/CVRVideoPlayerCinemaScreen.prefab | Bin 4218 -> 16956 bytes Assets/ABI.CCK/Prefabs/Chair.prefab | Bin 9282 -> 12876 bytes Assets/ABI.CCK/Prefabs/Mirror.prefab | Bin 3422 -> 9708 bytes .../Prefabs/VideoPlayer/Speakers.prefab | Bin 23961 -> 11340 bytes .../VideoPlayerRoomScaleAudioPrefab.prefab | Bin 13165 -> 21828 bytes .../VideoPlayer/VideoPlayerUiPrefab.prefab | Bin 7889 -> 18276 bytes .../VideoPlayer/_AudioSourceRoom.prefab | Bin 5267 -> 11180 bytes Assets/ABI.CCK/Scripts/APIConnection.cs | 176 +++++++++ Assets/ABI.CCK/Scripts/APIConnection.cs.meta | 3 + .../Scripts/CVRAdvancedAvatarSettings.cs | 10 +- .../Editor/CCK_AnimatorDriverEditor.cs | 353 ++++++++++++++++++ .../Editor/CCK_AnimatorDriverEditor.cs.meta | 3 + .../Scripts/Editor/CCK_BuildManagerWindow.cs | 126 +++---- .../Scripts/Editor/CCK_BuildUtility.cs | 149 ++++++-- .../Editor/CCK_CVRAnimatorDriverEditor.cs | 31 +- .../Scripts/Editor/CCK_CVRAvatarEditor.cs | 16 +- .../Editor/CCK_CVRInteractableEditor.cs | 6 + .../Editor/CCK_CVR_VideoPlayerEditor.cs | 19 +- Assets/ABI.CCK/Scripts/Editor/CCK_Init.cs | 38 +- .../Runtime/CCK_RuntimeUploaderMaster.cs | 19 +- .../Runtime/CCK_RuntimeVariableStream.cs | 206 +++------- .../ABI.CCK/Scripts/Runtime/OnGuiUpdater.cs | 12 +- .../ShaderCompatibilityPreprocessor.cs | 4 + Assets/ABI.CCK/Textures/24718.renderTexture | Bin 785 -> 4236 bytes 43 files changed, 1213 insertions(+), 289 deletions(-) create mode 100755 Assets/ABI.CCK/Components/AnimatorDriver.cs create mode 100755 Assets/ABI.CCK/Components/AnimatorDriver.cs.meta create mode 100755 Assets/ABI.CCK/Components/PlayerMaterialParser.cs create mode 100755 Assets/ABI.CCK/Components/PlayerMaterialParser.cs.meta create mode 100755 Assets/ABI.CCK/Components/SpawnablePickupMarker.cs create mode 100755 Assets/ABI.CCK/Components/SpawnablePickupMarker.cs.meta create mode 100755 Assets/ABI.CCK/Scripts/APIConnection.cs create mode 100755 Assets/ABI.CCK/Scripts/APIConnection.cs.meta create mode 100755 Assets/ABI.CCK/Scripts/Editor/CCK_AnimatorDriverEditor.cs create mode 100755 Assets/ABI.CCK/Scripts/Editor/CCK_AnimatorDriverEditor.cs.meta diff --git a/Assets/ABI.CCK/Components/AnimatorDriver.cs b/Assets/ABI.CCK/Components/AnimatorDriver.cs new file mode 100755 index 0000000..6e8435a --- /dev/null +++ b/Assets/ABI.CCK/Components/AnimatorDriver.cs @@ -0,0 +1,209 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace ABI.CCK.Components +{ + public class AnimatorDriver : StateMachineBehaviour + { + public List EnterTasks = new List(); + public List ExitTasks = new List(); + + public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) + { + foreach (var task in EnterTasks) + { + task.Execute(animator); + } + } + + public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) + { + foreach (var task in ExitTasks) + { + task.Execute(animator); + } + } + } + + [System.Serializable] + public class AnimatorDriverTask + { + public enum Operator + { + Set, + Addition, + Subtraction, + Multiplication, + Division, + Modulo, + Power, + Log, + Equal, + NotEqual, + LessThen, + LessEqual, + MoreThen, + MoreEqual + } + + public enum SourceType + { + Static, + Parameter, + Random + } + + public enum ParameterType + { + None, + Float, + Int, + Bool, + Trigger + } + + public ParameterType targetType = ParameterType.None; + public string targetName = ""; + + public Operator op = Operator.Set; + + public SourceType aType = SourceType.Static; + public float aValue = 0f; + public float aMax = 1f; + public ParameterType aParamType; + public string aName = ""; + + public SourceType bType = SourceType.Static; + public float bValue = 0f; + public float bMax = 1f; + public ParameterType bParamType; + public string bName = ""; + + public void Execute(Animator animator) + { + float valA = 0f; + float valB = 0f; + float res = 0f; + + switch (aType) + { + case SourceType.Static: + valA = aValue; + break; + case SourceType.Random: + valA = Random.Range(aValue, aMax); + break; + case SourceType.Parameter: + switch (aParamType) + { + default: + valA = 0f; + break; + case ParameterType.Bool: + valA = animator.GetBool(aName) ? 1f : 0f; + break; + case ParameterType.Float: + valA = animator.GetFloat(aName); + break; + case ParameterType.Int: + valA = animator.GetInteger(aName); + break; + } + break; + } + + if (op == Operator.Set) + { + res = valA; + } + else + { + switch (bType) + { + case SourceType.Static: + valB = bValue; + break; + case SourceType.Random: + valB = Random.Range(bValue, aMax); + break; + case SourceType.Parameter: + switch (aParamType) + { + default: + valB = 0f; + break; + case ParameterType.Bool: + valB = animator.GetBool(bName) ? 1f : 0f; + break; + case ParameterType.Float: + valB = animator.GetFloat(bName); + break; + case ParameterType.Int: + valB = animator.GetInteger(bName); + break; + } + break; + } + + switch (op) + { + case Operator.Addition: + res = valA + valB; + break; + case Operator.Subtraction: + res = valA - valB; + break; + case Operator.Multiplication: + res = valA * valB; + break; + case Operator.Division: + res = valA / valB; + break; + case Operator.Modulo: + res = valA % valB; + break; + case Operator.Power: + res = Mathf.Pow(valA, valB); + break; + case Operator.Log: + res = Mathf.Log(valA, valB); + break; + case Operator.Equal: + res = valA == valB ? 1f : 0f; + break; + case Operator.NotEqual: + res = valA != valB ? 1f : 0f; + break; + case Operator.LessThen: + res = valA < valB ? 1f : 0f; + break; + case Operator.LessEqual: + res = valA <= valB ? 1f : 0f; + break; + case Operator.MoreThen: + res = valA > valB ? 1f : 0f; + break; + case Operator.MoreEqual: + res = valA >= valB ? 1f : 0f; + break; + } + } + + switch (targetType) + { + case ParameterType.Bool: + animator.SetBool(targetName, res >= 0.5f); + break; + case ParameterType.Trigger: + if (res >= 0.5f) animator.SetTrigger(targetName); + break; + case ParameterType.Float: + animator.SetFloat(targetName, res); + break; + case ParameterType.Int: + animator.SetInteger(targetName, (int) res); + break; + } + } + } +} \ No newline at end of file diff --git a/Assets/ABI.CCK/Components/AnimatorDriver.cs.meta b/Assets/ABI.CCK/Components/AnimatorDriver.cs.meta new file mode 100755 index 0000000..dd3c423 --- /dev/null +++ b/Assets/ABI.CCK/Components/AnimatorDriver.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6007a7c7844c4bcc994fd9111bf4d5a5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 8d4eaf52fbae23548874e96ac0d52276, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ABI.CCK/Components/CVRAssetInfo.cs b/Assets/ABI.CCK/Components/CVRAssetInfo.cs index 60b4282..2ca2be4 100755 --- a/Assets/ABI.CCK/Components/CVRAssetInfo.cs +++ b/Assets/ABI.CCK/Components/CVRAssetInfo.cs @@ -17,5 +17,8 @@ namespace ABI.CCK.Components public AssetType type; public string objectId; + + [HideInInspector] + public string randomNum; } } diff --git a/Assets/ABI.CCK/Components/CVRAttachment.cs b/Assets/ABI.CCK/Components/CVRAttachment.cs index b1d3b2d..f987128 100755 --- a/Assets/ABI.CCK/Components/CVRAttachment.cs +++ b/Assets/ABI.CCK/Components/CVRAttachment.cs @@ -1,4 +1,5 @@ -using UnityEngine; +using System.Collections.Generic; +using UnityEngine; using UnityEngine.Events; namespace ABI.CCK.Components @@ -10,6 +11,7 @@ namespace ABI.CCK.Components { Bone = 1, Tracker = 2, + SnappingPoint = 4, } public AttachmentType attachmentType; @@ -52,6 +54,8 @@ namespace ABI.CCK.Components } public TrackerType trackerType = 0; + + public List snappingPointTypes = new List(); public bool useFixedPositionOffset = false; public bool useFixedRotationOffset = false; diff --git a/Assets/ABI.CCK/Components/CVRAvatar.cs b/Assets/ABI.CCK/Components/CVRAvatar.cs index 8fed611..2d52469 100755 --- a/Assets/ABI.CCK/Components/CVRAvatar.cs +++ b/Assets/ABI.CCK/Components/CVRAvatar.cs @@ -37,6 +37,8 @@ namespace ABI.CCK.Components public CVRAvatarVisemeMode visemeMode = CVRAvatarVisemeMode.Visemes; + public int visemeSmoothing = 50; + public string[] visemeBlendshapes = new string[15]; [Space] [Header("Avatar customization")] [Space] @@ -82,8 +84,8 @@ namespace ABI.CCK.Components FlashingLights = 16, Violence = 32, Gore = 64, - //Suggestive = 128, - //Nudity = 256, + Suggestive = 128, + Nudity = 256, Horror = 512 } diff --git a/Assets/ABI.CCK/Components/CVRInteractableAction.cs b/Assets/ABI.CCK/Components/CVRInteractableAction.cs index 97a4801..04a9cfc 100755 --- a/Assets/ABI.CCK/Components/CVRInteractableAction.cs +++ b/Assets/ABI.CCK/Components/CVRInteractableAction.cs @@ -123,6 +123,11 @@ namespace ABI.CCK.Components Alpha7 = KeyCode.Alpha7, Alpha8 = KeyCode.Alpha8, Alpha9 = KeyCode.Alpha9, + LeftShift = KeyCode.LeftShift, + RightShift = KeyCode.RightShift, + LeftControl = KeyCode.LeftControl, + RightControl = KeyCode.RightControl, + Space = KeyCode.Space, InputHorizontalNegative = 10000, InputHorizontalPositive = 10001, InputVerticalNegative = 10002, diff --git a/Assets/ABI.CCK/Components/CVRInteractableActionOperation.cs b/Assets/ABI.CCK/Components/CVRInteractableActionOperation.cs index 450f3d8..9034f52 100755 --- a/Assets/ABI.CCK/Components/CVRInteractableActionOperation.cs +++ b/Assets/ABI.CCK/Components/CVRInteractableActionOperation.cs @@ -29,6 +29,7 @@ namespace ABI.CCK.Components DisplayWorldDetailPage = 13, DisplayInstanceDetailPage = 14, DisplayAvatarDetailPage = 15, + DisplaySpawnableDetailPage = 37, SitAtPosition = 16, MethodCall = 21, SetSpawnableValue = 22, diff --git a/Assets/ABI.CCK/Components/CombatSystem.cs b/Assets/ABI.CCK/Components/CombatSystem.cs index 57d4cdd..3bea52e 100755 --- a/Assets/ABI.CCK/Components/CombatSystem.cs +++ b/Assets/ABI.CCK/Components/CombatSystem.cs @@ -24,12 +24,15 @@ namespace ABI.CCK.Components [Header("Events")] public UnityEvent playerDownEvent = new UnityEvent(); + public UnityEvent playerHitEvent = new UnityEvent(); public UnityEvent playerRespawnEvent = new UnityEvent(); public UnityEvent playerRevitalizeEvent = new UnityEvent(); [Header("PVP Events")] public UnityEvent playerDownedEvent = new UnityEvent(); public UnityEvent downedAnotherPlayerEvent = new UnityEvent(); + public UnityEvent playerGotHitEvent = new UnityEvent(); + public UnityEvent hitAnotherPlayerEvent = new UnityEvent(); private void Reset() { diff --git a/Assets/ABI.CCK/Components/GameInstanceController.cs b/Assets/ABI.CCK/Components/GameInstanceController.cs index 5525239..5a93e45 100755 --- a/Assets/ABI.CCK/Components/GameInstanceController.cs +++ b/Assets/ABI.CCK/Components/GameInstanceController.cs @@ -103,5 +103,7 @@ namespace ABI.CCK.Components public UnityEvent teamLeaveEvent = new UnityEvent(); public UnityEvent teamWinRoundEvent = new UnityEvent(); public UnityEvent teamWinGameEvent = new UnityEvent(); + public UnityEvent teamMemberReadyEvent = new UnityEvent(); + public UnityEvent teamMemberUnReadyEvent = new UnityEvent(); } } \ No newline at end of file diff --git a/Assets/ABI.CCK/Components/GunController.cs b/Assets/ABI.CCK/Components/GunController.cs index 72f7e54..3ce764e 100755 --- a/Assets/ABI.CCK/Components/GunController.cs +++ b/Assets/ABI.CCK/Components/GunController.cs @@ -25,6 +25,15 @@ namespace ABI.CCK.Components public FiringMode firingMode = FiringMode.HalfAuto; public float firingRate = 1f; public float reloadTime = 1f; + + public enum HitDetection + { + Particle = 0, + Raycast = 1, + } + + public HitDetection hitDetection = HitDetection.Particle; + public LayerMask hitMask = (1 << 0) | (1 << 8); public void Shoot() { diff --git a/Assets/ABI.CCK/Components/ObjectHealth.cs b/Assets/ABI.CCK/Components/ObjectHealth.cs index 8e24fd6..5887a24 100755 --- a/Assets/ABI.CCK/Components/ObjectHealth.cs +++ b/Assets/ABI.CCK/Components/ObjectHealth.cs @@ -11,11 +11,16 @@ namespace ABI.CCK.Components { Destroy = 0, RespawnAfterTime = 1, + RespawnOnRoundStart = 2, + RespawnOnRoundEnd = 3, + RespawnOnGameStart = 4, + RespawnOnGameEnd = 5, } [Header("Down Behavior")] public DownBehavior downBehavior = DownBehavior.Destroy; public float respawnTime = 10f; public Transform respawnPoint; + public GameInstanceController connectedGameInstance; [Header("Events")] public UnityEvent downEvent = new UnityEvent(); diff --git a/Assets/ABI.CCK/Components/PlayerMaterialParser.cs b/Assets/ABI.CCK/Components/PlayerMaterialParser.cs new file mode 100755 index 0000000..33642d9 --- /dev/null +++ b/Assets/ABI.CCK/Components/PlayerMaterialParser.cs @@ -0,0 +1,20 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace ABI.CCK.Components +{ + public class PlayerMaterialParser : MonoBehaviour + { + public Material targetMaterial; + + public string playerRootPositions = "_PlayerRootPositions"; + public string playerHipPositions = "_PlayerHipPositions"; + public string playerHeadPositions = "_PlayerHeadPositions"; + public string playerLeftHandPositions = "_PlayerLeftHandPositions"; + public string playerRightHandPositions = "_PlayerRightHandPositions"; + public string playerChestPositions = "_PlayerChestPositions"; + public string playerLeftFootPositions = "_PlayerLeftFootPositions"; + public string playerRightFootPositions = "_PlayerRightFootPositions"; + } +} diff --git a/Assets/ABI.CCK/Components/PlayerMaterialParser.cs.meta b/Assets/ABI.CCK/Components/PlayerMaterialParser.cs.meta new file mode 100755 index 0000000..b538903 --- /dev/null +++ b/Assets/ABI.CCK/Components/PlayerMaterialParser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5256473d683a24743ab8a6b352997437 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 8d4eaf52fbae23548874e96ac0d52276, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ABI.CCK/Components/SpawnablePickupMarker.cs b/Assets/ABI.CCK/Components/SpawnablePickupMarker.cs new file mode 100755 index 0000000..a5e556d --- /dev/null +++ b/Assets/ABI.CCK/Components/SpawnablePickupMarker.cs @@ -0,0 +1,27 @@ +using UnityEngine; + +namespace ABI.CCK.Components +{ + public class SpawnablePickupMarker : MonoBehaviour + { + public string spawnableGuid; + + private void OnDrawGizmos() + { + Gizmos.color = Color.magenta; + Matrix4x4 rotationMatrix = Matrix4x4.TRS(transform.position, transform.rotation, transform.lossyScale); + Gizmos.matrix = rotationMatrix; + Gizmos.DrawWireCube(new Vector3(0, 0.75f, 0), new Vector3(1f, 1.5f, 0f)); + + Gizmos.DrawWireCube(new Vector3(0, 0.7f, 0), new Vector3(0.8f, 0.1f, 0f)); + Gizmos.DrawWireCube(new Vector3(0, 0.615f, 0), new Vector3(0.6f, 0.07f, 0f)); + Gizmos.DrawWireCube(new Vector3(0.24f, 0.28f, 0), new Vector3(0.32f, 0.42f, 0f)); + Gizmos.DrawWireCube(new Vector3(-0.24f, 0.28f, 0), new Vector3(0.32f, 0.42f, 0f)); + var scale = transform.lossyScale; + scale.Scale(new Vector3(1f, 1f, 0f)); + rotationMatrix = Matrix4x4.TRS(transform.position, transform.rotation, scale); + Gizmos.matrix = rotationMatrix; + Gizmos.DrawWireSphere(new Vector3(0, 1.11f, 0), 0.31f); + } + } +} \ No newline at end of file diff --git a/Assets/ABI.CCK/Components/SpawnablePickupMarker.cs.meta b/Assets/ABI.CCK/Components/SpawnablePickupMarker.cs.meta new file mode 100755 index 0000000..fb72485 --- /dev/null +++ b/Assets/ABI.CCK/Components/SpawnablePickupMarker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eff309c86b8103c45a87cf57553d787f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 8d4eaf52fbae23548874e96ac0d52276, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ABI.CCK/GUIAssets/CCK_UploaderHead.prefab b/Assets/ABI.CCK/GUIAssets/CCK_UploaderHead.prefab index 96c9168..5e4a1f2 100755 --- a/Assets/ABI.CCK/GUIAssets/CCK_UploaderHead.prefab +++ b/Assets/ABI.CCK/GUIAssets/CCK_UploaderHead.prefab @@ -17079,7 +17079,7 @@ MonoBehaviour: m_HorizontalOverflow: 1 m_VerticalOverflow: 1 m_LineSpacing: 1 - m_Text: ABI Platform Content Creation Kit v3.4 RELEASE (Build 92, Public) + m_Text: ABI Platform Content Creation Kit v3.5 RELEASE (Build 98, Public) --- !u!1 &8389522060313083026 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/ABI.CCK/Materials/UI Additive.mat b/Assets/ABI.CCK/Materials/UI Additive.mat index cf978152a01a6101b8f432388725b769a0c993a9..41099850fdbaadaef6011cbb1f73c89c6454ecdc 100755 GIT binary patch literal 6036 zcmeHL&2J<}6|Y{~yRe%8;VXoMWFUM5LU!YXj|4V5_KwG1C-&~dV=o^<8ntK2o+drr zLwC<&OGH~I4qV9rDW?d8ka7ru3kMEd5t}38g7OD&L*k72{a#hgbocCfZ=Ci?{i^!? z>b>eWZLQV;z`sYl;ZN_|SHkD*ZNh3A)FzWCzB<%4DQ-;Msaxz%2#PxCr~t;PpdzY#+vg;IzMtGIaKrL^g$iR_)Ut z40YO|ZvWgI9;lz6Q6_WtIfm25PhU^7e|`=R)HV3`E|eJG3&ah3v4rsj@Xzoe&KL$O zWqd*6_c&}YHV+e*NO}DQ^*VHajECd?$Q&N1b;!DSX#1mh%2baZ6X`Vn9+|_fe?Nkp zjNyA=jZZBcGomh!~$w&mgH0--7)&@kYHz z?}7iy;h!PCLS~8j9N+KoO8bvFxi5(S8~C3gp#PsGV8|@h{ePTdV=?l&|4+;ysS$q) z`N{dE{m)Tq1QHggMai$X9sVSxMj&B*YE|jK>jhu#J}gLYsf5d z{WAX+V3ht}q}W)D9OJKy?-GTE%o6jby#Ai|KnXAB-!kRKfhahB#>eO13xo`rCCp!? z{}&;y#^+q6|8Ed?x-0^9t`eVb&f!byVJI;FxOTopr4liJevkF@7}{|E!#P(W+Nb~i ze0m9Jb^kk8IiFsh!_TUJqVK0+pS$*V#Ck(G8STFV`_BSj#QS#zX$U9t_;U`wEJ#B* z8OKlimz@1q1ZfB-^ZMTY6+s%p$vp1uHw9@3C-eF966`a7Rwy)Nmg@PlO0lsRc|Cuw z&LF7~FXvB-QX`PCdj70YY6KEi&!0A=r{xdNI=C_=`d{9^HshXEa10}p1ADmS+{p$MKp2Mr_>pJk$;&X#IZ8)mOrvrHv zUsAX$8pelr1H=;45KhMYdx5Gkb zQ5dUEr^qh12T_q`?V~~`d6Xts)Tp-}#d>oMl}=a;QIU3?Odo{%n@L`TNnc;F!tO8} z=!`nHHm$s-kAIqGgB*gb=x|t!!tr_>9`e1Ng!`~>4MoY}%@Bi03PNk?1W-2`=)uM& z-dmHrNJl$5K_{(;?Ilrh+{x0h&WhviQ0oGQ zy5TK7aKZ?UM!j8q)J|@>=Jv%(i%F)b(GO#-j?^*gHx3SRF|!`0p$xQ@#%Y$TOdYCy z70R?B*rdjVhLmJ)@#gHv!S=0uqukMXI?4Jvzck^(Oc6+7{#mcz8<9aX;0g({dSnY;jH-Lp0=;2 z*(i+fWBdHfHg-yH)0b7-yfF6KqbTQLav!_=G0@u%qlEGB=B8!UuEdRP=SEO%_lVd; z+~PRuZ^UVy&kX`Csyh5Z(7Vy^$CJAbdak|r*a)`-roINH75X%Sp6w3hXwa6aBMAZsE&>enVhxG=gDgDWjylK9bdXqU_kE8K^n!d4}4m2Bs z__L?y^J40dY0CN$d6eipXH)Bo$c}gPL9F}qR3OuoIo(WdaW*)9iHBTu%5!I$JnHQg z2=eu?kGMc$nl|@cp0YQP%t>ji63b~`mcr%reGWqR{6BtuS?0Mrj1uR<`**gkNL;(4 zG%beo3#*40oYpW*67A+*e$e!~=|KT|MbwX{>1CZ$@87xeisVDNO%xx*a zWGu4YDe?P}EhYc`{yc5tHEny@Ps(%6JgD{NHEb;0Jb7WM6rXpaq?q-^Gj96)4_&5N AVgLXD literal 3259 zcmcguO>^5e5WVYHAcyoMYead}W_VNdWlk(xH6=G`r=x*LkU|0i8US>yWb)s;07#IM zoGW>N<=w^ZzPF17-hY{_?oluZdha)rC3;uBLmKB{$*Dfwrh`Nj{n0Q8!rslzjnR$* z^xG&Hny|4I^lM^mz3I9DMWTJcm!Nz_sB zl=3_lrA&yk4AGB_G7`G0+Cy|M}PPf?r6wmf}dHrXUC5o29+A ziek4RuXFxV+1;Ss$Few@P*!dBS`%H$tFjrTQO5~pM)?||ppQ;OKEMR8v$|H=ux&bKO4kAFUG+$~4z^(Q zxEJEvN~GrYtvA#ye~HP;DJRO@o(&ULe0m}ogLer42CdIH;xDEyEs4FQ+m-aTwPt}6 zpsuy0K8mdrFEaM$<_*&77B@K$eMRE~H6!8pt zLZA9*Z$%hZ_jZC&W&Jp7cvgWmtY8K!m{m_KFssj6%iKAK)q8Es+Z8rVbe&XtUz1H- eRlJ@4+m;*3bvv2C*k%vM*Ck~B8lZ#m&))x`A(g)X diff --git a/Assets/ABI.CCK/Materials/VideoPlayerSpeaker.mat b/Assets/ABI.CCK/Materials/VideoPlayerSpeaker.mat index 3acccb7499a4ffa630d20e1e4af896fd07cecc77..cd659d9b537ec25eba88944433751aea85a4e631 100755 GIT binary patch literal 5052 zcmeHLOK;p%6uxd=kUpT4S81UGu>irg3$_Thhz;rwV28w-@O|gnld-2wSL}KuA77vEobR4{eC+EP zrFML+)Sg>PsmGLh7$>EU9~(V2a$@Az(y01(V`IZ{EU47R#$W$T{PyAZAK%!2`={-n z{rYLJ0B9cgAmbo!DrFF|As0rpC`UQ!n?7ZJbd>3bg_JxpA^spP%KgghzvJiblc z2KNEj8Q&+kfwtlxVg&q$aQOfZJBP6#H2Ftyc2oWVv2|ded48@3sdgNS{6jssqdwWD zOqB97hpqDGTDRgK?!g^(4(t04L9Fj~;)b(WL4FR_XLt~24W03Byie-44;-w`PU2Fj zEWS@&M(hVTnD?$8+)>l8)o_seAspROtREX`tM%>f!R`9qhn@L9LUKc8rMSL5FgxQZ z$T2#C{gJKjQL*Lm?)9P95wj^-f3{#^eIDP0WJLTT_;28faZlU@|2)N?BtA}Mh4IYq zTU?TVZ)(p@#Qz4)=aB1vih!ZAQe6K&nvKP%i|gON3CW1~0rV&DFZrLQ)d(cYQT@_i zU!?dmv>Jg#Icgx+UwjVp^&iaDzeHRjt#a^&=&t{>J-D5J82!ooo@1DyvQnJ?Ak16M z|2*+DmZ#$UFZAG!`W%KwfaCDBw_e8zu9 zkdkPs4A1z-1SyH8%KGOd_}M?>G#V-^#r`=SBG)(`cxy z6zg*#1G@0;`e3gr#OI%{N)MiYzAgdZsy=hX$&pI2K2_NB_<+K7Yb#nOAga07bu%@3aB9`B=(Tci zJ$1Ji)|#{<&4`BUYqh4n$y4BYi z;s$m}_ZQ{7j>C4;(DBhWGp{eUJwNe+x?W2n%iI-se|WzF_bc#!SAajr7Vr`ZtG>Ig zquQ!=uj$CXX^ zKBW`a^UwN=x*6WXpFfII|B4%5OIfnhUAZrXQOou3!Of4pdb#Dr+z{^JE9ik9PU~VeV&{39wtBU zjeXe*AOGyYzLSJYOBks!{&-I7+^Jp19r;QhOvTBBk6nrpkX<~4vvRHg literal 2060 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 diff --git a/Assets/ABI.CCK/Prefabs/Chair.prefab b/Assets/ABI.CCK/Prefabs/Chair.prefab index ab8f7ab92a7bd8cf04a54506254eb415df3e09cd..338d9bd8ae5dc88a712ea8894c8cbcffd8abc68c 100755 GIT binary patch literal 12876 zcmeHNeQaJ;89#UJ*oV_G@Bi7B4UCjYQ*~copYbJ_uTt- z-MaaQ#wR`Zp8NdH^PI2eJm)#*tx~I>RBBz9QtBg0t^O6>YTeqFtJkbw(=yVc{xvl< z<(vhcLttvE`K`CV`|2f6{eJV|1$TG<>A;Z{;C>Z}MV?S9-h>2^DSRTQpZeiI!M7V! zeAH2KBREv2RVGD$&QMW^fkcn){eF^qo| ze2)Keq%_e!)9d2`fEcP;5#s6fabXTO<9`SE9RE*f9FK(9f3Dy6lJ(1Vrc^;c`5@kf z5qVJOm1;`fcxmeGjl#_x!+sQm9TSmPuJ}QDiyGgz!!LQA+mY#YqcLQ3x!%wlafdp~ zmB=j@Jr>&*jPDQ1UO7^=T(9egs#xQX@9T0Wy%1&hxTF11=$A*4?<@voymq?>y1mMn zl<2Iq7bE|Gr(4F}VoG0LHq^Z0qNUF~-}0@46GvbA&1!JJgTzUS(DDB}Hscun6OL^I z4Eq2Ki-xTo8{R@$!)BRw0rAcncH-D-C1{v$LO&fRoe~|JF;AV*@<(8}-T0&_(6QCS zd%z`bJZ=+mhFCx4v3NC3$5v0iKf#S-Yhocyx_z*(0erD<+Oer7jqxG+rG0d4_4G^o z=-BGv(mpyi8^`#del7;quN~V7>ZfC~NbKife6s#akQ{XwPeWPzxfJYrxXj;W zGvG3R45HHVr|Hjs_g_ulS8+vQI$yMH;? z?2Sk=FZA^Vd}oPcJzEe<|210>%Vuyc8<6U4(w_pKewJly+)?Ynb7u)+MgL4etmvO> z5G(o@<=SV04AH+hhdb(Ie7)$WJ+~tX(U!SZM1MVBzYB%wYbk4dy-0H`%~}-wO99#A zYwM@4PveXs5U@lrvePnqElgz$ZTQwr)Sh>0>b)f!FTM2Gu|Gb(_nn{K{ENRm_i2C+ z<2dB#LQ0)ZAi@Eg%{b|RPGp={0H4V?TY=4HoT7gw;}rdKHBQk#lW~gvxf-YFr-9Wo zPSIb_IJ@9jZiYp1E@_-Hr^q4?w+iFFF5%NS(EnR`&UrN~Z zPFSp8B6t&sP>CUt|0X_JtqDXDQ1eXtzn|bb5GmL=o#%0|XkR7}v2kvcuOzq$L~NWV z;CH}cpr8YhIE~wZf(}FqY1|GJOdw+89jQPef5I|>g3N#Zgw?2>lgvK@k+k#R`28Kc zMHoExpMgkf`jDTe9z_3^gNfy?7>LxvS0#8;4mW{FD{$K8iX3j7pS0fuA~8xC66Y%I zXSrUo!*#e1cy|yb$AQ zi1x$r{Vi~|e=SnBe&X*ZcuO7p2=KFET$Eoo1CCoBjWf{5>Tdl`m*v)34sp4?;hhWQ{Ju z6yGgXR6m33;#M~*j&+tt0$^Frh##Uq)gc{k?+C(e zV{RC2_aZYSEPxB35cffm7VeLHbVoGzd+s=u^m`maZ`j;3naO5f^$hrBf4n-b_4fO> zlht00f`P$qcVfG5Zkp0OeR42io>bH8hVD3;6jm6w<+*GD+9-3QueH*QY1|xCXq!Ct zf^NV3caw|XKYskkKleU**V}tudwu@c$f3=DdH(vhe*VK}A6xY9Aj)`&V_1Mybvi*H z>zgeI5a?K&kX=86K)Zi-{R{$a+|++9_^e+C zfiXT3%JyFefdxUS%dX!9fi`}Fn*Ny~9|St81I0gw#QJGRD(1sbw*DrvV?GRJ>t7*2 z3a9>CAw~TclOOY8$We_tNGjs95sAT8nuzm&aX%8}R}zf*FyyHDmVGb?wDGfa5F@vB z3@27~S6`nw_xBJZfhT3-A^J_uZF{S1>20vG7gTMj{8Orw01c8FG{fn%hp-d2%#uw;A>T$5J9ho4|@?XHge-Vk}!yqtCTOM+{3 zlLnE`wtutc#kEqz)3>?wBX<9c{)-a*TWXRflhxmrlehI3a=6jooak>iYHQD|{;fHA zTmQBkZVtiMKtIQCdrh;+&_8f~cO-a62A>BUV;1)$_>K$?|DpH4y$QY(xT6ZSQsSRv zee9|sCL_4mN9PQ<*vEBsaPH5?!ABF+^~BrxFhu=n`{)v&hTA`bcY|-wzx^}#?i_CP zi+%LWqQ5sMZ|lcilc~Q^`;X6~bMzm5#A7@X%KGnq@STF7)MfkcJ;bMBji>jwfee0H z*QQYrlp=q>+BVqNSwP%k=DrkS-iZuA-vJ{ho^4 zaMX(`Cf;AU6JdVO(5*O2Y*8bnz>NmolB($6l$jesJNO>072}r_TvyAjujMu*iqY~x z7pF3`dTVuL#0$5m18!)t)RF#JXML?t`nQLz^(MTc&Y-7Wn4AH(`e^@X)gRW=p>1|* z>d>=;;ma4kfAFb?+^28q>)x^)ATRiEM%Ki0#EnT_#ggHi&i+dW{o`!s2*wxm6AeiA zIxv?3++P_zvW$)6G6+0(mR~wV|4f(3qJOTJ$)bNzu6=g<7w7Pk`=vwlb1YMC24i9C zuXm21Z@UGFvb;=A6XofLMZY;m#I+(>{X9ox#~;2e_BCIrWi?5Yp?wgSbIds`m+Am< z{;FIBpY1zWi#6#dAFTffD1ob+jeCwNNDb4&HUm_o(kG zEa#gbHy`QYgg1s^W;wR+k%V_13S0mNXW-F<_XhOcjc?Ke2cJDoeUCxkxM8UW6W&6& z1Zm6WpS|=CJuYxX!fQ)-_oLhw6Is^H^v2|qn!_4n+l4~1?xd1bYXE4rp({Et($6g7ojC8&l)uTqmq{s+Z;_X%vo_6=3>1EgQx z=S@VRJ1ug`IccWMKNZyG9eJ5=@;Sb^V~gmi2g;EPYa1p%OB|b1BC#_|C}z+Lino}z z;)waUD#N9I{C?Cy-uxA+UzF-U9__VXqUa>d6#pjE1uBU!K()$5$1Kr*80u$h&?#nche{7H~nau{tXln4r2fS literal 9282 zcmeHN-B05<5P#>d@ILH4Q52_1zuroL-Ab^FC?K6qr^-#7)^|x ztJPAy82#1>e6Q{G+r7Tm?{ve^_q>A-B%_~af6+(|4iL(w=I@Uzre`Uc7X#$!<`EZy z7E7MTET2#KNYS1o!eXhLS=ypSZ1=-`q5VNp=o>@28YBxPS{d`m^a zcs@WKyL<*~(_AarLa;gewVHisS)Jtu1_oP|DtAqQweiPRcjllepn zFxCLw=U`Wpv7Wi!igl3MW->7Tx|GaTnr=0?qD_SoEz+NExThX2a;5ML{8HH+t z)v2w;XIaa@PQyG}@cPkr$)vR8El*caM(?N)P&l`z(HUo)Ytv_BS=mWD^TXIRKw;%fdUJ=UmWFki)@lXIzXHM932=jj!BB#!wFh)LW_Ma(iQ76SpMPrK}8r301D9 zv8gS_kIEFFdD}ROd?k%8SEFdv1)sDxbkvnV<1b*J8FL$++YiB?CL)T+L&_mGHBzxxo^;> z;m-dP+Bg&KAGB#0=@+ztBG&l)f;PXP&2ylQyJ&XbBD8UvdlIy9!Wyl74+lA6jf1l3 z2FYSr8vwdYXw>i7hXjJh#HQELc4O}V>u4$qgaAWOi zS+O*Z^3?J>C0wnw5m;VR+#G%Eb^5)q<8}1KWyc(S4|n?=&kws+t1Z^ZUU^>35n;SR z`8g*5OyD^`rVDb%fTZ0Ap2(?gq9g9GMFq!rH7~?n$ z;u+}$q?aV^wud{jemjXBrDUPANdr0qm=#AUDT;9nj5AA^qVk|ma-K>CxAzHC7a^kA z63b=8G$oejK!`7?(6puQRPku|E3C+D^^ru(skFU2I9??Q6`M~~_Z96@S=gD**|M~_YbfpA@O0gh+jgq=?yz$iZZ?jbMnmmC;wb!aqq4wl$x z9`Q6K%K}Ix<89lk3VIzbqQaoEBHw_Cx?^IOF8Xp1Cqx7Ursu#+e@ zjpwJzNb14Jkd}`I*JfbBxCbVmIm{Aeov{A0;4-g&aLgZ+b%49v$CBY_=>O_@l*9r6&-(AapCGh{l?e#^+%2cl>AFF=> Dt6=Z) diff --git a/Assets/ABI.CCK/Prefabs/Mirror.prefab b/Assets/ABI.CCK/Prefabs/Mirror.prefab index 6a8600f4f0fa80ae29a73720b367d75f00d151e9..3c50b10365f8739e18afdd179630e0b646da4f12 100755 GIT binary patch literal 9708 zcmeHMeQX>@6`!^9(KLZHrKKqe&Dta(p>-N3O`#-d?qWNM8{0Yj5t@h))^}rj+q+w{ zx98X)m98y{sL~JAKlm)jK@|m(QjsE|f)Z7#kP<5K2PhH{sV$&FRnq78lM(o&1E6PjY2fOh_~3ZvH7kIn>REMG>d;t zOiWk{z_SQUOfP$_?*svpHIalB5H{7^poFkSx_Rn?F8|Jo|t5*IPP z?ch_ti}6mD#C3QnLjSC0=!c0ob(l;<@p`4d6_7#QypOnu(k?cYp1tjm`Li;lMcp(@-G z=b-;0_|*Rjq$troqw8ZOK&Yx*gm`p)e7FkN`acFf^?!@P@d%0I=lZ=8u3xS*Ark7z z2k{PQu+jUwe;-E%};-M^vth*yB^%{BXN=f4E(BN(~jZ2aBO$L zut#86G;HPA@HSLw*esJYAl{XR9Xhsh2^!|>kWa@+r$oo5%~NGm{gW`L2W@4__Rca%{p@7#~Ky=^q_iE%~N@ zbZoV7(?2@4I1c@weJ%#JuN>Pn?bETv>+A8G_UYJa;ii2$wm7Z>n-4A>D;*mGTbVHa zSYV@LLtrZt9VZ>132bz1$udg))r((Z{!L(`V~gYSVvduJtrCwqPP+=Xl>7(4r~Vp{ zEF?pmzo=tw1W<`b<$t6Kw^aS(;M4wAE4+lKCSyNO;*;&KL9)a+o|-D{XD!&Za5H}& zodP%W$4ykU{u~{9hnIG;-Cp1X2nb?SjESS-2t2mpr@Vrz_~CaC%1VGOLvA+XOM3QQ z2ph`lcY9v2&(Em5s@zu0NI+@>9bNhOVdtgm>rb>a{`KIg zy?aM5T-<%>?2@f@&t9Mo4QBKr27J=Ggj! zyAEIJO6<7xg=Jq_K^s4aWX4I~n80@>nYA_DfuDQ5nGXEy2FG5H6kj`fZG8-US~SbV zaZ79l&za%CZ{$yP;5YJTd*Ca7(mja6GH{O5x#wgD777lj-0`i>9R8^)h9s~JST~xc&iHR#q?p(X} z+_}rA4!rf^pR26lC5OGNQ_U}xZt5(8UXJ6bX8x;h zqvomGC^P>&v_+i<`~MDji=aG?zdCT&i4)Mz3gB4of`L0Sy~t~PU5MLNxIVOP0Z!X& zsKT}LGyT_ryM$7jjB_>pXSvG$^U%3Fl)u_kjMV4+8TmYL#OrJ4YUJxfTd6FC`eAVB z3+40B7A51njr?^0r<1?F3b)jy#xUel{|qAW`g&vXP>A1J1Mk529tVz};5aJl6Mrhi zo2J0ehWLgl@RvjUcH)T=o|>p1>i74++5e45mF*M%XNWh~z)u3d4#vg$o2I~VBd&06 zG%Dq90oH}I1lS!&BG$jSeK8iq>&NH+&MI7wFCDgzI9E~M5;oRH031K@35DYk67@s; z;Sj$Id@Es4AsA=7Wge&LxrT2X)}2DoGvs8vBLzh8Zkd+2d7Wgmj^&-4o8FgBXNwuh z(|xDMJ?Va##$7S1bhv{pN-O{C0X7U5-P*x4QW4 zbPD&Y%6eQW-}QVq7-NeLwkfWYEr=doM5K2*L3*e?Ki~nYBxj!Mx|oF3-=Q%ey?kWytY^RvBoOumCR0ecYV~s&Y@@VmL-}k92Yr(j%!tnbCLh zda^lIH3M$m%@uP>ZjXDEtYk6p`u2A^qphyKm5=h&EsNgfnPyUs@8r-WzrcN4HJ3d= zAI;pTzW}0)NnBs*&^FcWjU@&a-($CaXXU{+|8aI@&!sCr`E^s%&CghU=Pw*@>TiGQ zk!KrFbQ}q5`|9ltg2a3Im*l%Sp>Xp;CrU?{L^5Q8D1$dQ$+b3t<8V^3O<+U-o!Hge z8&UdS-rjJ2czeUOrZ#~U^TQz94UF^8O<rj6i z>OT_V>h>m5hW17K_-7z1w8ISpnhH}Cv(pU|&J@oC-N7tQZk7h^I1DrhU`*=-eCm zy~t=C6zsH@=uX4a*Vr`pH8$NJAaK?f~v!n*r6Vx7dS literal 3422 zcmeHKO>g5i5WV|Xa1WbP5{UYiZ;tb^2I9nslK@3g1Qa#0*_A|tq_XiA``9IdEMx-ylFkG8IZm zq7)V;oGU=PV;!NoRMmvDhBVTU9EbsJpdg|l2s&{RjegklJ0-IUnC?vMY>ig9 zBXO1s%zb>v#jH5R(N{T}`xAV=>g*1(FurKk*g>@M@K>io~9taW}b zRjB9FEuIeCy+7D{wvRoYn5&yg=wpc9>a>f{9W3g!1O=Loca+lp% znZ-p=V)@NN>_S48KPs$w{6>G(MSb1Sg0{_mr{+FOqp{q9a{ZGCfH3W?ADCktG}DTnDj@^ zfz?|Q%)x>UMJK==k~S3RdC);68d0~kJ8O>3+>nHBeAF8G@Hk~J=R$9KL+>_cL zkffO#?$4hwg-VD7Kqn3h<{Vw`iR8Law{m}Ud#BEFTV4Cc*cQxpda?ftW|vYt$n%h< zG%xau`*9fLDL|A)2@7(Hk9|u0Ou?+5kOQ`y&%_H<4(2Vt?%~C>3O3B~vdtGjC04VF zHE>&&?#sbD^%4hlX}O_q017DX<-@9QRP1QHQ6{G{PB}1>-+p6QO|qJICJcHJ#JKU_ DK>r*G diff --git a/Assets/ABI.CCK/Prefabs/VideoPlayer/Speakers.prefab b/Assets/ABI.CCK/Prefabs/VideoPlayer/Speakers.prefab index d1d726f39d92aa64260433a39e8af264b54528a1..f7257f767080b6f987a39df5412cc9b418c92bc8 100755 GIT binary patch literal 11340 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 QG;GX_frJ}S_8TPpA0~g4!vFvP diff --git a/Assets/ABI.CCK/Prefabs/VideoPlayer/VideoPlayerRoomScaleAudioPrefab.prefab b/Assets/ABI.CCK/Prefabs/VideoPlayer/VideoPlayerRoomScaleAudioPrefab.prefab index 3f9d8331763ac5316479f9803c219b1d8c2da6ea..24370a219bdb03697eab68341bf97472310ca245 100755 GIT binary patch literal 21828 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 literal 13165 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 z zdwepb#K8dp*`80`(5GR0(hIibRcE0OV8|)D%2~_M-5B6gve63N?CC|N!6$h@8g8k3aAT{xIxUfkK* z`5RNodR}Hy%SI>@71*wcZP;n`2-WuSOg1_T?Un|Mb@mP-w5=M(8nZH4%V7!VN=k3b zTbVZiu@Ahe095zIn7T7BjqwY%*;&fC^ZmRV09XZheBjI59+c;+Qdax}RCci3J6WBr zS*6aovfk1JNEYqE18u7l+sjUB@wCb(r-K;4i>3nd9pl;KMr}gB zfC*U|)EcJeKo|qf-H+sxOIga__?kTk=uW<08gw)=o*}%gzk7YyBB{h?2u2vwClJZg zB=mxWP?vJg!#HHrkF$t^3%TotNe7X{#-r_8Oln(=XF03uc?zwT$b{yr@Gj-GQEMpp zuQzK^BU=*CBdbxtQjU~FF-J|!Q}ig*8qoaQN5N;o+4T1+g_B&&{j5}rBqr&#gmEy6d`hsi0@c&MxQ8+9H8T91z0j^>C0Sr821}zk<-F%BN_p)TW-Eo|;h>1NrAbqjWnrDY-gLlKa!X z$E{BvbTJ-pjPg?uk;~-1f=;$B&Y?H< zh(jE>9vKI&L&sj=lQD}EGIpF0_-+__9@h>;`ok2wgjKvEf|}*NZ=vvqyH{U8=$^5i(_e zso`Sxcq5d)r7{D68kKxort@;a;XW~K`$B{OCE>oXhPJIzdoR_xDdLied?#7dXEM*( z2GHAfQ_$M#8(~1P8~#Z()v#?1y(fGl_MP8Ug+!A#@|1M@>sU zz`14H*fMAv_4%!0XvCF1p;p_M;?BmJlPJNvN9ZyuXjD6U+U~x%yV5tufbXR`W4XOh z(8et8?4xy822E_e{)>w@O!J(-q!(z9HoI}(7jD%=fmQ~c*nH3pbhqvY8ThXG1qwiE z1SN?Ey5+-R5dJvL?~x9sxVtzA@SJO!_zhtFz&>9EtnbIpSA=zU;?mFE!o%&6X=Tl) zx#6c)`;m6`z*ir3{$4Bk1@Le0$zBZq=uJp{irv5mB=sX`jUD;}eaCjN*655nkZ;TR rx5>2wdwdPKb|7xPO0I=Ahd!5R#7u#|kYvwqjQ$@AZNCio;vD)Ptc7M4 diff --git a/Assets/ABI.CCK/Prefabs/VideoPlayer/_AudioSourceRoom.prefab b/Assets/ABI.CCK/Prefabs/VideoPlayer/_AudioSourceRoom.prefab index 38f754681b407f45a99797278d2a2d9f66c2749d..2cdfbade9bc6b10c0a87ef720fd669738b40ddf1 100755 GIT binary patch literal 11180 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 AUjP6A literal 5267 zcmd^D-EZPJ5P#>d@IGvxT9j`R-dOsvNKg=Id%8QFkVzcyZDJ$GY0Iwmf4{MlK!6~f zv{G-omj_7f$#^_7p8S6E@%O=GjLfdt`S>unLm!F{Na9t$U{r4HxEt~8(lSi5-?_TF zQnMzyF#RA19N)66o@+XuZQEYw4rgS#{F_9w-$5u_l=q)$Om0)W%KOOB!$U3v$v2$E zl&wNuh^T%GeM@LcM%N(uU5m~HN$_&Sa*0_)`e)_`c~0c~Cn9pnSs!`T z@)@j6m^ShX!RD&Ry>`6NyR@s@~s z&-dV(K3WWlnDTPVbIvnu&jVhCQh+P^=#hcjS0vWsqe$6&?2&u?JR$k|KzS&!q|r@G zB^L*t9_52b(q~xNtV8EO=uUUnc@UW82^ZN<5V>s8NTj_3S~9M3G>>pP=gJA%W3S-! zOSIL$U-j<`IG`ar<2gMe+mH%Dt4cXgXKHou3+gIG!!=D~L74K_)!sPxzmTQ#`$MJ+TkW&%wGi9uHb5o>54A?3q`DY55s;xNK)b~1|zJ)GMQ?S#> zw09WN8-|xDiB;Yr)N+y?7@ih#Q%Jqf34JBvPVi!L>R_yn+%TmrQ?nFrr)=+Kcuby2TB)V%n$~sB(hK3&{fKL*p&4eDs*Z3gc$)Ggnee!>=F@hA^Za1d za%c={2_vFqY7Xm*#^f{Hz`+3sb&n%=1DXjld^h1yy^$VfEe%p{und@!=?Czv*#Ut_xo#b*YR|7wA1R z_b-fBS)s1V_e#3}JRPlTWmR{SYc`naT>L)<{zrY6Zv?^d zn|baR$~v(tKTyHn%z^bOe)q?AkH#&dXV`Af2wcFTzVA7%{p+CdGnlF!jXS2-3miM> znaUlG?R&lgVC};2UGN-`^g+_JoB%*u1prU6d$c5KE17qy&9?V>qhz?0sk zlMeU{Bq7daxW+Mm0oYwqjX8-3F!iI+>n+0>jiynQ7BQ*ta<-UoMPHwQUU0F~Fjh!- zCis#(=6JP}os%R5L6C2m!&@N!5%eBP{H$POwkZ7!gSyEu!TFcHk!1w-Y({|*um?l# z0u#!Q*sx{lfY<4O<6f|IdrQYl5)(U6oZZL`ydHsGl20(M)1f-5Wn1GD1`Y-omX|~% zp#pqYEX%Yju~1$<4tb%da%ocIWp!>F8M5JooOh#o0N^?B*k|(iR57h=FdrAQJ zkxEy+H^ocqB}0O8V7(!NLdaV$;V|}FHe+Hc?$seC4 yP0DF>-NPx}kmw^n(8KlmGc2IF1qlE~9CtTDFuhJB-PY4@Hb-}RDkXQVkbeN$Bqv?~ diff --git a/Assets/ABI.CCK/Scripts/APIConnection.cs b/Assets/ABI.CCK/Scripts/APIConnection.cs new file mode 100755 index 0000000..5a5708b --- /dev/null +++ b/Assets/ABI.CCK/Scripts/APIConnection.cs @@ -0,0 +1,176 @@ +using System; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Abi.Newtonsoft.Json; +using Abi.Newtonsoft.Json.Linq; +using UnityEngine; +using Object = System.Object; + +public static class APIConnection +{ + public static string APIAddress = "https://api.abinteractive.net"; + public static string APIVersion = "2"; + private static string _apiUserAgent = "ChilloutVR API-Requests"; + + private static HttpClient _client = new HttpClient(); + + private static string _username; + private static string _accessKey; + + private static bool _initialized = false; + public static bool Initialized + { + get => _initialized; + } + + public static void Initialize(string username, string accessKey) + { + if (username == "" || accessKey == "") return; + + _username = username; + _accessKey = accessKey; + + _client.DefaultRequestHeaders.Clear(); + + _client.DefaultRequestHeaders.Add("Username", _username); + _client.DefaultRequestHeaders.Add("AccessKey", _accessKey); + _client.DefaultRequestHeaders.Add("User-Agent", _apiUserAgent); + + _client.Timeout = TimeSpan.FromSeconds(30); + _initialized = true; + } + + public static async Task> MakeRequest(string url, Object data = null, string apiVersion = null, bool put = false) + { + if (!_initialized) return default(BaseResponse); + + JObject currentRequestData; + string currentRequestUrl = String.Empty; + int currentRequestType = 0; + + if (apiVersion == null) apiVersion = APIVersion; + + currentRequestUrl = $"{APIAddress}/{apiVersion}/{url}"; + + HttpResponseMessage response; + if (data != null) currentRequestType = 1; + if (put) currentRequestType = 2; + + if (currentRequestType == 0) + { + response = await _client.GetAsync(currentRequestUrl); + } + else if (currentRequestType == 2) + { + response = await _client.PutAsync(currentRequestUrl, null); + } + else + { + response = await _client.PostAsync(currentRequestUrl, new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json")); + } + + + if (response.IsSuccessStatusCode) + { + return JsonConvert.DeserializeObject>(await response.Content.ReadAsStringAsync()); + } + else + { + Debug.LogError($"Result from API Request {currentRequestUrl} returned {response.StatusCode}"); + } + + try + { + BaseResponse res = JsonConvert.DeserializeObject>(await response.Content.ReadAsStringAsync()); + if (res != null) + return res; + } + catch (Exception e) + { + Debug.LogError($"Result from API Request {currentRequestUrl} could not be parsed"); + } + + return default(BaseResponse); + } + + //Responses + public class BaseResponse + { + public string Message { get; set; } + public T Data { get; set; } + + public BaseResponse(string message = null, T data = default) + { + Message = message; + Data = data; + } + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } + } + + public class UserinfoResponse + { + public bool IsAccountUnlocked { get; set; } + public string UserId { get; set; } + public string Name { get; set; } + public string UserRank { get; set; } + } + + public enum ContentTypes + { + Avatar, + World, + Spawnable + } + + public class GenerateResponse + { + public Guid Id { get; set; } + public ContentTypes Type { get; set; } + } + + public class ContentInfoResponse + { + public string UploadLocation { get; set; } + public ContentDataIni ContentData { get; set; } + + public class ContentDataIni : GenericINI + { + public ContentTypes Type { get; set; } + public UgcTagsData Tags { get; set; } + } + } + + public class GenericINI + { + public string Id { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public Uri Image { get; set; } + } + + public struct UgcTagsData + { + public bool Gore; + public bool Horror; + public bool Jumpscare; + public bool Nudity; + public bool Suggestive; + public bool Violence; + public bool ContainsMusic; + public bool ExtremelyBright; + public bool ExtremelyHuge; + public bool ExtremelySmall; + public bool FlashingColors; + public bool FlashingLights; + public bool LoudAudio; + public bool ParticleSystems; + public bool ScreenEffects; + public bool SpawnAudio; + public bool LongRangeAudio; + } +} \ No newline at end of file diff --git a/Assets/ABI.CCK/Scripts/APIConnection.cs.meta b/Assets/ABI.CCK/Scripts/APIConnection.cs.meta new file mode 100755 index 0000000..c5a3c7e --- /dev/null +++ b/Assets/ABI.CCK/Scripts/APIConnection.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b6e98b6775f64bbdb3309a8b58773d81 +timeCreated: 1678553770 \ No newline at end of file diff --git a/Assets/ABI.CCK/Scripts/CVRAdvancedAvatarSettings.cs b/Assets/ABI.CCK/Scripts/CVRAdvancedAvatarSettings.cs index 3a46c92..8ec1ad9 100755 --- a/Assets/ABI.CCK/Scripts/CVRAdvancedAvatarSettings.cs +++ b/Assets/ABI.CCK/Scripts/CVRAdvancedAvatarSettings.cs @@ -179,6 +179,7 @@ namespace ABI.CCK.Scripts public bool useAnimationClip; public AnimationClip animationClip; + public AnimationClip offAnimationClip; public List gameObjectTargets = new List(); @@ -256,7 +257,14 @@ namespace ABI.CCK.Scripts if (useAnimationClip) { onClip = animationClip; - AssetDatabase.CreateAsset(offClip, folderPath + "/Anim_" + machineName + "_Toggle_Off.anim"); + if (offAnimationClip != null) + { + offClip = offAnimationClip; + } + else + { + AssetDatabase.CreateAsset(offClip, folderPath + "/Anim_" + machineName + "_Toggle_Off.anim"); + } } else { AssetDatabase.CreateAsset(offClip, folderPath + "/Anim_" + machineName + "_Toggle_Off.anim"); diff --git a/Assets/ABI.CCK/Scripts/Editor/CCK_AnimatorDriverEditor.cs b/Assets/ABI.CCK/Scripts/Editor/CCK_AnimatorDriverEditor.cs new file mode 100755 index 0000000..c20b84b --- /dev/null +++ b/Assets/ABI.CCK/Scripts/Editor/CCK_AnimatorDriverEditor.cs @@ -0,0 +1,353 @@ +using System; +using System.Collections.Generic; +using ABI.CCK.Components; +using UnityEditor; +using UnityEditorInternal; +using UnityEngine; +using AnimatorController = UnityEditor.Animations.AnimatorController; +using AnimatorControllerParameterType = UnityEngine.AnimatorControllerParameterType; + +[CustomEditor(typeof(ABI.CCK.Components.AnimatorDriver))] +public class CCK_AnimatorDriverEditor : UnityEditor.Editor +{ + private AnimatorDriver _animatorDriver; + + private ReorderableList _onEnterList; + private ReorderableList _onExitList; + + private List animatorParamNames = new List(); + private List animatorParamNamesDisplay = new List(); + private List animatorParamTypes = new List(); + + public override void OnInspectorGUI() + { + if (_animatorDriver == null) _animatorDriver = (AnimatorDriver) target; + + animatorParamNames.Clear(); + animatorParamNamesDisplay.Clear(); + animatorParamTypes.Clear(); + + animatorParamNames.Add("- None -"); + animatorParamNamesDisplay.Add("- None -"); + animatorParamTypes.Add(AnimatorDriverTask.ParameterType.None); + + var behaviorContext = AnimatorController.FindStateMachineBehaviourContext(_animatorDriver); + if (behaviorContext.Length > 0) + { + var controller = behaviorContext[0].animatorController; + + foreach (var parameter in controller.parameters) + { + switch (parameter.type) + { + case AnimatorControllerParameterType.Bool: + animatorParamNames.Add($"{parameter.name}"); + animatorParamNamesDisplay.Add($"{parameter.name} (Bool)"); + animatorParamTypes.Add(AnimatorDriverTask.ParameterType.Bool); + break; + case AnimatorControllerParameterType.Float: + animatorParamNames.Add($"{parameter.name}"); + animatorParamNamesDisplay.Add($"{parameter.name} (Float)"); + animatorParamTypes.Add(AnimatorDriverTask.ParameterType.Float); + break; + case AnimatorControllerParameterType.Int: + animatorParamNames.Add($"{parameter.name}"); + animatorParamNamesDisplay.Add($"{parameter.name} (Int)"); + animatorParamTypes.Add(AnimatorDriverTask.ParameterType.Int); + break; + case AnimatorControllerParameterType.Trigger: + animatorParamNames.Add($"{parameter.name}"); + animatorParamNamesDisplay.Add($"{parameter.name} (Trigger)"); + animatorParamTypes.Add(AnimatorDriverTask.ParameterType.Trigger); + break; + } + } + } + + if (_onEnterList == null) + { + _onEnterList = new ReorderableList(_animatorDriver.EnterTasks, typeof(AnimatorDriverTask), + true, true, true, true); + _onEnterList.drawHeaderCallback = OnDrawHeaderTaskEnter; + _onEnterList.drawElementCallback = OnDrawElementTaskEnter; + _onEnterList.elementHeightCallback = OnHeightElementTaskEnter; + } + + _onEnterList.DoLayoutList(); + + if (_onExitList == null) + { + _onExitList = new ReorderableList(_animatorDriver.ExitTasks, typeof(AnimatorDriverTask), + true, true, true, true); + _onExitList.drawHeaderCallback = OnDrawHeaderTaskExit; + _onExitList.drawElementCallback = OnDrawElementTaskExit; + _onExitList.elementHeightCallback = OnHeightElementTaskExit; + } + + _onExitList.DoLayoutList(); + } + + private void OnDrawHeaderTaskEnter(Rect rect) + { + Rect _rect = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight); + + GUI.Label(_rect, "On Enter State"); + } + + private void OnDrawElementTaskEnter(Rect rect, int index, bool isactive, bool isfocused) + { + if (index > _animatorDriver.EnterTasks.Count) return; + AnimatorDriverTask element = _animatorDriver.EnterTasks[index]; + + RenderTask(rect, element); + } + + private float OnHeightElementTaskEnter(int index) + { + int length = 3; + + if (index > _animatorDriver.EnterTasks.Count) return 1.25f * length * EditorGUIUtility.singleLineHeight; + AnimatorDriverTask task = _animatorDriver.EnterTasks[index]; + + return (length + TaskHeight(task)) * 1.25f * EditorGUIUtility.singleLineHeight; + } + + private void OnDrawHeaderTaskExit(Rect rect) + { + Rect _rect = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight); + + GUI.Label(_rect, "On Exit State"); + } + + private void OnDrawElementTaskExit(Rect rect, int index, bool isactive, bool isfocused) + { + if (index > _animatorDriver.ExitTasks.Count) return; + AnimatorDriverTask element = _animatorDriver.ExitTasks[index]; + + RenderTask(rect, element); + } + + private float OnHeightElementTaskExit(int index) + { + int length = 3; + + if (index > _animatorDriver.ExitTasks.Count) return 1.25f * length * EditorGUIUtility.singleLineHeight; + AnimatorDriverTask task = _animatorDriver.ExitTasks[index]; + + return (length + TaskHeight(task)) * 1.25f * EditorGUIUtility.singleLineHeight; + } + + private int TaskHeight(AnimatorDriverTask task) + { + int length = 0; + + switch (task.aType) + { + case AnimatorDriverTask.SourceType.Static: + case AnimatorDriverTask.SourceType.Parameter: + length += 1; + break; + case AnimatorDriverTask.SourceType.Random: + length += 2; + break; + } + + if (task.op != AnimatorDriverTask.Operator.Set) + { + length += 1; + + switch (task.bType) + { + case AnimatorDriverTask.SourceType.Static: + case AnimatorDriverTask.SourceType.Parameter: + length += 1; + break; + case AnimatorDriverTask.SourceType.Random: + length += 2; + break; + } + } + + length += 1; + + return length; + } + + private void RenderTask(Rect rect, AnimatorDriverTask task) + { + string formulaDisplay = ""; + + Rect _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); + + int parameterIndex = Math.Max(animatorParamNames.FindIndex(m => m == task.targetName), 0); + EditorGUI.LabelField(_rect, "Parameter"); + _rect.x += 100; + _rect.width = rect.width - 100; + int selectedIndex = EditorGUI.Popup(_rect, parameterIndex, animatorParamNamesDisplay.ToArray()); + task.targetType = animatorParamTypes[selectedIndex]; + task.targetName = animatorParamNames[selectedIndex]; + + formulaDisplay = $"{task.targetName} = "; + + rect.y += EditorGUIUtility.singleLineHeight * 1.25f; + _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); + + EditorGUI.LabelField(_rect, "Operation"); + _rect.x += 100; + _rect.width = rect.width - 100; + task.op = (AnimatorDriverTask.Operator) EditorGUI.EnumPopup(_rect, task.op); + + rect.y += EditorGUIUtility.singleLineHeight * 1.25f; + _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); + + EditorGUI.LabelField(_rect, "A Type"); + _rect.x += 100; + _rect.width = rect.width - 100; + task.aType = (AnimatorDriverTask.SourceType) EditorGUI.EnumPopup(_rect, task.aType); + + rect.y += EditorGUIUtility.singleLineHeight * 1.25f; + _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); + + switch (task.aType) + { + case AnimatorDriverTask.SourceType.Static: + EditorGUI.LabelField(_rect, "A Value"); + _rect.x += 100; + _rect.width = rect.width - 100; + task.aValue = EditorGUI.FloatField(_rect, task.aValue); + + formulaDisplay += $"{task.aValue} "; + break; + case AnimatorDriverTask.SourceType.Parameter: + parameterIndex = Math.Max(animatorParamNames.FindIndex(m => m == task.aName), 0); + EditorGUI.LabelField(_rect, "Parameter A"); + _rect.x += 100; + _rect.width = rect.width - 100; + selectedIndex = EditorGUI.Popup(_rect, parameterIndex, animatorParamNamesDisplay.ToArray()); + task.aParamType = animatorParamTypes[selectedIndex]; + task.aName = animatorParamNames[selectedIndex]; + + formulaDisplay += $"{task.aName} "; + break; + case AnimatorDriverTask.SourceType.Random: + EditorGUI.LabelField(_rect, "A Min"); + _rect.x += 100; + _rect.width = rect.width - 100; + task.aValue = EditorGUI.FloatField(_rect, task.aValue); + + rect.y += EditorGUIUtility.singleLineHeight * 1.25f; + _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); + + EditorGUI.LabelField(_rect, "A Max"); + _rect.x += 100; + _rect.width = rect.width - 100; + task.aMax = Convert.ToSingle(EditorGUI.TextField(_rect, task.aMax.ToString())); + + formulaDisplay += $"Rand({task.aValue}, {task.aMax}) "; + break; + } + + if (task.op != AnimatorDriverTask.Operator.Set) + { + rect.y += EditorGUIUtility.singleLineHeight * 1.25f; + _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); + + switch (task.op) + { + case AnimatorDriverTask.Operator.Addition: + formulaDisplay += "+ "; + break; + case AnimatorDriverTask.Operator.Subtraction: + formulaDisplay += "- "; + break; + case AnimatorDriverTask.Operator.Multiplication: + formulaDisplay += "* "; + break; + case AnimatorDriverTask.Operator.Division: + formulaDisplay += "/ "; + break; + case AnimatorDriverTask.Operator.Modulo: + formulaDisplay += "% "; + break; + case AnimatorDriverTask.Operator.Power: + formulaDisplay += "pow "; + break; + case AnimatorDriverTask.Operator.Log: + formulaDisplay += "log "; + break; + case AnimatorDriverTask.Operator.Equal: + formulaDisplay += "== "; + break; + case AnimatorDriverTask.Operator.LessThen: + formulaDisplay += "< "; + break; + case AnimatorDriverTask.Operator.LessEqual: + formulaDisplay += "<= "; + break; + case AnimatorDriverTask.Operator.MoreThen: + formulaDisplay += "> "; + break; + case AnimatorDriverTask.Operator.MoreEqual: + formulaDisplay += ">= "; + break; + case AnimatorDriverTask.Operator.NotEqual: + formulaDisplay += "!= "; + break; + } + + EditorGUI.LabelField(_rect, "B Type"); + _rect.x += 100; + _rect.width = rect.width - 100; + task.bType = (AnimatorDriverTask.SourceType) EditorGUI.EnumPopup(_rect, task.bType); + + rect.y += EditorGUIUtility.singleLineHeight * 1.25f; + _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); + + switch (task.bType) + { + case AnimatorDriverTask.SourceType.Static: + EditorGUI.LabelField(_rect, "B Value"); + _rect.x += 100; + _rect.width = rect.width - 100; + task.bValue = EditorGUI.FloatField(_rect, task.bValue); + + formulaDisplay += $"{task.bValue} "; + break; + case AnimatorDriverTask.SourceType.Parameter: + parameterIndex = Math.Max(animatorParamNames.FindIndex(m => m == task.bName), 0); + EditorGUI.LabelField(_rect, "Parameter B"); + _rect.x += 100; + _rect.width = rect.width - 100; + selectedIndex = EditorGUI.Popup(_rect, parameterIndex, animatorParamNamesDisplay.ToArray()); + task.bParamType = animatorParamTypes[selectedIndex]; + task.bName = animatorParamNames[selectedIndex]; + + formulaDisplay += $"{task.bName} "; + break; + case AnimatorDriverTask.SourceType.Random: + EditorGUI.LabelField(_rect, "B Min"); + _rect.x += 100; + _rect.width = rect.width - 100; + task.bValue = EditorGUI.FloatField(_rect, task.bValue); + + rect.y += EditorGUIUtility.singleLineHeight * 1.25f; + _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); + + EditorGUI.LabelField(_rect, "B Max"); + _rect.x += 100; + _rect.width = rect.width - 100; + task.bMax = Convert.ToSingle(EditorGUI.TextField(_rect, task.bMax.ToString())); + + formulaDisplay += $"Rand({task.bValue}, {task.bMax}) "; + break; + } + } + + var boldtext = new GUIStyle (GUI.skin.label); + boldtext.fontStyle = FontStyle.Bold; + + rect.y += EditorGUIUtility.singleLineHeight * 1.25f; + _rect = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight); + EditorGUI.LabelField(_rect, task.targetName == "- None -"?"Parameter = A":formulaDisplay, boldtext); + } +} \ No newline at end of file diff --git a/Assets/ABI.CCK/Scripts/Editor/CCK_AnimatorDriverEditor.cs.meta b/Assets/ABI.CCK/Scripts/Editor/CCK_AnimatorDriverEditor.cs.meta new file mode 100755 index 0000000..7cbc779 --- /dev/null +++ b/Assets/ABI.CCK/Scripts/Editor/CCK_AnimatorDriverEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cf1a3cb4c93d41c9b01fcf9f128fbca2 +timeCreated: 1685439016 \ No newline at end of file diff --git a/Assets/ABI.CCK/Scripts/Editor/CCK_BuildManagerWindow.cs b/Assets/ABI.CCK/Scripts/Editor/CCK_BuildManagerWindow.cs index f66ab87..1bd4ecf 100755 --- a/Assets/ABI.CCK/Scripts/Editor/CCK_BuildManagerWindow.cs +++ b/Assets/ABI.CCK/Scripts/Editor/CCK_BuildManagerWindow.cs @@ -23,9 +23,9 @@ namespace ABI.CCK.Scripts.Editor [InitializeOnLoad] public class CCK_BuildManagerWindow : EditorWindow { - public static string Version = "3.4 RELEASE"; - public static int BuildID = 90; - private const string CCKVersion = "3.4 RELEASE (Build 92)"; + public static string Version = "3.5 RELEASE"; + public static int BuildID = 98; + private const string CCKVersion = "3.5 RELEASE (Build 98)"; private string[] SupportedUnityVersions = new[] { @@ -34,7 +34,11 @@ namespace ABI.CCK.Scripts.Editor "2019.4.13f1", "2019.4.14f1", "2019.4.15f1", "2019.4.16f1", "2019.4.17f1", "2019.4.18f1", "2019.4.19f1", "2019.4.20f1", "2019.4.21f1", "2019.4.22f1", "2019.4.23f1", "2019.4.24f1", "2019.4.25f1", "2019.4.26f1", "2019.4.27f1", "2019.4.28f1", "2019.4.29f1", "2019.4.30f1", - "2019.4.31f1" + "2019.4.31f1", + "2021.3.1f1", "2021.3.2f1", "2021.3.3f1", "2021.3.4f1", "2021.3.5f1", "2021.3.6f1", "2021.3.7f1", + "2021.3.8f1", "2021.3.9f1", "2021.3.10f1", "2021.3.11f1", "2021.3.12f1", "2021.3.13f1", "2021.3.14f1", + "2021.3.15f1", "2021.3.16f1", "2021.3.17f1", "2021.3.18f1", "2021.3.19f1", "2021.3.20f1", "2021.3.21f1", + "2021.3.22f1", "2021.3.23f1", "2021.3.24f1" }; string _username; @@ -108,13 +112,41 @@ namespace ABI.CCK.Scripts.Editor { EditorPrefs.SetBool("m_ABI_isBuilding", false); EditorPrefs.SetString("m_ABI_TempVersion", Version); - if (File.Exists(Application.dataPath + "/ABI.CCK/Resources/Cache/_CVRAvatar.prefab")) File.Delete(Application.dataPath + "/ABI.CCK/Resources/Cache/_CVRAvatar.prefab"); - if (File.Exists(Application.dataPath + "/ABI.CCK/Resources/Cache/_CVRSpawnable.prefab")) File.Delete(Application.dataPath + "/ABI.CCK/Resources/Cache/_CVRSpawnable.prefab"); - if (File.Exists(Application.dataPath + "/ABI.CCK/Resources/Cache/_CVRWorld.prefab")) File.Delete(Application.dataPath + "/ABI.CCK/Resources/Cache/_CVRWorld.prefab"); - if (File.Exists(Application.persistentDataPath + "/bundle.cvravatar")) File.Delete(Application.persistentDataPath + "/bundle.cvravatar"); + + string[] filePaths = Directory.GetFiles(Application.dataPath + "/ABI.CCK/Resources/Cache/", "*.prefab"); + foreach (string filePath in filePaths) + { + File.Delete(filePath); + } + + filePaths = Directory.GetFiles(Application.persistentDataPath + "/", "*.cvravatar"); + foreach (string filePath in filePaths) + { + File.Delete(filePath); + } + + filePaths = Directory.GetFiles(Application.persistentDataPath + "/", "*.cvravatar.manifest"); + foreach (string filePath in filePaths) + { + File.Delete(filePath); + } + + filePaths = Directory.GetFiles(Application.persistentDataPath + "/", "*.cvrprop"); + foreach (string filePath in filePaths) + { + File.Delete(filePath); + } + + filePaths = Directory.GetFiles(Application.persistentDataPath + "/", "*.cvrprop.manifest"); + foreach (string filePath in filePaths) + { + File.Delete(filePath); + } + + /*if (File.Exists(Application.persistentDataPath + "/bundle.cvravatar")) File.Delete(Application.persistentDataPath + "/bundle.cvravatar"); if (File.Exists(Application.persistentDataPath + "/bundle.cvravatar.manifest")) File.Delete(Application.persistentDataPath + "/bundle.cvravatar.manifest"); if (File.Exists(Application.persistentDataPath + "/bundle.cvrprop")) File.Delete(Application.persistentDataPath + "/bundle.cvrprop"); - if (File.Exists(Application.persistentDataPath + "/bundle.cvrprop.manifest")) File.Delete(Application.persistentDataPath + "/bundle.cvrprop.manifest"); + if (File.Exists(Application.persistentDataPath + "/bundle.cvrprop.manifest")) File.Delete(Application.persistentDataPath + "/bundle.cvrprop.manifest");*/ if (File.Exists(Application.persistentDataPath + "/bundle.cvrworld")) File.Delete(Application.persistentDataPath + "/bundle.cvrworld"); if (File.Exists(Application.persistentDataPath + "/bundle.cvrworld.manifest")) File.Delete(Application.persistentDataPath + "/bundle.cvrworld.manifest"); if (File.Exists(Application.persistentDataPath + "/bundle.png")) File.Delete(Application.persistentDataPath + "/bundle.png"); @@ -128,10 +160,15 @@ namespace ABI.CCK.Scripts.Editor if (state == PlayModeStateChange.EnteredPlayMode && EditorPrefs.GetBool("m_ABI_isBuilding")) { + CCK_BuildUtility.upload_id = EditorPrefs.GetString("m_ABI_uploadId"); + string randomNum = EditorPrefs.GetString("m_ABI_uploadRand"); + var ui = Instantiate(AssetDatabase.LoadAssetAtPath("Assets/ABI.CCK/GUIAssets/CCK_UploaderHead.prefab")); OnGuiUpdater up = ui.GetComponentInChildren(); if (File.Exists(Application.dataPath + "/ABI.CCK/Resources/Cache/_CVRAvatar.prefab"))up.asset = Resources.Load("Cache/_CVRAvatar").GetComponent(); + if (File.Exists(Application.dataPath + $"/ABI.CCK/Resources/Cache/CVRAvatar_{CCK_BuildUtility.upload_id}_{randomNum}.prefab"))up.asset = Resources.Load($"Cache/CVRAvatar_{CCK_BuildUtility.upload_id}_{randomNum}").GetComponent(); if (File.Exists(Application.dataPath + "/ABI.CCK/Resources/Cache/_CVRSpawnable.prefab"))up.asset = Resources.Load("Cache/_CVRSpawnable").GetComponent(); + if (File.Exists(Application.dataPath + $"/ABI.CCK/Resources/Cache/CVRSpawnable_{CCK_BuildUtility.upload_id}_{randomNum}.prefab"))up.asset = Resources.Load($"Cache/CVRSpawnable_{CCK_BuildUtility.upload_id}_{randomNum}").GetComponent(); if (File.Exists(Application.dataPath + "/ABI.CCK/Resources/Cache/_CVRWorld.prefab"))up.asset = Resources.Load("Cache/_CVRWorld").GetComponent(); } } @@ -690,71 +727,30 @@ namespace ABI.CCK.Scripts.Editor { _attemptingToLogin = true; - using (HttpClient httpclient = new HttpClient()) - { - HttpResponseMessage response; - response = await httpclient.PostAsync( - "https://api.abinteractive.net/1/cck/validateKey", - new StringContent(JsonConvert.SerializeObject(new {Username = _username, AccessKey = _key}), - Encoding.UTF8, "application/json") - ); + APIConnection.Initialize(_username, _key); + APIConnection.BaseResponse response = await APIConnection.MakeRequest("cck/userinfo"); - if (response.IsSuccessStatusCode) + if (response != null) + { + if (response.Data != null) { - string result = await response.Content.ReadAsStringAsync(); - BaseResponse usr = Abi.Newtonsoft.Json.JsonConvert.DeserializeObject>(result); - - if (usr == null || usr.Data == null) return; - - if (usr.Data.isValidCredentials) - { - _apiUserRank = usr.Data.userRank; - Debug.Log("[ABI:CCK] Successfully authenticated as " + _username + " using AlphaLink Public API."); - EditorPrefs.SetString("m_ABI_Username", _username); - EditorPrefs.SetString("m_ABI_Key", _key); - _loggedIn = true; - _hasAttemptedToLogin = false; - } - else - { - Debug.Log("[ABI:CCK] Unable to authenticate using provided credentials. API responded with: " + usr.Message + "."); - _loggedIn = false; - _hasAttemptedToLogin = true; - _username = _key = string.Empty; - } + _apiUserRank = response.Data.UserRank; + Debug.Log("[ABI:CCK] Successfully authenticated as " + _username + " using AlphaLink Public API."); + EditorPrefs.SetString("m_ABI_Username", _username); + EditorPrefs.SetString("m_ABI_Key", _key); + _loggedIn = true; + _hasAttemptedToLogin = false; } else { - Debug.LogError("[ABI:CCK] Web Request Error while trying to authenticate."); + Debug.Log("[ABI:CCK] Unable to authenticate using provided credentials. API responded with: " + response.Message + "."); + _loggedIn = false; + _hasAttemptedToLogin = true; + _username = _key = string.Empty; } } _attemptingToLogin = false; } } } - - public class LoginResponse - { - public bool isValidCredentials { get; set; } - public bool isAccountUnlocked { get; set; } - public string userId { get; set; } - public string userRank { get; set; } - } - - public class BaseResponse - { - public string Message { get; set; } - public T Data { get; set; } - - public BaseResponse(string message = null, T data = default) - { - Message = message; - Data = data; - } - - public override string ToString() - { - return JsonConvert.SerializeObject(this); - } - } } \ No newline at end of file diff --git a/Assets/ABI.CCK/Scripts/Editor/CCK_BuildUtility.cs b/Assets/ABI.CCK/Scripts/Editor/CCK_BuildUtility.cs index 30ea1a2..1aa6f27 100755 --- a/Assets/ABI.CCK/Scripts/Editor/CCK_BuildUtility.cs +++ b/Assets/ABI.CCK/Scripts/Editor/CCK_BuildUtility.cs @@ -1,11 +1,14 @@ using System; +using System.Collections; using System.Collections.Generic; +using System.Threading.Tasks; using ABI.CCK.Components; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; +using Random = System.Random; namespace ABI.CCK.Scripts.Editor { @@ -13,8 +16,10 @@ namespace ABI.CCK.Scripts.Editor { public static PreAvatarBundleEvent PreAvatarBundleEvent = new PreAvatarBundleEvent(); public static PrePropBundleEvent PrePropBundleEvent = new PrePropBundleEvent(); + + public static string upload_id = ""; - public static void BuildAndUploadAvatar(GameObject avatarObject) + public static async Task BuildAndUploadAvatar(GameObject avatarObject) { //GameObject avatarCopy = null; var origInfo = avatarObject.GetComponent(); @@ -33,17 +38,35 @@ namespace ABI.CCK.Scripts.Editor //CVRAssetInfo info = avatarCopy.GetComponent(); if (string.IsNullOrEmpty(origInfo.objectId)) { - origInfo.objectId = Guid.NewGuid().ToString(); - //origInfo.guid = info.guid; - try +#if UNITY_EDITOR + APIConnection.Initialize(EditorPrefs.GetString("m_ABI_Username"), EditorPrefs.GetString("m_ABI_Key")); +#endif + + APIConnection.BaseResponse response = await APIConnection.MakeRequest("cck/generate/avatar", put: true); + + if (response != null && response.Data != null) { - PrefabUtility.ApplyPrefabInstance(avatarObject, InteractionMode.UserAction); + origInfo.objectId = response.Data.Id.ToString(); } - catch + else { - Debug.Log("[CCK:BuildUtility] Object is not a prefab. No need to Apply To Instance."); + Debug.LogError($"[CCK:BuildUtility] New Guid could not be generated"); } } + + Random rnd = new Random(); + origInfo.randomNum = rnd.Next(11111111, 99999999).ToString(); + + EditorUtility.SetDirty(origInfo); + + try + { + PrefabUtility.ApplyPrefabInstance(avatarObject, InteractionMode.UserAction); + } + catch + { + Debug.Log("[CCK:BuildUtility] Object is not a prefab. No need to Apply To Instance."); + } PreAvatarBundleEvent.Invoke(avatarObject); @@ -51,7 +74,10 @@ namespace ABI.CCK.Scripts.Editor EditorSceneManager.SaveScene(EditorSceneManager.GetActiveScene()); - PrefabUtility.SaveAsPrefabAsset(avatarObject, "Assets/ABI.CCK/Resources/Cache/_CVRAvatar.prefab"); + if (!Application.unityVersion.Contains("2021")) + PrefabUtility.SaveAsPrefabAsset(avatarObject, "Assets/ABI.CCK/Resources/Cache/_CVRAvatar.prefab"); + else + PrefabUtility.SaveAsPrefabAsset(avatarObject, $"Assets/ABI.CCK/Resources/Cache/CVRAvatar_{origInfo.objectId}_{origInfo.randomNum}.prefab"); //GameObject.DestroyImmediate(avatarCopy); EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); @@ -59,11 +85,19 @@ namespace ABI.CCK.Scripts.Editor EditorSceneManager.SaveScene(EditorSceneManager.GetActiveScene()); AssetBundleBuild assetBundleBuild = new AssetBundleBuild(); - assetBundleBuild.assetNames = new[] {"Assets/ABI.CCK/Resources/Cache/_CVRAvatar.prefab"}; - assetBundleBuild.assetBundleName = "bundle.cvravatar"; + if (!Application.unityVersion.Contains("2021")) + assetBundleBuild.assetNames = new[] {"Assets/ABI.CCK/Resources/Cache/_CVRAvatar.prefab"}; + else + assetBundleBuild.assetNames = new[] {$"Assets/ABI.CCK/Resources/Cache/CVRAvatar_{origInfo.objectId}_{origInfo.randomNum}.prefab"}; + + upload_id = origInfo.objectId; + EditorPrefs.SetString("m_ABI_uploadId", upload_id); + EditorPrefs.SetString("m_ABI_uploadRand", origInfo.randomNum); + + assetBundleBuild.assetBundleName = $"cvravatar_{origInfo.objectId}_{origInfo.randomNum}.cvravatar"; BuildPipeline.BuildAssetBundles(Application.persistentDataPath, new[] {assetBundleBuild}, - BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget); + BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget); AssetDatabase.Refresh(); @@ -71,13 +105,35 @@ namespace ABI.CCK.Scripts.Editor EditorApplication.isPlaying = true; } - public static void BuildAndUploadSpawnable(GameObject s) + public static async Task BuildAndUploadSpawnable(GameObject s) { GameObject sCopy = null; var origInfo = s.GetComponent(); var spawnable = s.GetComponent(); spawnable.spawnableType = CVRSpawnable.SpawnableType.StandaloneSpawnable; + if (string.IsNullOrEmpty(origInfo.objectId)) + { +#if UNITY_EDITOR + APIConnection.Initialize(EditorPrefs.GetString("m_ABI_Username"), EditorPrefs.GetString("m_ABI_Key")); +#endif + + APIConnection.BaseResponse response = await APIConnection.MakeRequest("cck/generate/spawnable", put: true); + + if (response != null && response.Data != null) + { + origInfo.objectId = response.Data.Id.ToString(); + } + else + { + Debug.LogError($"[CCK:BuildUtility] New Guid could not be generated"); + } + } + + Random rnd = new Random(); + origInfo.randomNum = rnd.Next(11111111, 99999999).ToString(); + EditorUtility.SetDirty(origInfo); + PrePropBundleEvent.Invoke(s); try @@ -92,25 +148,25 @@ namespace ABI.CCK.Scripts.Editor } CVRAssetInfo info = sCopy.GetComponent(); - if (string.IsNullOrEmpty(info.objectId)) + + try { - info.objectId = Guid.NewGuid().ToString(); - origInfo.objectId = info.objectId; - try - { - PrefabUtility.ApplyPrefabInstance(s, InteractionMode.UserAction); - } - catch - { - Debug.Log("[CCK:BuildUtility] Object is not a prefab. No need to Apply To Instance."); - } + PrefabUtility.ApplyPrefabInstance(s, InteractionMode.UserAction); + } + catch + { + Debug.Log("[CCK:BuildUtility] Object is not a prefab. No need to Apply To Instance."); } EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); EditorSceneManager.SaveScene(EditorSceneManager.GetActiveScene()); - PrefabUtility.SaveAsPrefabAsset(sCopy, "Assets/ABI.CCK/Resources/Cache/_CVRSpawnable.prefab"); + if (!Application.unityVersion.Contains("2021")) + PrefabUtility.SaveAsPrefabAsset(sCopy, "Assets/ABI.CCK/Resources/Cache/_CVRSpawnable.prefab"); + else + PrefabUtility.SaveAsPrefabAsset(sCopy, $"Assets/ABI.CCK/Resources/Cache/CVRSpawnable_{origInfo.objectId}_{origInfo.randomNum}.prefab"); + GameObject.DestroyImmediate(sCopy); EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); @@ -118,11 +174,20 @@ namespace ABI.CCK.Scripts.Editor EditorSceneManager.SaveScene(EditorSceneManager.GetActiveScene()); AssetBundleBuild assetBundleBuild = new AssetBundleBuild(); - assetBundleBuild.assetNames = new[] {"Assets/ABI.CCK/Resources/Cache/_CVRSpawnable.prefab"}; - assetBundleBuild.assetBundleName = "bundle.cvrprop"; + + if (!Application.unityVersion.Contains("2021")) + assetBundleBuild.assetNames = new[] {"Assets/ABI.CCK/Resources/Cache/_CVRSpawnable.prefab"}; + else + assetBundleBuild.assetNames = new[] {$"Assets/ABI.CCK/Resources/Cache/CVRSpawnable_{origInfo.objectId}_{origInfo.randomNum}.prefab"}; + + upload_id = origInfo.objectId; + EditorPrefs.SetString("m_ABI_uploadId", upload_id); + EditorPrefs.SetString("m_ABI_uploadRand", origInfo.randomNum); + + assetBundleBuild.assetBundleName = $"cvrspawnable_{origInfo.objectId}_{origInfo.randomNum}.cvrprop"; BuildPipeline.BuildAssetBundles(Application.persistentDataPath, new[] {assetBundleBuild}, - BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget); + BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget); AssetDatabase.Refresh(); @@ -130,17 +195,35 @@ namespace ABI.CCK.Scripts.Editor EditorApplication.isPlaying = true; } - public static void BuildAndUploadMapAsset(Scene scene, GameObject descriptor) + public static async Task BuildAndUploadMapAsset(Scene scene, GameObject descriptor) { SetupNetworkUUIDs(); + + CVRAssetInfo info = descriptor.GetComponent(); + + if (string.IsNullOrEmpty(info.objectId)) + { +#if UNITY_EDITOR + APIConnection.Initialize(EditorPrefs.GetString("m_ABI_Username"), EditorPrefs.GetString("m_ABI_Key")); +#endif + + APIConnection.BaseResponse response = await APIConnection.MakeRequest("cck/generate/world", put: true); + if (response != null && response.Data != null) + { + info.objectId = response.Data.Id.ToString(); + EditorUtility.SetDirty(info); + } + else + { + Debug.LogError($"[CCK:BuildUtility] New Guid could not be generated"); + } + } + EditorSceneManager.MarkSceneDirty(scene); EditorSceneManager.SaveScene(EditorSceneManager.GetActiveScene()); - - CVRAssetInfo info = descriptor.GetComponent(); - if (string.IsNullOrEmpty(info.objectId)) info.objectId = Guid.NewGuid().ToString(); - + PrefabUtility.SaveAsPrefabAsset(descriptor, "Assets/ABI.CCK/Resources/Cache/_CVRWorld.prefab"); AssetBundleBuild assetBundleBuild = new AssetBundleBuild(); @@ -148,7 +231,7 @@ namespace ABI.CCK.Scripts.Editor assetBundleBuild.assetBundleName = "bundle.cvrworld"; BuildPipeline.BuildAssetBundles(Application.persistentDataPath, new[] {assetBundleBuild}, - BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget); + BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget); AssetDatabase.Refresh(); diff --git a/Assets/ABI.CCK/Scripts/Editor/CCK_CVRAnimatorDriverEditor.cs b/Assets/ABI.CCK/Scripts/Editor/CCK_CVRAnimatorDriverEditor.cs index c5f8391..64ac452 100755 --- a/Assets/ABI.CCK/Scripts/Editor/CCK_CVRAnimatorDriverEditor.cs +++ b/Assets/ABI.CCK/Scripts/Editor/CCK_CVRAnimatorDriverEditor.cs @@ -109,18 +109,33 @@ namespace ABI.CCK.Scripts.Editor if (_driver.animators[index] != null && _driver.animators[index].runtimeAnimatorController != null) { - var controller = (AnimatorController) _driver.animators[index].runtimeAnimatorController; - foreach (var parameter in controller.parameters) + var runtimeController = _driver.animators[index].runtimeAnimatorController; + UnityEngine.AnimatorControllerParameter[] parameters = null; + + if (runtimeController is AnimatorController animatorController) { - animatorParamNameList.Add(parameter.name); - animatorParamTypeList.Add(parameter.type); + parameters = animatorController.parameters; + } + else if (runtimeController is AnimatorOverrideController overrideController && + overrideController.runtimeAnimatorController is AnimatorController baseController) + { + parameters = baseController.parameters; + } - if (_driver.animatorParameters[index] == parameter.name) + if (parameters != null) + { + foreach (var parameter in parameters) { - oldIndex = i; - } + animatorParamNameList.Add(parameter.name); + animatorParamTypeList.Add(parameter.type); - i++; + if (_driver.animatorParameters[index] == parameter.name) + { + oldIndex = i; + } + + i++; + } } } diff --git a/Assets/ABI.CCK/Scripts/Editor/CCK_CVRAvatarEditor.cs b/Assets/ABI.CCK/Scripts/Editor/CCK_CVRAvatarEditor.cs index 7370a11..9f47d49 100755 --- a/Assets/ABI.CCK/Scripts/Editor/CCK_CVRAvatarEditor.cs +++ b/Assets/ABI.CCK/Scripts/Editor/CCK_CVRAvatarEditor.cs @@ -105,6 +105,9 @@ namespace ABI.CCK.Scripts.Editor _avatar.visemeMode = (CVRAvatar.CVRAvatarVisemeMode) EditorGUILayout.EnumPopup("Lip Sync Mode", _avatar.visemeMode); + if (_avatar.visemeMode == CVRAvatar.CVRAvatarVisemeMode.Visemes) + _avatar.visemeSmoothing = EditorGUILayout.IntSlider("Viseme Smoothing", _avatar.visemeSmoothing, 0, 100); + if (_avatar.visemeBlendshapes == null || _avatar.visemeBlendshapes.Length != _visemeNames.Length) _avatar.visemeBlendshapes = new string[_visemeNames.Length]; @@ -153,7 +156,7 @@ namespace ABI.CCK.Scripts.Editor if (_avatar.enableAdvancedTagging) { - EditorGUILayout.HelpBox("Attention! If you are using the Advanced Tagging System, you still need to Tag your Avatar appropriately and Set all affected GameObjects here.", MessageType.Warning); + EditorGUILayout.HelpBox("If you are using the Advanced Tagging System, you do not need to Tag your Avatar appropriately if you mark all affected GameObjects here.", MessageType.Info); if (taggingList == null) InitializeTaggingList(); taggingList.DoLayoutList(); @@ -429,7 +432,7 @@ namespace ABI.CCK.Scripts.Editor float height = 10.50f; if (gameObjectToggle.useAnimationClip) { - height -= 1.25f; + //height -= 1.25f; } else { @@ -781,6 +784,15 @@ namespace ABI.CCK.Scripts.Editor _rect.x += 100; _rect.width = rect.width - 100; gameObjectToggle.animationClip = (AnimationClip)EditorGUI.ObjectField(_rect, gameObjectToggle.animationClip, typeof(AnimationClip), true); + + rect.y += EditorGUIUtility.singleLineHeight * 1.25f; + _rect = new Rect(rect.x, rect.y, 100, EditorGUIUtility.singleLineHeight); + + // Animation Clip Slot + EditorGUI.LabelField(_rect, "Off Clip"); + _rect.x += 100; + _rect.width = rect.width - 100; + gameObjectToggle.offAnimationClip = (AnimationClip)EditorGUI.ObjectField(_rect, gameObjectToggle.offAnimationClip, typeof(AnimationClip), true); } else { diff --git a/Assets/ABI.CCK/Scripts/Editor/CCK_CVRInteractableEditor.cs b/Assets/ABI.CCK/Scripts/Editor/CCK_CVRInteractableEditor.cs index 67a9f60..11e9d61 100755 --- a/Assets/ABI.CCK/Scripts/Editor/CCK_CVRInteractableEditor.cs +++ b/Assets/ABI.CCK/Scripts/Editor/CCK_CVRInteractableEditor.cs @@ -455,6 +455,12 @@ namespace ABI.CCK.Scripts.Editor break; + case CVRInteractableActionOperation.ActionType.DisplaySpawnableDetailPage: + + trigger.operations[j].stringVal = EditorGUILayout.TextField("Spawnable GUID:", trigger.operations[j].stringVal); + + break; + case CVRInteractableActionOperation.ActionType.SitAtPosition: trigger.operations[j].gameObjectVal = (GameObject)EditorGUILayout.ObjectField( diff --git a/Assets/ABI.CCK/Scripts/Editor/CCK_CVR_VideoPlayerEditor.cs b/Assets/ABI.CCK/Scripts/Editor/CCK_CVR_VideoPlayerEditor.cs index e580f75..f730de4 100755 --- a/Assets/ABI.CCK/Scripts/Editor/CCK_CVR_VideoPlayerEditor.cs +++ b/Assets/ABI.CCK/Scripts/Editor/CCK_CVR_VideoPlayerEditor.cs @@ -133,7 +133,7 @@ public class CCK_CVR_VideoPlayerEditor : Editor { #region General settings - _showGeneral = EditorGUILayout.BeginFoldoutHeaderGroup(_showGeneral, "General"); + _showGeneral = EditorGUILayout.Foldout(_showGeneral, "General"); if (_showGeneral) { _player.syncEnabled = EditorGUILayout.Toggle("Network Sync", _player.syncEnabled); @@ -170,14 +170,11 @@ public class CCK_CVR_VideoPlayerEditor : Editor EditorGUILayout.Space(); } - EditorGUILayout.EndFoldoutHeaderGroup(); - #endregion #region Audio settings - _showAudio = EditorGUILayout.BeginFoldoutHeaderGroup(_showAudio, "Audio"); - + _showAudio = EditorGUILayout.Foldout(_showAudio, "Audio"); if (_showAudio) { _player.playbackVolume = EditorGUILayout.Slider("Playback Volume", _player.playbackVolume, 0.0f, 1.0f); @@ -190,15 +187,12 @@ public class CCK_CVR_VideoPlayerEditor : Editor EditorGUILayout.Space(); } - - EditorGUILayout.EndFoldoutHeaderGroup(); - + #endregion #region Playlists - _showPlaylists = EditorGUILayout.BeginFoldoutHeaderGroup(_showPlaylists, "Playlists"); - + _showPlaylists = EditorGUILayout.Foldout(_showPlaylists, "Playlists"); if (_showPlaylists) { EditorGUILayout.LabelField(new GUIContent("Play On Awake Object", "Default video to play on start/awake"), new GUIContent(_player.playOnAwakeObject?.videoTitle)); @@ -211,14 +205,11 @@ public class CCK_CVR_VideoPlayerEditor : Editor EditorGUILayout.Space(); } - EditorGUILayout.EndFoldoutHeaderGroup(); - #endregion #region Events _showEvents = EditorGUILayout.BeginFoldoutHeaderGroup(_showEvents, "Events"); - if (_showEvents) { serializedObject.Update(); @@ -238,8 +229,6 @@ public class CCK_CVR_VideoPlayerEditor : Editor serializedObject.ApplyModifiedProperties(); EditorGUILayout.Space(); } - - EditorGUILayout.EndFoldoutHeaderGroup(); #endregion } diff --git a/Assets/ABI.CCK/Scripts/Editor/CCK_Init.cs b/Assets/ABI.CCK/Scripts/Editor/CCK_Init.cs index e5aa217..670ac10 100755 --- a/Assets/ABI.CCK/Scripts/Editor/CCK_Init.cs +++ b/Assets/ABI.CCK/Scripts/Editor/CCK_Init.cs @@ -1,7 +1,9 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; +using UnityEngine.XR; #pragma warning disable @@ -13,13 +15,25 @@ public class CCK_Init void SetTag(SerializedProperty tags, string name, int index) { - SerializedProperty sp = tags.GetArrayElementAtIndex(index); + SerializedProperty sp = null; + try + { + sp = tags.GetArrayElementAtIndex(index); + } + catch{} + if (sp != null) sp.stringValue = name; } void SetLayer(SerializedProperty layers, string name, int index) { - SerializedProperty sp = layers.GetArrayElementAtIndex(index); + SerializedProperty sp = null; + try + { + sp = layers.GetArrayElementAtIndex(index); + } + catch{} + if (sp != null) sp.stringValue = name; } @@ -73,17 +87,33 @@ public class CCK_Init tagManager.ApplyModifiedProperties(); } +#if UNITY_2021_1_OR_NEWER + if (true) +#else if (!PlayerSettings.virtualRealitySupported) +#endif { Debug.Log("[CCK:Init] XR and render settings have to be changed. Now changing."); - EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64); +#if PLATFORM_ANDROID + if (EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android) + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.Android); +#else + if (EditorUserBuildSettings.activeBuildTarget != BuildTarget.StandaloneWindows64) + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64); +#endif PlayerSettings.colorSpace = UnityEngine.ColorSpace.Linear; PlayerSettings.apiCompatibilityLevel = ApiCompatibilityLevel.NET_4_6; +#if UNITY_2021_1_OR_NEWER + PlayerSettings.virtualRealitySupported = true; + PlayerSettings.stereoRenderingPath = StereoRenderingPath.Instancing; + XRSettings.enabled = false; +#else PlayerSettings.virtualRealitySupported = true; PlayerSettings.SetVirtualRealitySDKs(BuildTargetGroup.Standalone, new string[] { "None", "Oculus", "OpenVR", "MockHMD" }); PlayerSettings.stereoRenderingPath = StereoRenderingPath.SinglePass; +#endif } if (LayerMask.LayerToName(10) == "PlayerNetwork" && LayerMask.LayerToName(17) == "CVRPickup" && LayerMask.LayerToName(15) == "CVRReserved4" && PlayerSettings.virtualRealitySupported ) diff --git a/Assets/ABI.CCK/Scripts/Runtime/CCK_RuntimeUploaderMaster.cs b/Assets/ABI.CCK/Scripts/Runtime/CCK_RuntimeUploaderMaster.cs index e843c8a..59ee6af 100755 --- a/Assets/ABI.CCK/Scripts/Runtime/CCK_RuntimeUploaderMaster.cs +++ b/Assets/ABI.CCK/Scripts/Runtime/CCK_RuntimeUploaderMaster.cs @@ -33,17 +33,17 @@ namespace ABI.CCK.Scripts.Runtime var overwritePic = string.Empty; if (!File.Exists($"{Application.persistentDataPath}/bundle.png")) gameObject.GetComponent().SaveTexture(updater.camObj.GetComponent(), updater.tex); - StartCoroutine(UploadAssetAndSendInformation(updater.asset.GetComponent().objectId, type.ToString(), sfwLevel, updater.assetName.text, updater.assetDesc.text, updater.dontOverridePicture.isOn)); + StartCoroutine(UploadAssetAndSendInformation(updater.asset.objectId, type.ToString(), sfwLevel, updater.assetName.text, updater.assetDesc.text, updater.dontOverridePicture.isOn, updater.asset.randomNum)); } - private IEnumerator UploadAssetAndSendInformation(string contentId, string type, string sfwLevel, string assetName, string assetDesc, bool overwritePic) + private IEnumerator UploadAssetAndSendInformation(string contentId, string type, string sfwLevel, string assetName, string assetDesc, bool overwritePic, string randomNum) { string[] path = null; if (type == "Avatar") { path = new string[3]; - path[0] = $"file://{Application.persistentDataPath}/bundle.cvravatar"; - path[1] = $"file://{Application.persistentDataPath}/bundle.cvravatar.manifest"; + path[0] = $"file://{Application.persistentDataPath}/cvravatar_{contentId}_{randomNum}.cvravatar"; + path[1] = $"file://{Application.persistentDataPath}/cvravatar_{contentId}_{randomNum}.cvravatar.manifest"; path[2] = $"file://{Application.persistentDataPath}/bundle.png"; } if (type == "World") @@ -58,8 +58,8 @@ namespace ABI.CCK.Scripts.Runtime if (type == "Spawnable") { path = new string[3]; - path[0] = $"file://{Application.persistentDataPath}/bundle.cvrprop"; - path[1] = $"file://{Application.persistentDataPath}/bundle.cvrprop.manifest"; + path[0] = $"file://{Application.persistentDataPath}/cvrspawnable_{contentId}_{randomNum}.cvrprop"; + path[1] = $"file://{Application.persistentDataPath}/cvrspawnable_{contentId}_{randomNum}.cvrprop.manifest"; path[2] = $"file://{Application.persistentDataPath}/bundle.png"; } @@ -77,6 +77,13 @@ namespace ABI.CCK.Scripts.Runtime form.AddField("ContentDescription", assetDesc); form.AddField("ContentChangelog", updater.assetChangelog.text); +#if PLATFORM_ANDROID + form.AddField("Platform", "android_standalone"); +#else + form.AddField("Platform", "pc_standalone"); +#endif + form.AddField("CompatibilityVersion", Application.unityVersion.Contains("2021") ? 2 : 1); + if (updater.LoudAudio.isOn) form.AddField("Tag_LoudAudio", 1); if (updater.LongRangeAudio.isOn) form.AddField("Tag_LongRangeAudio", 1); if (updater.ContainsMusic.isOn) form.AddField("Tag_ContainsMusic", 1); diff --git a/Assets/ABI.CCK/Scripts/Runtime/CCK_RuntimeVariableStream.cs b/Assets/ABI.CCK/Scripts/Runtime/CCK_RuntimeVariableStream.cs index 0d938e2..091fd2c 100755 --- a/Assets/ABI.CCK/Scripts/Runtime/CCK_RuntimeVariableStream.cs +++ b/Assets/ABI.CCK/Scripts/Runtime/CCK_RuntimeVariableStream.cs @@ -2,6 +2,7 @@ using System; using System.Collections; using System.Net.Http; using System.Text; +using System.Threading.Tasks; using Abi.Newtonsoft.Json; using UnityEditor; using UnityEngine; @@ -19,164 +20,77 @@ namespace ABI.CCK.Scripts.Runtime { OnGuiUpdater updater = gameObject.GetComponent(); string type = updater.asset.type.ToString(); + string uploadRegion = "0"; +#if UNITY_EDITOR + APIConnection.Initialize(EditorPrefs.GetString("m_ABI_Username"), EditorPrefs.GetString("m_ABI_Key")); + EditorPrefs.GetInt("ABI_PREF_UPLOAD_REGION").ToString(); +#endif + + Task> task = Task.Run(() => APIConnection.MakeRequest( + $"cck/contentInfo/{type}/{updater.asset.objectId}?platform=pc_standalone®ion={uploadRegion}")); + + while (!task.IsCompleted) yield return null; - using (HttpClient httpclient = new HttpClient()) + APIConnection.BaseResponse response = task.Result; + + if (response != null) { - HttpResponseMessage response; - response = httpclient.PostAsync( - "https://api.abinteractive.net/1/cck/parameterStream", - new StringContent(JsonConvert.SerializeObject(new - { - ContentType = type, ContentId = updater.asset.objectId, -#if UNITY_EDITOR - Username = EditorPrefs.GetString("m_ABI_Username"), - AccessKey = EditorPrefs.GetString("m_ABI_Key"), - UploadRegion = EditorPrefs.GetInt("ABI_PREF_UPLOAD_REGION").ToString() -#endif - }), - Encoding.UTF8, "application/json") - ).GetAwaiter().GetResult(); - - if (response.IsSuccessStatusCode) + if (response.Data != null) { - string result = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); - BaseResponse streamResponse = Abi.Newtonsoft.Json.JsonConvert .DeserializeObject>(result); + updater.UploadLocation = response.Data.UploadLocation; + Debug.Log($"Upload Location: {updater.UploadLocation}"); + updater.assetName.text = response.Data.ContentData.Name; + updater.assetDesc.text = response.Data.ContentData.Description; - if (streamResponse == null || streamResponse.Data == null) - { -#if UNITY_EDITOR - EditorUtility.ClearProgressBar(); - if (UnityEditor.EditorUtility.DisplayDialog("Alpha Blend Interactive CCK", - "Request failed. Unable to connect to the Gateway. The Gateway might be unavailable. Check https://status.abinteractive.net for more info.", - "Okay")) - { - EditorApplication.isPlaying = false; - } -#endif - yield break; - } + updater.LoudAudio.isOn = response.Data.ContentData.Tags.LoudAudio; + updater.LongRangeAudio.isOn = response.Data.ContentData.Tags.LongRangeAudio; + updater.SpawnAudio.isOn = response.Data.ContentData.Tags.SpawnAudio; + updater.ContainsMusic.isOn = response.Data.ContentData.Tags.ContainsMusic; - if (!streamResponse.Data.HasPermission) - { -#if UNITY_EDITOR - EditorUtility.ClearProgressBar(); - if (UnityEditor.EditorUtility.DisplayDialog("Alpha Blend Interactive CCK", - "Request failed. The provided content ID does not belong to your account.", "Okay")) - { - EditorApplication.isPlaying = false; - } -#endif - yield break; - } + updater.ScreenEffects.isOn = response.Data.ContentData.Tags.ScreenEffects; + updater.FlashingColors.isOn = response.Data.ContentData.Tags.FlashingColors; + updater.FlashingLights.isOn = response.Data.ContentData.Tags.FlashingLights; + updater.ExtremelyBright.isOn = response.Data.ContentData.Tags.ExtremelyBright; + updater.ParticleSystems.isOn = response.Data.ContentData.Tags.ParticleSystems; - if (streamResponse.Data.IsAtUploadLimit) - { -#if UNITY_EDITOR - EditorUtility.ClearProgressBar(); - if (UnityEditor.EditorUtility.DisplayDialog("Alpha Blend Interactive CCK", - "Request failed. Your account has reached the upload limit. Please consider buying the Unlocked account.", - "Okay")) - { - EditorApplication.isPlaying = false; - } -#endif - } + updater.Violence.isOn = response.Data.ContentData.Tags.Violence; + updater.Gore.isOn = response.Data.ContentData.Tags.Gore; + updater.Horror.isOn = response.Data.ContentData.Tags.Horror; + updater.Jumpscare.isOn = response.Data.ContentData.Tags.Jumpscare; - if (streamResponse.Data.IsBannedFromUploading) - { -#if UNITY_EDITOR - EditorUtility.ClearProgressBar(); - if (UnityEditor.EditorUtility.DisplayDialog("Alpha Blend Interactive CCK", - "Request failed. Your upload permissions are suspended. For more information, consult your moderation profile in the ABI community hub.", - "Okay")) - { - EditorApplication.isPlaying = false; - } -#endif - } + updater.ExcessivelySmall.isOn = response.Data.ContentData.Tags.ExtremelySmall; + updater.ExcessivelyHuge.isOn = response.Data.ContentData.Tags.ExtremelyHuge; - updater.UploadLocation = streamResponse.Data.UploadLocation; - - updater.assetName.text = streamResponse.Data.ObjectName; - updater.assetDesc.text = streamResponse.Data.ObjectDescription; - - updater.LoudAudio.isOn = streamResponse.Data.LoudAudio; - updater.LongRangeAudio.isOn = streamResponse.Data.LongRangeAudio; - updater.SpawnAudio.isOn = streamResponse.Data.SpawnAudio; - updater.ContainsMusic.isOn = streamResponse.Data.ContainsMusic; - - updater.ScreenEffects.isOn = streamResponse.Data.ScreenFx; - updater.FlashingColors.isOn = streamResponse.Data.FlashingColors; - updater.FlashingLights.isOn = streamResponse.Data.FlashingLights; - updater.ExtremelyBright.isOn = streamResponse.Data.ExtremelyBright; - updater.ParticleSystems.isOn = streamResponse.Data.ParticleSystems; - - updater.Violence.isOn = streamResponse.Data.Violence; - updater.Gore.isOn = streamResponse.Data.Gore; - updater.Horror.isOn = streamResponse.Data.Horror; - updater.Jumpscare.isOn = streamResponse.Data.Jumpscare; - - updater.ExcessivelySmall.isOn = streamResponse.Data.ExtremelySmall; - updater.ExcessivelyHuge.isOn = streamResponse.Data.ExtremelyHuge; - - updater.Suggestive.isOn = streamResponse.Data.Suggestive; - updater.Nudity.isOn = streamResponse.Data.Nudity; + updater.Suggestive.isOn = response.Data.ContentData.Tags.Suggestive; + updater.Nudity.isOn = response.Data.ContentData.Tags.Nudity; } + else + { +#if UNITY_EDITOR + EditorUtility.ClearProgressBar(); + if (UnityEditor.EditorUtility.DisplayDialog("Alpha Blend Interactive CCK", + response.Message, "Okay")) + { + EditorApplication.isPlaying = false; + } +#endif + yield break; + } + } + else + { +#if UNITY_EDITOR + EditorUtility.ClearProgressBar(); + if (UnityEditor.EditorUtility.DisplayDialog("Alpha Blend Interactive CCK", + "An Error occured while uploading. Please try again later.", "Okay")) + { + EditorApplication.isPlaying = false; + } +#endif + yield break; } } } - - [Serializable] - public class VariableStreamResponse - { - public bool HasPermission { get; set; } - public bool IsAtUploadLimit { get; set; } - public bool IsBannedFromUploading { get; set; } - - public string UploadLocation { get; set; } - - public string ObjectName { get; set; } - public string ObjectDescription { get; set; } - - public bool LoudAudio { get; set; } - public bool LongRangeAudio { get; set; } - public bool SpawnAudio { get; set; } - public bool ContainsMusic { get; set; } - - public bool ScreenFx { get; set; } - public bool FlashingColors { get; set; } - public bool FlashingLights { get; set; } - public bool ExtremelyBright { get; set; } - public bool ParticleSystems { get; set; } - - public bool Violence { get; set; } - public bool Gore { get; set; } - public bool Horror { get; set; } - public bool Jumpscare { get; set; } - - public bool ExtremelySmall { get; set; } - public bool ExtremelyHuge { get; set; } - - public bool Suggestive { get; set; } - public bool Nudity { get; set; } - } - - public class BaseResponse - { - public string Message { get; set; } - public T Data { get; set; } - - public BaseResponse(string message = null, T data = default) - { - Message = message; - Data = data; - } - - public override string ToString() - { - return JsonConvert.SerializeObject(this); - } - } } \ No newline at end of file diff --git a/Assets/ABI.CCK/Scripts/Runtime/OnGuiUpdater.cs b/Assets/ABI.CCK/Scripts/Runtime/OnGuiUpdater.cs index 61e2662..53acc58 100755 --- a/Assets/ABI.CCK/Scripts/Runtime/OnGuiUpdater.cs +++ b/Assets/ABI.CCK/Scripts/Runtime/OnGuiUpdater.cs @@ -114,7 +114,7 @@ namespace ABI.CCK.Scripts.Runtime camObj.name = "ShotCam for CVR CCK"; camObj.transform.rotation = new Quaternion(0,180,0,0); CVRAvatar avatar = asset.GetComponent(); - if (asset.type == CVRAssetInfo.AssetType.Avatar) camObj.transform.position = new Vector3(avatar.viewPosition.x, avatar.viewPosition.y, avatar.viewPosition.z *= 5f); + if (avatar != null && asset.type == CVRAssetInfo.AssetType.Avatar) camObj.transform.position = new Vector3(avatar.viewPosition.x, avatar.viewPosition.y, avatar.viewPosition.z *= 5f); var cam = camObj.AddComponent(); cam.aspect = 1f; cam.nearClipPlane = 0.01f; @@ -125,21 +125,23 @@ namespace ABI.CCK.Scripts.Runtime #if UNITY_EDITOR #endif + + string content_id = asset.objectId; if (type == CVRAssetInfo.AssetType.Avatar) { - assetFileSizeText.text = ToFileSizeString(new FileInfo(Application.persistentDataPath + "/bundle.cvravatar").Length); + assetFileSizeText.text = ToFileSizeString(new FileInfo(Application.persistentDataPath + $"/cvravatar_{content_id}_{asset.randomNum}.cvravatar").Length); assetImageFileSizeText.text = "N/A"; - assetFileManifestSizeText.text = ToFileSizeString(new FileInfo(Application.persistentDataPath + "/bundle.cvravatar.manifest").Length); + assetFileManifestSizeText.text = ToFileSizeString(new FileInfo(Application.persistentDataPath + $"/cvravatar_{content_id}_{asset.randomNum}.cvravatar.manifest").Length); assetFilePano1SizeText.text = "N/A"; assetFilePano4SizeText.text = "N/A"; } if (type == CVRAssetInfo.AssetType.Spawnable) { - assetFileSizeText.text = ToFileSizeString(new FileInfo(Application.persistentDataPath + "/bundle.cvrprop").Length); + assetFileSizeText.text = ToFileSizeString(new FileInfo(Application.persistentDataPath + $"/cvrspawnable_{content_id}_{asset.randomNum}.cvrprop").Length); assetImageFileSizeText.text = ""; - assetFileManifestSizeText.text = ToFileSizeString(new FileInfo(Application.persistentDataPath + "/bundle.cvrprop.manifest").Length); + assetFileManifestSizeText.text = ToFileSizeString(new FileInfo(Application.persistentDataPath + $"/cvrspawnable_{content_id}_{asset.randomNum}.cvrprop.manifest").Length); assetFilePano1SizeText.text = "N/A"; assetFilePano4SizeText.text = "N/A"; } diff --git a/Assets/ABI.CCK/Scripts/ShaderCompatibilityPreprocessor.cs b/Assets/ABI.CCK/Scripts/ShaderCompatibilityPreprocessor.cs index ad15c79..6a5d006 100755 --- a/Assets/ABI.CCK/Scripts/ShaderCompatibilityPreprocessor.cs +++ b/Assets/ABI.CCK/Scripts/ShaderCompatibilityPreprocessor.cs @@ -16,6 +16,9 @@ public class ShaderCompatibilityPreprocessor : IPreprocessShaders public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList data) { +#if UNITY_2021_1_OR_NEWER + //Do nothing here +#else if(EditorUserBuildSettings.activeBuildTarget == BuildTarget.StandaloneWindows64) { List reworkedData = new List(); @@ -47,6 +50,7 @@ public class ShaderCompatibilityPreprocessor : IPreprocessShaders data.Add(entry); } } +#endif } } #endif \ No newline at end of file diff --git a/Assets/ABI.CCK/Textures/24718.renderTexture b/Assets/ABI.CCK/Textures/24718.renderTexture index c44b4bdd83b1b82e31762ef2ce203fe1536b3f7a..34f71a4c213c4de93bbeb4570671a25957f0d0de 100755 GIT binary patch literal 4236 zcmeI0O>7%Q6vy8>EfAo5l$NhjJ`1$81h1PmiG-picA7*qQmETT0wFZ9C-H*4Ywb=% zavO0d2P#fnk;u?q|FP?vaF7NMg8MdM*FucT) z7r*{AAg_PXgMGa0_)7(R#_>}He97^b3wYh}R|>dt{M7?E-(LcbKRR8&w;exIz&~;P zwF3T`<7W%_ZO6|Q@UI-__sPBaFJad|fc=QdXLn*~eg6LS8#q6oHwyT!Q5CQ}O1!H3QrQ zZY@>a>#n`w+BLMbsFR-p_!~)ktD|dtZ*qcg;!*55D=o{dz8jfQ21XeeWnh$nQ3n3s v8Q>qxmC31a`hacn7eX!;zlx{P;ZHpN5sL3pB#i%qkpJ;CDLltlp2z-Q_sLn% literal 785 zcmah{O>f&U487-9sE78n6mc40nQu)+?wfZn58CzHEzmJk81jD|3 zFwDnC^6}A^pNr}}%dWH0<$bYc7sCZ}(B*^T?&YSvZnS(eon%=)8jr_5JD;(u`E25! z(H*K5%{_i~gTZ{nm^^$uK4IfFyv3D(&gN_q;H5SOZLd|!Rafi5G#HsVdwt{rw7>p(U5w|rqOy5Ex@KvKzc_BNY`W?KmzF12!~oZWyud6kS=G#mu~hV2fG zFA5}YYQIk^TX5A@b&75k90l1ddvKh-(!kj6=l@ZobEMw> z=K}Ju;=-Y+bW78G2fs(5xYco-4@vEU%s2yk1O3C9?!(=$;XZ9ta*67Eb9vZlF-Q#N GdCm`5FzjIf