From 282fb334ca3a5b31b38c8200b13615a4fe6e92ed Mon Sep 17 00:00:00 2001 From: alexiscatnip Date: Mon, 10 May 2021 02:17:18 +0800 Subject: [PATCH] WIP of porting radegast viewer source code --- Assets/DebugTextVM.cs | 10 + Assets/DebugTextVM.cs.meta | 11 + Assets/DebugToggleManager.cs | 59 + Assets/DebugToggleManager.cs.meta | 11 + .../Plugins/{Catnip.meta => Disruptor.meta} | 2 +- Assets/Plugins/Disruptor/ConcurrentQueue.cs | 242 + .../Plugins/Disruptor/ConcurrentQueue.cs.meta | 11 + .../Plugins/Disruptor/DisruptorASMDEF.asmdef | 14 + .../Disruptor/DisruptorASMDEF.asmdef.meta | 7 + Assets/Plugins/Disruptor/RingBuffer.cs | 275 + Assets/Plugins/Disruptor/RingBuffer.cs.meta | 11 + Assets/Plugins/Disruptor/Test.cs | 74 + Assets/Plugins/Disruptor/Test.cs.meta | 11 + .../LibreMetaverse/Capabilities/CapsClient.cs | 13 +- Assets/Plugins/LibreMetaverse/Caps.cs | 2 +- .../LibreMetaverseAssembly.asmdef | 4 +- Assets/Plugins/LibreMetaverse/Login.cs | 2 + Assets/Raindrop/CurrentOutfitFolder.cs | 688 ++ Assets/Raindrop/Gridmanager.cs | 169 + Assets/Raindrop/Gridmanager.cs.meta | 11 + Assets/Raindrop/NameManager.cs | 723 +++ Assets/Raindrop/Netcom/ChatSentEventArgs.cs | 64 + Assets/Raindrop/Netcom/Enums.cs | 40 + .../Netcom/InstantMessageSentEventArgs.cs | 71 + Assets/Raindrop/Netcom/LoginOptions.cs | 133 + Assets/Raindrop/Netcom/Netcom.cs | 420 ++ Assets/Raindrop/Netcom/NetcomEvents.cs | 127 + Assets/Raindrop/Netcom/OverrideEventArgs.cs | 55 + Assets/Raindrop/Netcom/StartLocationParser.cs | 125 + .../Raindrop/Netcom/TeleportingEventArgs.cs | 56 + Assets/Raindrop/RaindropClient.cs | 394 +- Assets/Raindrop/RaindropEvents.cs | 24 +- Assets/Raindrop/RaindropInstance.cs | 851 +++ Assets/Raindrop/RaindropInstance.cs.meta | 11 + Assets/Raindrop/RaindropMovement.cs | 171 + Assets/Raindrop/RaindropUnity.asmdef | 17 + Assets/Raindrop/RaindropUnity.asmdef.meta | 7 + Assets/Raindrop/Settings.cs | 417 ++ Assets/Raindrop/Settings.cs.meta | 11 + Assets/Raindrop/StateManager.cs | 1224 ++++ Assets/{ => Raindrop}/Unity.meta | 0 Assets/Raindrop/Unity/Global.cs | 42 + Assets/{ => Raindrop}/Unity/Global.cs.meta | 0 Assets/Raindrop/Unity/RaindropViewManager.cs | 77 + .../Unity/RaindropViewManager.cs.meta | 0 Assets/{ => Raindrop}/Unity/Singleton.cs | 0 Assets/{ => Raindrop}/Unity/Singleton.cs.meta | 0 Assets/{ => Raindrop}/Unity/UI.meta | 0 .../Unity/UI/CanvasIdentifier.cs | 0 .../Unity/UI/CanvasIdentifier.cs.meta | 0 .../{ => Raindrop}/Unity/UI/CanvasManager.cs | 11 +- .../Unity/UI/CanvasManager.cs.meta | 0 Assets/{ => Raindrop}/Unity/UI/LoginVM.cs | 29 +- .../{ => Raindrop}/Unity/UI/LoginVM.cs.meta | 0 Assets/{ => Raindrop}/Unity/UI/ModalLogic.cs | 0 .../Unity/UI/ModalLogic.cs.meta | 0 Assets/Raindrop/mainUI.cs | 32 + Assets/Scenes/DebugDash.unity | 5563 +++++++++++++++++ Assets/Scenes/DebugDash.unity.meta | 7 + Assets/Scenes/SampleScene.unity | 333 +- Assets/Tests/RaindropTests.cs | 23 + Assets/Tests/RaindropTests.cs.meta | 11 + Assets/Tests/Tests.asmdef | 3 +- Assets/Unity/Global.cs | 32 - Assets/Unity/RaindropViewManager.cs | 70 - Assets/UnityMainThreadDispatcher.cs | 133 + Assets/UnityMainThreadDispatcher.cs.meta | 11 + Assets/grids.xml | 471 ++ Assets/grids.xml.meta | 7 + 69 files changed, 13121 insertions(+), 302 deletions(-) create mode 100644 Assets/DebugTextVM.cs create mode 100644 Assets/DebugTextVM.cs.meta create mode 100644 Assets/DebugToggleManager.cs create mode 100644 Assets/DebugToggleManager.cs.meta rename Assets/Plugins/{Catnip.meta => Disruptor.meta} (77%) create mode 100644 Assets/Plugins/Disruptor/ConcurrentQueue.cs create mode 100644 Assets/Plugins/Disruptor/ConcurrentQueue.cs.meta create mode 100644 Assets/Plugins/Disruptor/DisruptorASMDEF.asmdef create mode 100644 Assets/Plugins/Disruptor/DisruptorASMDEF.asmdef.meta create mode 100644 Assets/Plugins/Disruptor/RingBuffer.cs create mode 100644 Assets/Plugins/Disruptor/RingBuffer.cs.meta create mode 100644 Assets/Plugins/Disruptor/Test.cs create mode 100644 Assets/Plugins/Disruptor/Test.cs.meta create mode 100644 Assets/Raindrop/CurrentOutfitFolder.cs create mode 100644 Assets/Raindrop/Gridmanager.cs create mode 100644 Assets/Raindrop/Gridmanager.cs.meta create mode 100644 Assets/Raindrop/NameManager.cs create mode 100644 Assets/Raindrop/Netcom/ChatSentEventArgs.cs create mode 100644 Assets/Raindrop/Netcom/Enums.cs create mode 100644 Assets/Raindrop/Netcom/InstantMessageSentEventArgs.cs create mode 100644 Assets/Raindrop/Netcom/LoginOptions.cs create mode 100644 Assets/Raindrop/Netcom/Netcom.cs create mode 100644 Assets/Raindrop/Netcom/NetcomEvents.cs create mode 100644 Assets/Raindrop/Netcom/OverrideEventArgs.cs create mode 100644 Assets/Raindrop/Netcom/StartLocationParser.cs create mode 100644 Assets/Raindrop/Netcom/TeleportingEventArgs.cs create mode 100644 Assets/Raindrop/RaindropInstance.cs create mode 100644 Assets/Raindrop/RaindropInstance.cs.meta create mode 100644 Assets/Raindrop/RaindropMovement.cs create mode 100644 Assets/Raindrop/RaindropUnity.asmdef create mode 100644 Assets/Raindrop/RaindropUnity.asmdef.meta create mode 100644 Assets/Raindrop/Settings.cs create mode 100644 Assets/Raindrop/Settings.cs.meta create mode 100644 Assets/Raindrop/StateManager.cs rename Assets/{ => Raindrop}/Unity.meta (100%) create mode 100644 Assets/Raindrop/Unity/Global.cs rename Assets/{ => Raindrop}/Unity/Global.cs.meta (100%) create mode 100644 Assets/Raindrop/Unity/RaindropViewManager.cs rename Assets/{ => Raindrop}/Unity/RaindropViewManager.cs.meta (100%) rename Assets/{ => Raindrop}/Unity/Singleton.cs (100%) rename Assets/{ => Raindrop}/Unity/Singleton.cs.meta (100%) rename Assets/{ => Raindrop}/Unity/UI.meta (100%) rename Assets/{ => Raindrop}/Unity/UI/CanvasIdentifier.cs (100%) rename Assets/{ => Raindrop}/Unity/UI/CanvasIdentifier.cs.meta (100%) rename Assets/{ => Raindrop}/Unity/UI/CanvasManager.cs (84%) rename Assets/{ => Raindrop}/Unity/UI/CanvasManager.cs.meta (100%) rename Assets/{ => Raindrop}/Unity/UI/LoginVM.cs (74%) rename Assets/{ => Raindrop}/Unity/UI/LoginVM.cs.meta (100%) rename Assets/{ => Raindrop}/Unity/UI/ModalLogic.cs (100%) rename Assets/{ => Raindrop}/Unity/UI/ModalLogic.cs.meta (100%) create mode 100644 Assets/Raindrop/mainUI.cs create mode 100644 Assets/Scenes/DebugDash.unity create mode 100644 Assets/Scenes/DebugDash.unity.meta create mode 100644 Assets/Tests/RaindropTests.cs create mode 100644 Assets/Tests/RaindropTests.cs.meta delete mode 100644 Assets/Unity/Global.cs delete mode 100644 Assets/Unity/RaindropViewManager.cs create mode 100644 Assets/UnityMainThreadDispatcher.cs create mode 100644 Assets/UnityMainThreadDispatcher.cs.meta create mode 100644 Assets/grids.xml create mode 100644 Assets/grids.xml.meta diff --git a/Assets/DebugTextVM.cs b/Assets/DebugTextVM.cs new file mode 100644 index 0000000..405f830 --- /dev/null +++ b/Assets/DebugTextVM.cs @@ -0,0 +1,10 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class DebugTextVM : MonoBehaviour +{ + + + +} diff --git a/Assets/DebugTextVM.cs.meta b/Assets/DebugTextVM.cs.meta new file mode 100644 index 0000000..1573b21 --- /dev/null +++ b/Assets/DebugTextVM.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f003e7629ecbbdb4c9867c281c3c59c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/DebugToggleManager.cs b/Assets/DebugToggleManager.cs new file mode 100644 index 0000000..95bce25 --- /dev/null +++ b/Assets/DebugToggleManager.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +//attached to panel UI. simply toggles UI panels. +public class DebugToggleManager : MonoBehaviour +{ + public Stack panelStack; + + public GameObject loginPanel; + + public GameObject gamePanel; + + public GameObject defaultOnPanel; + + private void Awake() + { + panelStack = new Stack(); + + defaultOnPanel = loginPanel; + addPaneltoView(defaultOnPanel); + removeTopPanelFromView(); + + gamePanel.SetActive(false); + } + + public void togglePanel(GameObject panel) + { + if (panel.activeInHierarchy == false) + { + addPaneltoView(panel); + } else + { + removeTopPanelFromView(); + } + } + + + public void removeTopPanelFromView() + { + GameObject toppanel; + if (panelStack.Count != 0) + { + toppanel = panelStack.Peek(); + panelStack.Pop(); + toppanel.SetActive(false); + } + } + + public void addPaneltoView(GameObject defaultOnPanel) + { + panelStack.Push(defaultOnPanel); + + + + defaultOnPanel.SetActive(true); + } +} diff --git a/Assets/DebugToggleManager.cs.meta b/Assets/DebugToggleManager.cs.meta new file mode 100644 index 0000000..85d6f93 --- /dev/null +++ b/Assets/DebugToggleManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9047a9f086d8beb429cb9bad0fe6fbd7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Catnip.meta b/Assets/Plugins/Disruptor.meta similarity index 77% rename from Assets/Plugins/Catnip.meta rename to Assets/Plugins/Disruptor.meta index b827153..5ba4c3c 100644 --- a/Assets/Plugins/Catnip.meta +++ b/Assets/Plugins/Disruptor.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5517ceddb63c378498db7ef3905c90f3 +guid: 538b2f91dbf71f54eb8346fd20194b00 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/Disruptor/ConcurrentQueue.cs b/Assets/Plugins/Disruptor/ConcurrentQueue.cs new file mode 100644 index 0000000..76a1fb1 --- /dev/null +++ b/Assets/Plugins/Disruptor/ConcurrentQueue.cs @@ -0,0 +1,242 @@ +// ConcurrentQueue.cs +// +// Copyright (c) 2008 Jérémie "Garuma" Laval +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// + +// Note this is slightly modified from the original from Mono for compatibility with .Net 3.5 + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace System.Threading.Collections +{ + public class ConcurrentQueue : IEnumerable, ICollection, ISerializable, IDeserializationCallback + { + class Node + { + public T Value; + public Node Next; + } + + Node _head = new Node(); + Node _tail; + int _count; + + /// + /// + public ConcurrentQueue() + { + _tail = _head; + } + + public ConcurrentQueue(IEnumerable enumerable) + : this() + { + foreach (T item in enumerable) + Enqueue(item); + } + + public void Enqueue(T item) + { + var node = new Node { Value = item }; + + Node oldTail = null; + + bool update = false; + while (!update) + { + oldTail = _tail; + var oldNext = oldTail.Next; + + // Did tail was already updated ? + if (_tail == oldTail) + { + if (oldNext == null) + { + // The place is for us + update = Interlocked.CompareExchange(ref _tail.Next, node, null) == null; + } + else + { + // another Thread already used the place so give him a hand by putting tail where it should be + Interlocked.CompareExchange(ref _tail, oldNext, oldTail); + } + } + } + // At this point we added correctly our node, now we have to update tail. If it fails then it will be done by another thread + Interlocked.CompareExchange(ref _tail, node, oldTail); + + Interlocked.Increment(ref _count); + } + + + /// + /// + /// + public bool TryDequeue(out T value) + { + value = default(T); + bool advanced = false; + while (!advanced) + { + Node oldHead = _head; + Node oldTail = _tail; + Node oldNext = oldHead.Next; + + if (oldHead == _head) + { + // Empty case ? + if (oldHead == oldTail) + { + // This should be false then + if (oldNext != null) + { + // If not then the linked list is mal formed, update tail + Interlocked.CompareExchange(ref _tail, oldNext, oldTail); + } + value = default(T); + return false; + } + else + { + value = oldNext.Value; + advanced = Interlocked.CompareExchange(ref _head, oldNext, oldHead) == oldHead; + } + } + } + + Interlocked.Decrement(ref _count); + return true; + } + + /// + /// + /// + public bool TryPeek(out T value) + { + if (IsEmpty) + { + value = default(T); + return false; + } + + Node first = _head.Next; + value = first.Value; + return true; + } + + public void Clear() + { + _count = 0; + _tail = _head = new Node(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return InternalGetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return InternalGetEnumerator(); + } + + public IEnumerator GetEnumerator() + { + return InternalGetEnumerator(); + } + + IEnumerator InternalGetEnumerator() + { + Node myHead = _head; + while ((myHead = myHead.Next) != null) + { + yield return myHead.Value; + } + } + + void ICollection.CopyTo(Array array, int index) + { + T[] dest = array as T[]; + if (dest == null) + return; + CopyTo(dest, index); + } + + public void CopyTo(T[] dest, int index) + { + IEnumerator e = InternalGetEnumerator(); + int i = index; + while (e.MoveNext()) + { + dest[i++] = e.Current; + } + } + + public T[] ToArray() + { + T[] dest = new T[_count]; + CopyTo(dest, 0); + return dest; + } + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + throw new NotImplementedException(); + } + + bool ICollection.IsSynchronized + { + get { return true; } + } + + public void OnDeserialization(object sender) + { + throw new NotImplementedException(); + } + + readonly object _syncRoot = new object(); + object ICollection.SyncRoot + { + get { return _syncRoot; } + } + + public int Count + { + get + { + return _count; + } + } + + public bool IsEmpty + { + get + { + return _count == 0; + } + } + } +} + diff --git a/Assets/Plugins/Disruptor/ConcurrentQueue.cs.meta b/Assets/Plugins/Disruptor/ConcurrentQueue.cs.meta new file mode 100644 index 0000000..f3a78c7 --- /dev/null +++ b/Assets/Plugins/Disruptor/ConcurrentQueue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 18a25d882e7671d47becffdc6de1f734 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Disruptor/DisruptorASMDEF.asmdef b/Assets/Plugins/Disruptor/DisruptorASMDEF.asmdef new file mode 100644 index 0000000..01b1f9d --- /dev/null +++ b/Assets/Plugins/Disruptor/DisruptorASMDEF.asmdef @@ -0,0 +1,14 @@ +{ + "name": "DisruptorASMDEF", + "rootNamespace": "", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/Disruptor/DisruptorASMDEF.asmdef.meta b/Assets/Plugins/Disruptor/DisruptorASMDEF.asmdef.meta new file mode 100644 index 0000000..9beabd2 --- /dev/null +++ b/Assets/Plugins/Disruptor/DisruptorASMDEF.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1364d97af688c264f94c622d729b2059 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Disruptor/RingBuffer.cs b/Assets/Plugins/Disruptor/RingBuffer.cs new file mode 100644 index 0000000..5884448 --- /dev/null +++ b/Assets/Plugins/Disruptor/RingBuffer.cs @@ -0,0 +1,275 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Threading; + +namespace DisruptorUnity3d +{ + /// + /// Implementation of the Disruptor pattern + /// + /// the type of item to be stored + public class RingBuffer + { + private readonly T[] _entries; + private readonly int _modMask; + private Volatile.PaddedLong _consumerCursor = new Volatile.PaddedLong(); + private Volatile.PaddedLong _producerCursor = new Volatile.PaddedLong(); + + /// + /// Creates a new RingBuffer with the given capacity + /// + /// The capacity of the buffer + /// Only a single thread may attempt to consume at any one time + public RingBuffer(int capacity) + { + capacity = NextPowerOfTwo(capacity); + _modMask = capacity - 1; + _entries = new T[capacity]; + } + + /// + /// The maximum number of items that can be stored + /// + public int Capacity + { + get { return _entries.Length; } + } + + public T this[long index] + { + get { unchecked { return _entries[index & _modMask]; } } + set { unchecked { _entries[index & _modMask] = value; } } + } + + /// + /// Removes an item from the buffer. + /// + /// The next available item + public T Dequeue() + { + var next = _consumerCursor.ReadAcquireFence() + 1; + while (_producerCursor.ReadAcquireFence() < next) // makes sure we read the data from _entries after we have read the producer cursor + { + Thread.SpinWait(1); + } + var result = this[next]; + _consumerCursor.WriteReleaseFence(next); // makes sure we read the data from _entries before we update the consumer cursor + return result; + } + + /// + /// Attempts to remove an items from the queue + /// + /// the items + /// True if successful + public bool TryDequeue(out T obj) + { + var next = _consumerCursor.ReadAcquireFence() + 1; + + if (_producerCursor.ReadAcquireFence() < next) + { + obj = default(T); + return false; + } + obj = Dequeue(); + return true; + } + + /// + /// Add an item to the buffer + /// + /// + public void Enqueue(T item) + { + var next = _producerCursor.ReadAcquireFence() + 1; + + long wrapPoint = next - _entries.Length; + long min = _consumerCursor.ReadAcquireFence(); + + while (wrapPoint > min) + { + min = _consumerCursor.ReadAcquireFence(); + Thread.SpinWait(1); + } + + this[next] = item; + _producerCursor.WriteReleaseFence(next); // makes sure we write the data in _entries before we update the producer cursor + } + + /// + /// The number of items in the buffer + /// + /// for indicative purposes only, may contain stale data + public int Count { get { return (int)(_producerCursor.ReadFullFence() - _consumerCursor.ReadFullFence()); } } + + private static int NextPowerOfTwo(int x) + { + var result = 2; + while (result < x) + { + result <<= 1; + } + return result; + } + + + } + public static class Volatile + { + private const int CacheLineSize = 64; + + [StructLayout(LayoutKind.Explicit, Size = CacheLineSize * 2)] + public struct PaddedLong + { + [FieldOffset(CacheLineSize)] + private long _value; + + /// + /// Create a new with the given initial value. + /// + /// Initial value + public PaddedLong(long value) + { + _value = value; + } + + /// + /// Read the value without applying any fence + /// + /// The current value + public long ReadUnfenced() + { + return _value; + } + + /// + /// Read the value applying acquire fence semantic + /// + /// The current value + public long ReadAcquireFence() + { + var value = _value; + Thread.MemoryBarrier(); + return value; + } + + /// + /// Read the value applying full fence semantic + /// + /// The current value + public long ReadFullFence() + { + Thread.MemoryBarrier(); + return _value; + } + + /// + /// Read the value applying a compiler only fence, no CPU fence is applied + /// + /// The current value + [MethodImpl(MethodImplOptions.NoOptimization)] + public long ReadCompilerOnlyFence() + { + return _value; + } + + /// + /// Write the value applying release fence semantic + /// + /// The new value + public void WriteReleaseFence(long newValue) + { + Thread.MemoryBarrier(); + _value = newValue; + } + + /// + /// Write the value applying full fence semantic + /// + /// The new value + public void WriteFullFence(long newValue) + { + Thread.MemoryBarrier(); + _value = newValue; + } + + /// + /// Write the value applying a compiler fence only, no CPU fence is applied + /// + /// The new value + [MethodImpl(MethodImplOptions.NoOptimization)] + public void WriteCompilerOnlyFence(long newValue) + { + _value = newValue; + } + + /// + /// Write without applying any fence + /// + /// The new value + public void WriteUnfenced(long newValue) + { + _value = newValue; + } + + /// + /// Atomically set the value to the given updated value if the current value equals the comparand + /// + /// The new value + /// The comparand (expected value) + /// + public bool AtomicCompareExchange(long newValue, long comparand) + { + return Interlocked.CompareExchange(ref _value, newValue, comparand) == comparand; + } + + /// + /// Atomically set the value to the given updated value + /// + /// The new value + /// The original value + public long AtomicExchange(long newValue) + { + return Interlocked.Exchange(ref _value, newValue); + } + + /// + /// Atomically add the given value to the current value and return the sum + /// + /// The value to be added + /// The sum of the current value and the given value + public long AtomicAddAndGet(long delta) + { + return Interlocked.Add(ref _value, delta); + } + + /// + /// Atomically increment the current value and return the new value + /// + /// The incremented value. + public long AtomicIncrementAndGet() + { + return Interlocked.Increment(ref _value); + } + + /// + /// Atomically increment the current value and return the new value + /// + /// The decremented value. + public long AtomicDecrementAndGet() + { + return Interlocked.Decrement(ref _value); + } + + /// + /// Returns the string representation of the current value. + /// + /// the string representation of the current value. + public override string ToString() + { + var value = ReadFullFence(); + return value.ToString(); + } + } + } +} diff --git a/Assets/Plugins/Disruptor/RingBuffer.cs.meta b/Assets/Plugins/Disruptor/RingBuffer.cs.meta new file mode 100644 index 0000000..4fb29a8 --- /dev/null +++ b/Assets/Plugins/Disruptor/RingBuffer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0ed5999a9ac5a0244b4e15b4e2a5c7ee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Disruptor/Test.cs b/Assets/Plugins/Disruptor/Test.cs new file mode 100644 index 0000000..5b24616 --- /dev/null +++ b/Assets/Plugins/Disruptor/Test.cs @@ -0,0 +1,74 @@ +using System.Diagnostics; +using System.Threading; +using UnityEngine; +using Debug = UnityEngine.Debug; +using Random = System.Random; + +namespace DisruptorUnity3d +{ + public class Test : MonoBehaviour + { + static readonly Random Rng = new Random(); + static readonly RingBuffer Queue = new RingBuffer(1000); + //static readonly ConcurrentQueue Queue = new ConcurrentQueue(); + + static readonly Stopwatch sw = new Stopwatch(); + private const long Count = 5000000;//100000000; + private long _queued = 0; + private const long BatchSize = 20000; + private Thread _consumerThread; + private bool _printed = false; + + private int numberToEnqueue; + + public void Start() + { + Debug.Log("Started Test"); + _consumerThread = new Thread(() => + { + Debug.Log("Started consumer"); + int expectedNumber = 0; + int previousNumber = 0; + for (long i = 0; i < Count; ) + { + int val; + var dequeued = Queue.TryDequeue(out val); + if (dequeued) + { + if (expectedNumber != val) + Debug.Log("wrong value " + val + " ,correct: " + i + " ,previous: " + previousNumber); + previousNumber = val; + expectedNumber++; + ++i; + } + + } + Debug.Log(string.Format("Consumer done {0}", sw.Elapsed)); + }); + _consumerThread.Start(); + sw.Start(); + } + + + + // Update is called once per frame + public void Update() + { + if (_queued >= Count && !_printed) + { + sw.Stop(); + Debug.Log(string.Format("Producer done {0} {1}", sw.Elapsed, _queued)); + _printed = true; + + } + else + { + for (long i = 0; i < BatchSize && _queued < Count; ++i) + { + Queue.Enqueue(numberToEnqueue++); + ++_queued; + } + } + } + } +} diff --git a/Assets/Plugins/Disruptor/Test.cs.meta b/Assets/Plugins/Disruptor/Test.cs.meta new file mode 100644 index 0000000..e80ea03 --- /dev/null +++ b/Assets/Plugins/Disruptor/Test.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 35efa1e25d8cb8243afec9feafa02080 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/LibreMetaverse/Capabilities/CapsClient.cs b/Assets/Plugins/LibreMetaverse/Capabilities/CapsClient.cs index 5083ef2..d427e38 100644 --- a/Assets/Plugins/LibreMetaverse/Capabilities/CapsClient.cs +++ b/Assets/Plugins/LibreMetaverse/Capabilities/CapsClient.cs @@ -113,14 +113,14 @@ namespace OpenMetaverse.Http if (postData == null) { // GET - //Logger.Log.Debug("[CapsClient] GET " + _Address); + Logger.DebugLog("[CapsClient] GET " + _Address); _Request = CapsBase.DownloadStringAsync(_Address, _ClientCert, millisecondsTimeout, DownloadProgressHandler, RequestCompletedHandler); } else { // POST - //Logger.Log.Debug("[CapsClient] POST (" + postData.Length + " bytes) " + _Address); + Logger.DebugLog("[CapsClient] POST (" + postData.Length + " bytes) " + _Address); _Request = CapsBase.UploadDataAsync(_Address, _ClientCert, contentType, postData, millisecondsTimeout, null, DownloadProgressHandler, RequestCompletedHandler); } @@ -171,8 +171,11 @@ namespace OpenMetaverse.Http if (responseData != null) { + Logger.DebugLog("RequestCompletedHandler" + ":" +" responseData is not null."); try { result = OSDParser.Deserialize(responseData); } - catch (Exception ex) { error = ex; } + catch (Exception ex) { + Logger.Log("RequestCompletedHandler" + ":" + " responseData is not null but ran an exception!.",Helpers.LogLevel.Error); + error = ex; } } FireCompleteCallback(result, error); @@ -185,11 +188,11 @@ namespace OpenMetaverse.Http { try { - callback(this, result, error); + callback(this, result, error); //exception is "notimplementedexception" } catch (Exception ex) { - Logger.DebugLog($"CapsBase.GetResponse() {_CapName} : {ex.Message}"); + Logger.DebugLog($"CapsBase.GetResponse() {_CapName} : {ex.Message} : {ex.ToString()}"); //here the log is coming from! Logger.Log(ex.Message, Helpers.LogLevel.Error, ex); } } diff --git a/Assets/Plugins/LibreMetaverse/Caps.cs b/Assets/Plugins/LibreMetaverse/Caps.cs index 300ee30..23eaf88 100644 --- a/Assets/Plugins/LibreMetaverse/Caps.cs +++ b/Assets/Plugins/LibreMetaverse/Caps.cs @@ -330,7 +330,7 @@ namespace OpenMetaverse { Logger.Log("No Message handler exists for event " + eventName + ". Unable to decode. Will try Generic Handler next", Helpers.LogLevel.Warning); - Logger.Log("Please report this information at https://radegast.life/bugs/issue-entry/: \n" + body, + Logger.Log("Please report this information at https://eerbsitehere.com: \n" + body, Helpers.LogLevel.Debug); // try generic decoder next which takes a caps event and tries to match it to an existing packet diff --git a/Assets/Plugins/LibreMetaverse/LibreMetaverseAssembly.asmdef b/Assets/Plugins/LibreMetaverse/LibreMetaverseAssembly.asmdef index e2afbb0..016719b 100644 --- a/Assets/Plugins/LibreMetaverse/LibreMetaverseAssembly.asmdef +++ b/Assets/Plugins/LibreMetaverse/LibreMetaverseAssembly.asmdef @@ -1,9 +1,7 @@ { "name": "LibreMetaverseAssembly", "rootNamespace": "", - "references": [ - "" - ], + "references": [], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": true, diff --git a/Assets/Plugins/LibreMetaverse/Login.cs b/Assets/Plugins/LibreMetaverse/Login.cs index e6d2cb6..c58236f 100644 --- a/Assets/Plugins/LibreMetaverse/Login.cs +++ b/Assets/Plugins/LibreMetaverse/Login.cs @@ -1619,6 +1619,8 @@ namespace OpenMetaverse LoginErrorKey = "no connection"; UpdateLoginStatus(LoginStatus.Failed, error.Message); } + + } /// diff --git a/Assets/Raindrop/CurrentOutfitFolder.cs b/Assets/Raindrop/CurrentOutfitFolder.cs new file mode 100644 index 0000000..7fc492a --- /dev/null +++ b/Assets/Raindrop/CurrentOutfitFolder.cs @@ -0,0 +1,688 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using OpenMetaverse; +using OpenMetaverse.StructuredData; + +namespace Raindrop +{ + public class CurrentOutfitFolder : IDisposable + { + #region Fields + GridClient Client; + RaindropInstance Instance; + bool InitiCOF = false; + bool AppearanceSent = false; + bool COFReady = false; + bool InitialUpdateDone = false; + public Dictionary Content = new Dictionary(); + public InventoryFolder COF; + + #endregion Fields + + #region Construction and disposal + public CurrentOutfitFolder(RaindropInstance instance) + { + this.Instance = instance; + this.Client = instance.Client; + Instance.ClientChanged += new EventHandler(instance_ClientChanged); + RegisterClientEvents(Client); + } + + public void Dispose() + { + UnregisterClientEvents(Client); + Instance.ClientChanged -= new EventHandler(instance_ClientChanged); + } + #endregion Construction and disposal + + #region Event handling + void instance_ClientChanged(object sender, ClientChangedEventArgs e) + { + UnregisterClientEvents(Client); + Client = e.Client; + RegisterClientEvents(Client); + } + + void RegisterClientEvents(GridClient client) + { + client.Network.EventQueueRunning += new EventHandler(Network_EventQueueRunning); + client.Inventory.FolderUpdated += new EventHandler(Inventory_FolderUpdated); + client.Inventory.ItemReceived += new EventHandler(Inventory_ItemReceived); + client.Appearance.AppearanceSet += new EventHandler(Appearance_AppearanceSet); + client.Objects.KillObject += new EventHandler(Objects_KillObject); + } + + void UnregisterClientEvents(GridClient client) + { + client.Network.EventQueueRunning -= new EventHandler(Network_EventQueueRunning); + client.Inventory.FolderUpdated -= new EventHandler(Inventory_FolderUpdated); + client.Inventory.ItemReceived -= new EventHandler(Inventory_ItemReceived); + client.Appearance.AppearanceSet -= new EventHandler(Appearance_AppearanceSet); + client.Objects.KillObject -= new EventHandler(Objects_KillObject); + lock (Content) Content.Clear(); + InitiCOF = false; + AppearanceSent = false; + COFReady = false; + InitialUpdateDone = false; + } + + void Appearance_AppearanceSet(object sender, AppearanceSetEventArgs e) + { + AppearanceSent = true; + if (COFReady) + { + InitialUpdate(); + } + } + + void Inventory_ItemReceived(object sender, ItemReceivedEventArgs e) + { + bool partOfCOF = false; + var links = ContentLinks(); + foreach (var cofItem in links) + { + if (cofItem.AssetUUID == e.Item.UUID) + { + partOfCOF = true; + break; + } + } + + if (partOfCOF) + { + lock (Content) + { + Content[e.Item.UUID] = e.Item; + } + } + + if (Content.Count == links.Count) + { + COFReady = true; + if (AppearanceSent) + { + InitialUpdate(); + } + lock (Content) + { + foreach (InventoryItem link in Content.Values) + { + if (link.InventoryType == InventoryType.Wearable) + { + InventoryWearable w = (InventoryWearable)link; + InventoryItem lk = links.Find(l => l.AssetUUID == w.UUID); + // Logger.DebugLog(string.Format("\nName: {0}\nDescription: {1}\nType: {2} - {3}", w.Name, lk == null ? "" : lk.Description, w.Flags.ToString(), w.WearableType.ToString())); ; + } + } + + } + } + } + + object FolderSync = new object(); + + void Inventory_FolderUpdated(object sender, FolderUpdatedEventArgs e) + { + if (COF == null) return; + + if (e.FolderID == COF.UUID && e.Success) + { + COF = (InventoryFolder)Client.Inventory.Store[COF.UUID]; + lock (FolderSync) + { + lock (Content) Content.Clear(); + + + List items = new List(); + List owners = new List(); + + foreach (var link in ContentLinks()) + { + //if (Client.Inventory.Store.Contains(link.AssetUUID)) + //{ + // continue; + //} + items.Add(link.AssetUUID); + owners.Add(Client.Self.AgentID); + } + + if (items.Count > 0) + { + Client.Inventory.RequestFetchInventory(items, owners); + } + } + } + } + + void Objects_KillObject(object sender, KillObjectEventArgs e) + { + if (Client.Network.CurrentSim != e.Simulator) return; + + Primitive prim = null; + if (Client.Network.CurrentSim.ObjectsPrimitives.TryGetValue(e.ObjectLocalID, out prim)) + { + UUID invItem = GetAttachmentItem(prim); + if (invItem != UUID.Zero) + { + RemoveLink(invItem); + } + } + } + + void Network_EventQueueRunning(object sender, EventQueueRunningEventArgs e) + { + if (e.Simulator == Client.Network.CurrentSim && !InitiCOF) + { + InitiCOF = true; + InitCOF(); + } + } + #endregion Event handling + + #region Private methods + void RequestDescendants(UUID folderID) + { + Client.Inventory.RequestFolderContents(folderID, Client.Self.AgentID, true, true, InventorySortOrder.ByDate); + } + + void InitCOF() + { + List rootContent = Client.Inventory.Store.GetContents(Client.Inventory.Store.RootFolder.UUID); + foreach (InventoryBase baseItem in rootContent) + { + if (baseItem is InventoryFolder && ((InventoryFolder)baseItem).PreferredType == FolderType.CurrentOutfit) + { + COF = (InventoryFolder)baseItem; + break; + } + } + + if (COF == null) + { + CreateCOF(); + } + else + { + RequestDescendants(COF.UUID); + } + } + + void CreateCOF() + { + UUID cofID = Client.Inventory.CreateFolder(Client.Inventory.Store.RootFolder.UUID, "Current Outfit", FolderType.CurrentOutfit); + if (Client.Inventory.Store.Items.ContainsKey(cofID) && Client.Inventory.Store.Items[cofID].Data is InventoryFolder) + { + COF = (InventoryFolder)Client.Inventory.Store.Items[cofID].Data; + COFReady = true; + if (AppearanceSent) + { + InitialUpdate(); + } + } + } + + void InitialUpdate() + { + if (InitialUpdateDone) return; + InitialUpdateDone = true; + lock (Content) + { + List myAtt = Client.Network.CurrentSim.ObjectsPrimitives.FindAll((Primitive p) => p.ParentID == Client.Self.LocalID); + + foreach (InventoryItem item in Content.Values) + { + if (item is InventoryObject || item is InventoryAttachment) + { + if (!IsAttached(myAtt, item)) + { + Client.Appearance.Attach(item, AttachmentPoint.Default, false); + } + } + } + } + } + #endregion Private methods + + #region Public methods + /// + /// Get COF contents + /// + /// List if InventoryItems that can be part of appearance (attachments, wearables) + public List ContentLinks() + { + List ret = new List(); + if (COF == null) return ret; + + Client.Inventory.Store.GetContents(COF) + .FindAll(b => CanBeWorn(b) && ((InventoryItem)b).AssetType == AssetType.Link) + .ForEach(item => ret.Add((InventoryItem)item)); + + return ret; + } + + /// + /// Get inventory ID of a prim + /// + /// Prim to check + /// Inventory ID of the object. UUID.Zero if not found + public static UUID GetAttachmentItem(Primitive prim) + { + if (prim.NameValues == null) return UUID.Zero; + + for (int i = 0; i < prim.NameValues.Length; i++) + { + if (prim.NameValues[i].Name == "AttachItemID") + { + return (UUID)prim.NameValues[i].Value.ToString(); + } + } + return UUID.Zero; + } + + /// + /// Is an inventory item currently attached + /// + /// List of root prims that are attached to our avatar + /// Inventory item to check + /// True if the inventory item is attached to avatar + public static bool IsAttached(List attachments, InventoryItem item) + { + foreach (Primitive prim in attachments) + { + if (GetAttachmentItem(prim) == item.UUID) + { + return true; + } + } + + return false; + } + + /// + /// Checks if inventory item of Wearable type is worn + /// + /// Current outfit + /// Item to check + /// True if the item is worn + public static bool IsWorn(Dictionary currentlyWorn, InventoryItem item) + { + foreach (var n in currentlyWorn.Values) + { + if (n.ItemID == item.UUID) + { + return true; + } + } + return false; + } + + /// + /// Can this inventory type be worn + /// + /// Item to check + /// True if the inventory item can be worn + public static bool CanBeWorn(InventoryBase item) + { + return item is InventoryWearable || item is InventoryAttachment || item is InventoryObject; + } + + /// + /// Attach an inventory item + /// + /// Item to be attached + /// Attachment point + /// Replace existing attachment at that point first? + public void Attach(InventoryItem item, AttachmentPoint point, bool replace) + { + Client.Appearance.Attach(item, point, replace); + AddLink(item); + } + + /// + /// Creates a new COF link + /// + /// Original item to be linked from COF + public void AddLink(InventoryItem item) + { + if (item.InventoryType == InventoryType.Wearable && !IsBodyPart(item)) + { + InventoryWearable w = (InventoryWearable)item; + int layer = 0; + string desc = string.Format("@{0}{1:00}", (int)w.WearableType, layer); + AddLink(item, desc); + } + else + { + AddLink(item, string.Empty); + } + } + + /// + /// Creates a new COF link + /// + /// Original item to be linked from COF + /// Description for the link + public void AddLink(InventoryItem item, string newDescription) + { + if (COF == null) return; + + bool linkExists = false; + + linkExists = null != ContentLinks().Find(itemLink => itemLink.AssetUUID == item.UUID); + + if (!linkExists) + { + Client.Inventory.CreateLink(COF.UUID, item.UUID, item.Name, newDescription, AssetType.Link, item.InventoryType, UUID.Random(), (success, newItem) => + { + if (success) + { + Client.Inventory.RequestFetchInventory(newItem.UUID, newItem.OwnerID); + } + }); + } + } + + /// + /// Remove a link to specified inventory item + /// + /// ID of the target inventory item for which we want link to be removed + public void RemoveLink(UUID itemID) + { + RemoveLink(new List(1) { itemID }); + } + + /// + /// Remove a link to specified inventory item + /// + /// List of IDs of the target inventory item for which we want link to be removed + public void RemoveLink(List itemIDs) + { + if (COF == null) return; + + List toRemove = new List(); + + foreach (UUID itemID in itemIDs) + { + var links = ContentLinks().FindAll(itemLink => itemLink.AssetUUID == itemID); + links.ForEach(item => toRemove.Add(item.UUID)); + } + + Client.Inventory.Remove(toRemove, null); + } + + /// + /// Remove attachment + /// + /// >Inventory item to be detached + public void Detach(InventoryItem item) + { + var realItem = RealInventoryItem(item); + //if (Instance.RLV.AllowDetach(realItem)) + //{ + Client.Appearance.Detach(item); + RemoveLink(item.UUID); + //} + } + + public List GetWornAt(WearableType type) + { + var ret = new List(); + ContentLinks().ForEach(link => + { + var item = RealInventoryItem(link); + if (item is InventoryWearable) + { + var w = (InventoryWearable)item; + if (w.WearableType == type) + { + ret.Add(item); + } + } + }); + + return ret; + } + + /// + /// Resolves inventory links and returns a real inventory item that + /// the link is pointing to + /// + /// + /// + public InventoryItem RealInventoryItem(InventoryItem item) + { + if (item.IsLink() && Client.Inventory.Store.Contains(item.AssetUUID) && Client.Inventory.Store[item.AssetUUID] is InventoryItem) + { + return (InventoryItem)Client.Inventory.Store[item.AssetUUID]; + } + + return item; + } + + /// + /// Replaces the current outfit and updates COF links accordingly + /// + /// List of new wearables and attachments that comprise the new outfit + public void ReplaceOutfit(List newOutfit) + { + // Resolve inventory links + List outfit = new List(); + foreach (var item in newOutfit) + { + outfit.Add(RealInventoryItem(item)); + } + + // Remove links to all exiting items + List toRemove = new List(); + ContentLinks().ForEach(item => + { + if (IsBodyPart(item)) + { + WearableType linkType = ((InventoryWearable)RealInventoryItem(item)).WearableType; + bool hasBodyPart = false; + + foreach (var newItemTmp in newOutfit) + { + var newItem = RealInventoryItem(newItemTmp); + if (IsBodyPart(newItem)) + { + if (((InventoryWearable)newItem).WearableType == linkType) + { + hasBodyPart = true; + break; + } + } + } + + if (hasBodyPart) + { + toRemove.Add(item.UUID); + } + } + else + { + toRemove.Add(item.UUID); + } + }); + + Client.Inventory.Remove(toRemove, null); + + // Add links to new items + List newItems = outfit.FindAll(item => CanBeWorn(item)); + foreach (var item in newItems) + { + AddLink(item); + } + + Client.Appearance.ReplaceOutfit(outfit, false); + ThreadPool.QueueUserWorkItem(sync => + { + Thread.Sleep(2000); + Client.Appearance.RequestSetAppearance(true); + }); + } + + /// + /// Add items to current outfit + /// + /// Item to add + /// Should existing wearable of the same type be removed + public void AddToOutfit(InventoryItem item, bool replace) + { + AddToOutfit(new List(1) { item }, replace); + } + + /// + /// Add items to current outfit + /// + /// List of items to add + /// Should existing wearable of the same type be removed + public void AddToOutfit(List items, bool replace) + { + List current = ContentLinks(); + List toRemove = new List(); + + // Resolve inventory links and remove wearables of the same type from COF + List outfit = new List(); + + foreach (var item in items) + { + InventoryItem realItem = RealInventoryItem(item); + if (realItem is InventoryWearable) + { + foreach (var link in current) + { + var currentItem = RealInventoryItem(link); + if (link.AssetUUID == item.UUID) + { + toRemove.Add(link.UUID); + } + else if (currentItem is InventoryWearable) + { + var w = (InventoryWearable)currentItem; + if (w.WearableType == ((InventoryWearable)realItem).WearableType) + { + toRemove.Add(link.UUID); + } + } + } + } + + outfit.Add(realItem); + } + Client.Inventory.Remove(toRemove, null); + + // Add links to new items + List newItems = outfit.FindAll(item => CanBeWorn(item)); + foreach (var item in newItems) + { + AddLink(item); + } + + Client.Appearance.AddToOutfit(outfit, replace); + ThreadPool.QueueUserWorkItem(sync => + { + Thread.Sleep(2000); + Client.Appearance.RequestSetAppearance(true); + }); + } + + /// + /// Remove an item from the current outfit + /// + /// Item to remove + public void RemoveFromOutfit(InventoryItem item) + { + RemoveFromOutfit(new List(1) { item }); + } + + /// + /// Remove specified items from the current outfit + /// + /// List of items to remove + public void RemoveFromOutfit(List items) + { + // Resolve inventory links + List outfit = new List(); + foreach (var item in items) + { + var realItem = RealInventoryItem(item); + //if (Instance.RLV.AllowDetach(realItem)) + //{ + outfit.Add(realItem); + //} + } + + // Remove links to all items that were removed + List toRemove = new List(); + foreach (InventoryItem item in outfit.FindAll(item => CanBeWorn(item) && !IsBodyPart(item))) + { + toRemove.Add(item.UUID); + } + RemoveLink(toRemove); + + Client.Appearance.RemoveFromOutfit(outfit); + } + + public bool IsBodyPart(InventoryItem item) + { + var realItem = RealInventoryItem(item); + if (realItem is InventoryWearable) + { + var w = (InventoryWearable)realItem; + var t = w.WearableType; + if (t == WearableType.Shape || + t == WearableType.Skin || + t == WearableType.Eyes || + t == WearableType.Hair) + { + return true; + } + } + return false; + } + + /// + /// Force rebaking textures + /// + public void RebakeTextures() + { + Client.Appearance.RequestSetAppearance(true); + } + + #endregion Public methods + } +} diff --git a/Assets/Raindrop/Gridmanager.cs b/Assets/Raindrop/Gridmanager.cs new file mode 100644 index 0000000..f8219ef --- /dev/null +++ b/Assets/Raindrop/Gridmanager.cs @@ -0,0 +1,169 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +//using System.Reflection; +using OpenMetaverse; +using OpenMetaverse.StructuredData; + +namespace Raindrop +{ + public class Grid + { + public string ID = string.Empty; + public string Name = string.Empty; + public string Platform = string.Empty; + public string LoginURI = string.Empty; + public string LoginPage = string.Empty; + public string HelperURI = string.Empty; + public string Website = string.Empty; + public string Support = string.Empty; + public string Register = string.Empty; + public string PasswordURL = string.Empty; + public string Version = "1"; + + public Grid() { } + + public Grid(string ID, string name, string loginURI) + { + this.ID = ID; + this.Name = name; + this.LoginURI = loginURI; + } + + public override string ToString() + { + return Name; + } + + public static Grid FromOSD(OSD data) + { + if (data == null || data.Type != OSDType.Map) return null; + Grid grid = new Grid(); + OSDMap map = (OSDMap)data; + + grid.ID = map["gridnick"].AsString(); + grid.Name = map["gridname"].AsString(); + grid.Platform = map["platform"].AsString(); + grid.LoginURI = map["loginuri"].AsString(); + grid.LoginPage = map["loginpage"].AsString(); + grid.HelperURI = map["helperuri"].AsString(); + grid.Website = map["website"].AsString(); + grid.Support = map["support"].AsString(); + grid.Register = map["register"].AsString(); + grid.PasswordURL = map["password"].AsString(); + grid.Version = map["version"].AsString(); + + return grid; + } + } + + public class GridManager : IDisposable + { + public List Grids; + + public GridManager() + { + Grids = new List(); + } + + public void Dispose() + { + } + + public void LoadGrids(string datadir) + { + Grids.Clear(); + Grids.Add(new Grid("agni", "Second Life (agni)", "https://login.agni.lindenlab.com/cgi-bin/login.cgi")); + Grids.Add(new Grid("aditi", "Second Life Beta (aditi)", "https://login.aditi.lindenlab.com/cgi-bin/login.cgi")); + + try + { + string sysGridsFile = Path.Combine(Path.GetDirectoryName(datadir), "grids.xml"); + OSDArray sysGrids = (OSDArray)OSDParser.DeserializeLLSDXml(File.ReadAllText(sysGridsFile)); + for (int i = 0; i < sysGrids.Count; i++) + { + RegisterGrid(Grid.FromOSD(sysGrids[i])); + } + } + catch (Exception ex) + { + Logger.Log(string.Format("Error loading grid information: {0}", ex.Message), Helpers.LogLevel.Warning); + } + } + + public void RegisterGrid(Grid grid) + { + int ix = Grids.FindIndex((Grid g) => { return g.ID == grid.ID; }); + if (ix < 0) + { + Grids.Add(grid); + } + else + { + Grids[ix] = grid; + } + } + + public Grid this[int ix] + { + get { return Grids[ix]; } + } + + public Grid this[string gridID] + { + get + { + foreach (Grid grid in Grids) + { + if (grid.ID == gridID) return grid; + } + throw new KeyNotFoundException(); + } + } + + public bool KeyExists(string gridID) + { + foreach (Grid grid in Grids) + { + if (grid.ID == gridID) return true; + } + return false; + } + + public int Count + { + get { return Grids.Count; } + } + } +} diff --git a/Assets/Raindrop/Gridmanager.cs.meta b/Assets/Raindrop/Gridmanager.cs.meta new file mode 100644 index 0000000..9c3274c --- /dev/null +++ b/Assets/Raindrop/Gridmanager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96f21062a49b52b43914d622cebbfb1e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Raindrop/NameManager.cs b/Assets/Raindrop/NameManager.cs new file mode 100644 index 0000000..f0d5758 --- /dev/null +++ b/Assets/Raindrop/NameManager.cs @@ -0,0 +1,723 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +#if (COGBOT_LIBOMV || USE_STHREADS) +using ThreadPoolUtil; +using Thread = ThreadPoolUtil.Thread; +using ThreadPool = ThreadPoolUtil.ThreadPool; +using Monitor = ThreadPoolUtil.Monitor; +#endif +using System.Threading; +using System.IO; +using OpenMetaverse; +using OpenMetaverse.StructuredData; +using System.Collections.Concurrent; + +namespace Raindrop +{ + #region enums + /// + /// Enum representing different modes of handling display names + /// + public enum NameMode : int + { + /// No display names + Standard, + /// Display name followed by (username) if display name is not default + Smart, + /// Display name followed by (username) + OnlyDisplayName, + /// Only display + DisplayNameAndUserName, + } + #endregion enums + + /// + /// Manager for looking up avatar names and their caching + /// + public class NameManager : IDisposable + { + #region public fields and properties + public event EventHandler NameUpdated; + + public NameMode Mode + { + get + { + if (!client.Avatars.DisplayNamesAvailable()) + return NameMode.Standard; + + return (NameMode)instance.GlobalSettings["display_name_mode"].AsInteger(); + } + + set + { + instance.GlobalSettings["display_name_mode"] = (int)value; + } + } + #endregion public fields and properties + + #region private fields and properties + RaindropInstance instance; + GridClient client { get { return instance.Client; } } + Timer requestTimer; + Timer cacheTimer; + string cacheFileName; + + Queue requests = new Queue(); + + int MaxNameRequests = 80; + + // Queue up name request for this many ms, and send a batch requst + const int REQUEST_DELAY = 100; + // Save name cache after change to names after this many ms + const int CACHE_DELAY = 30000; + // Consider request failed after this many ms + const int MAX_REQ_AGE = 15000; + + Dictionary names = new Dictionary(); + Dictionary activeRequests = new Dictionary(); + + ConcurrentQueue> PendingLookups; + //BlockingQueue> PendingLookups; + Thread requestThread = null; + Semaphore lookupGate; + bool useRequestThread; + + #endregion private fields and properties + + #region construction and disposal + public NameManager(RaindropInstance instance) + { + this.instance = instance; + + requestTimer = new Timer(MakeRequest, null, Timeout.Infinite, Timeout.Infinite); + cacheTimer = new Timer(SaveCache, null, Timeout.Infinite, Timeout.Infinite); + cacheFileName = Path.Combine(instance.UserDir, "name.cache"); + LoadCachedNames(); + instance.ClientChanged += new EventHandler(instance_ClientChanged); + RegisterEvents(client); + + // Mono HTTPWebRequest sucks balls + useRequestThread = instance.MonoRuntime; + + if (useRequestThread) + { + PendingLookups = new ConcurrentQueue>(); + lookupGate = new Semaphore(4, 4); + requestThread = new Thread(new ThreadStart(RequestThread)); + requestThread.IsBackground = true; + requestThread.Name = "Display Name Request Thread"; + requestThread.Start(); + } + } + + public void Dispose() + { + SaveCache(new object()); + + if (client != null) + { + DeregisterEvents(client); + } + + if (requestTimer != null) + { + requestTimer.Dispose(); + requestTimer = null; + } + + if (cacheTimer != null) + { + cacheTimer.Dispose(); + cacheTimer = null; + } + + try + { + if (useRequestThread) + { + //PendingLookups.Close(); + if (requestThread != null) + { + if (!requestThread.Join(5 * 1000)) + { + requestThread.Abort(); + } + requestThread = null; + } + } + } + catch { } + } + #endregion construction and disposal + + #region private methods + public void RequestThread() + { + //PendingLookups.Open(); + + while (true) + { + List req = null; + if (!PendingLookups.TryDequeue(/*Timeout.Infinite,*/ out req)) break; + lookupGate.WaitOne(90 * 1000); + client.Avatars.GetDisplayNames(req, (bool success, AgentDisplayName[] names, UUID[] badIDs) => + { + if (success) + { + ProcessDisplayNames(names); + } + else + { + Logger.Log("Failed fetching display names", Helpers.LogLevel.Warning, client); + } + lookupGate.Release(1); + }); + } + } + + void RegisterEvents(GridClient c) + { + c.Avatars.UUIDNameReply += new EventHandler(Avatars_UUIDNameReply); + c.Avatars.DisplayNameUpdate += new EventHandler(Avatars_DisplayNameUpdate); + } + + void DeregisterEvents(GridClient c) + { + c.Avatars.UUIDNameReply -= new EventHandler(Avatars_UUIDNameReply); + c.Avatars.DisplayNameUpdate -= new EventHandler(Avatars_DisplayNameUpdate); + } + + DateTime UUIDNameOnly = new DateTime(1970, 9, 4, 10, 0, 0, DateTimeKind.Utc); + + void instance_ClientChanged(object sender, ClientChangedEventArgs e) + { + DeregisterEvents(e.OldClient); + RegisterEvents(e.Client); + } + + void Avatars_DisplayNameUpdate(object sender, DisplayNameUpdateEventArgs e) + { + lock (names) + { + e.DisplayName.Updated = DateTime.Now; + names[e.DisplayName.ID] = e.DisplayName; + } + Dictionary ret = new Dictionary(); + ret.Add(e.DisplayName.ID, FormatName(e.DisplayName)); + TriggerEvent(ret); + } + + void Avatars_UUIDNameReply(object sender, UUIDNameReplyEventArgs e) + { + Dictionary ret = new Dictionary(); + + foreach (KeyValuePair kvp in e.Names) + { + // Remove from the list of active requests if in UUID only (standard mode) + if (Mode == NameMode.Standard) + { + lock (activeRequests) + { + activeRequests.Remove(kvp.Key); + } + } + + lock (names) + { + if (!names.ContainsKey(kvp.Key)) + { + names[kvp.Key] = new AgentDisplayName(); + names[kvp.Key].ID = kvp.Key; + names[kvp.Key].NextUpdate = UUIDNameOnly; + names[kvp.Key].IsDefaultDisplayName = true; + } + + names[kvp.Key].Updated = DateTime.Now; + + string[] parts = kvp.Value.Trim().Split(' '); + if (parts.Length == 2) + { + if (InvalidName(names[kvp.Key].DisplayName)) + { + names[kvp.Key].DisplayName = string.Format("{0} {1}", parts[0], parts[1]); + } + + names[kvp.Key].LegacyFirstName = parts[0]; + names[kvp.Key].LegacyLastName = parts[1]; + if (names[kvp.Key].LegacyLastName == "Resident") + { + names[kvp.Key].UserName = names[kvp.Key].LegacyFirstName.ToLower(); + } + else + { + names[kvp.Key].UserName = string.Format("{0}.{1}", parts[0], parts[1]).ToLower(); + } + + ret.Add(kvp.Key, FormatName(names[kvp.Key])); + } + } + } + + TriggerEvent(ret); + TriggerCacheSave(); + } + + string FormatName(AgentDisplayName n) + { + switch (Mode) + { + case NameMode.OnlyDisplayName: + return n.DisplayName; + + case NameMode.Smart: + if (n.IsDefaultDisplayName) + return n.DisplayName; + else + return string.Format("{0} ({1})", n.DisplayName, n.UserName); + + case NameMode.DisplayNameAndUserName: + return string.Format("{0} ({1})", n.DisplayName, n.UserName); + + default: + return n.LegacyFullName; + } + } + + bool InvalidName(string displayName) + { + if (string.IsNullOrEmpty(displayName) || + displayName == "???" || + displayName == RaindropInstance.INCOMPLETE_NAME) + { + return true; + } + return false; + } + + void ProcessDisplayNames(AgentDisplayName[] names) + { + Dictionary ret = new Dictionary(); + + foreach (var name in names) + { + // Remove from the list of active requests + lock (activeRequests) + { + activeRequests.Remove(name.ID); + } + + if (InvalidName(name.DisplayName)) continue; + + ret.Add(name.ID, FormatName(name)); + + name.Updated = DateTime.Now; + lock (this.names) + { + this.names[name.ID] = name; + } + } + + TriggerEvent(ret); + TriggerCacheSave(); + } + + void MakeRequest(object sync) + { + List req = new List(); + lock (requests) + { + while (requests.Count > 0) + req.Add(requests.Dequeue()); + } + + + if (req.Count > 0) + { + if (Mode == NameMode.Standard || (!client.Avatars.DisplayNamesAvailable())) + { + client.Avatars.RequestAvatarNames(req); + } + else // Use display names + { + if (useRequestThread) + { + PendingLookups.Enqueue(new List(req)); + } + else + { + client.Avatars.GetDisplayNames(req, (bool success, AgentDisplayName[] names, UUID[] badIDs) => + { + if (success) + { + ProcessDisplayNames(names); + } + else + { + Logger.Log("Failed fetching display names", Helpers.LogLevel.Warning, client); + } + }); + } + } + } + } + + void SaveCache(object sync) + { + ThreadPool.QueueUserWorkItem(syncx => + { + OSDArray namesOSD = new OSDArray(names.Count); + lock (names) + { + foreach (var name in names) + { + namesOSD.Add(name.Value.GetOSD()); + } + } + + OSDMap cache = new OSDMap(1); + cache["names"] = namesOSD; + byte[] data = OSDParser.SerializeLLSDBinary(cache, false); + Logger.DebugLog(string.Format("Caching {0} avatar names to {1}", namesOSD.Count, cacheFileName)); + + try + { + File.WriteAllBytes(cacheFileName, data); + } + catch (Exception ex) + { + Logger.Log("Failed to save avatar name cache: ", Helpers.LogLevel.Error, client, ex); + } + }); + } + + void LoadCachedNames() + { + ThreadPool.QueueUserWorkItem(syncx => + { + try + { + byte[] data = File.ReadAllBytes(cacheFileName); + OSDMap cache = (OSDMap)OSDParser.DeserializeLLSDBinary(data); + OSDArray namesOSD = (OSDArray)cache["names"]; + DateTime now = DateTime.Now; + TimeSpan maxAge = new TimeSpan(48, 0, 0); + NameMode mode = (NameMode)(int)instance.GlobalSettings["display_name_mode"]; + + lock (names) + { + for (int i = 0; i < namesOSD.Count; i++) + { + AgentDisplayName name = AgentDisplayName.FromOSD(namesOSD[i]); + if (mode == NameMode.Standard || ((now - name.Updated) < maxAge)) + { + names[name.ID] = name; + } + } + } + + Logger.DebugLog(string.Format("Restored {0} names from the avatar name cache", names.Count)); + } + catch (Exception ex) + { + Logger.Log("Failed loading cached avatar names: ", Helpers.LogLevel.Warning, client, ex); + } + }); + } + + void TriggerEvent(Dictionary ret) + { + if (NameUpdated == null || ret.Count == 0) return; + + try + { + NameUpdated(this, new UUIDNameReplyEventArgs(ret)); + } + catch (Exception ex) + { + Logger.Log("Failure in event handler: " + ex.Message, Helpers.LogLevel.Warning, client, ex); + } + } + + void TriggerNameRequest() + { + if (requestTimer != null) + { + requestTimer.Change(REQUEST_DELAY, Timeout.Infinite); + } + } + + void TriggerCacheSave() + { + if (cacheTimer != null) + { + cacheTimer.Change(CACHE_DELAY, Timeout.Infinite); + } + } + + void QueueNameRequest(UUID agentID) + { + // Check if we're already waiting for an answer on this one + lock (activeRequests) + { + if (activeRequests.ContainsKey(agentID)) + { + // Logger.Log("Exiting is active " + agentID.ToString(), Helpers.LogLevel.Error); + if (Environment.TickCount - activeRequests[agentID] < MAX_REQ_AGE) // Not timeout yet + { + // Logger.Log("Exiting is active " + agentID.ToString(), Helpers.LogLevel.Error); + return; + } + else + { + // Logger.Log("Continuing, present but expired " + agentID.ToString(), Helpers.LogLevel.Error); + } + } + else + { + // Logger.Log("Not present " + agentID.ToString(), Helpers.LogLevel.Error); + } + + // Record time of when we're making this request + activeRequests[agentID] = Environment.TickCount; + } + + + lock (requests) + { + if (!requests.Contains(agentID)) + { + // Logger.Log("Enqueueing " + agentID.ToString(), Helpers.LogLevel.Error); + requests.Enqueue(agentID); + + if (requests.Count >= MaxNameRequests && Mode != NameMode.Standard) + { + requestTimer.Change(Timeout.Infinite, Timeout.Infinite); + MakeRequest(this); + } + else + { + TriggerNameRequest(); + } + } + } + } + #endregion private methods + + #region public methods + /// + /// Cleans avatar name cache + /// + public void CleanCache() + { + lock (names) + { + try + { + names.Clear(); + File.Delete(cacheFileName); + } + catch { } + } + } + + /// + /// Gets legacy First Last name + /// + /// UUID of the agent + /// + public string GetLegacyName(UUID agentID) + { + if (agentID == UUID.Zero) return "(???) (???)"; + + lock (names) + { + if (names.ContainsKey(agentID)) + { + return names[agentID].LegacyFullName; + } + } + + QueueNameRequest(agentID); + return RaindropInstance.INCOMPLETE_NAME; + } + + /// + /// Gets UserName + /// + /// UUID of the agent + /// + public string GetUserName(UUID agentID) + { + if (agentID == UUID.Zero) return "(???) (???)"; + + lock (names) + { + if (names.ContainsKey(agentID)) + { + return names[agentID].UserName; + } + } + + QueueNameRequest(agentID); + return RaindropInstance.INCOMPLETE_NAME; + } + + /// + /// Gets DisplayName + /// + /// UUID of the agent + /// + public string GetDisplayName(UUID agentID) + { + if (agentID == UUID.Zero) return "(???) (???)"; + + lock (names) + { + if (names.ContainsKey(agentID)) + { + return names[agentID].DisplayName; + } + } + + QueueNameRequest(agentID); + return RaindropInstance.INCOMPLETE_NAME; + } + + /// + /// Get avatar display name, or queue fetching of the name + /// + /// UUID of avatar to lookup + /// Avatar display name or "Loading..." if not in cache + public string Get(UUID agentID) + { + if (agentID == UUID.Zero) return "(???) (???)"; + + lock (names) + { + if (names.ContainsKey(agentID)) + { + if (Mode != NameMode.Standard && names[agentID].NextUpdate == UUIDNameOnly) + { + QueueNameRequest(agentID); + } + return FormatName(names[agentID]); + } + } + + QueueNameRequest(agentID); + return RaindropInstance.INCOMPLETE_NAME; + } + + /// + /// Get avatar display name, or queue fetching of the name + /// + /// UUID of avatar to lookup + /// If true, wait until name is recieved, otherwise return immediately + /// Avatar display name or "Loading..." if not in cache + public string Get(UUID agentID, bool blocking) + { + if (!blocking) + Get(agentID); + + string name = null; + + using (ManualResetEvent gotName = new ManualResetEvent(false)) + { + + EventHandler handler = (object sender, UUIDNameReplyEventArgs e) => + { + if (e.Names.ContainsKey(agentID)) + { + name = e.Names[agentID]; + gotName.Set(); + } + }; + + NameUpdated += handler; + name = Get(agentID); + + if (name == RaindropInstance.INCOMPLETE_NAME) + { + gotName.WaitOne(20 * 1000, false); + } + + NameUpdated -= handler; + } + return name; + } + + /// + /// Get avatar display name, or queue fetching of the name + /// + /// UUID of avatar to lookup + /// If name failed to retrieve, use this + /// Avatar display name or the default value if not in cache + public string Get(UUID agentID, string defaultValue) + { + if (Mode == NameMode.Standard) + return defaultValue; + + string name = Get(agentID); + if (name == RaindropInstance.INCOMPLETE_NAME) + return defaultValue; + + return name; + } + + /// + /// Get avatar display name, or queue fetching of the name + /// + /// UUID of avatar to lookup + /// If true, wait until name is recieved, otherwise return immediately + /// If name failed to retrieve, use this + /// + public string Get(UUID agentID, bool blocking, string defaultValue) + { + if (Mode == NameMode.Standard) + return defaultValue; + + string name = Get(agentID, blocking); + if (name == RaindropInstance.INCOMPLETE_NAME) + return defaultValue; + + return name; + + } + + #endregion public methods + } +} diff --git a/Assets/Raindrop/Netcom/ChatSentEventArgs.cs b/Assets/Raindrop/Netcom/ChatSentEventArgs.cs new file mode 100644 index 0000000..9481b19 --- /dev/null +++ b/Assets/Raindrop/Netcom/ChatSentEventArgs.cs @@ -0,0 +1,64 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; +using OpenMetaverse; + +namespace Raindrop.Netcom +{ + public class ChatSentEventArgs : EventArgs + { + private string message; + private ChatType type; + private int channel; + + public ChatSentEventArgs(string message, ChatType type, int channel) + { + this.message = message; + this.type = type; + this.channel = channel; + } + + public string Message + { + get { return message; } + } + + public ChatType Type + { + get { return type; } + } + + public int Channel + { + get { return channel; } + } + } +} \ No newline at end of file diff --git a/Assets/Raindrop/Netcom/Enums.cs b/Assets/Raindrop/Netcom/Enums.cs new file mode 100644 index 0000000..068bd76 --- /dev/null +++ b/Assets/Raindrop/Netcom/Enums.cs @@ -0,0 +1,40 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// + +namespace Raindrop.Netcom +{ + public enum StartLocationType + { + Home, + Last, + Custom + }; +} diff --git a/Assets/Raindrop/Netcom/InstantMessageSentEventArgs.cs b/Assets/Raindrop/Netcom/InstantMessageSentEventArgs.cs new file mode 100644 index 0000000..a1b67b8 --- /dev/null +++ b/Assets/Raindrop/Netcom/InstantMessageSentEventArgs.cs @@ -0,0 +1,71 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; +using OpenMetaverse; + +namespace Raindrop.Netcom +{ + public class InstantMessageSentEventArgs : EventArgs + { + private string message; + private UUID targetID; + private UUID sessionID; + private DateTime timestamp; + + public InstantMessageSentEventArgs(string message, UUID targetID, UUID sessionID, DateTime timestamp) + { + this.message = message; + this.targetID = targetID; + this.sessionID = sessionID; + this.timestamp = timestamp; + } + + public string Message + { + get { return message; } + } + + public UUID TargetID + { + get { return targetID; } + } + + public UUID SessionID + { + get { return sessionID; } + } + + public DateTime Timestamp + { + get { return timestamp; } + } + } +} \ No newline at end of file diff --git a/Assets/Raindrop/Netcom/LoginOptions.cs b/Assets/Raindrop/Netcom/LoginOptions.cs new file mode 100644 index 0000000..456e54e --- /dev/null +++ b/Assets/Raindrop/Netcom/LoginOptions.cs @@ -0,0 +1,133 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// + +using OpenMetaverse; + +namespace Raindrop.Netcom +{ + public class LoginOptions + { + private string firstName; + private string lastName; + private string password; + private string version = string.Empty; + private string channel = string.Empty; + + private StartLocationType startLocation = StartLocationType.Home; + private string startLocationCustom = string.Empty; + + private Grid grid; + private string gridCustomLoginUri = string.Empty; + private LastExecStatus lastExecEvent = LastExecStatus.Normal; + + + public LoginOptions() + { + + } + + public static bool IsPasswordMD5(string pass) + { + return pass.Length == 35 && pass.StartsWith("$1$"); + } + + public string FirstName + { + get { return firstName; } + set { firstName = value; } + } + + public string LastName + { + get { return lastName; } + set { lastName = value; } + } + + public string FullName + { + get + { + if (string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName)) + return string.Empty; + else + return firstName + " " + lastName; + } + } + + public string Password + { + get { return password; } + set { password = value; } + } + + public StartLocationType StartLocation + { + get { return startLocation; } + set { startLocation = value; } + } + + public string StartLocationCustom + { + get { return startLocationCustom; } + set { startLocationCustom = value; } + } + + public string Channel + { + get { return channel; } + set { channel = value; } + } + + public string Version + { + get { return version; } + set { version = value; } + } + + public Grid Grid + { + get { return grid; } + set { grid = value; } + } + + public string GridCustomLoginUri + { + get { return gridCustomLoginUri; } + set { gridCustomLoginUri = value; } + } + + public LastExecStatus LastExecEvent + { + get { return lastExecEvent; } + set { lastExecEvent = value; } + } + } +} diff --git a/Assets/Raindrop/Netcom/Netcom.cs b/Assets/Raindrop/Netcom/Netcom.cs new file mode 100644 index 0000000..2a8e9f9 --- /dev/null +++ b/Assets/Raindrop/Netcom/Netcom.cs @@ -0,0 +1,420 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using OpenMetaverse; +using Raindrop; +using OpenMetaverse.Packets; + +namespace Raindrop.Netcom +{ + /// + /// RadegastNetcom is a class built on top of libsecondlife that provides a way to + /// raise events on the proper thread (for GUI apps especially). + /// + public partial class RaindropNetcom : IDisposable + { + private RaindropInstance instance; + private GridClient client { get { return instance.Client; } } + public LoginOptions loginOptions; + + private bool loggingIn = false; + private bool loggedIn = false; + private bool teleporting = false; + private bool agreeToTos = false; + public bool AgreeToTos { get { return agreeToTos; } set { agreeToTos = value; } } + private Grid grid; + public Grid Grid { get { return grid; } } + + // NetcomSync is used for raising certain events on the + // GUI/main thread. Useful if you're modifying GUI controls + // in the client app when responding to those events. + //private Control netcomSync; + //we don't use netcomsync or a netcom actually. we just pass all as events to the unitymainthreaddispatcher for now. + + #region ClientConnected event + /// The event subscribers, null of no subscribers + private EventHandler m_ClientConnected; + + ///Raises the ClientConnected Event + /// A ClientConnectedEventArgs object containing + /// the old and the new client + protected virtual void OnClientConnected(EventArgs e) + { + EventHandler handler = m_ClientConnected; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_ClientConnectedLock = new object(); + + /// Raise event delegate + private delegate void ClientConnectedRaise(EventArgs e); + + /// Raised when the GridClient object in the main Radegast instance is changed + public event EventHandler ClientConnected + { + add { lock (m_ClientConnectedLock) { m_ClientConnected += value; } } + remove { lock (m_ClientConnectedLock) { m_ClientConnected -= value; } } + } + #endregion ClientConnected event + + public RaindropNetcom(RaindropInstance instance) + { + this.instance = instance; + loginOptions = new LoginOptions(); + + instance.ClientChanged += new EventHandler(instance_ClientChanged); + RegisterClientEvents(client); + } + + private void RegisterClientEvents(GridClient client) + { + client.Self.ChatFromSimulator += new EventHandler(Self_ChatFromSimulator); + client.Self.IM += new EventHandler(Self_IM); + client.Self.MoneyBalance += new EventHandler(Self_MoneyBalance); + client.Self.TeleportProgress += new EventHandler(Self_TeleportProgress); + client.Self.AlertMessage += new EventHandler(Self_AlertMessage); + client.Network.Disconnected += new EventHandler(Network_Disconnected); + client.Network.LoginProgress += new EventHandler(Network_LoginProgress); + client.Network.LoggedOut += new EventHandler(Network_LoggedOut); + } + + private void UnregisterClientEvents(GridClient client) + { + client.Self.ChatFromSimulator -= new EventHandler(Self_ChatFromSimulator); + client.Self.IM -= new EventHandler(Self_IM); + client.Self.MoneyBalance -= new EventHandler(Self_MoneyBalance); + client.Self.TeleportProgress -= new EventHandler(Self_TeleportProgress); + client.Self.AlertMessage -= new EventHandler(Self_AlertMessage); + client.Network.Disconnected -= new EventHandler(Network_Disconnected); + client.Network.LoginProgress -= new EventHandler(Network_LoginProgress); + client.Network.LoggedOut -= new EventHandler(Network_LoggedOut); + } + + void instance_ClientChanged(object sender, ClientChangedEventArgs e) + { + UnregisterClientEvents(e.OldClient); + RegisterClientEvents(client); + } + + //private bool CanSyncInvoke + //{ + // get + // { + // return netcomSync != null && !netcomSync.IsDisposed && netcomSync.IsHandleCreated && netcomSync.InvokeRequired; + // } + //} + + public void Dispose() + { + if (client != null) + { + UnregisterClientEvents(client); + } + } + + void Self_IM(object sender, InstantMessageEventArgs e) + { + UnityMainThreadDispatcher.Instance().Enqueue(() => { + Logger.DebugLog("netcom callback: Self_IM"); + OnInstantMessageReceived(e); + }); + + + //if (CanSyncInvoke) + // netcomSync.BeginInvoke(new OnInstantMessageRaise(OnInstantMessageReceived), new object[] { e }); + //else + // OnInstantMessageReceived(e); + } + + void Network_LoginProgress(object sender, LoginProgressEventArgs e) + { + if (e.Status == LoginStatus.Success) + { + loggedIn = true; + client.Self.RequestBalance(); + if (CanSyncInvoke) + { + netcomSync.BeginInvoke(new ClientConnectedRaise(OnClientConnected), new object[] { EventArgs.Empty }); + } + else + { + OnClientConnected(EventArgs.Empty); + } + } + + if (e.Status == LoginStatus.Failed) + { + instance.MarkEndExecution(); + } + + LoginProgressEventArgs ea = new LoginProgressEventArgs(e.Status, e.Message, string.Empty); + + if (CanSyncInvoke) + netcomSync.BeginInvoke(new OnClientLoginRaise(OnClientLoginStatus), new object[] { e }); + else + OnClientLoginStatus(e); + } + + void Network_LoggedOut(object sender, LoggedOutEventArgs e) + { + loggedIn = false; + + if (CanSyncInvoke) + netcomSync.BeginInvoke(new OnClientLogoutRaise(OnClientLoggedOut), new object[] { EventArgs.Empty }); + else + OnClientLoggedOut(EventArgs.Empty); + } + + void Self_TeleportProgress(object sender, TeleportEventArgs e) + { + if (e.Status == TeleportStatus.Finished || e.Status == TeleportStatus.Failed) + teleporting = false; + + if (CanSyncInvoke) + netcomSync.BeginInvoke(new OnTeleportStatusRaise(OnTeleportStatusChanged), new object[] { e }); + else + OnTeleportStatusChanged(e); + } + + private void Self_ChatFromSimulator(object sender, ChatEventArgs e) + { + if (CanSyncInvoke) + netcomSync.BeginInvoke(new OnChatRaise(OnChatReceived), new object[] { e }); + else + OnChatReceived(e); + } + + void Network_Disconnected(object sender, DisconnectedEventArgs e) + { + loggedIn = false; + instance.MarkEndExecution(); + + if (CanSyncInvoke) + netcomSync.BeginInvoke(new OnClientDisconnectRaise(OnClientDisconnected), new object[] { e }); + else + OnClientDisconnected(e); + } + + void Self_MoneyBalance(object sender, BalanceEventArgs e) + { + if (CanSyncInvoke) + netcomSync.BeginInvoke(new OnMoneyBalanceRaise(OnMoneyBalanceUpdated), new object[] { e }); + else + OnMoneyBalanceUpdated(e); + } + + void Self_AlertMessage(object sender, AlertMessageEventArgs e) + { + if (CanSyncInvoke) + netcomSync.BeginInvoke(new OnAlertMessageRaise(OnAlertMessageReceived), new object[] { e }); + else + OnAlertMessageReceived(e); + } + + public void Login() + { + loggingIn = true; + + // Report crashes only once and not on relogs/reconnects + LastExecStatus execStatus = instance.GetLastExecStatus(); + if (!instance.AnotherInstanceRunning() && execStatus != LastExecStatus.Normal && (!instance.ReportedCrash)) + { + instance.ReportedCrash = true; + loginOptions.LastExecEvent = execStatus; + Logger.Log("Reporting crash of the last application run to the grid login service", Helpers.LogLevel.Warning); + } + else + { + loginOptions.LastExecEvent = LastExecStatus.Normal; + Logger.Log("Reporting normal shutdown of the last application run to the grid login service", Helpers.LogLevel.Info); + } + instance.MarkStartExecution(); + + OverrideEventArgs ea = new OverrideEventArgs(); + OnClientLoggingIn(ea); + + if (ea.Cancel) + { + loggingIn = false; + return; + } + + if (string.IsNullOrEmpty(loginOptions.FirstName) || + string.IsNullOrEmpty(loginOptions.LastName) || + string.IsNullOrEmpty(loginOptions.Password)) + { + OnClientLoginStatus( + new LoginProgressEventArgs(LoginStatus.Failed, "One or more fields are blank.", string.Empty)); + } + + string startLocation = string.Empty; + + switch (loginOptions.StartLocation) + { + case StartLocationType.Home: startLocation = "home"; break; + case StartLocationType.Last: startLocation = "last"; break; + + case StartLocationType.Custom: + startLocation = loginOptions.StartLocationCustom.Trim(); + + StartLocationParser parser = new StartLocationParser(startLocation); + startLocation = NetworkManager.StartLocation(parser.Sim, parser.X, parser.Y, parser.Z); + + break; + } + + string password; + + if (LoginOptions.IsPasswordMD5(loginOptions.Password)) + { + password = loginOptions.Password; + } + else + { + if (loginOptions.Password.Length > 16) + { + password = Utils.MD5(loginOptions.Password.Substring(0, 16)); + } + else + { + password = Utils.MD5(loginOptions.Password); + } + } + + LoginParams loginParams = client.Network.DefaultLoginParams( + loginOptions.FirstName, loginOptions.LastName, password, + loginOptions.Channel, loginOptions.Version); + + grid = loginOptions.Grid; + loginParams.Start = startLocation; + loginParams.AgreeToTos = AgreeToTos; + loginParams.URI = grid.LoginURI; + loginParams.LastExecEvent = loginOptions.LastExecEvent; + client.Network.BeginLogin(loginParams); + } + + public void Logout() + { + if (!loggedIn) + { + OnClientLoggedOut(EventArgs.Empty); + return; + } + + OverrideEventArgs ea = new OverrideEventArgs(); + OnClientLoggingOut(ea); + if (ea.Cancel) return; + + client.Network.Logout(); + } + + public void ChatOut(string chat, ChatType type, int channel) + { + if (!loggedIn) return; + + client.Self.Chat(chat, channel, type); + OnChatSent(new ChatSentEventArgs(chat, type, channel)); + } + + public void SendInstantMessage(string message, UUID target, UUID session) + { + if (!loggedIn) return; + + client.Self.InstantMessage( + loginOptions.FullName, target, message, session, InstantMessageDialog.MessageFromAgent, + InstantMessageOnline.Online, client.Self.SimPosition, client.Network.CurrentSim.ID, null); + + OnInstantMessageSent(new InstantMessageSentEventArgs(message, target, session, DateTime.Now)); + } + + public void SendIMStartTyping(UUID target, UUID session) + { + if (!loggedIn) return; + + client.Self.InstantMessage( + loginOptions.FullName, target, "typing", session, InstantMessageDialog.StartTyping, + InstantMessageOnline.Online, client.Self.SimPosition, client.Network.CurrentSim.ID, null); + } + + public void SendIMStopTyping(UUID target, UUID session) + { + if (!loggedIn) return; + + client.Self.InstantMessage( + loginOptions.FullName, target, "typing", session, InstantMessageDialog.StopTyping, + InstantMessageOnline.Online, client.Self.SimPosition, client.Network.CurrentSim.ID, null); + } + + public void Teleport(string sim, Vector3 coordinates) + { + if (!loggedIn) return; + if (teleporting) return; + + TeleportingEventArgs ea = new TeleportingEventArgs(sim, coordinates); + OnTeleporting(ea); + if (ea.Cancel) return; + + teleporting = true; + client.Self.Teleport(sim, coordinates); + } + + public bool IsLoggingIn + { + get { return loggingIn; } + } + + public bool IsLoggedIn + { + get { return loggedIn; } + } + + public bool IsTeleporting + { + get { return teleporting; } + } + + public LoginOptions LoginOptions + { + get { return loginOptions; } + set { loginOptions = value; } + } + + //public Control NetcomSync + //{ + // get { return netcomSync; } + // set { netcomSync = value; } + //} + } +} diff --git a/Assets/Raindrop/Netcom/NetcomEvents.cs b/Assets/Raindrop/Netcom/NetcomEvents.cs new file mode 100644 index 0000000..45e8800 --- /dev/null +++ b/Assets/Raindrop/Netcom/NetcomEvents.cs @@ -0,0 +1,127 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; +using OpenMetaverse; + +namespace Raindrop.Netcom +{ + public partial class RaindropNetcom + { + // For the NetcomSync stuff + private delegate void OnClientLoginRaise(LoginProgressEventArgs e); + private delegate void OnClientLogoutRaise(EventArgs e); + private delegate void OnClientDisconnectRaise(DisconnectedEventArgs e); + private delegate void OnChatRaise(ChatEventArgs e); + private delegate void OnInstantMessageRaise(InstantMessageEventArgs e); + private delegate void OnAlertMessageRaise(AlertMessageEventArgs e); + private delegate void OnMoneyBalanceRaise(BalanceEventArgs e); + private delegate void OnTeleportStatusRaise(TeleportEventArgs e); + + public event EventHandler ClientLoggingIn; + public event EventHandler ClientLoginStatus; + public event EventHandler ClientLoggingOut; + public event EventHandler ClientLoggedOut; + public event EventHandler ClientDisconnected; + public event EventHandler ChatReceived; + public event EventHandler ChatSent; + public event EventHandler InstantMessageReceived; + public event EventHandler InstantMessageSent; + public event EventHandler Teleporting; + public event EventHandler TeleportStatusChanged; + public event EventHandler AlertMessageReceived; + public event EventHandler MoneyBalanceUpdated; + + protected virtual void OnClientLoggingIn(OverrideEventArgs e) + { + if (ClientLoggingIn != null) ClientLoggingIn(this, e); + } + + protected virtual void OnClientLoginStatus(LoginProgressEventArgs e) + { + if (ClientLoginStatus != null) ClientLoginStatus(this, e); + } + + protected virtual void OnClientLoggingOut(OverrideEventArgs e) + { + if (ClientLoggingOut != null) ClientLoggingOut(this, e); + } + + protected virtual void OnClientLoggedOut(EventArgs e) + { + if (ClientLoggedOut != null) ClientLoggedOut(this, e); + } + + protected virtual void OnClientDisconnected(DisconnectedEventArgs e) + { + if (ClientDisconnected != null) ClientDisconnected(this, e); + } + + protected virtual void OnChatReceived(ChatEventArgs e) + { + if (ChatReceived != null) ChatReceived(this, e); + } + + protected virtual void OnChatSent(ChatSentEventArgs e) + { + if (ChatSent != null) ChatSent(this, e); + } + + protected virtual void OnInstantMessageReceived(InstantMessageEventArgs e) + { + if (InstantMessageReceived != null) InstantMessageReceived(this, e); + } + + protected virtual void OnInstantMessageSent(InstantMessageSentEventArgs e) + { + if (InstantMessageSent != null) InstantMessageSent(this, e); + } + + protected virtual void OnTeleporting(TeleportingEventArgs e) + { + if (Teleporting != null) Teleporting(this, e); + } + + protected virtual void OnTeleportStatusChanged(TeleportEventArgs e) + { + if (TeleportStatusChanged != null) TeleportStatusChanged(this, e); + } + + protected virtual void OnAlertMessageReceived(AlertMessageEventArgs e) + { + if (AlertMessageReceived != null) AlertMessageReceived(this, e); + } + + protected virtual void OnMoneyBalanceUpdated(BalanceEventArgs e) + { + if (MoneyBalanceUpdated != null) MoneyBalanceUpdated(this, e); + } + } +} diff --git a/Assets/Raindrop/Netcom/OverrideEventArgs.cs b/Assets/Raindrop/Netcom/OverrideEventArgs.cs new file mode 100644 index 0000000..e4826a6 --- /dev/null +++ b/Assets/Raindrop/Netcom/OverrideEventArgs.cs @@ -0,0 +1,55 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; + +namespace Raindrop.Netcom +{ + public class OverrideEventArgs : EventArgs + { + private bool _cancel = false; + + public OverrideEventArgs() + { + + } + + public OverrideEventArgs(bool cancel) + { + _cancel = cancel; + } + + public bool Cancel + { + get { return _cancel; } + set { _cancel = value; } + } + } +} \ No newline at end of file diff --git a/Assets/Raindrop/Netcom/StartLocationParser.cs b/Assets/Raindrop/Netcom/StartLocationParser.cs new file mode 100644 index 0000000..81dcef9 --- /dev/null +++ b/Assets/Raindrop/Netcom/StartLocationParser.cs @@ -0,0 +1,125 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; + +namespace Raindrop.Netcom +{ + public class StartLocationParser + { + private string location; + + public StartLocationParser(string location) + { + if (location == null) throw new Exception("Location cannot be null."); + + this.location = location; + } + + private string GetSim(string location) + { + if (!location.Contains("/")) return location; + + string[] locSplit = location.Split('/'); + return locSplit[0]; + } + + private int GetX(string location) + { + if (!location.Contains("/")) return 128; + + string[] locSplit = location.Split('/'); + + int returnResult; + bool stringToInt = int.TryParse(locSplit[1], out returnResult); + + if (stringToInt) + return returnResult; + else + return 128; + } + + private int GetY(string location) + { + if (!location.Contains("/")) return 128; + + string[] locSplit = location.Split('/'); + + if (locSplit.Length > 2) + { + int returnResult; + bool stringToInt = int.TryParse(locSplit[2], out returnResult); + + if (stringToInt) + return returnResult; + } + + return 128; + } + + private int GetZ(string location) + { + if (!location.Contains("/")) return 0; + + string[] locSplit = location.Split('/'); + + if (locSplit.Length > 3) + { + int returnResult; + bool stringToInt = int.TryParse(locSplit[3], out returnResult); + + if (stringToInt) + return returnResult; + } + + return 0; + } + + public string Sim + { + get { return GetSim(location); } + } + + public int X + { + get { return GetX(location); } + } + + public int Y + { + get { return GetY(location); } + } + + public int Z + { + get { return GetZ(location); } + } + } +} diff --git a/Assets/Raindrop/Netcom/TeleportingEventArgs.cs b/Assets/Raindrop/Netcom/TeleportingEventArgs.cs new file mode 100644 index 0000000..b8f84dd --- /dev/null +++ b/Assets/Raindrop/Netcom/TeleportingEventArgs.cs @@ -0,0 +1,56 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using OpenMetaverse; + +namespace Raindrop.Netcom +{ + public class TeleportingEventArgs : OverrideEventArgs + { + private string _sim; + private Vector3 _coordinates; + + public TeleportingEventArgs(string sim, Vector3 coordinates) : base() + { + _sim = sim; + _coordinates = coordinates; + } + + public string SimName + { + get { return _sim; } + } + + public Vector3 Coordinates + { + get { return _coordinates; } + } + } +} \ No newline at end of file diff --git a/Assets/Raindrop/RaindropClient.cs b/Assets/Raindrop/RaindropClient.cs index 770c53f..f15d335 100644 --- a/Assets/Raindrop/RaindropClient.cs +++ b/Assets/Raindrop/RaindropClient.cs @@ -1,213 +1,267 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using LibreMetaverse; -using OpenMetaverse; +//using System.Collections; +//using System.Collections.Generic; +//using UnityEngine; +//using LibreMetaverse; +//using OpenMetaverse; +//using DisruptorUnity3d; + +//namespace Raindrop +//{ +// //implements (actually, composites) the gridclient +// public class RaindropClient //todo: decouple unity, maybe. +// { + +// //static readonly RingBuffer Queue = new RingBuffer(1000); -namespace Raindrop -{ - //implements (actually, composites) the gridclient - public class RaindropClient - { - //todo: internal eventbus for raindrop subsystems comms; include ui? - public event Notify LoginCompleted; - public event Notify LoginFailed; +// //todo: internal eventbus for raindrop subsystems comms; include ui? +// public event Notify LoginCompleted; +// public event Notify LoginFailed; - public GridClient Client; +// public GridClient Client; - public enum RaindropState - { - intialise, - connected, - disconnected +// public enum RaindropState +// { +// intialise, +// connected, +// disconnected - } +// } - private RaindropState clientstate; +// private RaindropState clientstate; - private string Username { get; set; } - private string Password { get; set; } - public string configdatapath { get; private set; } +// private readonly object eventLock = new object(); +// private List avatars_in_sim = new List(); +// private Global globalRef; - public RaindropClient() - { - clientstate = RaindropState.intialise; +// private string Username { get; set; } +// private string Password { get; set; } +// public string configdatapath { get; private set; } - Client = new GridClient(); // instantiates the GridClient class - // to the global Client object +// public RaindropClient(string appdatapath, Global global) +// { +// globalRef = global; +// //ensure you set the app path first, so that the Setting static prop gets updated before construction of the client instance. +// setConfigPath(appdatapath); - Client.Settings.USE_LLSD_LOGIN = true; - const string AGNI_LOGIN_SERVER = "https://login.agni.lindenlab.com/cgi-bin/login.cgi"; - Client.Settings.LOGIN_SERVER = AGNI_LOGIN_SERVER; +// clientstate = RaindropState.intialise; + +// Client = new GridClient(); // instantiates the GridClient class +// // to the global Client object + + +// Client.Settings.USE_LLSD_LOGIN = true; +// const string AGNI_LOGIN_SERVER = "https://login.agni.lindenlab.com/cgi-bin/login.cgi"; +// Client.Settings.LOGIN_SERVER = AGNI_LOGIN_SERVER; +// RegisterClientEvents(); +// } - RegisterClientEvents(); - } + - private void RegisterClientEvents() - { - ////register events - //Client.Appearance.AgentWearablesReply += Appearance_AgentWearablesReply; - //Client.Appearance.AppearanceSet += Appearance_AppearanceSet; - //Client.Appearance.CachedBakesReply += Appearance_CachedBakesReply; - //Client.Appearance.RebakeAvatarRequested += Appearance_RebakeAvatarRequested; +// private void RegisterClientEvents() +// { +// ////register events +// //Client.Appearance.AgentWearablesReply += Appearance_AgentWearablesReply; +// //Client.Appearance.AppearanceSet += Appearance_AppearanceSet; +// //Client.Appearance.CachedBakesReply += Appearance_CachedBakesReply; +// //Client.Appearance.RebakeAvatarRequested += Appearance_RebakeAvatarRequested; - ////local chat - Client.Self.ChatFromSimulator += Self_ChatFromSimulator; +// ////local chat +// Client.Self.ChatFromSimulator += Self_ChatFromSimulator; - ////user connected/disconnected - Client.Network.Disconnected += Network_Disconnected; - Client.Network.LoginProgress += Network_LoginProgress; +// ////user connected/disconnected +// Client.Network.Disconnected += Network_Disconnected; +// Client.Network.LoginProgress += Network_LoginProgress; - ////grid location update - Client.Grid.CoarseLocationUpdate += Grid_CoarseLocationUpdate; - Client.Network.SimChanged += Network_SimChanged; +// ////grid location update +// Client.Grid.CoarseLocationUpdate += Grid_CoarseLocationUpdate; +// Client.Network.SimChanged += Network_SimChanged; - //log - OpenMetaverse.Logger.OnLogMessage += Logger_OnLogMessage; - } +// //log +// OpenMetaverse.Logger.OnLogMessage += Logger_OnLogMessage; +// } - private void Logger_OnLogMessage(object message, Helpers.LogLevel level) - { - if (level == Helpers.LogLevel.Debug) - { - Debug.Log(message); - } - else if (level == Helpers.LogLevel.Error) - { - Debug.LogError(message); - } - else if (level == Helpers.LogLevel.Info) - { - Debug.Log(message); - } - else if (level == Helpers.LogLevel.Warning) - { - Debug.LogWarning(message); - } - else - { - Debug.LogError(message); - } - } + //private void Logger_OnLogMessage(object message, Helpers.LogLevel level) + //{ + // if (level == Helpers.LogLevel.Debug) + // { + // Debug.Log(message); + // } + // else if (level == Helpers.LogLevel.Error) + // { + // Debug.LogError(message); + // } + // else if (level == Helpers.LogLevel.Info) + // { + // Debug.Log(message); + // } + // else if (level == Helpers.LogLevel.Warning) + // { + // Debug.LogWarning(message); + // } + // else + // { + // Debug.LogError(message); + // } + //} - internal void setConfigPath(string app_data_Path) - { - this.configdatapath = app_data_Path; +// internal void setConfigPath(string app_data_Path) +// { +// this.configdatapath = app_data_Path; +// Settings.RESOURCE_DIR = app_data_Path; +// //Client.Settings.ASSET_CACHE_DIR = app_data_Path + "/cache"; +// } - } +// private void Network_SimChanged(object sender, SimChangedEventArgs e) +// { +// Debug.Log("Sim was changed."); +// } - private void Network_SimChanged(object sender, SimChangedEventArgs e) - { - throw new System.NotImplementedException(); - } - - private void Grid_CoarseLocationUpdate(object sender, CoarseLocationUpdateEventArgs e) - { - throw new System.NotImplementedException(); - } - - private void Network_LoginProgress(object sender, LoginProgressEventArgs e) - { - if (e.Status == LoginStatus.Failed) - { - LoginFailed?.Invoke(); //raise event. - Debug.LogWarning("logging in failed. \n Message: " + e.Message + "fail reason: " + e.FailReason); - } - else if (e.Status == LoginStatus.Success) - { - this.clientstate = RaindropState.connected; - - LoginCompleted?.Invoke(); //raise event. - - Disk.SaveLoad.saveCred(Username,Password, configdatapath); +// private void Grid_CoarseLocationUpdate(object sender, CoarseLocationUpdateEventArgs e) +// { - Debug.Log("logging in success. \n Message: " + e.Message); +// lock (eventLock) +// { + +// if (e.Simulator == Client.Network.CurrentSim) +// { + + +// foreach (var each in e.NewEntries) +// { +// avatars_in_sim.Add(each); +// } + +// foreach (var each in e.RemovedEntries) +// { +// if (avatars_in_sim.Contains(each)) +// { +// avatars_in_sim.Remove(each); + +// } +// } + +// if (e.NewEntries.Count != 0 || e.RemovedEntries.Count != 0) +// { +// Debug.Log("Avatars: " + avatars_in_sim.ToString()); +// } +// } +// } + +// } + +// private void Network_LoginProgress(object sender, LoginProgressEventArgs e) +// { +// if (e.Status == LoginStatus.Failed) +// { +// LoginFailed?.Invoke(); //raise event. +// Debug.LogWarning("logging in failed. \n Message: " + e.Message + "fail reason: " + e.FailReason); +// globalRef.RaindropVM.canvasManager.pushModal(); //error mah boi +// } +// else if (e.Status == LoginStatus.Success) +// { +// this.clientstate = RaindropState.connected; + +// //LoginCompleted?.Invoke(); //raise event. + +// UnityMainThreadDispatcher.Instance().Enqueue(() => +// { +// Debug.Log("This is executed from the main thread"); +// Debug.Log("Login success ui update"); +// globalRef.RaindropVM.canvasManager.popCanvas(); //remove login panel from sight. +// globalRef.RaindropVM.canvasManager.pushCanvas(CanvasType.Game); +// }); + +// Disk.SaveLoad.saveCred(Username,Password, configdatapath); + + +// Debug.Log("logging in success. \n Message: " + e.Message); - } - else if (e.Status == LoginStatus.ConnectingToLogin) - { - Debug.Log("ConnectingToLogin. \n Message: " + e.Message); +// } +// else if (e.Status == LoginStatus.ConnectingToLogin) +// { +// //Debug.Log("ConnectingToLogin. \n Message: " + e.Message); - } - else if (e.Status == LoginStatus.ConnectingToSim) - { - Debug.Log("ConnectingToSim. \n Message: " + e.Message); +// } +// else if (e.Status == LoginStatus.ConnectingToSim) +// { +// Debug.Log("ConnectingToSim. \n Message: " + e.Message); - } - else - { - Debug.LogError("logging in not-supported. \n status type: " + e.Status.ToString() + "\n Message: " + e.Message); - } - } +// } +// else +// { +// Debug.LogError("logging in not-supported. \n status type: " + e.Status.ToString() + "\n Message: " + e.Message); +// } +// } - private void Network_Disconnected(object sender, DisconnectedEventArgs e) - { - Debug.Log("Disconnected!"); - } +// private void Network_Disconnected(object sender, DisconnectedEventArgs e) +// { +// Debug.Log("Disconnected!"); +// } - private void Self_ChatFromSimulator(object sender, ChatEventArgs e) - { - throw new System.NotImplementedException(); - } +// private void Self_ChatFromSimulator(object sender, ChatEventArgs e) +// { +// Debug.Log("Chat: " + e.FromName+ " : " + e.Message); - //private void Appearance_RebakeAvatarRequested(object sender, RebakeAvatarTexturesEventArgs e) - //{ - // throw new System.NotImplementedException(); - //} +// } - //private void Appearance_CachedBakesReply(object sender, AgentCachedBakesReplyEventArgs e) - //{ - // throw new System.NotImplementedException(); - //} +// //private void Appearance_RebakeAvatarRequested(object sender, RebakeAvatarTexturesEventArgs e) +// //{ +// // throw new System.NotImplementedException(); +// //} - //private void Appearance_AppearanceSet(object sender, AppearanceSetEventArgs e) - //{ - // throw new System.NotImplementedException(); - //} +// //private void Appearance_CachedBakesReply(object sender, AgentCachedBakesReplyEventArgs e) +// //{ +// // throw new System.NotImplementedException(); +// //} - //private void Appearance_AgentWearablesReply(object sender, AgentWearablesReplyEventArgs e) - //{ - // throw new System.NotImplementedException(); - //} +// //private void Appearance_AppearanceSet(object sender, AppearanceSetEventArgs e) +// //{ +// // throw new System.NotImplementedException(); +// //} - //connects to SL. username is either format; ie: "firstname lastname" or "Jaken69" are both compaitble. - public void connectTo(string username, string password) - { +// //private void Appearance_AgentWearablesReply(object sender, AgentWearablesReplyEventArgs e) +// //{ +// // throw new System.NotImplementedException(); +// //} - Username = username; - Password = password; +// //connects to SL. username is either format; ie: "firstname lastname" or "Jaken69" are both compaitble. +// public void connectTo(string username, string password) +// { - // Login to Simulator - string[] _splitname = username.Split(); - if (_splitname.Length == 1) - { - var temp = _splitname[0]; - _splitname = new string[2]; - _splitname[0] = temp; - _splitname[1] = ""; - } - else if (_splitname.Length != 2) - { - Debug.LogError("username is not 2 words (tip examples of valid usernames: \'Jake69 Resident\' or \'Jake Aabye\')"); - return; - } +// Username = username; +// Password = password; - var lp = new LoginParams(Global.MainRaindropInstance.Client, _splitname[0], _splitname[1], password, "raindropviewer@gmail.com", "RaindropViewer_0.1"); - Debug.Log("attempt login with name1 " + _splitname[0] + " name 2 " + _splitname[1] + " password " + password); - Global.MainRaindropInstance.Client.Network.BeginLogin(lp); +// // Login to Simulator +// string[] _splitname = username.Split(); +// if (_splitname.Length == 1) +// { +// var temp = _splitname[0]; +// _splitname = new string[2]; +// _splitname[0] = temp; +// _splitname[1] = ""; +// } +// else if (_splitname.Length != 2) +// { +// Debug.LogError("username is not 2 words (tip examples of valid usernames: \'Jake69 Resident\' or \'Jake Aabye\')"); +// return; +// } - //UnityClient.Client.Network.Login(lp); - // Logout of simulator - //Client.Network.Logout(); +// var lp = new LoginParams(Client, _splitname[0], _splitname[1], password, "raindropviewer@gmail.com", "RaindropViewer_0.1"); +// Debug.Log("attempt login with name1 " + _splitname[0] + " name 2 " + _splitname[1] + " password " + password); +// Client.Network.BeginLogin(lp); - } +// //UnityClient.Client.Network.Login(lp); +// // Logout of simulator +// //Client.Network.Logout(); - } -} \ No newline at end of file +// } + +// } +//} \ No newline at end of file diff --git a/Assets/Raindrop/RaindropEvents.cs b/Assets/Raindrop/RaindropEvents.cs index 59feb41..24ef56a 100644 --- a/Assets/Raindrop/RaindropEvents.cs +++ b/Assets/Raindrop/RaindropEvents.cs @@ -1,16 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +//using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; -namespace Raindrop -{ - public delegate void Notify(); +//namespace Raindrop +//{ +// public delegate void Notify(); - class RaindropEvents - { - } -} +// class RaindropEvents +// { +// } +//} diff --git a/Assets/Raindrop/RaindropInstance.cs b/Assets/Raindrop/RaindropInstance.cs new file mode 100644 index 0000000..74017ef --- /dev/null +++ b/Assets/Raindrop/RaindropInstance.cs @@ -0,0 +1,851 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Threading; +//using Radegast.Commands; +using Raindrop.Netcom; +//using Radegast.Media; +using OpenMetaverse; +using UnityEngine; +using Logger = OpenMetaverse.Logger; + +namespace Raindrop +{ + public class RaindropInstance + { + #region OnRadegastFormCreated + //Actually this event is never subscribed to! + //public event Action RadegastFormCreated; + ///// + ///// Triggers the RadegastFormCreated event. + ///// this method is called directly by the 'form' when the UI is loaded. the payload is the actual form - eg: formProfile + ///// + //public virtual void OnRadegastFormCreated(RadegastForm radForm) + //{ + // if (RadegastFormCreated != null) RadegastFormCreated(radForm); + //} + #endregion + + private GridClient client; + private RaindropNetcom netcom; + + private StateManager state; + private string app_data_dir; + + //private frmMain mainForm; //frmMain is a class that inherits RadegastForm. It seems to be the code-behind of the overall UI, that includes the view and buttons. + private mainUI mainCanvas; + + // Singleton, there can be only one instance + private static RaindropInstance globalInstance = null; + public static RaindropInstance GlobalInstance + { + get + { + if (globalInstance == null) + { + globalInstance = new RaindropInstance(new GridClient()); + } + return globalInstance; + } + } + + /// + /// Manages retrieving avatar names + /// + public NameManager Names { get { return names; } } + private NameManager names; + + /// + /// When was Radegast started (UTC) + /// + public readonly DateTime StartupTimeUTC; + + /// + /// Time zone of the current world (currently hard coded to US Pacific time) + /// + public TimeZoneInfo WordTimeZone; + + private string userDir; + /// + /// System (not grid!) user's dir + /// + public string UserDir { get { return userDir; } } + + /// + /// Grid client's user dir for settings and logs + /// + public string ClientDir + { + get + { + if (client != null && client.Self != null && !string.IsNullOrEmpty(client.Self.Name)) + { + return Path.Combine(userDir, client.Self.Name); + } + else + { + return Environment.CurrentDirectory; + } + } + } + + public string InventoryCacheFileName { get { return Path.Combine(ClientDir, "inventory.cache"); } } + + private string globalLogFile; + public string GlobalLogFile { get { return globalLogFile; } } + + private bool monoRuntime; + public bool MonoRuntime { get { return monoRuntime; } } + + private Dictionary groups = new Dictionary(); + public Dictionary Groups { get { return groups; } } + + private Settings globalSettings; + /// + /// Global settings for the entire application + /// + public Settings GlobalSettings { get { return globalSettings; } } + + private Settings clientSettings; + /// + /// Per client settings + /// + public Settings ClientSettings { get { return clientSettings; } } + + public const string INCOMPLETE_NAME = "Loading..."; + + public readonly bool advancedDebugging = false; + + //private PluginManager pluginManager; + ///// Handles loading plugins and scripts + //public PluginManager PluginManager { get { return pluginManager; } } + + //private MediaManager mediaManager; + ///// + ///// Radegast media manager for playing streams and in world sounds + ///// + //public MediaManager MediaManager { get { return mediaManager; } } + + + //private CommandsManager commandsManager; + ///// + ///// Radegast command manager for executing textual console commands + ///// + //public CommandsManager CommandsManager { get { return commandsManager; } } + + /// + /// Radegast ContextAction manager for context sensitive actions + /// + //public ContextActionsManager ContextActionManager { get; private set; } + + private RaindropMovement movement; + /// + /// Allows key emulation for moving avatar around + /// + public RaindropMovement Movement { get { return movement; } } + + //private InventoryClipboard inventoryClipboard; + ///// + ///// The last item that was cut or copied in the inventory, used for pasting + ///// in a different place on the inventory, or other places like profile + ///// that allow sending copied inventory items + ///// + //public InventoryClipboard InventoryClipboard + //{ + // get { return inventoryClipboard; } + // set + // { + // inventoryClipboard = value; + // OnInventoryClipboardUpdated(EventArgs.Empty); + // } + //} + + //private RLVManager rlv; + + ///// + ///// Manager for RLV functionality + ///// + //public RLVManager RLV { get { return rlv; } } + + private GridManager gridManager; + /// Manages default params for different grids + public GridManager GridManger { get { return gridManager; } } + + + /// + /// Current Outfit Folder (appearnce) manager + /// + public CurrentOutfitFolder COF; + + /// + /// Did we report crash to the grid login service + /// + public bool ReportedCrash = false; + + private string CrashMarkerFileName + { + get + { + return Path.Combine(UserDir, "crash_marker"); + } + } + + #region Events + + #region ClientChanged event + /// The event subscribers, null of no subscribers + private EventHandler m_ClientChanged; + + ///Raises the ClientChanged Event + /// A ClientChangedEventArgs object containing + /// the old and the new client + protected virtual void OnClientChanged(ClientChangedEventArgs e) + { + EventHandler handler = m_ClientChanged; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_ClientChangedLock = new object(); + + /// Raised when the GridClient object in the main Radegast instance is changed + public event EventHandler ClientChanged + { + add { lock (m_ClientChangedLock) { m_ClientChanged += value; } } + remove { lock (m_ClientChangedLock) { m_ClientChanged -= value; } } + } + #endregion ClientChanged event + + #region InventoryClipboardUpdated event + /// The event subscribers, null of no subscribers + private EventHandler m_InventoryClipboardUpdated; + + ///Raises the InventoryClipboardUpdated Event + /// A EventArgs object containing + /// the old and the new client + protected virtual void OnInventoryClipboardUpdated(EventArgs e) + { + EventHandler handler = m_InventoryClipboardUpdated; + if (handler != null) + handler(this, e); + } + + /// Thread sync lock object + private readonly object m_InventoryClipboardUpdatedLock = new object(); + + /// Raised when the GridClient object in the main Radegast instance is changed + public event EventHandler InventoryClipboardUpdated + { + add { lock (m_InventoryClipboardUpdatedLock) { m_InventoryClipboardUpdated += value; } } + remove { lock (m_InventoryClipboardUpdatedLock) { m_InventoryClipboardUpdated -= value; } } + } + #endregion InventoryClipboardUpdated event + + + #endregion Events + + public RaindropInstance(GridClient client0) + { + // incase something else calls GlobalInstance while we are loading + globalInstance = this; + + app_data_dir = Application.persistentDataPath; + + //if (!System.Diagnostics.Debugger.IsAttached) + //{ + // Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); + // Application.ThreadException += HandleThreadException; + //} + + client = client0; + + // Initialize current time zone, and mark when we started + GetWorldTimeZone(); + StartupTimeUTC = DateTime.UtcNow; + + // Are we running mono? + monoRuntime = Type.GetType("Mono.Runtime") != null; + + //Keyboard = new Keyboard(); + //Application.AddMessageFilter(Keyboard); + + netcom = new RaindropNetcom(this); + state = new StateManager(this); + //mediaManager = new MediaManager(this); + //commandsManager = new CommandsManager(this); + //ContextActionManager = new ContextActionsManager(this); + //RegisterContextActions(); + movement = new RaindropMovement(this); + + InitializeLoggingAndConfig(); + InitializeClient(client); + + //rlv = new RLVManager(this); + gridManager = new GridManager(); + gridManager.LoadGrids(app_data_dir); + + names = new NameManager(this); + COF = new CurrentOutfitFolder(this); + + mainCanvas = new mainUI(this); + //mainCanvas.InitializeControls(); + + //mainCanvas.Load += new EventHandler(mainForm_Load); + //pluginManager = new PluginManager(this); + //pluginManager.ScanAndLoadPlugins(); + } + + private void InitializeClient(GridClient client) + { + client.Settings.MULTIPLE_SIMS = false; + + client.Settings.USE_INTERPOLATION_TIMER = false; + client.Settings.ALWAYS_REQUEST_OBJECTS = true; + client.Settings.ALWAYS_DECODE_OBJECTS = true; + client.Settings.OBJECT_TRACKING = true; + client.Settings.ENABLE_SIMSTATS = true; + client.Settings.FETCH_MISSING_INVENTORY = true; + client.Settings.SEND_AGENT_THROTTLE = true; + client.Settings.SEND_AGENT_UPDATES = true; + client.Settings.STORE_LAND_PATCHES = true; + + client.Settings.USE_ASSET_CACHE = true; + client.Settings.ASSET_CACHE_DIR = Path.Combine(userDir, "cache"); + client.Assets.Cache.AutoPruneEnabled = false; + client.Assets.Cache.ComputeAssetCacheFilename = ComputeCacheName; + + client.Throttle.Total = 5000000f; + client.Settings.THROTTLE_OUTGOING_PACKETS = false; + client.Settings.LOGIN_TIMEOUT = 120 * 1000; + client.Settings.SIMULATOR_TIMEOUT = 180 * 1000; + client.Settings.MAX_CONCURRENT_TEXTURE_DOWNLOADS = 20; + + client.Self.Movement.AutoResetControls = false; + client.Self.Movement.UpdateInterval = 250; + + RegisterClientEvents(client); + SetClientTag(); + } + + public string ComputeCacheName(string cacheDir, UUID assetID) + { + string fileName = assetID.ToString(); + string dir = cacheDir + + Path.DirectorySeparatorChar + fileName.Substring(0, 1) + + Path.DirectorySeparatorChar + fileName.Substring(1, 1); + try + { + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + } + catch + { + return Path.Combine(cacheDir, fileName); + } + return Path.Combine(dir, fileName); + } + + private void RegisterClientEvents(GridClient client) + { + //log + OpenMetaverse.Logger.OnLogMessage += Logger_OnLogMessage; + + client.Groups.CurrentGroups += new EventHandler(Groups_CurrentGroups); + client.Groups.GroupLeaveReply += new EventHandler(Groups_GroupsChanged); + client.Groups.GroupDropped += new EventHandler(Groups_GroupsChanged); + client.Groups.GroupJoinedReply += new EventHandler(Groups_GroupsChanged); + if (netcom != null) + netcom.ClientConnected += new EventHandler(netcom_ClientConnected); + client.Network.LoginProgress += new EventHandler(Network_LoginProgress); + } + + private void UnregisterClientEvents(GridClient client) + { + client.Groups.CurrentGroups -= new EventHandler(Groups_CurrentGroups); + client.Groups.GroupLeaveReply -= new EventHandler(Groups_GroupsChanged); + client.Groups.GroupDropped -= new EventHandler(Groups_GroupsChanged); + client.Groups.GroupJoinedReply -= new EventHandler(Groups_GroupsChanged); + if (netcom != null) + netcom.ClientConnected -= new EventHandler(netcom_ClientConnected); + client.Network.LoginProgress -= new EventHandler(Network_LoginProgress); + } + + public void SetClientTag() + { + if (GlobalSettings["send_rad_client_tag"]) + { + client.Settings.CLIENT_IDENTIFICATION_TAG = new UUID("b748af88-58e2-995b-cf26-9486dea8e830"); + } + else + { + client.Settings.CLIENT_IDENTIFICATION_TAG = UUID.Zero; + } + } + private void GetWorldTimeZone() + { + try + { + foreach (TimeZoneInfo tz in TimeZoneInfo.GetSystemTimeZones()) + { + if (tz.Id == "Pacific Standard Time" || tz.Id == "America/Los_Angeles") + { + WordTimeZone = tz; + break; + } + } + } + catch (Exception) { } + } + + public DateTime GetWorldTime() + { + DateTime now; + + try + { + if (WordTimeZone != null) + now = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, WordTimeZone); + else + now = DateTime.UtcNow.AddHours(-7); + } + catch (Exception) + { + now = DateTime.UtcNow.AddHours(-7); + } + + return now; + } + + + public void Reconnect() + { + //TabConsole.DisplayNotificationInChat("Attempting to reconnect...", ChatBufferTextStyle.StatusDarkBlue); + Logger.Log("Attempting to reconnect", Helpers.LogLevel.Info, client); + GridClient oldClient = client; + client = new GridClient(); + UnregisterClientEvents(oldClient); + InitializeClient(client); + OnClientChanged(new ClientChangedEventArgs(oldClient, client)); + netcom.Login(); + } + + public void CleanUp() + { + MarkEndExecution(); + + if (COF != null) + { + COF.Dispose(); + COF = null; + } + + if (names != null) + { + names.Dispose(); + names = null; + } + + if (gridManager != null) + { + gridManager.Dispose(); + gridManager = null; + } + + //if (rlv != null) + //{ + // rlv.Dispose(); + // rlv = null; + //} + + if (client != null) + { + UnregisterClientEvents(client); + } + + //if (pluginManager != null) + //{ + // pluginManager.Dispose(); + // pluginManager = null; + //} + + if (movement != null) + { + movement.Dispose(); + movement = null; + } + //if (commandsManager != null) + //{ + // commandsManager.Dispose(); + // commandsManager = null; + //} + //if (ContextActionManager != null) + //{ + // ContextActionManager.Dispose(); + // ContextActionManager = null; + //} + //if (mediaManager != null) + //{ + // mediaManager.Dispose(); + // mediaManager = null; + //} + if (state != null) + { + state.Dispose(); + state = null; + } + if (netcom != null) + { + netcom.Dispose(); + netcom = null; + } + //if (mainCanvas != null) + //{ + // mainCanvas.Load -= new EventHandler(mainForm_Load); + //} + Logger.Log("RaindropInstance finished cleaning up.", Helpers.LogLevel.Debug); + } + + void mainForm_Load(object sender, EventArgs e) + { + //pluginManager.StartPlugins(); + } + + void netcom_ClientConnected(object sender, EventArgs e) + { + client.Self.RequestMuteList(); + } + + void Network_LoginProgress(object sender, LoginProgressEventArgs e) + { + if (e.Status == LoginStatus.ConnectingToSim) + { + try + { + if (!Directory.Exists(ClientDir)) + { + Directory.CreateDirectory(ClientDir); + } + clientSettings = new Settings(Path.Combine(ClientDir, "client_settings.xml")); + } + catch (Exception ex) + { + Logger.Log("Failed to create client directory", Helpers.LogLevel.Warning, ex); + } + } + } + + + /// + /// Fetches avatar name + /// + /// Avatar UUID + /// Should we wait until the name is retrieved + /// Avatar name + [Obsolete("Use Instance.Names.Get() instead")] + public string getAvatarName(UUID key, bool blocking) + { + return Names.Get(key, blocking); + } + + /// + /// Fetches avatar name from cache, if not in cache will request name from the server + /// + /// Avatar UUID + /// Avatar name + [Obsolete("Use Instance.Names.Get() instead")] + public string getAvatarName(UUID key) + { + return Names.Get(key); + } + + void Groups_GroupsChanged(object sender, EventArgs e) + { + client.Groups.RequestCurrentGroups(); + } + + public static string SafeFileName(string fileName) + { + foreach (char lDisallowed in Path.GetInvalidFileNameChars()) + { + fileName = fileName.Replace(lDisallowed.ToString(), "_"); + } + + return fileName; + } + + public string ChatFileName(string session) + { + string fileName = session; + + foreach (char lDisallowed in System.IO.Path.GetInvalidFileNameChars()) + { + fileName = fileName.Replace(lDisallowed.ToString(), "_"); + } + + return Path.Combine(ClientDir, fileName); + } + + public void LogClientMessage(string sessioName, string message) + { + if (globalSettings["disable_chat_im_log"]) return; + + lock (this) + { + try + { + File.AppendAllText(ChatFileName(sessioName), + DateTime.Now.ToString("yyyy-MM-dd [HH:mm:ss] ") + message + Environment.NewLine); + } + catch (Exception) { } + } + } + + void Groups_CurrentGroups(object sender, CurrentGroupsEventArgs e) + { + this.groups = e.Groups; + } + + private void InitializeLoggingAndConfig() + { + try + { + userDir = Path.Combine(app_data_dir , PROGRAMNAME); + if (!Directory.Exists(userDir)) + { + Directory.CreateDirectory(userDir); + } + } + catch (Exception) + { + userDir = System.Environment.CurrentDirectory; + }; + + globalLogFile = Path.Combine(userDir, PROGRAMNAME + ".log"); + globalSettings = new Settings(Path.Combine(userDir, "settings.xml")); + //frmSettings.InitSettigs(globalSettings, monoRuntime); + } + + public GridClient Client + { + get { return client; } + } + + public RaindropNetcom Netcom + { + get { return netcom; } + } + + public StateManager State + { + get { return state; } + } + + public mainUI MainCanvas + { + get { return mainCanvas; } + } + + //public TabsConsole TabConsole + //{ + // get { return mainForm.TabConsole; } + //} + + public void HandleThreadException(object sender, ThreadExceptionEventArgs e) + { + Logger.Log("Unhandled thread exception: " + + e.Exception.Message + Environment.NewLine + + e.Exception.StackTrace + Environment.NewLine, + Helpers.LogLevel.Error, + client); + } + + #region Crash reporting + FileStream MarkerLock = null; + private string PROGRAMNAME = "RaindropTest_02"; + + public bool AnotherInstanceRunning() + { + // We have successfuly obtained lock + if (MarkerLock != null && MarkerLock.CanWrite) + { + Logger.Log("No other instances detected, marker file already locked", Helpers.LogLevel.Debug); + return false || MonoRuntime; + } + + try + { + MarkerLock = new FileStream(CrashMarkerFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); + Logger.Log(string.Format("Successfully created and locked marker file {0}", CrashMarkerFileName), Helpers.LogLevel.Debug); + return false || MonoRuntime; + } + catch + { + MarkerLock = null; + Logger.Log(string.Format("Another instance detected, marker fils {0} locked", CrashMarkerFileName), Helpers.LogLevel.Debug); + return true; + } + } + + public LastExecStatus GetLastExecStatus() + { + // Crash marker file found and is not locked by us + if (File.Exists(CrashMarkerFileName) && MarkerLock == null) + { + Logger.Log(string.Format("Found crash marker file {0}", CrashMarkerFileName), Helpers.LogLevel.Debug); + return LastExecStatus.OtherCrash; + } + else + { + Logger.Log(string.Format("No crash marker file {0} found", CrashMarkerFileName), Helpers.LogLevel.Debug); + return LastExecStatus.Normal; + } + } + + public void MarkStartExecution() + { + Logger.Log(string.Format("Marking start of execution run, creating file: {0}", CrashMarkerFileName), Helpers.LogLevel.Debug); + try + { + File.Create(CrashMarkerFileName).Dispose(); + } + catch { } + } + + public void MarkEndExecution() + { + Logger.Log(string.Format("Marking end of execution run, deleting file: {0}", CrashMarkerFileName), Helpers.LogLevel.Debug); + try + { + if (MarkerLock != null) + { + MarkerLock.Close(); + MarkerLock.Dispose(); + MarkerLock = null; + } + + File.Delete(CrashMarkerFileName); + } + catch { } + } + + internal void setAppDataDir(string app_data_Path) + { + throw new NotImplementedException(); + } + + #endregion Crash reporting + + #region Context Actions + //void RegisterContextActions() + //{ + // ContextActionManager.RegisterContextAction(typeof(Primitive), "Save as DAE...", ExportDAEHander); + // ContextActionManager.RegisterContextAction(typeof(Primitive), "Copy UUID to clipboard", CopyObjectUUIDHandler); + //} + + //void DeregisterContextActions() + //{ + // ContextActionManager.DeregisterContextAction(typeof(Primitive), "Save as DAE..."); + // ContextActionManager.DeregisterContextAction(typeof(Primitive), "Copy UUID to clipboard"); + //} + + //void ExportDAEHander(object sender, EventArgs e) + //{ + // MainForm.DisplayColladaConsole((Primitive)sender); + //} + + //void CopyObjectUUIDHandler(object sender, EventArgs e) + //{ + // if (mainForm.InvokeRequired) + // { + // if (mainForm.IsHandleCreated || !MonoRuntime) + // { + // mainForm.Invoke(new MethodInvoker(() => CopyObjectUUIDHandler(sender, e))); + // } + // return; + // } + + // Clipboard.SetText(((Primitive)sender).ID.ToString()); + //} + + #endregion Context Actions + + + private void Logger_OnLogMessage(object message, Helpers.LogLevel level) + { + if (level == Helpers.LogLevel.Debug) + { + Debug.Log(message); + } + else if (level == Helpers.LogLevel.Error) + { + Debug.LogError(message); + } + else if (level == Helpers.LogLevel.Info) + { + Debug.Log(message); + } + else if (level == Helpers.LogLevel.Warning) + { + Debug.LogWarning(message); + } + else + { + Debug.LogError(message); + } + } + + + } + + #region Event classes + public class ClientChangedEventArgs : EventArgs + { + private GridClient m_OldClient; + private GridClient m_Client; + + public GridClient OldClient { get { return m_OldClient; } } + public GridClient Client { get { return m_Client; } } + + public ClientChangedEventArgs(GridClient OldClient, GridClient Client) + { + m_OldClient = OldClient; + m_Client = Client; + } + } + + #endregion Event classes +} diff --git a/Assets/Raindrop/RaindropInstance.cs.meta b/Assets/Raindrop/RaindropInstance.cs.meta new file mode 100644 index 0000000..3458df6 --- /dev/null +++ b/Assets/Raindrop/RaindropInstance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a513c3b8d6c8e1b48adc33fd6d665cef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Raindrop/RaindropMovement.cs b/Assets/Raindrop/RaindropMovement.cs new file mode 100644 index 0000000..8b79f3e --- /dev/null +++ b/Assets/Raindrop/RaindropMovement.cs @@ -0,0 +1,171 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; +using System.Timers; +using OpenMetaverse; + +namespace Raindrop +{ + public class RaindropMovement : IDisposable + { + private RaindropInstance instance; + private GridClient client { get { return instance.Client; } } + private Timer timer; + private Vector3 forward = new Vector3(1, 0, 0); + private bool turningLeft = false; + private bool turningRight = false; + private bool movingForward = false; + private bool movingBackward = false; + + public bool TurningLeft + { + get + { + return turningLeft; + } + set + { + turningLeft = value; + if (value) + { + timer_Elapsed(null, null); + timer.Enabled = true; + } + else + { + timer.Enabled = false; + client.Self.Movement.TurnLeft = false; + client.Self.Movement.SendUpdate(true); + } + } + } + + public bool TurningRight + { + get + { + return turningRight; + } + set + { + turningRight = value; + if (value) + { + timer_Elapsed(null, null); + timer.Enabled = true; + } + else + { + timer.Enabled = false; + client.Self.Movement.TurnRight = false; + client.Self.Movement.SendUpdate(true); + } + } + } + + public bool MovingForward + { + get + { + return movingForward; + } + set + { + movingForward = value; + if (value) + { + client.Self.Movement.AtPos = true; + client.Self.Movement.SendUpdate(true); + } + else + { + client.Self.Movement.AtPos = false; + client.Self.Movement.SendUpdate(true); + } + } + } + + public bool MovingBackward + { + get + { + return movingBackward; + } + set + { + movingBackward = value; + if (value) + { + client.Self.Movement.AtNeg = true; + client.Self.Movement.SendUpdate(true); + } + else + { + client.Self.Movement.AtNeg = false; + client.Self.Movement.SendUpdate(true); + + } + } + } + + public RaindropMovement(RaindropInstance instance) + { + this.instance = instance; + timer = new System.Timers.Timer(100); + timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); + timer.Enabled = false; + } + + public void Dispose() + { + timer.Enabled = false; + timer.Dispose(); + timer = null; + } + + void timer_Elapsed(object sender, ElapsedEventArgs e) + { + float delta = (float)timer.Interval / 1000f; + if (turningLeft) + { + client.Self.Movement.TurnLeft = true; + client.Self.Movement.BodyRotation = client.Self.Movement.BodyRotation * Quaternion.CreateFromAxisAngle(Vector3.UnitZ, delta); + client.Self.Movement.SendUpdate(true); + } + else if (turningRight) + { + client.Self.Movement.TurnRight = true; + client.Self.Movement.BodyRotation = client.Self.Movement.BodyRotation * Quaternion.CreateFromAxisAngle(Vector3.UnitZ, -delta); + client.Self.Movement.SendUpdate(true); + } + } + } +} diff --git a/Assets/Raindrop/RaindropUnity.asmdef b/Assets/Raindrop/RaindropUnity.asmdef new file mode 100644 index 0000000..39bd5cf --- /dev/null +++ b/Assets/Raindrop/RaindropUnity.asmdef @@ -0,0 +1,17 @@ +{ + "name": "RaindropUnity", + "rootNamespace": "", + "references": [ + "GUID:b6ef318018e211441b43da945a1caf13", + "GUID:1364d97af688c264f94c622d729b2059" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Raindrop/RaindropUnity.asmdef.meta b/Assets/Raindrop/RaindropUnity.asmdef.meta new file mode 100644 index 0000000..c268216 --- /dev/null +++ b/Assets/Raindrop/RaindropUnity.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0e5c96f0601ad834f84ded85be85a608 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Raindrop/Settings.cs b/Assets/Raindrop/Settings.cs new file mode 100644 index 0000000..577f327 --- /dev/null +++ b/Assets/Raindrop/Settings.cs @@ -0,0 +1,417 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; +using System.Collections.Generic; +using System.Collections; +using System.IO; +using System.Xml; +using OpenMetaverse; +using OpenMetaverse.StructuredData; +using System.Drawing; +//using System.Web.Script.Serialization; +using System.ComponentModel; +using SixLabors.ImageSharp; + +namespace Raindrop +{ + public class Settings : IDictionary + { + private string SettingsFile; + private OSDMap SettingsData; + + public delegate void SettingChangedCallback(object sender, SettingsEventArgs e); + public event SettingChangedCallback OnSettingChanged; + + public static readonly Dictionary DefaultFontSettings = new Dictionary() + { + {"Normal", new FontSetting { + Name = "Normal", + ForeColor = SystemColors.ControlText, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"StatusBlue", new FontSetting { + Name = "StatusBlue", + ForeColor = Color.Blue, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"StatusDarkBlue", new FontSetting { + Name = "StatusDarkBlue", + ForeColor = Color.DarkBlue, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"LindenChat", new FontSetting { + Name = "LindenChat", + ForeColor = Color.DarkGreen, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"ObjectChat", new FontSetting { + Name = "ObjectChat", + ForeColor = Color.DarkCyan, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"StartupTitle", new FontSetting { + Name = "StartupTitle", + ForeColor = SystemColors.ControlText, + BackColor = Color.Transparent, + Font = new Font(FontSetting.DefaultFont, FontStyle.Bold), + }}, + {"Alert", new FontSetting { + Name = "Alert", + ForeColor = Color.DarkRed, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"Error", new FontSetting { + Name = "Error", + ForeColor = Color.Red, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"OwnerSay", new FontSetting { + Name = "OwnerSay", + ForeColor = Color.DarkGoldenrod, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"Timestamp", new FontSetting { + Name = "Timestamp", + ForeColor = SystemColors.GrayText, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"Name", new FontSetting { + Name = "Name", + ForeColor = SystemColors.ControlText, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"Notification", new FontSetting { + Name = "Notification", + ForeColor = SystemColors.ControlText, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"IncomingIM", new FontSetting { + Name = "IncomingIM", + ForeColor = SystemColors.ControlText, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"OutgoingIM", new FontSetting { + Name = "OutgoingIM", + ForeColor = SystemColors.ControlText, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"Emote", new FontSetting { + Name = "Emote", + ForeColor = SystemColors.ControlText, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + {"Self", new FontSetting { + Name = "Self", + ForeColor = SystemColors.ControlText, + BackColor = Color.Transparent, + Font = FontSetting.DefaultFont, + }}, + }; + + public class FontSetting + { + [ScriptIgnoreAttribute] + public static readonly Font DefaultFont = new Font(FontFamily.GenericSansSerif, 8.0f); + + [ScriptIgnoreAttribute] + public Font Font; + + [ScriptIgnoreAttribute] + public Color ForeColor; + + [ScriptIgnoreAttribute] + public Color BackColor; + + + public String Name; + + public string ForeColorString + { + get + { + if (ForeColor != null) + { + return ColorTranslator.ToHtml(ForeColor); + } + else + { + return ColorTranslator.ToHtml(SystemColors.ControlText); + } + } + set + { + ForeColor = ColorTranslator.FromHtml(value); + } + } + + public string BackColorString + { + get + { + if (BackColor != null) + { + return ColorTranslator.ToHtml(BackColor); + } + else + { + return ColorTranslator.ToHtml(SystemColors.ControlText); + } + } + set + { + BackColor = ColorTranslator.FromHtml(value); + } + } + + public string FontString + { + get + { + if (this.Font != null) + { + TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font)); + return converter.ConvertToString(this.Font); + } + else + { + return null; + } + } + set + { + try + { + TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font)); + this.Font = converter.ConvertFromString(value) as Font; + } + catch (Exception) + { + this.Font = DefaultFont; + } + + } + } + + public override string ToString() + { + return Name; + } + } + + public Settings(string fileName) + { + SettingsFile = fileName; + + try + { + string xml = File.ReadAllText(SettingsFile); + SettingsData = (OSDMap)OSDParser.DeserializeLLSDXml(xml); + } + catch + { + Logger.DebugLog("Failed opening settings file: " + fileName); + SettingsData = new OSDMap(); + Save(); + } + } + + public void Save() + { + try + { + File.WriteAllText(SettingsFile, SerializeLLSDXmlStringFormated(SettingsData)); + } + catch (Exception ex) + { + Logger.Log("Failed saving settings", Helpers.LogLevel.Warning, ex); + } + } + + public static string SerializeLLSDXmlStringFormated(OSD data) + { + using (StringWriter sw = new StringWriter()) + { + using (XmlTextWriter writer = new XmlTextWriter(sw)) + { + writer.Formatting = Formatting.Indented; + writer.Indentation = 4; + writer.IndentChar = ' '; + + writer.WriteStartElement(String.Empty, "llsd", String.Empty); + OSDParser.SerializeLLSDXmlElement(writer, data); + writer.WriteEndElement(); + + writer.Close(); + + return sw.ToString(); + } + } + } + + private void FireEvent(string key, OSD val) + { + if (OnSettingChanged != null) + { + try { OnSettingChanged(this, new SettingsEventArgs(key, val)); } + catch (Exception) { } + } + } + + #region IDictionary Implementation + + public int Count { get { return SettingsData.Count; } } + public bool IsReadOnly { get { return false; } } + public ICollection Keys { get { return SettingsData.Keys; } } + public ICollection Values { get { return SettingsData.Values; } } + public OSD this[string key] + { + get + { + return SettingsData[key]; + } + set + { + if (string.IsNullOrEmpty(key)) + { + Logger.DebugLog("Warning: trying to set an emprty setting: " + Environment.StackTrace.ToString()); + } + else + { + SettingsData[key] = value; + FireEvent(key, value); + Save(); + } + } + } + + public bool ContainsKey(string key) + { + return SettingsData.ContainsKey(key); + } + + public void Add(string key, OSD llsd) + { + SettingsData.Add(key, llsd); + FireEvent(key, llsd); + Save(); + } + + public void Add(KeyValuePair kvp) + { + SettingsData.Add(kvp.Key, kvp.Value); + FireEvent(kvp.Key, kvp.Value); + Save(); + } + + public bool Remove(string key) + { + bool ret = SettingsData.Remove(key); + FireEvent(key, null); + Save(); + return ret; + } + + public bool TryGetValue(string key, out OSD llsd) + { + return SettingsData.TryGetValue(key, out llsd); + } + + public void Clear() + { + SettingsData.Clear(); + Save(); + } + + public bool Contains(KeyValuePair kvp) + { + // This is a bizarre function... we don't really implement it + // properly, hopefully no one wants to use it + return SettingsData.ContainsKey(kvp.Key); + } + + public void CopyTo(KeyValuePair[] array, int index) + { + throw new NotImplementedException(); + } + + public bool Remove(KeyValuePair kvp) + { + bool ret = SettingsData.Remove(kvp.Key); + FireEvent(kvp.Key, null); + Save(); + return ret; + } + + public System.Collections.IDictionaryEnumerator GetEnumerator() + { + return SettingsData.GetEnumerator(); + } + + IEnumerator> IEnumerable>.GetEnumerator() + { + return null; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return SettingsData.GetEnumerator(); + } + + #endregion IDictionary Implementation + + } + + public class SettingsEventArgs : EventArgs + { + public string Key = string.Empty; + public OSD Value = new OSD(); + + public SettingsEventArgs(string key, OSD val) + { + Key = key; + Value = val; + } + } +} diff --git a/Assets/Raindrop/Settings.cs.meta b/Assets/Raindrop/Settings.cs.meta new file mode 100644 index 0000000..e8bc3de --- /dev/null +++ b/Assets/Raindrop/Settings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4d006287ccb09804583f81650c8c71b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Raindrop/StateManager.cs b/Assets/Raindrop/StateManager.cs new file mode 100644 index 0000000..17757a7 --- /dev/null +++ b/Assets/Raindrop/StateManager.cs @@ -0,0 +1,1224 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009-2014, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id$ +// +using System; +using System.Collections.Generic; +using System.Timers; +using System.Threading; + +using OpenMetaverse; + +//using Radegast.Automation; +using Raindrop.Netcom; + +namespace Raindrop +{ + public class KnownHeading + { + public string ID { get; set; } + public string Name { get; set; } + public Quaternion Heading { get; set; } + + public KnownHeading(string id, string name, Quaternion heading) + { + this.ID = id; + this.Name = name; + this.Heading = heading; + } + + public override string ToString() + { + return Name; + } + } + + public class StateManager : IDisposable + { + public Parcel Parcel { get; set; } + + private RaindropInstance instance; + private GridClient client { get { return instance.Client; } } + private RaindropNetcom netcom { get { return instance.Netcom; } } + + private bool typing = false; + private bool away = false; + private bool busy = false; + private bool flying = false; + private bool alwaysrun = false; + private bool sitting = false; + + private bool following = false; + private string followName = string.Empty; + private float followDistance = 3.0f; + private UUID followID; + private bool displayEndWalk = false; + + private UUID awayAnimationID = new UUID("fd037134-85d4-f241-72c6-4f42164fedee"); + private UUID busyAnimationID = new UUID("efcf670c2d188128973a034ebc806b67"); + private UUID typingAnimationID = new UUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9"); + internal static Random rnd = new Random(); + private System.Threading.Timer lookAtTimer; + + public float FOVVerticalAngle = Utils.TWO_PI - 0.05f; + + /// + /// Passes walk state + /// + /// True if we are walking towards a targer + public delegate void WalkStateCanged(bool walking); + + /// + /// Fires when we start or stop walking towards a target + /// + public event WalkStateCanged OnWalkStateCanged; + + /// + /// Fires when avatar stands + /// + public event EventHandler SitStateChanged; + + static List m_Headings; + public static List KnownHeadings + { + get + { + if (m_Headings == null) + { + m_Headings = new List(16); + m_Headings.Add(new KnownHeading("E", "East", new Quaternion(0.00000f, 0.00000f, 0.00000f, 1.00000f))); + m_Headings.Add(new KnownHeading("ENE", "East by Northeast", new Quaternion(0.00000f, 0.00000f, 0.19509f, 0.98079f))); + m_Headings.Add(new KnownHeading("NE", "Northeast", new Quaternion(0.00000f, 0.00000f, 0.38268f, 0.92388f))); + m_Headings.Add(new KnownHeading("NNE", "North by Northeast", new Quaternion(0.00000f, 0.00000f, 0.55557f, 0.83147f))); + m_Headings.Add(new KnownHeading("N", "North", new Quaternion(0.00000f, 0.00000f, 0.70711f, 0.70711f))); + m_Headings.Add(new KnownHeading("NNW", "North by Northwest", new Quaternion(0.00000f, 0.00000f, 0.83147f, 0.55557f))); + m_Headings.Add(new KnownHeading("NW", "Nortwest", new Quaternion(0.00000f, 0.00000f, 0.92388f, 0.38268f))); + m_Headings.Add(new KnownHeading("WNW", "West by Northwest", new Quaternion(0.00000f, 0.00000f, 0.98079f, 0.19509f))); + m_Headings.Add(new KnownHeading("W", "West", new Quaternion(0.00000f, 0.00000f, 1.00000f, -0.00000f))); + m_Headings.Add(new KnownHeading("WSW", "West by Southwest", new Quaternion(0.00000f, 0.00000f, 0.98078f, -0.19509f))); + m_Headings.Add(new KnownHeading("SW", "Southwest", new Quaternion(0.00000f, 0.00000f, 0.92388f, -0.38268f))); + m_Headings.Add(new KnownHeading("SSW", "South by Southwest", new Quaternion(0.00000f, 0.00000f, 0.83147f, -0.55557f))); + m_Headings.Add(new KnownHeading("S", "South", new Quaternion(0.00000f, 0.00000f, 0.70711f, -0.70711f))); + m_Headings.Add(new KnownHeading("SSE", "South by Southeast", new Quaternion(0.00000f, 0.00000f, 0.55557f, -0.83147f))); + m_Headings.Add(new KnownHeading("SE", "Southeast", new Quaternion(0.00000f, 0.00000f, 0.38268f, -0.92388f))); + m_Headings.Add(new KnownHeading("ESE", "East by Southeast", new Quaternion(0.00000f, 0.00000f, 0.19509f, -0.98078f))); + } + return m_Headings; + } + } + + public static Vector3 RotToEuler(Quaternion r) + { + Quaternion t = new Quaternion(r.X * r.X, r.Y * r.Y, r.Z * r.Z, r.W * r.W); + + float m = (t.X + t.Y + t.Z + t.W); + if (Math.Abs(m) < 0.001) return Vector3.Zero; + float n = 2 * (r.Y * r.W + r.X * r.Z); + float p = m * m - n * n; + + if (p > 0) + return new Vector3( + (float)Math.Atan2(2.0 * (r.X * r.W - r.Y * r.Z), (-t.X - t.Y + t.Z + t.W)), + (float)Math.Atan2(n, Math.Sqrt(p)), + (float)Math.Atan2(2.0 * (r.Z * r.W - r.X * r.Y), t.X - t.Y - t.Z + t.W) + ); + else if (n > 0) + return new Vector3( + 0f, + (float)(Math.PI / 2d), + (float)Math.Atan2((r.Z * r.W + r.X * r.Y), 0.5 - t.X - t.Y) + ); + else + return new Vector3( + 0f, + -(float)(Math.PI / 2d), + (float)Math.Atan2((r.Z * r.W + r.X * r.Y), 0.5 - t.X - t.Z) + ); + } + + public static KnownHeading ClosestKnownHeading(int degrees) + { + KnownHeading ret = KnownHeadings[0]; + int facing = (int)(57.2957795d * RotToEuler(KnownHeadings[0].Heading).Z); + if (facing < 0) facing += 360; + int minDistance = Math.Abs(degrees - facing); + + for (int i = 1; i < KnownHeadings.Count; i++) + { + facing = (int)(57.2957795d * RotToEuler(KnownHeadings[i].Heading).Z); + if (facing < 0) facing += 360; + + int distance = Math.Abs(degrees - facing); + if (distance < minDistance) + { + ret = KnownHeadings[i]; + minDistance = distance; + } + } + + return ret; + } + + public Dictionary KnownAnimations; + public bool CameraTracksOwnAvatar = true; + public Vector3 DefaultCameraOffset = new Vector3(-5, 0, 0); + + public StateManager(RaindropInstance instance) + { + this.instance = instance; + this.instance.ClientChanged += new EventHandler(instance_ClientChanged); + KnownAnimations = Animations.ToDictionary(); + //autosit = new AutoSit(this.instance); + //pseudohome = new PseudoHome(this.instance); + //lslHelper = new LSLHelper(this.instance); + + beamTimer = new System.Timers.Timer(); + beamTimer.Enabled = false; + beamTimer.Elapsed += new ElapsedEventHandler(beamTimer_Elapsed); + + // Callbacks + netcom.ClientConnected += new EventHandler(netcom_ClientConnected); + netcom.ClientDisconnected += new EventHandler(netcom_ClientDisconnected); + netcom.ChatReceived += new EventHandler(netcom_ChatReceived); + RegisterClientEvents(client); + } + + + private void RegisterClientEvents(GridClient client) + { + client.Objects.AvatarUpdate += new EventHandler(Objects_AvatarUpdate); + client.Objects.TerseObjectUpdate += new EventHandler(Objects_TerseObjectUpdate); + client.Objects.AvatarSitChanged += new EventHandler(Objects_AvatarSitChanged); + client.Self.AlertMessage += new EventHandler(Self_AlertMessage); + client.Self.TeleportProgress += new EventHandler(Self_TeleportProgress); + client.Network.EventQueueRunning += new EventHandler(Network_EventQueueRunning); + client.Network.SimChanged += new EventHandler(Network_SimChanged); + } + + private void UnregisterClientEvents(GridClient client) + { + client.Objects.AvatarUpdate -= new EventHandler(Objects_AvatarUpdate); + client.Objects.TerseObjectUpdate -= new EventHandler(Objects_TerseObjectUpdate); + client.Objects.AvatarSitChanged -= new EventHandler(Objects_AvatarSitChanged); + client.Self.AlertMessage -= new EventHandler(Self_AlertMessage); + client.Self.TeleportProgress -= new EventHandler(Self_TeleportProgress); + client.Network.EventQueueRunning -= new EventHandler(Network_EventQueueRunning); + client.Network.SimChanged -= new EventHandler(Network_SimChanged); + } + + public void Dispose() + { + netcom.ClientConnected -= new EventHandler(netcom_ClientConnected); + netcom.ClientDisconnected -= new EventHandler(netcom_ClientDisconnected); + netcom.ChatReceived -= new EventHandler(netcom_ChatReceived); + UnregisterClientEvents(client); + beamTimer.Dispose(); + beamTimer = null; + + if (lookAtTimer != null) + { + lookAtTimer.Dispose(); + lookAtTimer = null; + } + + if (walkTimer != null) + { + walkTimer.Dispose(); + walkTimer = null; + } + + //if (autosit != null) + //{ + // autosit.Dispose(); + // autosit = null; + //} + + //if (lslHelper == null) + //{ + // lslHelper.Dispose(); + // lslHelper = null; + //} + } + + void instance_ClientChanged(object sender, ClientChangedEventArgs e) + { + UnregisterClientEvents(e.OldClient); + RegisterClientEvents(client); + } + + void Objects_AvatarSitChanged(object sender, AvatarSitChangedEventArgs e) + { + if (e.Avatar.LocalID != client.Self.LocalID) return; + + sitting = e.SittingOn != 0; + + if (client.Self.SittingOn != 0 && !client.Network.CurrentSim.ObjectsPrimitives.ContainsKey(client.Self.SittingOn)) + { + client.Objects.RequestObject(client.Network.CurrentSim, client.Self.SittingOn); + } + + if (SitStateChanged != null) + { + SitStateChanged(this, new SitEventArgs(this.sitting)); + } + } + + /// + /// Locates avatar in the current sim, or adjacents sims + /// + /// Avatar UUID + /// Position within sim + /// True if managed to find the avatar + public bool TryFindAvatar(UUID person, out Vector3 position) + { + Simulator sim; + if (!TryFindAvatar(person, out sim, out position)) return false; + // same sim? + if (sim == client.Network.CurrentSim) return true; + position = ToLocalPosition(sim.Handle, position); + return true; + } + + public Vector3 ToLocalPosition(ulong handle, Vector3 position) + { + Vector3d diff = ToVector3D(handle, position) - client.Self.GlobalPosition; + position = new Vector3((float)diff.X, (float)diff.Y, (float)diff.Z) - position; + return position; + } + + public static Vector3d ToVector3D(ulong handle, Vector3 pos) + { + uint globalX, globalY; + Utils.LongToUInts(handle, out globalX, out globalY); + + return new Vector3d( + (double)globalX + (double)pos.X, + (double)globalY + (double)pos.Y, + (double)pos.Z); + } + + /// + /// Locates avatar in the current sim, or adjacents sims + /// + /// Avatar UUID + /// Simulator avatar is in + /// Position within sim + /// True if managed to find the avatar + public bool TryFindAvatar(UUID person, out Simulator sim, out Vector3 position) + { + return TryFindPrim(person, out sim, out position, true); + } + public bool TryFindPrim(UUID person, out Simulator sim, out Vector3 position, bool onlyAvatars) + { + Simulator[] Simulators = null; + lock (client.Network.Simulators) + { + Simulators = client.Network.Simulators.ToArray(); + } + sim = null; + position = Vector3.Zero; + + Primitive avi = null; + + // First try the object tracker + foreach (var s in Simulators) + { + avi = s.ObjectsAvatars.Find((Avatar av) => { return av.ID == person; }); + if (avi != null) + { + sim = s; + break; + } + } + if (avi == null && !onlyAvatars) + { + foreach (var s in Simulators) + { + avi = s.ObjectsPrimitives.Find((Primitive av) => { return av.ID == person; }); + if (avi != null) + { + sim = s; + break; + } + } + } + if (avi != null) + { + if (avi.ParentID == 0) + { + position = avi.Position; + } + else + { + Primitive seat; + if (sim.ObjectsPrimitives.TryGetValue(avi.ParentID, out seat)) + { + position = seat.Position + avi.Position * seat.Rotation; + } + } + } + else + { + foreach (var s in Simulators) + { + if (s.AvatarPositions.ContainsKey(person)) + { + position = s.AvatarPositions[person]; + sim = s; + break; + } + } + } + + if (position.Z > 0.1f) + return true; + else + return false; + } + + public bool TryLocatePrim(Primitive avi, out Simulator sim, out Vector3 position) + { + Simulator[] Simulators = null; + lock (client.Network.Simulators) + { + Simulators = client.Network.Simulators.ToArray(); + } + + sim = client.Network.CurrentSim; + position = Vector3.Zero; + { + foreach (var s in Simulators) + { + if (s.Handle == avi.RegionHandle) + { + sim = s; + break; + } + } + } + if (avi != null) + { + if (avi.ParentID == 0) + { + position = avi.Position; + } + else + { + Primitive seat; + if (sim.ObjectsPrimitives.TryGetValue(avi.ParentID, out seat)) + { + position = seat.Position + avi.Position * seat.Rotation; + } + } + } + if (position.Z > 0.1f) + return true; + else + return false; + } + + /// + /// Move to target position either by walking or by teleporting + /// + /// Sim local position of the target + /// Move using teleport + public void MoveTo(Vector3 target, bool useTP) + { + MoveTo(client.Network.CurrentSim, target, useTP); + } + + /// + /// Move to target position either by walking or by teleporting + /// + /// Simulator in which the target is + /// Sim local position of the target + /// Move using teleport + public void MoveTo(Simulator sim, Vector3 target, bool useTP) + { + SetSitting(false, UUID.Zero); + + if (useTP) + { + client.Self.RequestTeleport(sim.Handle, target); + } + else + { + displayEndWalk = true; + client.Self.Movement.TurnToward(target); + WalkTo(GlobalPosition(sim, target)); + } + } + + + public void SetRandomHeading() + { + client.Self.Movement.UpdateFromHeading(Utils.TWO_PI * rnd.NextDouble(), true); + LookInFront(); + } + + void Network_EventQueueRunning(object sender, EventQueueRunningEventArgs e) + { + if (e.Simulator == client.Network.CurrentSim) + { + SetRandomHeading(); + } + } + + void Network_SimChanged(object sender, SimChangedEventArgs e) + { + //ThreadPool.QueueUserWorkItem(sync => + //{ + // Thread.Sleep(15 * 1000); + // autosit.TrySit(); + // pseudohome.ETGoHome(); + //}); + client.Self.Movement.SetFOVVerticalAngle(FOVVerticalAngle); + } + + private UUID teleportEffect = UUID.Random(); + + void Self_TeleportProgress(object sender, TeleportEventArgs e) + { + if (!client.Network.Connected) return; + + if (e.Status == TeleportStatus.Progress) + { + client.Self.SphereEffect(client.Self.GlobalPosition, Color4.White, 4f, teleportEffect); + } + + if (e.Status == TeleportStatus.Finished) + { + client.Self.SphereEffect(Vector3d.Zero, Color4.White, 0f, teleportEffect); + SetRandomHeading(); + } + + if (e.Status == TeleportStatus.Failed) + { + client.Self.SphereEffect(Vector3d.Zero, Color4.White, 0f, teleportEffect); + } + } + + void netcom_ClientDisconnected(object sender, DisconnectedEventArgs e) + { + typing = away = busy = walking = false; + + if (lookAtTimer != null) + { + lookAtTimer.Dispose(); + lookAtTimer = null; + } + + } + + void netcom_ClientConnected(object sender, EventArgs e) + { + if (!instance.GlobalSettings.ContainsKey("draw_distance")) + { + instance.GlobalSettings["draw_distance"] = 48; + } + + client.Self.Movement.Camera.Far = instance.GlobalSettings["draw_distance"]; + + if (lookAtTimer == null) + { + lookAtTimer = new System.Threading.Timer(new TimerCallback(lookAtTimerTick), null, Timeout.Infinite, Timeout.Infinite); + } + } + + void Objects_AvatarUpdate(object sender, AvatarUpdateEventArgs e) + { + if (e.Avatar.LocalID == client.Self.LocalID) + { + SetDefaultCamera(); + } + } + + void Objects_TerseObjectUpdate(object sender, TerseObjectUpdateEventArgs e) + { + if (!e.Update.Avatar) return; + + if (e.Prim.LocalID == client.Self.LocalID) + { + SetDefaultCamera(); + } + + if (!following) return; + + Avatar av; + client.Network.CurrentSim.ObjectsAvatars.TryGetValue(e.Update.LocalID, out av); + if (av == null) return; + + if (av.ID == followID) + { + Vector3 pos = AvatarPosition(client.Network.CurrentSim, av); + + FollowUpdate(pos); + } + } + + void FollowUpdate(Vector3 pos) + { + if (Vector3.Distance(pos, client.Self.SimPosition) > followDistance) + { + Vector3 target = pos + Vector3.Normalize(client.Self.SimPosition - pos) * (followDistance - 1f); + client.Self.AutoPilotCancel(); + Vector3d glb = GlobalPosition(client.Network.CurrentSim, target); + client.Self.AutoPilot(glb.X, glb.Y, glb.Z); + } + else + { + client.Self.AutoPilotCancel(); + client.Self.Movement.TurnToward(pos); + } + } + + public void SetDefaultCamera() + { + if (CameraTracksOwnAvatar) + { + if (client.Self.SittingOn != 0 && !client.Network.CurrentSim.ObjectsPrimitives.ContainsKey(client.Self.SittingOn)) + { + // We are sitting but don't have the information about the object we are sitting on + // Sim seems to ignore RequestMutlipleObjects message + // client.Objects.RequestObject(client.Network.CurrentSim, client.Self.SittingOn); + } + else + { + Vector3 pos = client.Self.SimPosition + DefaultCameraOffset * client.Self.Movement.BodyRotation; + //Logger.Log("Setting camera position to " + pos.ToString(), Helpers.LogLevel.Debug); + client.Self.Movement.Camera.LookAt( + pos, + client.Self.SimPosition + ); + } + } + } + + public Quaternion AvatarRotation(Simulator sim, UUID avID) + { + Quaternion rot = Quaternion.Identity; + Avatar av = sim.ObjectsAvatars.Find((Avatar a) => { return a.ID == avID; }); + + if (av == null) + return rot; + + if (av.ParentID == 0) + { + rot = av.Rotation; + } + else + { + Primitive prim; + if (sim.ObjectsPrimitives.TryGetValue(av.ParentID, out prim)) + { + rot = prim.Rotation + av.Rotation; + } + } + + return rot; + } + + + public Vector3 AvatarPosition(Simulator sim, UUID avID) + { + Vector3 pos = Vector3.Zero; + Avatar av = sim.ObjectsAvatars.Find((Avatar a) => { return a.ID == avID; }); + if (av != null) + { + return AvatarPosition(sim, av); + } + else + { + Vector3 coarse; + if (sim.AvatarPositions.TryGetValue(avID, out coarse)) + { + if (coarse.Z > 0.01) + return coarse; + } + } + return pos; + } + + public Vector3 AvatarPosition(Simulator sim, Avatar av) + { + Vector3 pos = Vector3.Zero; + + if (av.ParentID == 0) + { + pos = av.Position; + } + else + { + Primitive prim; + if (sim.ObjectsPrimitives.TryGetValue(av.ParentID, out prim)) + { + pos = prim.Position + av.Position; + } + } + + return pos; + } + + public void Follow(string name, UUID id) + { + followName = name; + followID = id; + following = followID != UUID.Zero; + + if (following) + { + walking = false; + + Vector3 target = AvatarPosition(client.Network.CurrentSim, id); + if (Vector3.Zero != target) + { + client.Self.Movement.TurnToward(target); + FollowUpdate(target); + } + + } + } + + public void StopFollowing() + { + following = false; + followName = string.Empty; + followID = UUID.Zero; + } + + #region Look at effect + private int lastLookAtEffect = 0; + private UUID lookAtEffect = UUID.Random(); + + /// + /// Set eye focus 3m in front of us + /// + public void LookInFront() + { + if (!client.Network.Connected || instance.GlobalSettings["disable_look_at"]) return; + + client.Self.LookAtEffect(client.Self.AgentID, client.Self.AgentID, + new Vector3d(new Vector3(3, 0, 0) * Quaternion.Identity), + LookAtType.Idle, lookAtEffect); + } + + void lookAtTimerTick(object state) + { + LookInFront(); + } + + void netcom_ChatReceived(object sender, ChatEventArgs e) + { + //somehow it can be too early (when Radegast is loaded from running bot) + if (instance.GlobalSettings == null) return; + if (!instance.GlobalSettings["disable_look_at"] + && e.SourceID != client.Self.AgentID + && (e.SourceType == ChatSourceType.Agent || e.Type == ChatType.StartTyping)) + { + // change focus max every 4 seconds + if (Environment.TickCount - lastLookAtEffect > 4000) + { + lastLookAtEffect = Environment.TickCount; + client.Self.LookAtEffect(client.Self.AgentID, e.SourceID, Vector3d.Zero, LookAtType.Respond, lookAtEffect); + // keep looking at the speaker for 10 seconds + if (lookAtTimer != null) + { + lookAtTimer.Change(10000, Timeout.Infinite); + } + } + } + } + #endregion Look at effect + + #region Walking (move to) + private bool walking = false; + private System.Threading.Timer walkTimer; + private int walkChekInterval = 500; + private Vector3d walkToTarget; + int lastDistance = 0; + int lastDistanceChanged = 0; + + public void WalkTo(Primitive prim) + { + WalkTo(GlobalPosition(prim)); + } + public double WaitUntilPosition(Vector3d pos, TimeSpan maxWait, double howClose) + { + + DateTime until = DateTime.Now + maxWait; + while (until > DateTime.Now) + { + double dist = Vector3d.Distance(client.Self.GlobalPosition, pos); + if (howClose >= dist) return dist; + Thread.Sleep(250); + } + return Vector3d.Distance(client.Self.GlobalPosition, pos); + + } + + public void WalkTo(Vector3d globalPos) + { + walkToTarget = globalPos; + + if (following) + { + following = false; + followName = string.Empty; + } + + if (walkTimer == null) + { + walkTimer = new System.Threading.Timer(new TimerCallback(walkTimerElapsed), null, walkChekInterval, Timeout.Infinite); + } + + lastDistanceChanged = System.Environment.TickCount; + client.Self.AutoPilotCancel(); + walking = true; + client.Self.AutoPilot(walkToTarget.X, walkToTarget.Y, walkToTarget.Z); + FireWalkStateCanged(); + } + + void walkTimerElapsed(object sender) + { + + double distance = Vector3d.Distance(client.Self.GlobalPosition, walkToTarget); + + if (distance < 2d) + { + // We're there + EndWalking(); + } + else + { + if (lastDistance != (int)distance) + { + lastDistanceChanged = System.Environment.TickCount; + lastDistance = (int)distance; + } + else if ((System.Environment.TickCount - lastDistanceChanged) > 10000) + { + // Our distance to the target has not changed in 10s, give up + EndWalking(); + return; + } + if (walkTimer != null) walkTimer.Change(walkChekInterval, Timeout.Infinite); + } + } + + void Self_AlertMessage(object sender, AlertMessageEventArgs e) + { + if (e.Message.Contains("Autopilot cancel")) + { + if (walking) + { + EndWalking(); + } + } + } + + void FireWalkStateCanged() + { + if (OnWalkStateCanged != null) + { + try { OnWalkStateCanged(walking); } + catch (Exception) { } + } + } + + public void EndWalking() + { + if (walking) + { + walking = false; + Logger.Log("Finished walking.", Helpers.LogLevel.Debug, client); + walkTimer.Dispose(); + walkTimer = null; + client.Self.AutoPilotCancel(); + + if (displayEndWalk) + { + displayEndWalk = false; + string msg = "Finished walking"; + + if (walkToTarget != Vector3d.Zero) + { + System.Threading.Thread.Sleep(1000); + msg += string.Format(" {0:0} meters from destination", Vector3d.Distance(client.Self.GlobalPosition, walkToTarget)); + walkToTarget = Vector3d.Zero; + } + + //instance.TabConsole.DisplayNotificationInChat(msg); + } + + FireWalkStateCanged(); + } + } + #endregion + + public void SetTyping(bool typing) + { + if (!client.Network.Connected) return; + + Dictionary typingAnim = new Dictionary(); + typingAnim.Add(typingAnimationID, typing); + + client.Self.Animate(typingAnim, false); + + if (typing) + client.Self.Chat(string.Empty, 0, ChatType.StartTyping); + else + client.Self.Chat(string.Empty, 0, ChatType.StopTyping); + + this.typing = typing; + } + + public void SetAway(bool away) + { + Dictionary awayAnim = new Dictionary(); + awayAnim.Add(awayAnimationID, away); + + client.Self.Animate(awayAnim, true); + if (UseMoveControl) client.Self.Movement.Away = away; + this.away = away; + } + + public void SetBusy(bool busy) + { + Dictionary busyAnim = new Dictionary(); + busyAnim.Add(busyAnimationID, busy); + + client.Self.Animate(busyAnim, true); + this.busy = busy; + } + + public void SetFlying(bool flying) + { + this.flying = client.Self.Movement.Fly = flying; + } + + public void SetAlwaysRun(bool alwaysrun) + { + this.alwaysrun = client.Self.Movement.AlwaysRun = alwaysrun; + } + + public void SetSitting(bool sitting, UUID target) + { + this.sitting = sitting; + + if (sitting) + { + client.Self.RequestSit(target, Vector3.Zero); + client.Self.Sit(); + } + else + { + //if (!instance.RLV.RestictionActive("unsit")) + //{ + client.Self.Stand(); + //} + //else + //{ + // instance.TabConsole.DisplayNotificationInChat("Unsit prevented by RLV"); + // this.sitting = true; + // return; + //} + } + + if (SitStateChanged != null) + { + SitStateChanged(this, new SitEventArgs(this.sitting)); + } + + if (!this.sitting) + { + StopAllAnimations(); + } + } + + public void StopAllAnimations() + { + Dictionary stop = new Dictionary(); + + client.Self.SignaledAnimations.ForEach((UUID anim) => + { + if (!KnownAnimations.ContainsKey(anim)) + { + stop.Add(anim, false); + } + }); + + if (stop.Count > 0) + { + client.Self.Animate(stop, true); + } + } + + static public Vector3d GlobalPosition(Simulator sim, Vector3 pos) + { + uint globalX, globalY; + Utils.LongToUInts(sim.Handle, out globalX, out globalY); + + return new Vector3d( + (double)globalX + (double)pos.X, + (double)globalY + (double)pos.Y, + (double)pos.Z); + } + + public Vector3d GlobalPosition(Primitive prim) + { + return GlobalPosition(client.Network.CurrentSim, prim.Position); + } + + private System.Timers.Timer beamTimer; + private List beamTarget; + private Random beamRandom = new Random(); + private UUID pointID; + private UUID sphereID; + private List beamID; + private int numBeans; + private Color4[] beamColors = new Color4[3] { new Color4(0, 255, 0, 255), new Color4(255, 0, 0, 255), new Color4(0, 0, 255, 255) }; + private Primitive targetPrim; + + public void UnSetPointing() + { + beamTimer.Enabled = false; + if (pointID != UUID.Zero) + { + client.Self.PointAtEffect(client.Self.AgentID, UUID.Zero, Vector3d.Zero, PointAtType.None, pointID); + pointID = UUID.Zero; + } + + if (beamID != null) + { + foreach (UUID id in beamID) + { + client.Self.BeamEffect(UUID.Zero, UUID.Zero, Vector3d.Zero, new Color4(255, 255, 255, 255), 0, id); + } + beamID = null; + } + + if (sphereID != UUID.Zero) + { + client.Self.SphereEffect(Vector3d.Zero, Color4.White, 0, sphereID); + sphereID = UUID.Zero; + } + + } + + void beamTimer_Elapsed(object sender, EventArgs e) + { + if (beamID == null) return; + + try + { + client.Self.SphereEffect(GlobalPosition(targetPrim), beamColors[beamRandom.Next(0, 3)], 0.85f, sphereID); + int i = 0; + for (i = 0; i < numBeans; i++) + { + UUID newBeam = UUID.Random(); + Vector3d scatter; + + if (i == 0) + { + scatter = GlobalPosition(targetPrim); + } + else + { + Vector3d direction = client.Self.GlobalPosition - GlobalPosition(targetPrim); + Vector3d cross = direction % new Vector3d(0, 0, 1); + cross.Normalize(); + scatter = GlobalPosition(targetPrim) + cross * (i * 0.2d) * (i % 2 == 0 ? 1 : -1); + } + client.Self.BeamEffect(client.Self.AgentID, UUID.Zero, scatter, beamColors[beamRandom.Next(0, 3)], 1.0f, beamID[i]); + } + + for (int j = 1; j < numBeans; j++) + { + UUID newBeam = UUID.Random(); + Vector3d scatter; + Vector3d cross = new Vector3d(0, 0, 1); + cross.Normalize(); + scatter = GlobalPosition(targetPrim) + cross * (j * 0.2d) * (j % 2 == 0 ? 1 : -1); + + client.Self.BeamEffect(client.Self.AgentID, UUID.Zero, scatter, beamColors[beamRandom.Next(0, 3)], 1.0f, beamID[j + i - 1]); + } + } + catch (Exception) { }; + + } + + public void SetPointing(Primitive prim, int numBeans) + { + UnSetPointing(); + client.Self.Movement.TurnToward(prim.Position); + pointID = UUID.Random(); + sphereID = UUID.Random(); + beamID = new List(); + beamTarget = new List(); + targetPrim = prim; + this.numBeans = numBeans; + + client.Self.PointAtEffect(client.Self.AgentID, prim.ID, Vector3d.Zero, PointAtType.Select, pointID); + + for (int i = 0; i < numBeans; i++) + { + UUID newBeam = UUID.Random(); + beamID.Add(newBeam); + beamTarget.Add(Vector3d.Zero); + } + + for (int i = 1; i < numBeans; i++) + { + UUID newBeam = UUID.Random(); + beamID.Add(newBeam); + beamTarget.Add(Vector3d.Zero); + } + + beamTimer.Interval = 1000; + beamTimer.Enabled = true; + } + + public UUID TypingAnimationID + { + get { return typingAnimationID; } + set { typingAnimationID = value; } + } + + public UUID AwayAnimationID + { + get { return awayAnimationID; } + set { awayAnimationID = value; } + } + + public UUID BusyAnimationID + { + get { return busyAnimationID; } + set { busyAnimationID = value; } + } + + public bool IsTyping + { + get { return typing; } + } + + public bool IsAway + { + get + { + if (UseMoveControl) return client.Self.Movement.Away; + return away; + } + } + + public bool IsBusy + { + get { return busy; } + } + + public bool IsFlying + { + get { return client.Self.Movement.Fly; } + } + + public bool IsSitting + { + get + { + if (client.Self.Movement.SitOnGround || client.Self.SittingOn != 0) return true; + if (sitting) + { + Logger.Log("out of sync sitting", Helpers.LogLevel.Debug); + sitting = false; + } + return false; + } + } + + public bool IsPointing + { + get { return pointID != UUID.Zero; } + } + + public bool IsFollowing + { + get { return following; } + } + + public string FollowName + { + get { return followName; } + set { followName = value; } + } + + public float FollowDistance + { + get { return followDistance; } + set { followDistance = value; } + } + + public bool IsWalking + { + get { return walking; } + } + + //private AutoSit autosit; + //public AutoSit AutoSit + //{ + // get { return autosit; } + //} + + //private LSLHelper lslHelper; + //public LSLHelper LSLHelper + //{ + // get { return lslHelper; } + //} + + //private PseudoHome pseudohome; + + /// + /// Experimental Option that sometimes the Client has more authority than state mananger + /// + public static bool UseMoveControl; + + //public PseudoHome PseudoHome + //{ + // get { return pseudohome; } + //} + } + + public class SitEventArgs : EventArgs + { + public bool Sitting; + + public SitEventArgs(bool sitting) + { + this.Sitting = sitting; + } + } +} diff --git a/Assets/Unity.meta b/Assets/Raindrop/Unity.meta similarity index 100% rename from Assets/Unity.meta rename to Assets/Raindrop/Unity.meta diff --git a/Assets/Raindrop/Unity/Global.cs b/Assets/Raindrop/Unity/Global.cs new file mode 100644 index 0000000..db2ab7d --- /dev/null +++ b/Assets/Raindrop/Unity/Global.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Raindrop; + +public class Global : MonoBehaviour +{ + //public GameObject CanvasManagerObject; + public CanvasManager CanvasManagerRef; + + //this static-new is like a globally accessible instance without a singleton! :) + public RaindropInstance MainRaindropInstance; + //this one manages the viewmodels and the stacking of UI modals. + public RaindropViewManager RaindropVM; + + + public string app_data_Path { get; private set; } + + private void Awake() + { + CanvasManagerRef= FindObjectOfType(); + + //initialise your 'statics' + + //Get the path of the Game data folder + //app_data_Path = Application.persistentDataPath; + + //Output the Game data path to the console + //Debug.Log("dataPath : " + app_data_Path); + + //raindropinstance seems tightly coupled with the applicaiton lifecycle; it seems essentially a subset of the app lifecycle in fact. + //make sure you supply the app directory. + MainRaindropInstance = RaindropInstance.GlobalInstance; + //RaindropInstance.GlobalInstance.setAppDataDir(app_data_Path); + + RaindropVM = new RaindropViewManager(MainRaindropInstance); + } + +} diff --git a/Assets/Unity/Global.cs.meta b/Assets/Raindrop/Unity/Global.cs.meta similarity index 100% rename from Assets/Unity/Global.cs.meta rename to Assets/Raindrop/Unity/Global.cs.meta diff --git a/Assets/Raindrop/Unity/RaindropViewManager.cs b/Assets/Raindrop/Unity/RaindropViewManager.cs new file mode 100644 index 0000000..d4d80df --- /dev/null +++ b/Assets/Raindrop/Unity/RaindropViewManager.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Raindrop +{ + + + public enum CanvasType + { + Login, + Game + } + + public class RaindropViewManager + { + + + + + + public CanvasManager canvasManager; + + //manages all child Viewmodels + public RaindropViewManager(RaindropInstance instance) + { + //Debug.Log("VM manager setup ok"); + + //subscribe all events from raindropclient + //Client.LoginCompleted += MainRaindropInstance_LoginCompleted; + //Client.LoginFailed += MainRaindropInstance_LoginFailed; + + } + + //register the canvas manager which is in a GO, who has the responsibility of flipping pages. + //public void registerWithRaindropClient(CanvasManager canvasManager) + //{ + // this.canvasManager = canvasManager; + // //start up the initial login panel + // pushLoginView(); + //} + private void pushLoginView() + { + canvasManager.pushCanvas(CanvasType.Login); + } + + //private void MainRaindropInstance_LoginFailed() + //{ + // Debug.Log("failed login TODO: why?"); + //} + + private void showFailedLoginModal() + { + throw new NotImplementedException(); + } + + //private void MainRaindropInstance_LoginCompleted() + //{ + // cm.popCanvas();//this lince causes error, as the function was called from the login thread! + // cm.pushCanvas(CanvasType.Game); + // //showSuccessLoginModal(); + //} + + private void removeLoginView() + { + throw new NotImplementedException(); + } + + private void showSuccessLoginModal() + { + throw new NotImplementedException(); + } + } +} diff --git a/Assets/Unity/RaindropViewManager.cs.meta b/Assets/Raindrop/Unity/RaindropViewManager.cs.meta similarity index 100% rename from Assets/Unity/RaindropViewManager.cs.meta rename to Assets/Raindrop/Unity/RaindropViewManager.cs.meta diff --git a/Assets/Unity/Singleton.cs b/Assets/Raindrop/Unity/Singleton.cs similarity index 100% rename from Assets/Unity/Singleton.cs rename to Assets/Raindrop/Unity/Singleton.cs diff --git a/Assets/Unity/Singleton.cs.meta b/Assets/Raindrop/Unity/Singleton.cs.meta similarity index 100% rename from Assets/Unity/Singleton.cs.meta rename to Assets/Raindrop/Unity/Singleton.cs.meta diff --git a/Assets/Unity/UI.meta b/Assets/Raindrop/Unity/UI.meta similarity index 100% rename from Assets/Unity/UI.meta rename to Assets/Raindrop/Unity/UI.meta diff --git a/Assets/Unity/UI/CanvasIdentifier.cs b/Assets/Raindrop/Unity/UI/CanvasIdentifier.cs similarity index 100% rename from Assets/Unity/UI/CanvasIdentifier.cs rename to Assets/Raindrop/Unity/UI/CanvasIdentifier.cs diff --git a/Assets/Unity/UI/CanvasIdentifier.cs.meta b/Assets/Raindrop/Unity/UI/CanvasIdentifier.cs.meta similarity index 100% rename from Assets/Unity/UI/CanvasIdentifier.cs.meta rename to Assets/Raindrop/Unity/UI/CanvasIdentifier.cs.meta diff --git a/Assets/Unity/UI/CanvasManager.cs b/Assets/Raindrop/Unity/UI/CanvasManager.cs similarity index 84% rename from Assets/Unity/UI/CanvasManager.cs rename to Assets/Raindrop/Unity/UI/CanvasManager.cs index 848362d..8cb849c 100644 --- a/Assets/Unity/UI/CanvasManager.cs +++ b/Assets/Raindrop/Unity/UI/CanvasManager.cs @@ -11,6 +11,8 @@ public class CanvasManager : Singleton //CanvasIdentifier lastActiveCanvas; public Stack activeCanvasStack = new Stack(); + public Global Globalref; + protected override void Awake() { @@ -20,7 +22,7 @@ public class CanvasManager : Singleton pushCanvas(CanvasType.Login); //canvas manager (attached to the UI GO) should register with the globals. so that the globals can acess them - Global.RaindropVM.registerWithRaindropClient(this); + //Globalref.RaindropVM.registerWithRaindropClient(this); } public void pushCanvas(CanvasType _type) @@ -52,10 +54,15 @@ public class CanvasManager : Singleton var lastActiveCanvas = activeCanvasStack.Peek(); if (lastActiveCanvas != null) { - lastActiveCanvas.gameObject.SetActive(false); + lastActiveCanvas.gameObject.SetActive(false); //this lince causes error, as the function was called from the login thread! activeCanvasStack.Pop(); } } + + internal void pushModal() + { + throw new NotImplementedException(); + } } diff --git a/Assets/Unity/UI/CanvasManager.cs.meta b/Assets/Raindrop/Unity/UI/CanvasManager.cs.meta similarity index 100% rename from Assets/Unity/UI/CanvasManager.cs.meta rename to Assets/Raindrop/Unity/UI/CanvasManager.cs.meta diff --git a/Assets/Unity/UI/LoginVM.cs b/Assets/Raindrop/Unity/UI/LoginVM.cs similarity index 74% rename from Assets/Unity/UI/LoginVM.cs rename to Assets/Raindrop/Unity/UI/LoginVM.cs index b8adb31..499b572 100644 --- a/Assets/Unity/UI/LoginVM.cs +++ b/Assets/Raindrop/Unity/UI/LoginVM.cs @@ -1,4 +1,5 @@ using OpenMetaverse; +using Raindrop; using System.Collections; using System.Collections.Generic; using System.ComponentModel; @@ -8,6 +9,10 @@ using UnityWeld.Binding; [Binding] public class LoginVM : MonoBehaviour, INotifyPropertyChanged { + public Global globalRef; + + private RaindropInstance instance; + private RaindropNetcom netcom { get { return instance.Netcom; } } #region state @@ -116,9 +121,25 @@ public class LoginVM : MonoBehaviour, INotifyPropertyChanged void Start() { initialise(); - Global.MainRaindropInstance.LoginCompleted += cb_LoginCompleted; - Global.MainRaindropInstance.LoginFailed += cb_LoginFailed; + + } + + + private void AddNetcomEvents() + { + netcom.ClientLoggingIn += new EventHandler(netcom_ClientLoggingIn); + netcom.ClientLoginStatus += new EventHandler(netcom_ClientLoginStatus); + netcom.ClientLoggingOut += new EventHandler(netcom_ClientLoggingOut); + netcom.ClientLoggedOut += new EventHandler(netcom_ClientLoggedOut); + } + + private void RemoveNetcomEvents() + { + netcom.ClientLoggingIn -= new EventHandler(netcom_ClientLoggingIn); + netcom.ClientLoginStatus -= new EventHandler(netcom_ClientLoginStatus); + netcom.ClientLoggingOut -= new EventHandler(netcom_ClientLoggingOut); + netcom.ClientLoggedOut -= new EventHandler(netcom_ClientLoggedOut); } private void cb_LoginFailed() @@ -174,7 +195,7 @@ public class LoginVM : MonoBehaviour, INotifyPropertyChanged Debug.LogError("loggin button but username and password are not defined!"); return; } - Global.MainRaindropInstance.connectTo(Username,Password); + globalRef.MainRaindropInstance.connectTo(Username,Password); } @@ -184,7 +205,7 @@ public class LoginVM : MonoBehaviour, INotifyPropertyChanged Debug.Log("logout btn"); // Logout of simulator - Global.MainRaindropInstance.Client.Network.Logout(); + globalRef.MainRaindropInstance.Client.Network.Logout(); } #endregion diff --git a/Assets/Unity/UI/LoginVM.cs.meta b/Assets/Raindrop/Unity/UI/LoginVM.cs.meta similarity index 100% rename from Assets/Unity/UI/LoginVM.cs.meta rename to Assets/Raindrop/Unity/UI/LoginVM.cs.meta diff --git a/Assets/Unity/UI/ModalLogic.cs b/Assets/Raindrop/Unity/UI/ModalLogic.cs similarity index 100% rename from Assets/Unity/UI/ModalLogic.cs rename to Assets/Raindrop/Unity/UI/ModalLogic.cs diff --git a/Assets/Unity/UI/ModalLogic.cs.meta b/Assets/Raindrop/Unity/UI/ModalLogic.cs.meta similarity index 100% rename from Assets/Unity/UI/ModalLogic.cs.meta rename to Assets/Raindrop/Unity/UI/ModalLogic.cs.meta diff --git a/Assets/Raindrop/mainUI.cs b/Assets/Raindrop/mainUI.cs new file mode 100644 index 0000000..0951a07 --- /dev/null +++ b/Assets/Raindrop/mainUI.cs @@ -0,0 +1,32 @@ +using System; + +using System.Collections.Generic; +using System.Threading; + +using Raindrop.Netcom; +using OpenMetaverse; +using OpenMetaverse.StructuredData; +using OpenMetaverse.Assets; + + +namespace Raindrop +{ + public class mainUI + { + private RaindropInstance raindropInstance; + + public mainUI(RaindropInstance raindropInstance) + { + this.raindropInstance = raindropInstance; + + + // Callbacks + netcom.ClientLoginStatus += new EventHandler(netcom_ClientLoginStatus); + netcom.ClientLoggedOut += new EventHandler(netcom_ClientLoggedOut); + netcom.ClientDisconnected += new EventHandler(netcom_ClientDisconnected); + instance.Names.NameUpdated += new EventHandler(Names_NameUpdated); + } + + public object instance { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/Scenes/DebugDash.unity b/Assets/Scenes/DebugDash.unity new file mode 100644 index 0000000..efddefc --- /dev/null +++ b/Assets/Scenes/DebugDash.unity @@ -0,0 +1,5563 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 705507994} + m_IndirectSpecularColor: {r: 0.44657826, g: 0.49641263, b: 0.57481676, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &26288764 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 26288765} + - component: {fileID: 26288767} + - component: {fileID: 26288766} + m_Layer: 5 + m_Name: Overlaydebug + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &26288765 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 26288764} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 267083071} + m_Father: {fileID: 904771131} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 461.74963, y: -300.6742} + m_SizeDelta: {x: -923.4992, y: -601.3484} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &26288766 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 26288764} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &26288767 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 26288764} + m_CullTransparentMesh: 1 +--- !u!1 &38931173 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 38931174} + - component: {fileID: 38931178} + - component: {fileID: 38931177} + - component: {fileID: 38931176} + - component: {fileID: 38931175} + m_Layer: 5 + m_Name: LogoutBtn + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &38931174 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 38931173} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1829647101} + m_Father: {fileID: 1090573972} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 432.96002, y: -779.76636} + m_SizeDelta: {x: 611.5748, y: 119.71399} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &38931175 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 38931173} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1360956885, guid: 46db69d45cc2c8f4cbecbd38f79f45ef, type: 3} + m_Name: + m_EditorClassIdentifier: + viewModelMethodName: LoginVM.OnLogoutBtnClick + viewEventName: UnityEngine.UI.Button.onClick +--- !u!114 &38931176 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 38931173} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 38931177} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &38931177 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 38931173} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9528302, g: 0.54447436, b: 0.54447436, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &38931178 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 38931173} + m_CullTransparentMesh: 1 +--- !u!1 &159306963 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 159306964} + - component: {fileID: 159306966} + - component: {fileID: 159306965} + m_Layer: 5 + m_Name: Failed! + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &159306964 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 159306963} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1999675308} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 235, y: -89.28295} + m_SizeDelta: {x: 450, y: 158.5659} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &159306965 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 159306963} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 60 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 60 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Login fail! + + message: TODO' +--- !u!222 &159306966 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 159306963} + m_CullTransparentMesh: 1 +--- !u!1 &219892340 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 219892341} + - component: {fileID: 219892342} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &219892341 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 219892340} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1603377540} + - {fileID: 1268431908} + - {fileID: 853768760} + m_Father: {fileID: 2072508973} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &219892342 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 219892340} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1603377541} + toggleTransition: 1 + graphic: {fileID: 1268431909} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &267083070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 267083071} + - component: {fileID: 267083075} + - component: {fileID: 267083074} + - component: {fileID: 267083073} + - component: {fileID: 267083072} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &267083071 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267083070} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1597224912} + m_Father: {fileID: 26288765} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -457.23755, y: 191.93365} + m_SizeDelta: {x: 914.4751, y: 383.8673} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &267083072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267083070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f003e7629ecbbdb4c9867c281c3c59c9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &267083073 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267083070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &267083074 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267083070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &267083075 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267083070} + m_CullTransparentMesh: 1 +--- !u!1 &289478450 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 289478451} + - component: {fileID: 289478452} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &289478451 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 289478450} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 783031747} + - {fileID: 1421356641} + m_Father: {fileID: 632800670} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &289478452 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 289478450} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!1001 &336628906 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 177638, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_Name + value: '[Graphy]' + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_Pivot.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22451668, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0abab5bb77339e4428787a870eb31bd3, type: 3} +--- !u!1 &384628818 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 384628819} + - component: {fileID: 384628821} + - component: {fileID: 384628820} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &384628819 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 384628818} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 936677285} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -7.5, y: -0.5} + m_SizeDelta: {x: -35, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &384628820 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 384628818} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Option A +--- !u!222 &384628821 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 384628818} + m_CullTransparentMesh: 1 +--- !u!1 &406697129 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 406697130} + - component: {fileID: 406697132} + - component: {fileID: 406697131} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &406697130 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 406697129} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 512934468} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &406697131 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 406697129} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Login to SL + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36.26 + m_fontSizeBase: 36.26 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &406697132 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 406697129} + m_CullTransparentMesh: 1 +--- !u!1 &432150339 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 432150340} + - component: {fileID: 432150345} + - component: {fileID: 432150344} + - component: {fileID: 432150343} + - component: {fileID: 432150342} + - component: {fileID: 432150341} + m_Layer: 5 + m_Name: Modal_LoginFailed + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &432150340 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432150339} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1356808778} + - {fileID: 1418630376} + m_Father: {fileID: 1910810518} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -1450, y: -733.8941} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &432150341 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432150339} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 09b7e9011827e984fb71ed88b07d1f0b, type: 3} + m_Name: + m_EditorClassIdentifier: + modalReference: {fileID: 432150339} + modal_message: + modal_title: +--- !u!114 &432150342 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432150339} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 10 + m_Bottom: 10 + m_ChildAlignment: 0 + m_Spacing: 8.97 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &432150343 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432150339} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 1 + m_VerticalFit: 1 +--- !u!114 &432150344 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432150339} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.46666667} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &432150345 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432150339} + m_CullTransparentMesh: 1 +--- !u!1 &512934467 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 512934468} + - component: {fileID: 512934471} + - component: {fileID: 512934470} + - component: {fileID: 512934469} + - component: {fileID: 512934472} + m_Layer: 5 + m_Name: LoginBtn + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &512934468 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512934467} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 406697130} + m_Father: {fileID: 1910810518} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 436.14, y: -630.2138} + m_SizeDelta: {x: 605.19995, y: 113.48163} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &512934469 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512934467} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 512934470} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &512934470 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512934467} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.50134766, g: 0.8773585, b: 0.641376, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &512934471 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512934467} + m_CullTransparentMesh: 1 +--- !u!114 &512934472 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512934467} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1360956885, guid: 46db69d45cc2c8f4cbecbd38f79f45ef, type: 3} + m_Name: + m_EditorClassIdentifier: + viewModelMethodName: LoginVM.OnLoginBtnClick + viewEventName: UnityEngine.UI.Button.onClick +--- !u!1 &601590702 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 601590703} + - component: {fileID: 601590706} + - component: {fileID: 601590705} + - component: {fileID: 601590704} + - component: {fileID: 601590707} + m_Layer: 5 + m_Name: LogoutBtn + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &601590703 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601590702} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1171704729} + m_Father: {fileID: 1910810518} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 432.96002, y: -779.76636} + m_SizeDelta: {x: 611.5748, y: 119.71399} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &601590704 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601590702} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 601590705} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &601590705 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601590702} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9528302, g: 0.54447436, b: 0.54447436, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &601590706 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601590702} + m_CullTransparentMesh: 1 +--- !u!114 &601590707 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601590702} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1360956885, guid: 46db69d45cc2c8f4cbecbd38f79f45ef, type: 3} + m_Name: + m_EditorClassIdentifier: + viewModelMethodName: LoginVM.OnLogoutBtnClick + viewEventName: UnityEngine.UI.Button.onClick +--- !u!1 &632800669 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 632800670} + - component: {fileID: 632800673} + - component: {fileID: 632800672} + - component: {fileID: 632800671} + - component: {fileID: 632800674} + m_Layer: 5 + m_Name: PassTextField + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &632800670 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632800669} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 289478451} + m_Father: {fileID: 1910810518} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 477.0183, y: -392.0724} + m_SizeDelta: {x: 699.6915, y: 113.92651} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &632800671 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632800669} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 632800672} + m_TextViewport: {fileID: 289478451} + m_TextComponent: {fileID: 1421356642} + m_Placeholder: {fileID: 783031749} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 35.9 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: Password here + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!114 &632800672 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632800669} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &632800673 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632800669} + m_CullTransparentMesh: 1 +--- !u!114 &632800674 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632800669} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1957390036, guid: 46db69d45cc2c8f4cbecbd38f79f45ef, type: 3} + m_Name: + m_EditorClassIdentifier: + viewModelPropertyName: LoginVM.Password + viewEventName: TMPro.TMP_InputField.onValueChanged + viewPropertyName: TMPro.TMP_InputField.text + viewAdapterTypeName: + viewAdapterOptions: {fileID: 0} + viewModelAdapterTypeName: + viewModelAdapterOptions: {fileID: 0} + exceptionPropertyName: + exceptionAdapterTypeName: + exceptionAdapterOptions: {fileID: 0} +--- !u!1 &696494505 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 696494506} + - component: {fileID: 696494508} + - component: {fileID: 696494507} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &696494506 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 696494505} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1418630376} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &696494507 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 696494505} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 85 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 300 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: OK +--- !u!222 &696494508 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 696494505} + m_CullTransparentMesh: 1 +--- !u!1 &703123634 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 703123635} + - component: {fileID: 703123637} + - component: {fileID: 703123636} + m_Layer: 5 + m_Name: Location + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &703123635 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 703123634} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1090573972} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 461, y: -353.26} + m_SizeDelta: {x: 392.248, y: 107.2654} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &703123636 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 703123634} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Logged in! + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 63.96 + m_fontSizeBase: 63.96 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &703123637 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 703123634} + m_CullTransparentMesh: 1 +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705507995} + - component: {fileID: 705507994} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 1 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &783031746 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 783031747} + - component: {fileID: 783031750} + - component: {fileID: 783031749} + - component: {fileID: 783031748} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &783031747 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 783031746} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 289478451} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &783031748 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 783031746} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &783031749 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 783031746} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Enter text... + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2150773298 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 35.9 + m_fontSizeBase: 35.9 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 2 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &783031750 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 783031746} + m_CullTransparentMesh: 1 +--- !u!1 &853334010 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 853334011} + - component: {fileID: 853334014} + - component: {fileID: 853334013} + - component: {fileID: 853334012} + m_Layer: 5 + m_Name: OKBtn + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &853334011 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 853334010} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1296132511} + m_Father: {fileID: 1999675308} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 235, y: -256.82092} + m_SizeDelta: {x: 450, y: 158.57} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &853334012 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 853334010} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 853334013} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1999675309} + m_TargetAssemblyTypeName: ModalCloser, Assembly-CSharp + m_MethodName: DeactivateModal + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &853334013 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 853334010} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &853334014 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 853334010} + m_CullTransparentMesh: 1 +--- !u!1 &853768759 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 853768760} + - component: {fileID: 853768762} + - component: {fileID: 853768761} + m_Layer: 5 + m_Name: Item Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &853768760 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 853768759} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 219892341} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -0.5} + m_SizeDelta: {x: -30, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &853768761 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 853768759} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Option A +--- !u!222 &853768762 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 853768759} + m_CullTransparentMesh: 1 +--- !u!1 &900175403 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 900175406} + - component: {fileID: 900175405} + - component: {fileID: 900175404} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &900175404 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900175403} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &900175405 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900175403} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &900175406 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900175403} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &904771127 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 904771131} + - component: {fileID: 904771130} + - component: {fileID: 904771129} + - component: {fileID: 904771128} + - component: {fileID: 904771132} + m_Layer: 5 + m_Name: UI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &904771128 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 904771127} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &904771129 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 904771127} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0.456 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &904771130 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 904771127} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 1 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &904771131 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 904771127} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1910810518} + - {fileID: 1090573972} + - {fileID: 26288765} + - {fileID: 2046520449} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &904771132 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 904771127} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5759aa2a69d06bf42bc000d03390227e, type: 3} + m_Name: + m_EditorClassIdentifier: + Globalref: {fileID: 0} +--- !u!1 &936677284 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 936677285} + - component: {fileID: 936677289} + - component: {fileID: 936677288} + - component: {fileID: 936677287} + - component: {fileID: 936677286} + m_Layer: 5 + m_Name: GridDD + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &936677285 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936677284} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 384628819} + - {fileID: 1155767808} + - {fileID: 1860074066} + m_Father: {fileID: 1910810518} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -730.74365, y: -186.34656} + m_SizeDelta: {x: 458.51343, y: 116.289} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &936677286 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936677284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 822021643, guid: 46db69d45cc2c8f4cbecbd38f79f45ef, type: 3} + m_Name: + m_EditorClassIdentifier: + viewModelSelectionPropertyName: LoginVM.SelectedItem + viewModelOptionsPropertyName: LoginVM.Options + exceptionPropertyName: + exceptionAdapterTypeName: + selectionViewModelToUIAdapter: + selectionUIToViewModelAdapter: + optionsAdapter: +--- !u!114 &936677287 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936677284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0d0b652f32a2cc243917e4028fa0f046, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 936677288} + m_Template: {fileID: 1860074066} + m_CaptionText: {fileID: 384628820} + m_CaptionImage: {fileID: 0} + m_ItemText: {fileID: 853768761} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: + - m_Text: Option A + m_Image: {fileID: 0} + - m_Text: Option B + m_Image: {fileID: 0} + - m_Text: Option C + m_Image: {fileID: 0} + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_AlphaFadeSpeed: 0.15 +--- !u!114 &936677288 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936677284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &936677289 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936677284} + m_CullTransparentMesh: 1 +--- !u!1 &963194225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 963194228} + - component: {fileID: 963194227} + - component: {fileID: 963194226} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &963194226 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 +--- !u!20 &963194227 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.43981075, g: 0.7726164, b: 0.8867924, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &963194228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1090573971 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1090573972} + - component: {fileID: 1090573976} + - component: {fileID: 1090573975} + - component: {fileID: 1090573974} + - component: {fileID: 1090573973} + m_Layer: 5 + m_Name: GamePnl + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1090573972 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1090573971} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 38931174} + - {fileID: 1999675308} + - {fileID: 703123635} + m_Father: {fileID: 904771131} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1090573973 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1090573971} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a6e0c28d5fb230f4e90475005bc6511c, type: 3} + m_Name: + m_EditorClassIdentifier: + canvasType: 1 +--- !u!114 &1090573974 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1090573971} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2eeaa71c61350f46902f312854272c9, type: 3} + m_Name: + m_EditorClassIdentifier: + globalRef: {fileID: 0} +--- !u!114 &1090573975 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1090573971} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1090573976 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1090573971} + m_CullTransparentMesh: 1 +--- !u!1 &1155767807 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1155767808} + - component: {fileID: 1155767810} + - component: {fileID: 1155767809} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1155767808 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1155767807} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 936677285} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -15, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1155767809 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1155767807} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1155767810 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1155767807} + m_CullTransparentMesh: 1 +--- !u!1 &1171704728 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1171704729} + - component: {fileID: 1171704731} + - component: {fileID: 1171704730} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1171704729 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1171704728} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 601590703} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1171704730 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1171704728} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Logout + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 40.3 + m_fontSizeBase: 40.3 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1171704731 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1171704728} + m_CullTransparentMesh: 1 +--- !u!1 &1193650083 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1193650084} + - component: {fileID: 1193650086} + - component: {fileID: 1193650085} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1193650084 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1193650083} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2034268939} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1193650085 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1193650083} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "Username here\u200B" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 34.3 + m_fontSizeBase: 34.3 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1193650086 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1193650083} + m_CullTransparentMesh: 1 +--- !u!1 &1262350653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1262350654} + - component: {fileID: 1262350657} + - component: {fileID: 1262350656} + - component: {fileID: 1262350655} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1262350654 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1262350653} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2072508973} + m_Father: {fileID: 1860074066} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -18, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1262350655 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1262350653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &1262350656 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1262350653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1262350657 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1262350653} + m_CullTransparentMesh: 1 +--- !u!1 &1268431907 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1268431908} + - component: {fileID: 1268431910} + - component: {fileID: 1268431909} + m_Layer: 5 + m_Name: Item Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1268431908 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1268431907} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 219892341} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1268431909 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1268431907} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1268431910 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1268431907} + m_CullTransparentMesh: 1 +--- !u!1 &1273355154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1273355155} + - component: {fileID: 1273355157} + - component: {fileID: 1273355156} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1273355155 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1273355154} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2139988269} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 9, y: -0.5} + m_SizeDelta: {x: -28, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1273355156 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1273355154} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: login +--- !u!222 &1273355157 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1273355154} + m_CullTransparentMesh: 1 +--- !u!1 &1296132510 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1296132511} + - component: {fileID: 1296132513} + - component: {fileID: 1296132512} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1296132511 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1296132510} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 853334011} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1296132512 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1296132510} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 85 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 300 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: OK +--- !u!222 &1296132513 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1296132510} + m_CullTransparentMesh: 1 +--- !u!1 &1353339734 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1353339735} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1353339735 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1353339734} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1889936408} + m_Father: {fileID: 1380663564} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1356808777 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1356808778} + - component: {fileID: 1356808780} + - component: {fileID: 1356808779} + m_Layer: 5 + m_Name: Failed! + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1356808778 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1356808777} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 432150340} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 235, y: -89.28295} + m_SizeDelta: {x: 450, y: 158.5659} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1356808779 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1356808777} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 60 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 60 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Login fail! + + message: TODO' +--- !u!222 &1356808780 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1356808777} + m_CullTransparentMesh: 1 +--- !u!1 &1380663563 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1380663564} + - component: {fileID: 1380663567} + - component: {fileID: 1380663566} + - component: {fileID: 1380663565} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1380663564 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380663563} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1353339735} + m_Father: {fileID: 1860074066} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1380663565 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380663563} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1889936409} + m_HandleRect: {fileID: 1889936408} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1380663566 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380663563} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1380663567 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380663563} + m_CullTransparentMesh: 1 +--- !u!1 &1418630375 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1418630376} + - component: {fileID: 1418630379} + - component: {fileID: 1418630378} + - component: {fileID: 1418630377} + m_Layer: 5 + m_Name: OKBtn + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1418630376 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1418630375} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 696494506} + m_Father: {fileID: 432150340} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 235, y: -256.82092} + m_SizeDelta: {x: 450, y: 158.57} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1418630377 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1418630375} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1418630378} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 432150341} + m_TargetAssemblyTypeName: ModalCloser, Assembly-CSharp + m_MethodName: DeactivateModal + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1418630378 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1418630375} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1418630379 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1418630375} + m_CullTransparentMesh: 1 +--- !u!1 &1421356640 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1421356641} + - component: {fileID: 1421356643} + - component: {fileID: 1421356642} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1421356641 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1421356640} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 289478451} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1421356642 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1421356640} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "Password here\u200B" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 35.9 + m_fontSizeBase: 35.9 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1421356643 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1421356640} + m_CullTransparentMesh: 1 +--- !u!1 &1597224911 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1597224912} + - component: {fileID: 1597224914} + - component: {fileID: 1597224913} + m_Layer: 5 + m_Name: LocationText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1597224912 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1597224911} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 267083071} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 240.7321, y: -42.3337} + m_SizeDelta: {x: 481.4642, y: 84.6674} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1597224913 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1597224911} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: New Text + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1597224914 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1597224911} + m_CullTransparentMesh: 1 +--- !u!1 &1603377539 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1603377540} + - component: {fileID: 1603377542} + - component: {fileID: 1603377541} + m_Layer: 5 + m_Name: Item Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1603377540 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1603377539} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 219892341} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1603377541 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1603377539} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1603377542 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1603377539} + m_CullTransparentMesh: 1 +--- !u!1 &1607187808 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1607187809} + - component: {fileID: 1607187811} + - component: {fileID: 1607187810} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1607187809 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1607187808} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1747592008} + m_Father: {fileID: 2139988269} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1607187810 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1607187808} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1607187811 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1607187808} + m_CullTransparentMesh: 1 +--- !u!1 &1738246286 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1738246287} + - component: {fileID: 1738246290} + - component: {fileID: 1738246289} + - component: {fileID: 1738246288} + - component: {fileID: 1738246291} + m_Layer: 5 + m_Name: UserTextField + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1738246287 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1738246286} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2034268939} + m_Father: {fileID: 1910810518} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 472.2052, y: -262.79144} + m_SizeDelta: {x: 690.12354, y: 116.87378} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1738246288 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1738246286} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1738246289} + m_TextViewport: {fileID: 2034268939} + m_TextComponent: {fileID: 1193650085} + m_Placeholder: {fileID: 1804642930} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 34.3 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: Username here + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!114 &1738246289 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1738246286} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1738246290 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1738246286} + m_CullTransparentMesh: 1 +--- !u!114 &1738246291 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1738246286} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1957390036, guid: 46db69d45cc2c8f4cbecbd38f79f45ef, type: 3} + m_Name: + m_EditorClassIdentifier: + viewModelPropertyName: LoginVM.Username + viewEventName: TMPro.TMP_InputField.onValueChanged + viewPropertyName: TMPro.TMP_InputField.text + viewAdapterTypeName: + viewAdapterOptions: {fileID: 0} + viewModelAdapterTypeName: + viewModelAdapterOptions: {fileID: 0} + exceptionPropertyName: + exceptionAdapterTypeName: + exceptionAdapterOptions: {fileID: 0} +--- !u!1 &1747592007 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1747592008} + - component: {fileID: 1747592010} + - component: {fileID: 1747592009} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1747592008 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1747592007} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1607187809} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1747592009 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1747592007} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1747592010 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1747592007} + m_CullTransparentMesh: 1 +--- !u!1 &1804642927 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1804642928} + - component: {fileID: 1804642931} + - component: {fileID: 1804642930} + - component: {fileID: 1804642929} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1804642928 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1804642927} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2034268939} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1804642929 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1804642927} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1804642930 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1804642927} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Enter text... + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2150773298 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 34.3 + m_fontSizeBase: 34.3 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 2 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1804642931 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1804642927} + m_CullTransparentMesh: 1 +--- !u!1 &1829647100 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1829647101} + - component: {fileID: 1829647103} + - component: {fileID: 1829647102} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1829647101 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829647100} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 38931174} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1829647102 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829647100} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Logout + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 40.3 + m_fontSizeBase: 40.3 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1829647103 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829647100} + m_CullTransparentMesh: 1 +--- !u!1 &1860074065 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1860074066} + - component: {fileID: 1860074069} + - component: {fileID: 1860074068} + - component: {fileID: 1860074067} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1860074066 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860074065} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1262350654} + - {fileID: 1380663564} + m_Father: {fileID: 936677285} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1860074067 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860074065} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2072508973} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 1262350654} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1380663565} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1860074068 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860074065} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1860074069 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860074065} + m_CullTransparentMesh: 1 +--- !u!1 &1889810039 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1889810040} + - component: {fileID: 1889810042} + m_Layer: 0 + m_Name: MetaverseClient + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1889810040 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889810039} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1889810042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889810039} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 55c6aede8bf73ca48b10f0d9e2e771f0, type: 3} + m_Name: + m_EditorClassIdentifier: + CanvasManagerRef: {fileID: 904771132} +--- !u!1 &1889936407 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1889936408} + - component: {fileID: 1889936410} + - component: {fileID: 1889936409} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1889936408 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889936407} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1353339735} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.2} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1889936409 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889936407} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1889936410 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1889936407} + m_CullTransparentMesh: 1 +--- !u!1 &1910810517 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1910810518} + - component: {fileID: 1910810520} + - component: {fileID: 1910810519} + - component: {fileID: 1910810521} + - component: {fileID: 1910810522} + m_Layer: 5 + m_Name: LoginPnl + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1910810518 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1910810517} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1738246287} + - {fileID: 632800670} + - {fileID: 512934468} + - {fileID: 601590703} + - {fileID: 936677285} + - {fileID: 432150340} + m_Father: {fileID: 904771131} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1910810519 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1910810517} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1910810520 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1910810517} + m_CullTransparentMesh: 1 +--- !u!114 &1910810521 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1910810517} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2eeaa71c61350f46902f312854272c9, type: 3} + m_Name: + m_EditorClassIdentifier: + globalRef: {fileID: 0} +--- !u!114 &1910810522 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1910810517} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a6e0c28d5fb230f4e90475005bc6511c, type: 3} + m_Name: + m_EditorClassIdentifier: + canvasType: 0 +--- !u!1 &1999675307 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1999675308} + - component: {fileID: 1999675313} + - component: {fileID: 1999675312} + - component: {fileID: 1999675311} + - component: {fileID: 1999675310} + - component: {fileID: 1999675309} + m_Layer: 5 + m_Name: Modal_LoginFailed + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1999675308 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1999675307} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 159306964} + - {fileID: 853334011} + m_Father: {fileID: 1090573972} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -1450, y: -733.8941} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1999675309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1999675307} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 09b7e9011827e984fb71ed88b07d1f0b, type: 3} + m_Name: + m_EditorClassIdentifier: + modalReference: {fileID: 1999675307} + modal_message: login failed! + modal_title: login failed! +--- !u!114 &1999675310 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1999675307} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 10 + m_Bottom: 10 + m_ChildAlignment: 0 + m_Spacing: 8.97 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1999675311 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1999675307} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 1 + m_VerticalFit: 1 +--- !u!114 &1999675312 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1999675307} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.46666667} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1999675313 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1999675307} + m_CullTransparentMesh: 1 +--- !u!1 &2034268938 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2034268939} + - component: {fileID: 2034268940} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2034268939 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2034268938} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1804642928} + - {fileID: 1193650084} + m_Father: {fileID: 1738246287} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2034268940 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2034268938} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!1 &2046520448 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2046520449} + - component: {fileID: 2046520451} + - component: {fileID: 2046520450} + - component: {fileID: 2046520452} + m_Layer: 5 + m_Name: DebugToggles + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2046520449 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2046520448} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2139988269} + m_Father: {fileID: 904771131} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -462.39783} + m_SizeDelta: {x: 0, y: -924.7958} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2046520450 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2046520448} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2046520451 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2046520448} + m_CullTransparentMesh: 1 +--- !u!114 &2046520452 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2046520448} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9047a9f086d8beb429cb9bad0fe6fbd7, type: 3} + m_Name: + m_EditorClassIdentifier: + loginPanel: {fileID: 1910810517} + gamePanel: {fileID: 1090573971} + defaultOnPanel: {fileID: 1910810517} +--- !u!1 &2072508972 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2072508973} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2072508973 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2072508972} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 219892341} + m_Father: {fileID: 1262350654} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &2139988268 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2139988269} + - component: {fileID: 2139988271} + m_Layer: 5 + m_Name: ToggleLogin + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2139988269 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2139988268} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 4, y: 4, z: 4} + m_Children: + - {fileID: 1607187809} + - {fileID: 1273355155} + m_Father: {fileID: 2046520449} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -575, y: 0.0000019073} + m_SizeDelta: {x: 152.9804, y: 23.0712} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2139988271 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2139988268} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1607187810} + toggleTransition: 1 + graphic: {fileID: 1747592009} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 2046520452} + m_TargetAssemblyTypeName: DebugToggleManager, Assembly-CSharp + m_MethodName: togglePanel + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 1910810517} + m_ObjectArgumentAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_IsOn: 1 diff --git a/Assets/Scenes/DebugDash.unity.meta b/Assets/Scenes/DebugDash.unity.meta new file mode 100644 index 0000000..b2ba5aa --- /dev/null +++ b/Assets/Scenes/DebugDash.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3c58dd02bac207f4185512ab84eea324 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 872481a..6478a52 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -123,6 +123,82 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &26288764 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 26288765} + - component: {fileID: 26288767} + - component: {fileID: 26288766} + m_Layer: 5 + m_Name: Overlaydebug + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &26288765 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 26288764} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 267083071} + m_Father: {fileID: 904771131} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 461.74963, y: -300.6742} + m_SizeDelta: {x: -923.4992, y: -601.3484} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &26288766 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 26288764} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &26288767 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 26288764} + m_CullTransparentMesh: 1 --- !u!1 &38931173 GameObject: m_ObjectHideFlags: 0 @@ -142,7 +218,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &38931174 RectTransform: m_ObjectHideFlags: 0 @@ -427,6 +503,122 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_IsOn: 1 +--- !u!1 &267083070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 267083071} + - component: {fileID: 267083075} + - component: {fileID: 267083074} + - component: {fileID: 267083073} + - component: {fileID: 267083072} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &267083071 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267083070} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1597224912} + m_Father: {fileID: 26288765} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -457.23755, y: 191.93365} + m_SizeDelta: {x: 914.4751, y: 383.8673} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &267083072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267083070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f003e7629ecbbdb4c9867c281c3c59c9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &267083073 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267083070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &267083074 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267083070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &267083075 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267083070} + m_CullTransparentMesh: 1 --- !u!1 &289478450 GameObject: m_ObjectHideFlags: 0 @@ -2227,6 +2419,7 @@ RectTransform: m_Children: - {fileID: 1910810518} - {fileID: 1090573972} + - {fileID: 26288765} m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -2247,6 +2440,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 5759aa2a69d06bf42bc000d03390227e, type: 3} m_Name: m_EditorClassIdentifier: + Globalref: {fileID: 0} --- !u!1 &936677284 GameObject: m_ObjectHideFlags: 0 @@ -2555,6 +2749,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c2eeaa71c61350f46902f312854272c9, type: 3} m_Name: m_EditorClassIdentifier: + globalRef: {fileID: 0} --- !u!114 &1090573975 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3690,6 +3885,140 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1421356640} m_CullTransparentMesh: 1 +--- !u!1 &1597224911 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1597224912} + - component: {fileID: 1597224914} + - component: {fileID: 1597224913} + m_Layer: 5 + m_Name: LocationText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1597224912 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1597224911} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 267083071} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 240.7321, y: -42.3337} + m_SizeDelta: {x: 481.4642, y: 84.6674} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1597224913 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1597224911} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: New Text + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1597224914 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1597224911} + m_CullTransparentMesh: 1 --- !u!1 &1603377539 GameObject: m_ObjectHideFlags: 0 @@ -4403,6 +4732,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 55c6aede8bf73ca48b10f0d9e2e771f0, type: 3} m_Name: m_EditorClassIdentifier: + CanvasManagerRef: {fileID: 904771132} --- !u!1 &1889936407 GameObject: m_ObjectHideFlags: 0 @@ -4573,6 +4903,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c2eeaa71c61350f46902f312854272c9, type: 3} m_Name: m_EditorClassIdentifier: + globalRef: {fileID: 0} --- !u!114 &1910810522 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Tests/RaindropTests.cs b/Assets/Tests/RaindropTests.cs new file mode 100644 index 0000000..187537e --- /dev/null +++ b/Assets/Tests/RaindropTests.cs @@ -0,0 +1,23 @@ +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Raindrop.Tests +{ + [TestFixture()] + class RaindropTests + { + [Test()] + public void LoginTest() + { + RaindropClient MainRaindropInstance; + + + } + + } +} diff --git a/Assets/Tests/RaindropTests.cs.meta b/Assets/Tests/RaindropTests.cs.meta new file mode 100644 index 0000000..423fd3b --- /dev/null +++ b/Assets/Tests/RaindropTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 646de89141f469245ace3f66a81cce73 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tests/Tests.asmdef b/Assets/Tests/Tests.asmdef index ae3de86..38b2f19 100644 --- a/Assets/Tests/Tests.asmdef +++ b/Assets/Tests/Tests.asmdef @@ -4,7 +4,8 @@ "references": [ "UnityEngine.TestRunner", "UnityEditor.TestRunner", - "LibreMetaverseAssembly" + "LibreMetaverseAssembly", + "RaindropUnity" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Assets/Unity/Global.cs b/Assets/Unity/Global.cs deleted file mode 100644 index 8249b89..0000000 --- a/Assets/Unity/Global.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; -using Raindrop; - -public class Global : MonoBehaviour -{ - //this static-new is like a globally accessible instance without a singleton! :) - public static RaindropClient MainRaindropInstance = new RaindropClient(); - //this one manages the viewmodels and the stacking of UI modals. - public static RaindropViewManager RaindropVM = new RaindropViewManager(); - - - public string app_data_Path { get; private set; } - - private void Awake() - { - //initialise your 'statics' - - //Get the path of the Game data folder - app_data_Path = Application.persistentDataPath; - - //Output the Game data path to the console - Debug.Log("dataPath : " + app_data_Path); - - MainRaindropInstance.setConfigPath(app_data_Path); - } - -} diff --git a/Assets/Unity/RaindropViewManager.cs b/Assets/Unity/RaindropViewManager.cs deleted file mode 100644 index 5ca122b..0000000 --- a/Assets/Unity/RaindropViewManager.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; - -namespace Raindrop -{ - public enum CanvasType - { - Login, - Game - } - - public class RaindropViewManager - { - public CanvasManager cm; - - //manages all child Viewmodels - public RaindropViewManager() - { - //Debug.Log("VM manager setup ok"); - - //subscribe all events from raindropclient - Global.MainRaindropInstance.LoginCompleted += MainRaindropInstance_LoginCompleted; - Global.MainRaindropInstance.LoginFailed += MainRaindropInstance_LoginFailed; - - } - - //register the canvas manager which is in a GO, who has the responsibility of flipping pages. - public void registerWithRaindropClient(CanvasManager canvasManager) - { - cm = canvasManager; - //start up the initial login panel - pushLoginView(); - } - private void pushLoginView() - { - cm.pushCanvas(CanvasType.Login); - } - - private void MainRaindropInstance_LoginFailed() - { - Debug.Log("failed login TODO: why?"); - } - - private void showFailedLoginModal() - { - throw new NotImplementedException(); - } - - private void MainRaindropInstance_LoginCompleted() - { - cm.popCanvas(); - cm.pushCanvas(CanvasType.Game); - //showSuccessLoginModal(); - } - - private void removeLoginView() - { - throw new NotImplementedException(); - } - - private void showSuccessLoginModal() - { - throw new NotImplementedException(); - } - } -} diff --git a/Assets/UnityMainThreadDispatcher.cs b/Assets/UnityMainThreadDispatcher.cs new file mode 100644 index 0000000..3675e8e --- /dev/null +++ b/Assets/UnityMainThreadDispatcher.cs @@ -0,0 +1,133 @@ +/* +Copyright 2015 Pim de Witte All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using System; +using System.Threading.Tasks; + +/// Author: Pim de Witte (pimdewitte.com) and contributors, https://github.com/PimDeWitte/UnityMainThreadDispatcher +/// +/// A thread-safe class which holds a queue with actions to execute on the next Update() method. It can be used to make calls to the main thread for +/// things such as UI Manipulation in Unity. It was developed for use in combination with the Firebase Unity plugin, which uses separate threads for event handling +/// +public class UnityMainThreadDispatcher : MonoBehaviour +{ + + private static readonly Queue _executionQueue = new Queue(); + + public void Update() + { + lock (_executionQueue) + { + while (_executionQueue.Count > 0) + { + _executionQueue.Dequeue().Invoke(); + } + } + } + + /// + /// Locks the queue and adds the IEnumerator to the queue + /// + /// IEnumerator function that will be executed from the main thread. + public void Enqueue(IEnumerator action) + { + lock (_executionQueue) + { + _executionQueue.Enqueue(() => { + StartCoroutine(action); + }); + } + } + + /// + /// Locks the queue and adds the Action to the queue + /// + /// function that will be executed from the main thread. + public void Enqueue(Action action) + { + Enqueue(ActionWrapper(action)); + } + + /// + /// Locks the queue and adds the Action to the queue, returning a Task which is completed when the action completes + /// + /// function that will be executed from the main thread. + /// A Task that can be awaited until the action completes + public Task EnqueueAsync(Action action) + { + var tcs = new TaskCompletionSource(); + + void WrappedAction() + { + try + { + action(); + tcs.TrySetResult(true); + } + catch (Exception ex) + { + tcs.TrySetException(ex); + } + } + + Enqueue(ActionWrapper(WrappedAction)); + return tcs.Task; + } + + + IEnumerator ActionWrapper(Action a) + { + a(); + yield return null; + } + + + private static UnityMainThreadDispatcher _instance = null; + + public static bool Exists() + { + return _instance != null; + } + + public static UnityMainThreadDispatcher Instance() + { + if (!Exists()) + { + throw new Exception("UnityMainThreadDispatcher could not find the UnityMainThreadDispatcher object. Please ensure you have added the MainThreadExecutor Prefab to your scene."); + } + return _instance; + } + + + void Awake() + { + if (_instance == null) + { + _instance = this; + DontDestroyOnLoad(this.gameObject); + } + } + + void OnDestroy() + { + _instance = null; + } + + +} \ No newline at end of file diff --git a/Assets/UnityMainThreadDispatcher.cs.meta b/Assets/UnityMainThreadDispatcher.cs.meta new file mode 100644 index 0000000..57d4608 --- /dev/null +++ b/Assets/UnityMainThreadDispatcher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 518a7b51b6ca76b4aa067bd054208dd9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/grids.xml b/Assets/grids.xml new file mode 100644 index 0000000..0e7ee37 --- /dev/null +++ b/Assets/grids.xml @@ -0,0 +1,471 @@ + + + + + + gridnick + agni + gridname + Second Life (agni) + platform + SecondLife + loginuri + https://login.agni.lindenlab.com/cgi-bin/login.cgi + loginpage + http://secondlife.com/app/login/?channel=Second+Life+Release + helperuri + https://secondlife.com/helpers/ + website + http://secondlife.com/ + support + http://secondlife.com/support/ + register + http://secondlife.com/registration/ + password + http://secondlife.com/account/request.php + version + 0 + + + + + gridnick + aditi + gridname + Second Life Beta (aditi) + platform + SecondLife + loginuri + https://login.aditi.lindenlab.com/cgi-bin/login.cgi + loginpage + http://secondlife.com/app/login/?channel=Second+Life+Beta + helperuri + http://aditi-secondlife.webdev.lindenlab.com/helpers/ + website + http://secondlife.com/ + support + http://secondlife.com/support/ + register + http://secondlife.com/registration/ + password + http://secondlife.com/account/request.php + version + 1 + + + + + gridnick + metropolis + gridname + Metropolis Metaversum + platform + OpenSim + loginuri + http://hypergrid.org:8002/ + loginpage + http://metropolis.hypergrid.org + helperuri + http://metropolis.hypergrid.org/currency/helper/ + website + http://metropolis.hypergrid.org + support + http://metropolis.hypergrid.org + register + http://metropolis.hypergrid.org/oswi.php + password + http://metropolis.hypergrid.org/oswi.php + version + 1 + + + + + gridnick + osgrid + gridname + OSGrid + platform + OpenSim + loginuri + http://login.osgrid.org/ + loginpage + http://osgrid.org/loginscreen.php + helperuri + http://osgrid.org/ + website + http://osgrid.org/ + support + http://osgrid.org/ + register + http://osgrid.org/elgg/account/register.php + password + http://osgrid.org/elgg/account/forgotten_password.php + version + 1 + + + + + gridnick + reactiongrid + gridname + ReactionGrid + platform + OpenSim + + loginuri + http://reactiongrid.com:8008/ + loginpage + http://gsquared.info/portal + website + http://reactiongrid.com/Default.aspx + support + http://reactiongrid.com/Support.aspx + register + http://reactiongrid.com/Register.aspx + + password + http://reactiongrid.com/Support/ResetPassword.aspx + version + 0 + + + + + + gridnick + 3rdrock + gridname + 3rd Rock Grid + platform + OpenSim + loginuri + http://grid.3rdrockgrid.com:8002/ + + loginpage + http://3rdrockgrid.com/startpage.php + helperuri + http://3rdrockgrid.com/main/rg_files/wr/ + website + http://3rdrockgrid.com/ + register + http://www.3rdrockgrid.com/main/index.php?option=com_comprofiler&task=registers + + password + http://www.3rdrockgrid.com/main/index.php?option=com_comprofiler&task=lostPassword + support + http://3rdrockgrid.com/ + version + 0 + + + + + + gridnick + sirinhgpole + gridname + SirinHGpole + platform + OpenSim + loginuri + http://hg.sirinhgpole.com:8002/ + + loginpage + + helperuri + + website + + register + + + password + + support + + version + 0 + + + + + + gridname + Inworldz + gridnick + inworldz + platform + OpenSim + + loginuri + http://inworldz.com:8002/ + loginpage + http://inworldz.com/welcome + helperuri + http://inworldz.com/ + password + http://inworldz.com/wpassword + + register + http://inworldz.com/register + support + http://inworldz.com/help + website + http://inworldz.com/about/ + version + 0 + + + + + + gridnick + francogrid + gridname + Francogrid + + platform + OpenSim + loginuri + http://login.francogrid.org/ + loginpage + http://viewer.francogrid.org/ + helperuri + http://helper.main.francogrid.org/ + website + http:/francogrid.org/ + + support + http:/francogrid.org/aide + register + http:/francogrid.org/user/register + password + http:/francogrid.org/user/password + version + 0 + + + + + gridnick + legendcityonline + gridname + Legend City Online + + platform + OpenSim + loginuri + http://login.legendcityonline.com + loginpage + http://www.legendcityonline.com/welcome.php + helperuri + https://secure.legendcityonline.com/ + website + http://www.legendcityonline.com/ + + support + http://www.legendcityonline.com/ + register + http://www.legendcityonline.com/ + password + http://www.legendcityonline.com/ + version + 0 + + + + + gridnick + worldsimterra + gridname + WorldSimTerra + platform + OpenSim + + loginuri + http://wsterra.com:8002 + loginpage + http://wsterra.com/log.php + helperuri + http://wsterra.com/ + website + http://www.worldsimterra.com/ + support + http://www.worldsimterra.com/ + + register + http://www.worldsimterra.com/ + password + http://www.worldsimterra.com/ + version + 0 + + + + + + gridnick + youralternativelife + gridname + Your Alternative Life + platform + OpenSim + loginuri + http://grid01.from-ne.com:8002/ + + loginpage + http://grid01.from-ne.com/tios/loginscreen3.php + helperuri + http://grid01.from-ne.com/tios/services/ + website + http://www.youralternativelife.com + support + http://www.youralternativelife.com + register + http://www.youralternativelife.com + + password + http://www.youralternativelife.com + version + 0 + + + + + + gridnick + thenewworldgrid + + gridname + The New World Grid + platform + OpenSim + loginuri + http://grid.newworldgrid.com:8002/ + loginpage + http://account.newworldgrid.com/loginscreen.php + helperuri + http://account.newworldgrid.com/ + + website + http://www.newworldgrid.com/ + support + http://www.newworldgrid.com/ + register + http://www.newworldgrid.com/register + password + http://account.newworldgrid.com/ + version + 0 + + + + + + gridnick + cyberlandia + + gridname + Cyberlandia + platform + OpenSim + loginuri + http://grid.cyberlandia.net:8002 + loginpage + + helperuri + + + website + http://www.cyberlandia.net + version + 0 + + + + + gridnick + thegorgrid + + gridname + The Gor Grid + platform + OpenSim + loginuri + http://thegorgrid.com:8002 + loginpage + http://thegorgrid.com/loginscreen.php + website + http://thegorgrid.com/ + + register + http://thegorgrid.com/index.php?page=create + password + http://thegorgrid.com/index.php?page=change + version + 0 + + + + + + gridnick + giantgrid + gridname + GiantGrid + platform + OpenSim + loginuri + http://Gianttest.no-ip.biz:8002/ + + loginpage + http://gianttest.no-ip.biz:80/gridsplash?method=login + helperuri + http://gianttest.no-ip.biz/giantmap/ + version + 0 + + + + + + gridnick + localhost + gridname + Local Host + platform + OpenSim + loginuri + http://127.0.0.1:9000/ + + loginpage + + helperuri + http://127.0.0.1:9000/ + version + 1 + + + + + + gridnick + gridproxy + gridname + Grid Proxy + platform + OpenSim + loginuri + http://127.0.0.1:8080/ + loginpage + + helperuri + http://127.0.0.1:8080/ + version + 1 + + + + \ No newline at end of file diff --git a/Assets/grids.xml.meta b/Assets/grids.xml.meta new file mode 100644 index 0000000..1f51553 --- /dev/null +++ b/Assets/grids.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bfaa316973c5d774593d35cb9ee33169 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: