From 5ef0b68e8aa8c5fe90b8f3f79912b2fca9a22700 Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Wed, 21 Jan 2026 19:15:23 +0700
Subject: [PATCH 01/17] Add create role panel
---
Assets/PerfectWorld/Scene/LoginScene.unity | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Assets/PerfectWorld/Scene/LoginScene.unity b/Assets/PerfectWorld/Scene/LoginScene.unity
index 96d09f5880..f9809e856d 100644
--- a/Assets/PerfectWorld/Scene/LoginScene.unity
+++ b/Assets/PerfectWorld/Scene/LoginScene.unity
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f3553c5fdd68230c6a591df1fde22cf360896fc818007787595189f0cc036b5c
-size 69312
+oid sha256:a41418f309314ea9e03e2b5d108dd17a0aca4514c478eeae159d537e7de7c178
+size 163949
From 2244c8b73c7d2a963453ddf2a1fb4674ff36803d Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Wed, 21 Jan 2026 19:16:49 +0700
Subject: [PATCH 02/17] Add create role ui
---
.../Scripts/UI/Login/CreateCharacterScreen.cs | 217 ++++++++++++++++++
.../UI/Login/CreateCharacterScreen.cs.meta | 2 +
Assets/Scripts/SelecScreenCharacter.cs | 72 +++++-
3 files changed, 286 insertions(+), 5 deletions(-)
create mode 100644 Assets/PerfectWorld/Scripts/UI/Login/CreateCharacterScreen.cs
create mode 100644 Assets/PerfectWorld/Scripts/UI/Login/CreateCharacterScreen.cs.meta
diff --git a/Assets/PerfectWorld/Scripts/UI/Login/CreateCharacterScreen.cs b/Assets/PerfectWorld/Scripts/UI/Login/CreateCharacterScreen.cs
new file mode 100644
index 0000000000..c8af5d8047
--- /dev/null
+++ b/Assets/PerfectWorld/Scripts/UI/Login/CreateCharacterScreen.cs
@@ -0,0 +1,217 @@
+using System;
+using System.Text;
+using BrewMonster.Network;
+using CSNetwork;
+using CSNetwork.GPDataType;
+using CSNetwork.Protocols;
+using CSNetwork.Protocols.RPCData;
+using TMPro;
+using UnityEngine;
+using UnityEngine.UI;
+using BrewMonster.Scripts;
+
+namespace BrewMonster.UI
+{
+ ///
+ /// UI screen for creating a new character.
+ /// Equivalent to CDlgCreateGenderName + CDlgCreateProfession in C++.
+ ///
+ public class CreateCharacterScreen : MonoBehaviour
+ {
+ [SerializeField] private GameObject professionSelectionPanel;
+ [SerializeField] private Button[] professionButtons;
+ [SerializeField] private Button maleGenderButton;
+ [SerializeField] private Button femaleGenderButton;
+ [SerializeField] private TMP_InputField nameInputField;
+ [SerializeField] private Button confirmButton;
+ [SerializeField] private Button cancelButton;
+ [SerializeField] private Button backButton;
+
+ private int _currentProfession = -1;
+ private int _currentGender = -1;
+
+ private Action _onCreateComplete;
+ private Action _onCancel;
+
+ private void Start()
+ {
+ if (confirmButton != null)
+ confirmButton.onClick.AddListener(OnConfirmClicked);
+ if (cancelButton != null)
+ cancelButton.onClick.AddListener(OnCancelClicked);
+ if (backButton != null)
+ backButton.onClick.AddListener(OnCancelClicked);
+
+ if (maleGenderButton != null)
+ maleGenderButton.onClick.AddListener(() => OnGenderSelected(GENDER.GENDER_MALE));
+ if (femaleGenderButton != null)
+ femaleGenderButton.onClick.AddListener(() => OnGenderSelected(GENDER.GENDER_FEMALE));
+
+ // Setup profession buttons
+ if (professionButtons != null)
+ {
+ for (int i = 0; i < professionButtons.Length && i < 12; i++)
+ {
+ int prof = i; // Capture for closure
+ if (professionButtons[i] != null)
+ professionButtons[i].onClick.AddListener(() => OnProfessionSelected(prof));
+ }
+ }
+
+ if (nameInputField != null)
+ {
+ nameInputField.onSubmit.AddListener((text) => { if (CanConfirm()) OnConfirmClicked(); });
+ }
+ }
+
+ public void Show(Action onCreateComplete, Action onCancel)
+ {
+ _onCreateComplete = onCreateComplete;
+ _onCancel = onCancel;
+ _currentProfession = -1;
+ _currentGender = -1;
+
+ gameObject.SetActive(true);
+
+ if (nameInputField != null)
+ {
+ nameInputField.text = "";
+ nameInputField.Select();
+ }
+
+ UpdateConfirmButtonState();
+ }
+
+ public void Hide()
+ {
+ gameObject.SetActive(false);
+ }
+
+ private void OnProfessionSelected(int profession)
+ {
+ if (profession < 0 || profession >= (int)Profession.NUM_PROFESSION)
+ return;
+
+ _currentProfession = profession;
+
+ // Update UI to show selected profession
+ if (professionButtons != null)
+ {
+ for (int i = 0; i < professionButtons.Length; i++)
+ {
+ if (professionButtons[i] != null)
+ {
+ // Visual feedback for selected profession
+ var colors = professionButtons[i].colors;
+ colors.normalColor = (i == profession) ? Color.yellow : Color.white;
+ professionButtons[i].colors = colors;
+ }
+ }
+ }
+
+ // Auto-select first available gender for this profession if not selected
+ if (_currentGender == -1)
+ {
+ // Default to male if available, otherwise female
+ OnGenderSelected(GENDER.GENDER_MALE);
+ }
+
+ UpdateConfirmButtonState();
+ }
+
+ private void OnGenderSelected(int gender)
+ {
+ if (gender != GENDER.GENDER_MALE && gender != GENDER.GENDER_FEMALE)
+ return;
+
+ _currentGender = gender;
+
+ // Update UI to show selected gender
+ if (maleGenderButton != null)
+ {
+ var colors = maleGenderButton.colors;
+ colors.normalColor = (gender == GENDER.GENDER_MALE) ? Color.yellow : Color.white;
+ maleGenderButton.colors = colors;
+ }
+
+ if (femaleGenderButton != null)
+ {
+ var colors = femaleGenderButton.colors;
+ colors.normalColor = (gender == GENDER.GENDER_FEMALE) ? Color.yellow : Color.white;
+ femaleGenderButton.colors = colors;
+ }
+
+ UpdateConfirmButtonState();
+ }
+
+ private void OnConfirmClicked()
+ {
+ if (!CanConfirm())
+ return;
+
+ string characterName = nameInputField != null ? nameInputField.text : "";
+ if (string.IsNullOrWhiteSpace(characterName))
+ {
+ Debug.LogWarning("Character name cannot be empty");
+ return;
+ }
+
+ // Create RoleInfo using helper method
+ RoleInfo roleInfo = GameSession.CreateNewRoleInfo(characterName, _currentProfession, _currentGender);
+
+ // Create role via network
+ Debug.Log($"Calling CreateRoleAsync for character: {characterName}, profession: {_currentProfession}, gender: {_currentGender}");
+ UnityGameSession.CreateRoleAsync(roleInfo, new Octets(), (createdRole) =>
+ {
+ if (createdRole != null)
+ {
+ Debug.Log($"Character created successfully: {characterName}, RoleID: {createdRole.roleid}");
+ _onCreateComplete?.Invoke(createdRole);
+ }
+ else
+ {
+ Debug.LogError($"Failed to create character: {characterName}. Check GameSession logs for error details.");
+ // TODO: Show error message to user
+ }
+ });
+ }
+
+ private void OnCancelClicked()
+ {
+ Hide();
+ _onCancel?.Invoke();
+ }
+
+ private bool CanConfirm()
+ {
+ if (_currentProfession < 0 || _currentProfession >= (int)Profession.NUM_PROFESSION)
+ return false;
+
+ if (_currentGender != GENDER.GENDER_MALE && _currentGender != GENDER.GENDER_FEMALE)
+ return false;
+
+ string name = nameInputField != null ? nameInputField.text : "";
+ if (string.IsNullOrWhiteSpace(name))
+ return false;
+
+ return true;
+ }
+
+ private void UpdateConfirmButtonState()
+ {
+ if (confirmButton != null)
+ {
+ confirmButton.interactable = CanConfirm();
+ }
+ }
+
+ private void Update()
+ {
+ // Update confirm button state in case name changes
+ if (nameInputField != null && nameInputField.isFocused)
+ {
+ UpdateConfirmButtonState();
+ }
+ }
+ }
+}
diff --git a/Assets/PerfectWorld/Scripts/UI/Login/CreateCharacterScreen.cs.meta b/Assets/PerfectWorld/Scripts/UI/Login/CreateCharacterScreen.cs.meta
new file mode 100644
index 0000000000..5a22e1e624
--- /dev/null
+++ b/Assets/PerfectWorld/Scripts/UI/Login/CreateCharacterScreen.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: aa9de023137e92348983cee3c59d620b
\ No newline at end of file
diff --git a/Assets/Scripts/SelecScreenCharacter.cs b/Assets/Scripts/SelecScreenCharacter.cs
index 087b6a401a..bdcf91c5a2 100644
--- a/Assets/Scripts/SelecScreenCharacter.cs
+++ b/Assets/Scripts/SelecScreenCharacter.cs
@@ -2,6 +2,7 @@ using CSNetwork.Protocols.RPCData;
using System;
using System.Collections.Generic;
using UnityEngine;
+using UnityEngine.UI;
using BrewMonster;
namespace BrewMonster.UI
@@ -10,15 +11,76 @@ namespace BrewMonster.UI
{
[SerializeField] private GameObject characterItemPrefab;
[SerializeField] private RectTransform parentItems;
+ [SerializeField] private Button createCharacterButton;
+ [SerializeField] private CreateCharacterScreen createCharacterScreen;
- public void InitScreen(List roleInfos, Action OnClickItemChar)
+ private Action _onClickItemChar;
+ private Action _onCreateCharacterComplete;
+
+ private void Start()
{
-
- foreach (RoleInfo info in roleInfos)
+ if (createCharacterButton != null)
{
- CharacterItemUI item = Instantiate(characterItemPrefab, parentItems).GetComponent();
- item.InitItem(info, OnClickItemChar);
+ createCharacterButton.onClick.AddListener(OnCreateCharacterClicked);
}
}
+
+ public void InitScreen(List roleInfos, Action OnClickItemChar, Action onCreateCharacterComplete = null)
+ {
+ _onClickItemChar = OnClickItemChar;
+ _onCreateCharacterComplete = onCreateCharacterComplete;
+
+ // Clear existing items
+ if (parentItems != null)
+ {
+ foreach (Transform child in parentItems)
+ {
+ Destroy(child.gameObject);
+ }
+ }
+
+ // Create character items
+ if (roleInfos != null)
+ {
+ foreach (RoleInfo info in roleInfos)
+ {
+ if (characterItemPrefab != null && parentItems != null)
+ {
+ CharacterItemUI item = Instantiate(characterItemPrefab, parentItems).GetComponent();
+ item.InitItem(info, OnClickItemChar);
+ }
+ }
+ }
+ }
+
+ private void OnCreateCharacterClicked()
+ {
+ if (createCharacterScreen != null)
+ {
+ gameObject.SetActive(false);
+ createCharacterScreen.Show(OnCreateCharacterComplete, OnCreateCharacterCancel);
+ }
+ }
+
+ private void OnCreateCharacterComplete(RoleInfo newRole)
+ {
+ if (createCharacterScreen != null)
+ {
+ createCharacterScreen.Hide();
+ }
+
+ gameObject.SetActive(true);
+ _onCreateCharacterComplete?.Invoke();
+ }
+
+ private void OnCreateCharacterCancel()
+ {
+ if (createCharacterScreen != null)
+ {
+ createCharacterScreen.Hide();
+ }
+
+ gameObject.SetActive(true);
+ }
}
}
From 8072ce91248d1f919f049602ece2fddce21a04be Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Thu, 22 Jan 2026 09:39:07 +0700
Subject: [PATCH 03/17] Change create role panel to prefab
---
Assets/PerfectWorld/Scene/LoginScene.unity | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Assets/PerfectWorld/Scene/LoginScene.unity b/Assets/PerfectWorld/Scene/LoginScene.unity
index f9809e856d..9ab890de71 100644
--- a/Assets/PerfectWorld/Scene/LoginScene.unity
+++ b/Assets/PerfectWorld/Scene/LoginScene.unity
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a41418f309314ea9e03e2b5d108dd17a0aca4514c478eeae159d537e7de7c178
-size 163949
+oid sha256:6a7e265cfd47dce1f812574e574f5193f8c7336c6ef0034eeb0c0200b2d45173
+size 75407
From 79906c31130c2bebb12de7c7156d93326561dd6d Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Thu, 22 Jan 2026 10:02:28 +0700
Subject: [PATCH 04/17] Add handle creating role, call back
---
.../Scripts/Network/CSNetwork/GameSession.cs | 3287 +++++++++--------
1 file changed, 1752 insertions(+), 1535 deletions(-)
diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs
index 56ec20638a..cb0e4f704e 100644
--- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs
+++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs
@@ -1,1536 +1,1753 @@
-using BrewMonster;
-using BrewMonster.Common;
-using BrewMonster.Managers;
-using BrewMonster.Network;
-using BrewMonster.Scripts.Skills;
-using BrewMonster.UI;
-using CSNetwork.C2SCommand;
-using CSNetwork.GPDataType;
-using CSNetwork.Protocols;
-using CSNetwork.Protocols.RPCData;
-using System;
-using System.Collections.Generic;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-using UnityEngine;
-using CommandID = CSNetwork.GPDataType.CommandID;
-
-namespace CSNetwork
-{
- public class GameSession : IDisposable
- {
- private static IPrefixedLogger
- _logger = LoggerFactory.GetLogger(nameof(GameSession)); // Get class-specific logger
-
- private NetworkManager _networkManager;
- private string _host;
- private int _port;
- private string _username;
- private string _password;
- private int _currentUserId = -1; // To store the UserID after successful login
- private int m_iCharID;
- private int m_idLastSelTarget = 0; // ID of selected item last time
-
- CECStringTab m_ErrorMsgs;
-
- // State management for async operations and callbacks
- private Action _loginCallback;
- private Action> _roleListCallback;
- private List _accumulatedRoles;
- private Action _selectRoleCallback;
- private RoleInfo _selectedRole;
- public bool IsConnected => _networkManager?.IsConnected ?? false;
- public static SynchronizationContext Context;
- private CECC2SCmdCache m_CmdCache; // C2S command cache
-#if UNITY_EDITOR
- public bool isDebug;
- public bool IsDebug
- {
- get => isDebug;
- set => isDebug = value;
- }
-#endif
- public CECC2SCmdCache CmdCache { get => m_CmdCache; }
-
-
- public GameSession()
- {
- _networkManager = new NetworkManager();
- m_CmdCache = new CECC2SCmdCache();
- _networkManager.ProtocolReceived += OnProtocolReceived;
- _networkManager.ErrorOccurred += OnErrorOccurred;
- _networkManager.Disconnected += OnDisconnected;
- }
-
- public void SetLogPath(string path)
- {
- LoggerFactory.SetFileLoggerImplementation(new FileLogger());
- _logger = LoggerFactory.GetCustomLogger(path, nameof(GameSession) + GetHashCode(), LoggerType.File);
- _networkManager.SetLogPath(path);
- }
-
- ///
- /// Connects to the game server asynchronously.
- ///
- /// Server hostname or IP address.
- /// Server port.
- /// Task representing the asynchronous connect operation. Check IsConnected property or handle Disconnected event for status.
- public async Task ConnectAsync(string host, int port)
- {
- if (IsConnected)
- {
- _logger.Log(LogType.Warning, "ConnectAsync called but already connected.");
- return;
- }
-
- _host = host;
- _port = port;
- _logger.Log(LogType.Info, $"Attempting to connect to {_host}:{_port}...");
- try
- {
- await _networkManager.ConnectAsync(_host, _port);
- if (IsConnected)
- {
- _logger.Log(LogType.Info, "Connection established.");
- }
- else
- {
- _logger.Log(LogType.Warning,
- "Connection failed after ConnectAsync completed (check NetworkManager logs/events).");
- }
- }
- catch (Exception ex)
- {
- _logger.Log(LogType.Error, $"Connection exception: {ex.Message}");
- _logger.LogException(ex);
- OnDisconnected();
- }
- }
-
-
- public void Disconnect()
- {
- _networkManager.Disconnect();
- }
-
- ///
- /// Initiates the login process asynchronously.
- ///
- /// Account username.
- /// Account password.
- /// Action invoked with true on successful login (OnlineAnnounce received), false otherwise.
- public void LoginAsync(string username, string password, Action callback)
- {
- if (!IsConnected)
- {
- _logger.Log(LogType.Warning, "LoginAsync called but not connected.");
- callback?.Invoke(false);
- return;
- }
-
- if (_loginCallback != null)
- {
- _logger.Log(LogType.Warning, "LoginAsync called while another login is already in progress.");
- callback?.Invoke(false);
- return;
- }
-
- _username = username;
- _password = password;
- _loginCallback = callback;
- _currentUserId = -1; // Reset user ID
-
- _logger.Log(LogType.Info, $"Initiating login for user '{_username}'...");
- }
-
- ///
- /// Initiates fetching the role list asynchronously. Requires successful login.
- ///
- /// Action invoked with the complete list of roles, or null/empty list on failure.
- public void GetRoleListAsync(Action> callback)
- {
- if (!IsConnected)
- {
- _logger.Log(LogType.Warning, "GetRoleListAsync called but not connected.");
- callback?.Invoke(null);
- return;
- }
-
- if (_currentUserId == -1)
- {
- _logger.Log(LogType.Warning, "GetRoleListAsync called but not logged in.");
- callback?.Invoke(null);
- return;
- }
-
- if (_roleListCallback != null)
- {
- _logger.Log(LogType.Warning,
- "GetRoleListAsync called while another role list retrieval is already in progress.");
- callback?.Invoke(null);
- return;
- }
-
- _roleListCallback = callback;
- _accumulatedRoles = new List();
- _logger.Log(LogType.Info, "Requesting role list...");
- RequestRoleListInternal();
- }
-
- public RoleInfo GetRoleInfo()
- {
- return _selectedRole;
- }
-
- public void SelectRoleAsync(RoleInfo role, Action callback)
- {
- _selectedRole = role;
- _selectRoleCallback = callback;
- SetCharacterID(role.roleid);
- SendProtocol(new selectrole()
- {
- Roleid = role.roleid,
- Flag = 0
- });
- }
-
- public void EnterWorldAsync(RoleInfo role, Action callback)
- {
- SendProtocol(new enterworld()
- {
- Roleid = _selectedRole.roleid,
- Provider_link_id = 0,
- }, callback);
- }
-
- public void RequestDropIvtrItem(byte index, int amount)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = C2SCommandFactory.CreateDropIvtrItem(index, amount);
- SendProtocol(gamedatasendRequest);
- }
-
- public void RequestDropEquipItem(byte index)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = C2SCommandFactory.CreateDropEquipItem(index);
- SendProtocol(gamedatasendRequest);
- }
-
- public void RequestPickupItem(int idItem, int tid)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = C2SCommandFactory.CreatePickupItem(idItem, tid);
- SendProtocol(gamedatasendRequest);
- }
-
- public void c2s_SendCmdGetIvtrDetailData(byte byPackage, Action callback)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = CSNetwork.C2SCommand.C2SCommandFactory.c2s_SendCmdGetIvtrDetailData(byPackage);
- SendProtocol(gamedatasendRequest, callback);
- }
-
- public void c2s_SendCmdQueryCashInfo()
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = C2SCommandFactory.c2s_SendCmdQueryCashInfo();
- SendProtocol(gamedatasendRequest);
- }
-
- public void c2s_SendCmdOpenFashionTrash(string password)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = C2SCommandFactory.c2s_SendCmdOpenFashionTrash(password);
- SendProtocol(gamedatasendRequest);
- }
-
- public void c2s_SendCmdEquipItem(byte iIvtrIdx, byte iEquipIdx, Action callback)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = CSNetwork.C2SCommand.C2SCommandFactory.c2s_SendCmdEquipItem(iIvtrIdx, iEquipIdx);
- SendProtocol(gamedatasendRequest, callback);
- }
-
- public void c2s_SendCmdReviveVillage(int param = 0)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = C2SCommandFactory.c2s_SendCmdReviveVillage(param);
- SendProtocol(gamedatasendRequest);
- }
- public void c2s_SendCmdReviveItem(int param = 0)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = C2SCommandFactory.c2s_SendCmdReviveVillage(param);
- SendProtocol(gamedatasendRequest);
- }
- public void RequestReviveByPlayer(int param = 0)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = C2SCommandFactory.c2s_SendCmdReviveVillage(param);
- SendProtocol(gamedatasendRequest);
- }
-
-
- public void c2s_SendCmdMallShopping(uint count, CMD_MallShopping.goods[] goodsArray)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = CSNetwork.C2SCommand.C2SCommandFactory.CreateGetMallShopping(count, goodsArray);
- SendProtocol(gamedatasendRequest);
- }
- public void c2s_SendCmdGatherMaterial(int idMatter, int iToolPack, int idToolIndex, int idTool, int idTask)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = CSNetwork.C2SCommand.C2SCommandFactory.c2s_SendCmdGatherMaterial(idMatter, iToolPack, idToolIndex, idTool, idTask);
- SendProtocol(gamedatasendRequest);
- }
-
- public void RequestOwnItemInfoAsync(
- byte byPackage,
- byte bySlot,
- int type,
- int expire_date,
- int state,
- uint count,
- ushort crc,
- ushort content_length,
- byte[] content,
- Action callback)
- {
- gamedatasend gamedatasendRequest = new gamedatasend();
- gamedatasendRequest.Data = C2SCommandFactory.CreateOwnItemInfo(byPackage, bySlot, type, expire_date, state,
- count, crc, content_length, content);
- SendProtocol(gamedatasendRequest, callback);
- }
-
- // --- Protocol Sending ---
- public void SendProtocol(Protocol protocol, Action complete = null)
- {
- if (IsConnected)
- {
- _logger.Log(LogType.Debug,
- $"Sending protocol: {protocol.GetType().Name} (Detail: {protocol.ToString})");
- _networkManager.Send(protocol);
- complete?.Invoke();
- }
- else
- {
- _logger.Log(LogType.Warning, $"Cannot send protocol ({protocol.GetType().Name}), not connected.");
- }
- }
-
- // --- Event Handlers (from NetworkManager) ---
-
- private void OnProtocolReceived(Protocol protocol)
- {
- _logger.Log(LogType.Debug, $"Received protocol: {protocol.GetType().Name} (Type: {protocol.Type})");
- if (protocol is null)
- return;
-
-
- // Route protocol to appropriate handler
- switch (protocol.GetPType())
- {
- case ProtocolType.PROTOCOL_CHALLENGE:
- HandleChallenge((challenge)protocol);
- break;
- case ProtocolType.PROTOCOL_KEYEXCHANGE:
- HandleKeyExchange((KeyExchange)protocol);
- break;
- case ProtocolType.PROTOCOL_ONLINEANNOUNCE:
- HandleOnlineAnnounce((onlineannounce)protocol);
- break;
- case ProtocolType.PROTOCOL_ROLELIST_RE:
- HandleRoleListResponse((RoleListResponse)protocol);
- break;
- // Add cases for other protocols GameSession might need to handle
- case ProtocolType.PROTOCOL_SELECTROLE_RE:
- HandleSelectRoleResponse((SelectRole_Re)protocol);
- //_networkManager.IgnoreBytes = 2;
- break;
- case ProtocolType.PROTOCOL_S2CGAMEDATASEND:
- case ProtocolType.PROTOCOL_GAMEDATASEND:
- HandleServerDataSend((gamedatasend)protocol);
- break;
- case ProtocolType.PROTOCOL_CHATMESSAGE:
- _logger.Log(LogType.Warning, $"HoangDev :ProtocolType.PROTOCOL_CHATMESSAGE {protocol.GetPType()}");
- OnPrtcChatMessage(protocol, false);
- break;
- case ProtocolType.PROTOCOL_PLAYERBASEINFO_RE:
- OnPrtcPlayerBaseInfoRe(protocol);
- break;
- case ProtocolType.PROTOCOL_GETUICONFIG_RE: OnPrtcGetConfigRe(protocol); break;
-
- case ProtocolType.PROTOCOL_AUTOTEAMSETGOAL_RE:
- {
- // CECAutoTeam pAutoTeam = CECGameRun.Instance.GetHostPlayer().GetAutoTeam();
- // if( pAutoTeam !=null)
- // pAutoTeam.OnPrtcAutoTeamSetGoalRe((AutoTeamSetGoal_Re)protocol);
- }
- break;
-
- default:
- _logger.Log(LogType.Warning, $"Received unhandled protocol type: {protocol.GetPType()}");
- break;
- }
- }
-
- private void HandleServerDataSend(gamedatasend protocol)
- {
- int lenghtHeader = Marshal.SizeOf();
- var pDataBuf = new byte[protocol.Data.ByteArray.Length - lenghtHeader];
- var byteArrHeader = new byte[lenghtHeader];
- long dwDataSize = protocol.Data.Size;
-
- if (dwDataSize < Marshal.SizeOf())
- {
- _logger.Error($"### GameDataSend: size invalid {dwDataSize}");
- return;
- }
-
- dwDataSize -= Marshal.SizeOf(); // subtract the header size (ushort)
- for (int i = 0; i < protocol.Data.ByteArray.Length; i++)
- {
- if (i < lenghtHeader)
- {
- byteArrHeader[i] = protocol.Data.ByteArray[i];
- }
- else
- {
- pDataBuf[i - lenghtHeader] = protocol.Data.ByteArray[i];
- }
- }
-
- var pCmdHeader = BitConverter.ToUInt16(byteArrHeader);
- //sss
-#if UNITY_EDITOR
- if (isDebug)
- {
- BMLogger.LogError($"### GameDataSend: CMDID {pCmdHeader}");
- }
-#endif
- int iHostID = _selectedRole.roleid;
- switch (pCmdHeader)
- {
- case CommandID.PLAYER_INFO_2:
- case CommandID.PLAYER_INFO_3:
- case CommandID.PLAYER_INFO_4:
- case CommandID.PLAYER_INFO_2_LIST:
- case CommandID.PLAYER_INFO_3_LIST:
- case CommandID.PLAYER_INFO_23_LIST:
-
- break;
-
- case CommandID.PLAYER_INFO_1:
- case CommandID.PLAYER_ENTER_WORLD:
- case CommandID.PLAYER_ENTER_SLICE:
- case CommandID.PLAYER_INFO_1_LIST:
- case CommandID.PLAYER_INFO_00:
- case CommandID.SELF_INFO_1:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERINFO, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf,
- pCmdHeader, iHostID);
- break;
- case CommandID.OBJECT_MOVE:
- int lenghtDataType = Marshal.SizeOf();
- byte[] arrByteData = GetBytes(pDataBuf, lenghtDataType, 0);
- int idObjMove = BitConverter.ToInt32(arrByteData);
- if (ISPLAYERID(idObjMove))
- {
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERMOVE, (int)MANAGER_INDEX.MAN_PLAYER, -1,
- pDataBuf, pCmdHeader, iHostID);
- }
- else if (ISNPCID(idObjMove))
- {
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCMOVE, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf,
- pCmdHeader);
- }
-
- break;
- case CommandID.OBJECT_STOP_MOVE:
- {
- int id1 = GPDataTypeHelper.FromBytes(pDataBuf);
-
- if (ISPLAYERID(id1))
- {
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERSTOPMOVE, (int)MANAGER_INDEX.MAN_PLAYER, -1,
- pDataBuf, pCmdHeader);
- }
- else if (ISNPCID(id1))
- {
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCSTOPMOVE, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf,
- pCmdHeader);
- }
-
- break;
- }
- case CommandID.OBJECT_LEAVE_SLICE:
- {
- int id = GPDataTypeHelper.FromBytes(pDataBuf);
- if (ISPLAYERID(id))
- {
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERRUNOUT, (int)MANAGER_INDEX.MAN_PLAYER, -1,
- pDataBuf, pCmdHeader);
- }
- else if (ISNPCID(id))
- {
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCRUNOUT, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf,
- pCmdHeader);
- }
-
- break;
- }
- case CommandID.OWN_IVTR_DATA:
- case CommandID.OWN_IVTR_DETAIL_DATA:
- case CommandID.GET_OWN_MONEY:
- case CommandID.CHANGE_IVTR_SIZE:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_IVTRINFO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader, iHostID);
- break;
- case CommandID.EXG_IVTR_ITEM:
- case CommandID.MOVE_IVTR_ITEM:
- case CommandID.PLAYER_DROP_ITEM:
- case CommandID.EXG_EQUIP_ITEM:
- case CommandID.EQUIP_ITEM:
- case CommandID.MOVE_EQUIP_ITEM:
- case CommandID.UNFREEZE_IVTR_SLOT:
- case CommandID.PLAYER_EQUIP_TRASHBOX_ITEM:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_ITEMOPERATION, (int)MANAGER_INDEX.MAN_PLAYER, 0,
- pDataBuf, pCmdHeader);
- break;
- case CommandID.PLAYER_CASH:
- {
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_IVTRINFO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader, iHostID);
- break;
- }
- case CommandID.MATTER_INFO_LIST:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_MM_MATTERINFO, (int)MANAGER_INDEX.MAN_MATTER, 0, pDataBuf,
- pCmdHeader);
- break;
- case CommandID.MATTER_ENTER_WORLD:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_MM_MATTERENTWORLD, (int)MANAGER_INDEX.MAN_MATTER, 0,
- pDataBuf, pCmdHeader);
- break;
- case CommandID.PICKUP_ITEM:
- case CommandID.HOST_OBTAIN_ITEM:
- case CommandID.PRODUCE_ONCE:
- case CommandID.TASK_DELIVER_ITEM:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_PICKUPITEM, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader);
- break;
- case CommandID.MATTER_PICKUP:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PICKUPMATTER, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- break;
- case CommandID.PICKUP_MONEY:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_PICKUPMONEY, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader);
- break;
- case CommandID.HOST_CORRECT_POS:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CORRECTPOS, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader, iHostID);
- break;
- case CommandID.OWN_ITEM_INFO:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_OWNITEMINFO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader, iHostID);
- break;
- case CommandID.PLAYER_DIED:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERDIED, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- break;
- case CommandID.HOST_DIED:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_DIED, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.PLAYER_REVIVE:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERREVIVE, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- break;
- case CommandID.NOTIFY_HOSTPOS:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_GOTO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.NPC_ENTER_SLICE:
- case CommandID.NPC_INFO_LIST:
- case CommandID.NPC_INFO_00:
- case CommandID.NPC_ENTER_WORLD:
- case CommandID.NPC_VISIBLE_TID_NOTIFY:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCINFO, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf,
- pCmdHeader, dwDataSize);
- break;
- case CommandID.TASK_DATA:
- case CommandID.TASK_VAR_DATA:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TASKDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader, dwDataSize);
- break;
- case CommandID.BE_HURT:
- case CommandID.HURT_RESULT:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_HURTRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader);
- break;
- case CommandID.OBJECT_ATTACK_RESULT:
- //int id = GPDataTypeHelper.FromBytes(pDataBuf);
- cmd_object_atk_result pCmdAtk = GPDataTypeHelper.FromBytes(pDataBuf);
- //BMLogger.LogError($"OBJECT_ATTACK_RESULT: npc ? " + ISNPCID(id));
-
- if (ISPLAYERID(pCmdAtk.attacker_id))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERATKRESULT, MANAGER_INDEX.MAN_PLAYER, -1,
- pDataBuf, pCmdHeader);
- else if (ISNPCID(pCmdAtk.attacker_id))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCATKRESULT, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.HOST_ATTACKRESULT:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_ATKRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader);
- break;
- case CommandID.HOST_ATTACKED:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_ATTACKED, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader);
- break;
-
- case CommandID.ERROR_MESSAGE:
- {
- int errRaw = BitConverter.ToInt32(pDataBuf, 0);
- // Note: _logger may be configured as a file logger via SetLogPath(), so also log to console for visibility.
- _logger.Info($"### GameDataSend: ERROR_MESSAGE: {errRaw}");
-#if UNITY_EDITOR
- BMLogger.LogError($"### GameDataSend: ERROR_MESSAGE: {errRaw}");
-#endif
- cmd_error_msg pCmd = GPDataTypeHelper.FromBytes(pDataBuf);
-#if UNITY_EDITOR
- BMLogger.LogError($"### GameDataSend: ERROR_MESSAGE parsed iMessage={pCmd.iMessage}");
-#endif
-
- if (pCmd.iMessage != 0)
- {
- // string szMsg = m_ErrorMsgs.GetWideString(pCmd.iMessage);
- // if (string.IsNullOrEmpty(szMsg))
- // BMLogger.LogError("SERVER - unknown error !");
- //else if (pCmd.iMessage != 2)
- //g_pGame.GetGameRun().AddChatMessage(szMsg, GP_CHAT_MISC);
- }
-
- if (pCmd.iMessage == 2)
- {
- // Attack target is too far
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TARGETISFAR, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- }
- else if (pCmd.iMessage == 20)
- {
- // Failed to cast skill
- //pGameRun.PostMessage(MSG_PM_CASTSKILL, MAN_PLAYER, 0, (DWORD)pDataBuf, pCmdHeader.cmd);
- }
- else if (pCmd.iMessage == 133 || pCmd.iMessage == 134)
- {
- // deal failed
- //pGameRun.PostMessage(MSG_HST_BUY_SELL_FAIL, MAN_PLAYER, 0, (DWORD)pDataBuf, pCmdHeader.cmd);
- }
- else if (pCmd.iMessage == 158)
- {
- // µ±Ç°»ãÂʲ»¶Ô£¬ÖØÐÂÈ¡»ãÂÊ
- //c2s_CmdGetCashMoneyRate();
- }
- else if (pCmd.iMessage == 108 /*&& pGameRun.GetHostPlayer().IsInKingService()*/)
- {
- /* CECGameUIMan* pGameUI = pGameRun.GetUIManager().GetInGameUIMan();
- if (pGameUI)
- pGameUI.EndNPCService();*/
- }
- else if
- (pCmd.iMessage == 108 /*&& pGameRun.GetHostPlayer().GetOfflineShopCtrl().GetNPCSevFlag() != COfflineShopCtrl::NPCSEV_NULL*/
- )
- {
- /* CECGameUIMan* pGameUI = pGameRun.GetUIManager().GetInGameUIMan();
- if (pGameUI)
- pGameUI.EndNPCService();*/
- }
- else if (pCmd.iMessage == 175)
- {
- //c2s_CmdQueryParallelWorld();
- }
- else if (pCmd.iMessage == 6)
- {
- //AP_ActionEvent(AP_EVENT_CANNOTPICKUP);
- }
-
- break;
- }
- case CommandID.SELECT_TARGET:
- case CommandID.UNSELECT:
-
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_SELTARGET, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader);
- break;
- case CommandID.NPC_DIED:
- case CommandID.NPC_DIED2:
-
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCDIED, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.OBJECT_DISAPPEAR:
- {
- int lenghtDataType1 = Marshal.SizeOf();
- byte[] arrByteData1 = GetBytes(pDataBuf, lenghtDataType1, 0);
- int objectId = BitConverter.ToInt32(arrByteData1);
- if (ISPLAYERID(objectId))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERDISAPPEAR, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- else if (ISNPCID(objectId))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCDISAPPEAR, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
- else if (ISMATTERID(objectId))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_MM_MATTERDISAPPEAR, MANAGER_INDEX.MAN_MATTER, 0, pDataBuf, pCmdHeader);
-
- break;
- }
- case CommandID.SELF_INFO_00:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_INFO00, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
- pCmdHeader);
- break;
- case CommandID.NPC_GREETING:
- {
- // If this greeting is from the skill-learn NPC, record it (C++ skill dialog relies on this).
- try
- {
- cmd_npc_greeting greet = GPDataTypeHelper.FromBytes(pDataBuf);
- CECHostSkillModel.Instance.OnNpcGreeting(greet.idObject);
- }
- catch (Exception ex)
- {
- _logger.Log(LogType.Warning, $"Failed to parse NPC_GREETING payload: {ex.Message}");
- }
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_NPCGREETING, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- }
- case CommandID.ACTIVATE_WAYPOINT:
- case CommandID.WAYPOINT_LIST:
-
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_WAYPOINT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.SERVER_TIME:
- {
- cmd_server_time pcmd_server_time = GPDataTypeHelper.FromBytes(pDataBuf);
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_SERVERTIME, -1, 0, pcmd_server_time.time, pcmd_server_time.timebias);
- break;
- }
- case CommandID.SCENE_SERVICE_NPC_LIST:
- {
- CECHostSkillModel.Instance.RecvNPCServiceList(protocol.Data);
- break;
- }
- case CommandID.SKILL_DATA:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_SKILLDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.OBJECT_CAST_SKILL:
- case CommandID.OBJECT_CAST_INSTANT_SKILL:
- case CommandID.OBJECT_CAST_POS_SKILL:
- {
- cmd_object_cast_skill pCmd2 = GPDataTypeHelper.FromBytes(pDataBuf,true);
- if (ISPLAYERID(pCmd2.caster))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_CASTSKILL, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- else if (ISNPCID(pCmd2.caster))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCCASTSKILL, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
-
- break;
- }
- case CommandID.LEVEL_UP:
- {
- cmd_level_up pCmdLevelUp = GPDataTypeHelper.FromBytes(pDataBuf); ;
- if (ISPLAYERID(pCmdLevelUp.id))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERLEVELUP, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- else if (ISNPCID(pCmdLevelUp.id))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCLEVELUP, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
- break;
- }
- case CommandID.HOST_START_ATTACK:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_STARTATTACK, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
- break;
- case CommandID.HOST_STOPATTACK:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_STOPATTACK, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
- break;
- case CommandID.HOST_SKILL_ATTACK_RESULT:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_SKILLRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.CHANGE_FACE_START:
- case CommandID.CHANGE_FACE_END:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CHANGEFACE, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
- break;
- case CommandID.ENCHANT_RESULT:
- cmd_enchant_result pCmd3 = GPDataTypeHelper.FromBytes(pDataBuf);
- if (ISPLAYERID(pCmd3.caster))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_ENCHANTRESULT, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- else if (ISNPCID(pCmd3.caster))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_ENCHANTRESULT, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.SKILL_PERFORM:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_CASTSKILL, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.SET_COOLDOWN:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_SETCOOLTIME, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.COMBO_SKILL_PREPARE:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_COMBO_SKILL_PREPARE, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
- break;
- case CommandID.PLAYER_EXT_PROP_BASE:
- case CommandID.PLAYER_EXT_PROP_MOVE:
- case CommandID.PLAYER_EXT_PROP_ATK:
- case CommandID.PLAYER_EXT_PROP_DEF:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYEREXTPROP, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- break;
- case CommandID.OWN_EXT_PROP:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_OWNEXTPROP, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.OBJECT_DO_EMOTE:
- case CommandID.OBJECT_EMOTE_RESTORE:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERDOEMOTE, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- break;
- case CommandID.OUT_OF_SIGHT_LIST:
- {
- cmd_out_of_sight_list pCmd5 = default;
- pCmd5.uCount = GPDataTypeHelper.FromBytes(pDataBuf);
- int offset2 = sizeof(uint);
- pCmd5.idList = new int[pCmd5.uCount];
- for (int i = 0; i < pCmd5.uCount; i++)
- {
- pCmd5.idList[i] = GPDataTypeHelper.FromBytes(pDataBuf, offset2);
- offset2 += 4;//sizeof int;
- }
-
- for (uint n = 0; n < pCmd5.uCount; n++)
- {
- if (ISPLAYERID(pCmd5.idList[n]))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYEROUTOFVIEW, MANAGER_INDEX.MAN_PLAYER, -1, pCmd5.idList[n], pCmdHeader);
- else if (ISNPCID(pCmd5.idList[n]))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCOUTOFVIEW, MANAGER_INDEX.MAN_NPC, 0, pCmd5.idList[n], pCmdHeader);
- else if (ISMATTERID(pCmd5.idList[n]))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_MM_MATTEROUTOFVIEW, MANAGER_INDEX.MAN_MATTER, 0, pCmd5.idList[n], pCmdHeader);
- }
-
- break;
- }
- case CommandID.PLAYER_GATHER_START:
- case CommandID.PLAYER_GATHER_STOP:
- case CommandID.MINE_GATHERED:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERGATHER, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- break;
- case CommandID.COOLTIME_DATA:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_COOLTIMEDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.OBJECT_TAKEOFF:
- {
- cmd_object_takeoff pCmdTakeOff = GPDataTypeHelper.FromBytes((byte[])pDataBuf);
- if (ISPLAYERID(pCmdTakeOff.object_id))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERFLY, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- break;
- }
- case CommandID.OBJECT_LANDING:
- {
- cmd_object_landing pCmdLanding = GPDataTypeHelper.FromBytes((byte[])pDataBuf);
- if (ISPLAYERID(pCmdLanding.object_id))
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERFLY, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
- break;
- }
- case CommandID.HOST_RUSH_FLY:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERFLY, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.FLYSWORD_TIME:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_FLYSWORDTIME, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.PRODUCE_START:
- case CommandID.PRODUCE_END:
- case CommandID.PRODUCE_NULL:
- // Post MSG_HST_PRODUCEITEM message with command ID as parameter (matches C++ behavior)
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_PRODUCEITEM, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
-
-
- case CommandID.LEARN_SKILL:
- BMLogger.LogError("### GameDataSend: LEARN_SKILL");
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_LEARNSKILL, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- case CommandID.EMBED_ITEM:
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_EMBEDITEM, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
- break;
- default:
-#if UNITY_EDITOR
- if (isDebug)
- {
- BMLogger.LogError($"### GameDataSend: Unhandled CMDID {pCmdHeader} (payloadBytes={pDataBuf?.Length ?? 0})");
- }
-#endif
- break;
- }
- }
-
-
- private void HandleSelectRoleResponse(SelectRole_Re protocol)
- {
- _logger.Info($"Select role response {protocol.result}");
- _selectRoleCallback?.Invoke(_selectedRole);
- }
-
- private void OnErrorOccurred(string errorMessage)
- {
- _logger.Log(LogType.Error, $"Network Error: {errorMessage}");
- FailLoginInProgress(errorMessage);
- FailRoleListInProgress(errorMessage);
- }
-
- private void OnDisconnected()
- {
- _logger.Log(LogType.Info, "Disconnected from server.");
- _currentUserId = -1;
- FailLoginInProgress("Disconnected");
- FailRoleListInProgress("Disconnected");
- // Clear command cache
- m_CmdCache.RemoveAllCmds();
- }
-
- // --- Protocol Handling Logic ---
-
- private void HandleChallenge(challenge challenge)
- {
- if (_loginCallback == null || string.IsNullOrEmpty(_username))
- {
- _logger.Log(LogType.Warning, "Received Challenge but not expecting it or username not set.");
- return;
- }
-
- _logger.Log(LogType.Info, "Handling Challenge...");
-
- response response = new response();
- byte[] usernameBytes = Encoding.ASCII.GetBytes(_username);
- byte[] passwordBytes = Encoding.ASCII.GetBytes(_password);
- response.identity.Replace(usernameBytes);
- response.Setup(new Octets(usernameBytes), new Octets(passwordBytes), challenge.nonce);
-
- uint clientId = 0xffffffff;
- byte[] clientIdBytes = BitConverter.GetBytes(clientId);
- response.cli_fingerprint.Replace(clientIdBytes);
- response.use_token = 0;
-
- _networkManager.SetNonce(response.response_data);
- SendProtocol(response);
- _logger.Log(LogType.Info, "Sent Response.");
- }
-
- private void HandleKeyExchange(KeyExchange keyExchange)
- {
- if (_loginCallback == null || string.IsNullOrEmpty(_username))
- {
- _logger.Log(LogType.Warning, "Received KeyExchange but not expecting it.");
- return;
- }
-
- _logger.Log(LogType.Info, "Handling KeyExchange...");
- keyExchange.Setup(_networkManager, _username);
- keyExchange.Blkickuser = 1;
- SendProtocol(keyExchange);
- _logger.Log(LogType.Info, "Sent KeyExchange acknowledgment/response.");
- }
-
- private void HandleOnlineAnnounce(onlineannounce announce)
- {
- if (_loginCallback == null)
- {
- _logger.Log(LogType.Warning, "Received OnlineAnnounce but not expecting it.");
- return;
- }
-
- _logger.Log(LogType.Info, $"Login successful! UserID: {announce.Userid}, LocalSID: {announce.Localsid}");
- _currentUserId = announce.Userid;
-
- var callback = _loginCallback;
- _loginCallback = null;
- callback?.Invoke(true);
- }
-
- private void RequestRoleListInternal(int lastHandle = -1)
- {
- rolelist rolelistRequest = new rolelist();
- rolelistRequest.Userid = _currentUserId;
- rolelistRequest.Localsid = 0;
- rolelistRequest.Handle = lastHandle;
-
- SendProtocol(rolelistRequest);
-
-
- //gamedatasend gamedatasendRequest = new gamedatasend();
- //gamedatasendRequest.Data = C2SCommandFactory.CreatePlayerMove();
-
- //SendProtocol(gamedatasendRequest);
- }
-
- private void HandleRoleListResponse(RoleListResponse response)
- {
- if (_roleListCallback == null || _accumulatedRoles == null)
- {
- _logger.Log(LogType.Warning, "Received RoleListResponse but not expecting it.");
- return;
- }
-
- _logger.Log(LogType.Debug,
- $"Received RoleListResponse. Handle: {response.handle}, Result: {response.result}, Count: {response.rolelist.Count}");
-
- if (response.result == 0)
- {
- _accumulatedRoles.AddRange(response.rolelist);
-
- foreach (var role in response.rolelist)
- {
- try
- {
- string roleName = Encoding.UTF8.GetString(role.name.ByteArray, 0, role.name.Length);
- _logger.Log(LogType.Info, $" - Role ID: {role.roleid}, Name: {roleName}, Level: {role.level}");
- }
- catch (Exception ex)
- {
- _logger.Log(LogType.Error, $" - Error decoding role name: {ex.Message}");
- _logger.LogException(ex);
- }
- }
-
- if (response.handle != -1)
- {
- _logger.Log(LogType.Debug, $"Requesting next batch of roles (handle: {response.handle})...");
- RequestRoleListInternal(response.handle);
- }
- else
- {
- _logger.Log(LogType.Info, $"Finished fetching roles. Total count: {_accumulatedRoles.Count}");
- var callback = _roleListCallback;
- var result = _accumulatedRoles;
- _roleListCallback = null;
- _accumulatedRoles = null;
- callback?.Invoke(result);
- }
- }
- else
- {
- _logger.Log(LogType.Error, $"Role list retrieval failed. Result code: {response.result}");
- FailRoleListInProgress($"Role list retrieval failed (Result: {response.result})");
- }
- }
-
- // --- Helper methods for failure handling ---
- private void FailLoginInProgress(string reason)
- {
- if (_loginCallback != null)
- {
- _logger.Log(LogType.Error, $"Login failed: {reason}");
- var callback = _loginCallback;
- _loginCallback = null;
- callback?.Invoke(false);
- }
- }
-
- private void FailRoleListInProgress(string reason)
- {
- if (_roleListCallback != null)
- {
- _logger.Log(LogType.Error, $"Role list retrieval failed: {reason}");
- var callback = _roleListCallback;
- _roleListCallback = null;
- _accumulatedRoles = null;
- callback?.Invoke(null);
- }
- }
-
- // --- IDisposable Implementation ---
- private bool disposedValue = false;
-
- protected virtual void Dispose(bool disposing)
- {
- if (!disposedValue)
- {
- if (disposing)
- {
- if (_networkManager != null)
- {
- _logger.Log(LogType.Info, "[DUCK] Disposing GameSession and disconnecting...");
- _networkManager.ProtocolReceived -= OnProtocolReceived;
- _networkManager.ErrorOccurred -= OnErrorOccurred;
- _networkManager.Disconnected -= OnDisconnected;
- _networkManager.Disconnect();
- _networkManager.Dispose();
- _networkManager = null;
- }
-
- _loginCallback = null;
- _roleListCallback = null;
- _accumulatedRoles = null;
- }
-
- disposedValue = true;
- }
- }
-
- public void Dispose()
- {
- Dispose(true);
- // GC.SuppressFinalize(this);
- }
-
- public bool ISPLAYERID(int id)
- {
- return id != 0 && (id & 0x80000000) == 0;
- }
- public bool ISNPCID(int id) => ((id & 0x80000000) != 0) && ((id & 0x40000000) == 0);
- public bool ISMATTERID(int id) => ((id) & 0xC0000000) == 0xC0000000;
- private byte[] GetBytes(byte[] bytes, int length, int index)
- {
- byte[] arrByteData = new byte[length];
- for (int i = 0; i < length; i++)
- {
- arrByteData[i] = bytes[i + index];
- }
-
- return arrByteData;
- }
-
- public void c2s_CmdPlayerMove(in Vector3 vCurPos, in Vector3 vDest,
- int iTime, float fSpeed, int iMoveMode, ushort wStamp)
- {
- gamedatasend gamedatasend = new gamedatasend();
-
- gamedatasend.Data =
- C2SCommandFactory.CreatePlayerMove(vCurPos, vDest, (ushort)iTime, fSpeed, (byte)iMoveMode, wStamp);
- SendProtocol(gamedatasend);
- }
- public void c2s_SendCmdCastSkill(int idSkill, byte byPVPMask, int iNumTarget, int[] aTargets)
- {
- gamedatasend gamedatasend = new gamedatasend();
-
- gamedatasend.Data =
- C2SCommandFactory.CreatePlayerCastSkill(idSkill, byPVPMask, iNumTarget, aTargets);
-
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdCastInstantSkill(int idSkill, byte byPVPMask, int iNumTarget, int[] aTargets)
- {
- gamedatasend gamedatasend = new gamedatasend();
-
- gamedatasend.Data =
- C2SCommandFactory.CreatePlayerCastInstantSkill(idSkill, byPVPMask, iNumTarget, aTargets);
-
- SendProtocol(gamedatasend);
- }
-
- public void c2s_CmdCastPosSkill(int idSkill, Vector3 vDest, byte byPVPMask, int iNumTarget, int aTargets)
- {
- gamedatasend gamedatasend = new gamedatasend();
-
- gamedatasend.Data =
- C2SCommandFactory.CreatePlayerCastPosSkill(idSkill, vDest, byPVPMask, iNumTarget, aTargets);
-
- SendProtocol(gamedatasend);
- }
- public void c2s_SendCmdContinueAction()
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.CONTINUE_ACTION);
- SendProtocol(gamedatasend);
- }
- public void c2s_SendCmdStopMove(in Vector3 vDest, float fSpeed, int iMoveMode,
- byte byDir, ushort wStamp, int iTime)
- {
- gamedatasend gamedatasend = new gamedatasend();
-
- gamedatasend.Data =
- C2SCommandFactory.CreatePlayerStop(vDest, fSpeed, (byte)iMoveMode, byDir, wStamp, (ushort)iTime);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_CmdSendEnterPKPrecinctint()
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.ENTER_PK_PROTECTED);
- SendProtocol(gamedatasend);
- }
- public void SendChatData(byte cChannel, in string szMsg, int iPack, int iSlot)
- {
- publicchat publicChat = new publicchat();
- publicChat.Channel = cChannel;
- publicChat.Roleid = m_iCharID;
-
- byte[] unicodeBytes = Encoding.Unicode.GetBytes(szMsg);
- publicChat.Msg.Replace(unicodeBytes);
- _logger.Log(LogType.Warning, $"HoangDev : publicChat {publicChat}");
- SendProtocol(publicChat);
- }
- public void LoadConfigData()
- {
- getuiconfig p = new getuiconfig();
- p.Roleid = m_iCharID;
- SendProtocol(p);
- }
- private void SetCharacterID(int iCharID)
- {
- m_iCharID = iCharID;
- }
-
- private void OnPrtcChatMessage(Protocol pProtocol, bool bCalledagain)
- {
- chatmessage p = (chatmessage)pProtocol;
-
- string strTemp = System.Text.Encoding.Unicode.GetString(p.Msg.ToArray(), 0, p.Msg.Length);
-
- _logger.Log(LogType.Warning, $"HoangDev : OnPrtcChatMessage :{strTemp}");
- EventBus.Publish(new ChatMessageEvent(strTemp));
- }
-
- public struct ChatMessageEvent
- {
- public string context;
-
- public ChatMessageEvent(string context)
- {
- this.context = context;
- }
- }
- public void OnPrtcGetConfigRe(Protocol pProtocol)
- {
- getuiconfig_re p = (getuiconfig_re)pProtocol;
- if (p.Result != (int)ErrCode.ERR_SUCCESS)
- BMLogger.LogError("CECGameSession::OnPrtcGetConfigRe, link return error code of " + p.Result);
- else
- {
- if (!CECGameRun.Instance.LoadConfigsFromServer(p.UiConfig.RawBuffer, p.UiConfig.Size))
- {
- // if load failed then use current setting directly
- //TODO : fix later
- EC_Game.GetConfigs().ApplyUserSetting();
- }
-
- // Now, Get config data request is sent after all host initial data ready.
- // so when we receive this reply, we can do some last work before game
- // really starts. Maybe it's not the best place to do these work, but
- // now we do it here.
- // Enalbe game UI
- CECGameUIMan pGameUI = (CECGameUIMan)EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
- if (pGameUI != null)
- {
- pGameUI.EnableUI(true);
-
- // Get referral name for adding friend or other display
- //TODO: a Hung lam phan select role info di
- /* RoleInfo info = EC_Game.GetGameRun().GetSelectedRoleInfo();
- if (info.referrer_role > 0)
- GetPlayerBriefInfo(1, info.referrer_role, 2);*/
- }
-
- CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
- pHost.OnAllInitDataReady();
-
- /* if (pHost.IsGM())
- {
- CDlgCountryMap pDlgCountryMap = (CDlgCountryMap)pGameUI.GetDialog("Win_CountryMap");
- pDlgCountryMap.GetConfig();
- }
-
- g_pGame.GetConfigs().ApplyOptimizeSetting();
-
- if (g_pGame.GetConfigs().IsMiniClient())
- CECMCDownload::GetInstance().SendGetDownloadOK();*/
- }
- }
- private void OnPrtcPlayerBaseInfoRe(Protocol pProtocol)
- {
- playerbaseinfo_re p = (playerbaseinfo_re)pProtocol;
- BMLogger.Log($"OnPrtcPlayerBaseInfoRe: {p.Roleid} {p.Player.cls} {p.Player.gender}");
- EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERBASEINFO, MANAGER_INDEX.MAN_PLAYER, -1, p);
- }
-
- public void c2s_CmdNPCSevAcceptTask(int idTask, int idStorage, int idRefreshItem)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateCmdNPCSevAcceptTask(idTask, idStorage, idRefreshItem);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdGetAllData(bool byPack, bool byEquip, bool byTask)
- {
- gamedatasend gamedatasend = new gamedatasend();
-
- gamedatasend.Data = C2SCommandFactory.CreateGetAllDataCommand(byPack, byEquip, byTask);
- _logger.Log(LogType.Warning, $"[Dat]- SendCmdGetAllData {byPack},{byEquip},{byTask}");
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdNPCSevHello(int nid)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNPCSevHelloDataCommand(nid);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_CmdNormalAttack(byte byPVPMask)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNormalAttackDataCmd(byPVPMask);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdCancelAction()
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(CSNetwork.C2SCommand.CommandID.CANCEL_ACTION);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_CmdUnselect()
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(CSNetwork.C2SCommand.CommandID.UNSELECT);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdSelectTarget(int idTarget)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateSelectTarget(idTarget);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdNPCSevWaypoint()
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNPCSevWaypointCmd(NPC_service_type.GP_NPCSEV_WAYPOINT, 0);
- SendProtocol(gamedatasend);
- }
- public void c2s_SendCmdNPCSevMakeItem(int idSkill, int idItem, uint dwCount)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNPCSevMakeItemCmd(idSkill, idItem, dwCount);
- SendProtocol(gamedatasend);
- }
- public void GetRoleBaseInfo(int iNumRole, List aRoleIDs)
- {
- int iNumLimit = 128;
- playerbaseinfo p = null;
- int iCount = 0;
-
- while (iCount < iNumRole)
- {
- p = new();
- p.Roleid = _selectedRole.roleid;
-
- int iNumSend = iNumLimit;
- if (iCount + iNumLimit > iNumRole)
- iNumSend = iNumRole - iCount;
-
- if (iNumSend > 0)
- {
- p.playerList = new();
- for (int i = 0; i < iNumSend; i++)
- p.playerList.Add(aRoleIDs[iCount + i]);
-
- SendProtocol(p);
- }
-
-
- iCount += iNumSend;
- }
- }
-
- public void c2s_SendCmdGetOtherEquip(int iNumID, List aIDs)
- {
- // int iNumLimit = 250;
- // int iCount = 0;
-
- // while (iCount < iNumID)
- // {
- // int iNumSend = iNumLimit;
- // if (iCount + iNumLimit > iNumID)
- // iNumSend = iNumID - iCount;
-
- // if (iNumSend > 0)
- // {
- // }
- // }
- }
-
- public void c2s_SendCmdNPCSevAcceptTask(int idTask, int idStorage, int idRefreshItem)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateCmdNPCSevAcceptTask(
- idTask,
- idStorage,
- idRefreshItem);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdNPCSevReturnTask(int idTask, int iChoice)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNPCSevReturnTaskCmd(
- idTask,
- iChoice);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdNPCSevTaskMatter(int idTask)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNPCSevTaskMatterCmd(idTask);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdNPCSevLearnSkill(int idSkill)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNPCSevLearnSkillCmd(idSkill);
- BMLogger.LogError("HoangDev : c2s_SendCmdNPCSevLearnSkill gamedatasend.Data : " + gamedatasend.Data.Size);
- BMLogger.LogError("HoangDev : c2s_SendCmdNPCSevLearnSkill idSkill : " + idSkill);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdNPCSevBuy(int itemNum, C2SCommand.npc_trade_item[] items)
- {
- if (itemNum <= 0 || items == null || items.Length < itemNum)
- return;
-
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNPCSevBuyCmd(itemNum, items);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdNPCSevSell(int itemNum, C2SCommand.npc_sell_item[] items)
- {
- if (itemNum <= 0 || items == null || items.Length < itemNum)
- return;
-
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNPCSevSellCmd(itemNum, items);
- SendProtocol(gamedatasend);
- }
-
- public void GetRoleCustomizeData(int iNumRole, List aRoleIDs)
- {
- if (iNumRole <= 0 || aRoleIDs == null || aRoleIDs.Count == 0) return;
-
- int iNumLimit = 240;
- int iCount = 0;
-
- while (iCount < iNumRole)
- {
- getcustomdata p = new();
- p.Roleid = _selectedRole.roleid;
-
- int iNumSend = iNumLimit;
- if (iCount + iNumLimit > iNumRole)
- iNumSend = iNumRole - iCount;
-
- for (int i = 0; i < iNumSend; i++)
- p.playerlist.Add(aRoleIDs[iCount + i]);
-
- SendProtocol(p);
-
- iCount += iNumSend;
- }
- }
- public void c2s_SendCmdEmoteAction(uint wPose)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateEmoteActionCmd((int)wPose);
- SendProtocol(gamedatasend);
- }
- public void c2s_SendCmdTaskNotify(byte[] pData, uint dwDataSize)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateTaskNotifyCmd( pData, dwDataSize);
- BMLogger.Log($"[MH Task] c2s_SendCmdTaskNotify Command ID : {pData[0]} Size: {dwDataSize}");
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdStandUp()
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.STAND_UP);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdAutoTeamSetGoal(int type, int goal_id, int op)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateAutoTeamSetGoalCommand(type,goal_id, op);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_CmdGoto(float x, float y, float z)
- {
- c2s_SendCmdGoto(x, y, z);
- }
-
- // Send C2S::GOTO command data
- void c2s_SendCmdGoto(float x, float y, float z)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateGoToCommed( x, y, z);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdUseItem(byte byPackage, byte bySlot, int tid, byte byCount)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateUseItemCmd(byPackage, bySlot, tid, byCount);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdGetExtProps()
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.GET_EXT_PROP);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdGivePresent(int roleid, int mail_id, int goods_id, int goods_index, int goods_slot)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateGivePresentCmd(roleid, mail_id, goods_id, goods_index, goods_slot);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdEnterSanctuary(int id)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateEnterSanctuaryCmd(id);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdEnterInstance(int iTransIdx, int idInst)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateEnterInstanceCmd(iTransIdx, idInst);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdActiveRushFly(bool bActive)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateActiveRushFlyCmd(bActive);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdPetCtrl(int idTarget, int cmd, byte[] pParamBuf, int iParamLen)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreatePetCtrlCmd(idTarget, cmd, pParamBuf, iParamLen);
- SendProtocol(gamedatasend);
- }
-
- public void c2s_SendCmdQueryFactionPVPInfo(int faction_id)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateQueryFactionPVPInfo(faction_id);
- SendProtocol(gamedatasend);
- }
- public void c2s_SendCmdNPCSevEmbed(ushort wStoneIdx, ushort wEquipIdx, int tidStone, int tidEquip)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateNPCSevEmbedCmd(wStoneIdx, wEquipIdx, tidStone, tidEquip);
- SendProtocol(gamedatasend);
- }
- public void c2s_SendCmdGetItemInfo(byte byPackage, int bySlot)
- {
- gamedatasend gamedatasend = new gamedatasend();
- gamedatasend.Data = C2SCommandFactory.CreateGetItemInfoCmd(byPackage, bySlot);
- SendProtocol(gamedatasend);
- }
- }
+using BrewMonster;
+using BrewMonster.Common;
+using BrewMonster.Managers;
+using BrewMonster.Network;
+using BrewMonster.Scripts.Skills;
+using BrewMonster.UI;
+using CSNetwork.C2SCommand;
+using CSNetwork.GPDataType;
+using CSNetwork.Protocols;
+using CSNetwork.Protocols.RPCData;
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using UnityEngine;
+using CommandID = CSNetwork.GPDataType.CommandID;
+
+namespace CSNetwork
+{
+ public class GameSession : IDisposable
+ {
+ private static IPrefixedLogger
+ _logger = LoggerFactory.GetLogger(nameof(GameSession)); // Get class-specific logger
+
+ private NetworkManager _networkManager;
+ private string _host;
+ private int _port;
+ private string _username;
+ private string _password;
+ private int _currentUserId = -1; // To store the UserID after successful login
+ private uint _localsid = 0; // To store the LocalSID from onlineannounce
+ private int m_iCharID;
+ private int m_idLastSelTarget = 0; // ID of selected item last time
+
+ CECStringTab m_ErrorMsgs;
+
+ // State management for async operations and callbacks
+ private Action _loginCallback;
+ private Action> _roleListCallback;
+ private List _accumulatedRoles;
+ private Action _selectRoleCallback;
+ private Action _createRoleCallback;
+ private RoleInfo _selectedRole;
+ public bool IsConnected => _networkManager?.IsConnected ?? false;
+ public static SynchronizationContext Context;
+ private CECC2SCmdCache m_CmdCache; // C2S command cache
+#if UNITY_EDITOR
+ public bool isDebug;
+ public bool IsDebug
+ {
+ get => isDebug;
+ set => isDebug = value;
+ }
+#endif
+ public CECC2SCmdCache CmdCache { get => m_CmdCache; }
+
+
+ public GameSession()
+ {
+ _networkManager = new NetworkManager();
+ m_CmdCache = new CECC2SCmdCache();
+ _networkManager.ProtocolReceived += OnProtocolReceived;
+ _networkManager.ErrorOccurred += OnErrorOccurred;
+ _networkManager.Disconnected += OnDisconnected;
+ }
+
+ public void SetLogPath(string path)
+ {
+ LoggerFactory.SetFileLoggerImplementation(new FileLogger());
+ _logger = LoggerFactory.GetCustomLogger(path, nameof(GameSession) + GetHashCode(), LoggerType.File);
+ _networkManager.SetLogPath(path);
+ }
+
+ ///
+ /// Connects to the game server asynchronously.
+ ///
+ /// Server hostname or IP address.
+ /// Server port.
+ /// Task representing the asynchronous connect operation. Check IsConnected property or handle Disconnected event for status.
+ public async Task ConnectAsync(string host, int port)
+ {
+ if (IsConnected)
+ {
+ _logger.Log(LogType.Warning, "ConnectAsync called but already connected.");
+ return;
+ }
+
+ _host = host;
+ _port = port;
+ _logger.Log(LogType.Info, $"Attempting to connect to {_host}:{_port}...");
+ try
+ {
+ await _networkManager.ConnectAsync(_host, _port);
+ if (IsConnected)
+ {
+ _logger.Log(LogType.Info, "Connection established.");
+ }
+ else
+ {
+ _logger.Log(LogType.Warning,
+ "Connection failed after ConnectAsync completed (check NetworkManager logs/events).");
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.Log(LogType.Error, $"Connection exception: {ex.Message}");
+ _logger.LogException(ex);
+ OnDisconnected();
+ }
+ }
+
+
+ public void Disconnect()
+ {
+ _networkManager.Disconnect();
+ }
+
+ ///
+ /// Initiates the login process asynchronously.
+ ///
+ /// Account username.
+ /// Account password.
+ /// Action invoked with true on successful login (OnlineAnnounce received), false otherwise.
+ public void LoginAsync(string username, string password, Action callback)
+ {
+ if (!IsConnected)
+ {
+ _logger.Log(LogType.Warning, "LoginAsync called but not connected.");
+ callback?.Invoke(false);
+ return;
+ }
+
+ if (_loginCallback != null)
+ {
+ _logger.Log(LogType.Warning, "LoginAsync called while another login is already in progress.");
+ callback?.Invoke(false);
+ return;
+ }
+
+ _username = username;
+ _password = password;
+ _loginCallback = callback;
+ _currentUserId = -1; // Reset user ID
+
+ _logger.Log(LogType.Info, $"Initiating login for user '{_username}'...");
+ }
+
+ ///
+ /// Initiates fetching the role list asynchronously. Requires successful login.
+ ///
+ /// Action invoked with the complete list of roles, or null/empty list on failure.
+ public void GetRoleListAsync(Action> callback)
+ {
+ if (!IsConnected)
+ {
+ _logger.Log(LogType.Warning, "GetRoleListAsync called but not connected.");
+ callback?.Invoke(null);
+ return;
+ }
+
+ if (_currentUserId == -1)
+ {
+ _logger.Log(LogType.Warning, "GetRoleListAsync called but not logged in.");
+ callback?.Invoke(null);
+ return;
+ }
+
+ if (_roleListCallback != null)
+ {
+ _logger.Log(LogType.Warning,
+ "GetRoleListAsync called while another role list retrieval is already in progress.");
+ callback?.Invoke(null);
+ return;
+ }
+
+ _roleListCallback = callback;
+ _accumulatedRoles = new List();
+ _logger.Log(LogType.Info, "Requesting role list...");
+ RequestRoleListInternal();
+ }
+
+ public RoleInfo GetRoleInfo()
+ {
+ return _selectedRole;
+ }
+
+ public void SelectRoleAsync(RoleInfo role, Action callback)
+ {
+ _selectedRole = role;
+ _selectRoleCallback = callback;
+ SetCharacterID(role.roleid);
+ SendProtocol(new selectrole()
+ {
+ Roleid = role.roleid,
+ Flag = 0
+ });
+ }
+
+ public void CreateRoleAsync(RoleInfo roleInfo, Octets referId, Action callback)
+ {
+ if (!IsConnected)
+ {
+ callback?.Invoke(null);
+ return;
+ }
+
+ if (_currentUserId == -1)
+ {
+ callback?.Invoke(null);
+ return;
+ }
+
+ if (_createRoleCallback != null)
+ {
+ callback?.Invoke(null);
+ return;
+ }
+
+ _createRoleCallback = callback;
+
+ createrole createRoleProtocol = new createrole()
+ {
+ Userid = _currentUserId,
+ Localsid = _localsid,
+ Roleinfo = roleInfo,
+ Referid = referId ?? new Octets()
+ };
+
+ Debug.Log($"[GameSession] Creating role - UserID: {_currentUserId}, Localsid: {_localsid}, Profession: {roleInfo.occupation}, Gender: {roleInfo.gender}");
+ Debug.Log($"[GameSession] RoleInfo details - Name size: {roleInfo.name?.Size ?? 0}, Equipment count: {roleInfo.equipment?.Count ?? 0}, Custom data size: {roleInfo.custom_data?.Size ?? 0}, Race: {roleInfo.race}");
+
+ // Log first few bytes of custom_data for debugging
+ if (roleInfo.custom_data != null && roleInfo.custom_data.Size > 0)
+ {
+ byte[] customDataPreview = new byte[Math.Min(16, (int)roleInfo.custom_data.Size)];
+ Array.Copy(roleInfo.custom_data.ByteArray, 0, customDataPreview, 0, customDataPreview.Length);
+ string hexPreview = BitConverter.ToString(customDataPreview).Replace("-", " ");
+ Debug.Log($"[GameSession] Custom_data preview (first 16 bytes): {hexPreview}");
+ }
+
+ Debug.Log($"[GameSession] Sending createrole protocol (Type: {createRoleProtocol.Type})");
+ SendProtocol(createRoleProtocol);
+ }
+
+ ///
+ /// Helper method to create a new RoleInfo for character creation.
+ /// Matches C++ NewCharacterImpl behavior.
+ ///
+ public static RoleInfo CreateNewRoleInfo(string name, int profession, int gender)
+ {
+ RoleInfo roleInfo = new RoleInfo();
+
+ // Set basic info
+ roleInfo.occupation = (byte)profession;
+ roleInfo.gender = (byte)gender;
+ roleInfo.level = 1;
+ roleInfo.level2 = 0;
+ roleInfo.status = 0; // _ROLE_STATUS_NORMAL
+ roleInfo.delete_time = 0;
+ roleInfo.create_time = 0; // Server will set this
+ roleInfo.lastlogin_time = 0;
+ roleInfo.posx = 0.0f;
+ roleInfo.posy = 0.0f;
+ roleInfo.posz = 0.0f;
+ roleInfo.worldtag = 0; // Server will set this
+ roleInfo.referrer_role = 0;
+ roleInfo.cash_add = 0;
+
+ // Set name - C++ uses Unicode encoding (ACHAR = wchar_t)
+ if (!string.IsNullOrEmpty(name))
+ {
+ byte[] nameBytes = Encoding.Unicode.GetBytes(name);
+ roleInfo.name = new Octets(nameBytes);
+ }
+ else
+ {
+ roleInfo.name = new Octets();
+ }
+
+ // Initialize equipment list with 29 empty items (IVTRSIZE_EQUIPPACK = 29)
+ roleInfo.equipment = new List();
+ for (int i = 0; i < 29; i++)
+ {
+ // Important: GRoleInventory.data must be non-null or Marshal() will fail and the packet won't send.
+ roleInfo.equipment.Add(new GRoleInventory
+ {
+ id = 0,
+ pos = i,
+ count = 0,
+ max_count = 0,
+ data = new Octets(),
+ proctype = 0,
+ expire_date = 0,
+ guid1 = 0,
+ guid2 = 0,
+ mask = 0
+ });
+ }
+
+ // Initialize custom data exactly as C++ does: memset to 0, then set specific values
+ // This matches C++ LoadDefaultCustomizeData behavior
+ roleInfo.custom_data = CreateDefaultCustomizeData(profession, gender);
+
+ // Initialize other empty custom data fields
+ roleInfo.custom_status = new Octets();
+ roleInfo.charactermode = new Octets();
+ roleInfo.reincarnation_data = new Octets();
+ roleInfo.realm_data = new Octets();
+
+ // Race is typically determined by profession, but we'll leave it at 0 for now
+ // Server may set it based on profession
+ roleInfo.race = 0;
+
+ return roleInfo;
+ }
+
+ ///
+ /// Creates default customize data exactly matching C++ LoadDefaultCustomizeData behavior.
+ /// Structure layout - trying multiple sizes due to potential padding:
+ /// - DWORD dwVersion (offset 0-3, 4 bytes) = 0x10007001
+ /// - FACE_CUSTOMIZEDATA faceData (offset 4-87, 84 bytes) = all zeros
+ /// - unsigned short bodyID (offset 88-89, 2 bytes) = 0
+ /// - A3DCOLOR colorBody (offset 90-93, 4 bytes) = 0xffffffff
+ /// - 6 unsigned char scales (offset 94-99, 6 bytes) = all 128
+ /// Note: C++ sizeof might include padding, trying 100, 104, 108 bytes
+ ///
+ private static Octets CreateDefaultCustomizeData(int profession, int gender)
+ {
+ // C++ sizeof(PLAYER_CUSTOMIZEDATA) - Based on server response, it expects 176 bytes
+ // The C++ code sends: sizeof(CECPlayer::PLAYER_CUSTOMIZEDATA) which appears to be 176 bytes
+ // Server response shows: custom_data size=176, so server expects/receives 176 bytes
+ // Structure layout (176 bytes total):
+ // - DWORD dwVersion (4 bytes, offset 0) = 0x10007001
+ // - FACE_CUSTOMIZEDATA faceData (84 bytes, offset 4) = all zeros for now
+ // - unsigned short bodyID (2 bytes, offset 88) = 0
+ // - A3DCOLOR colorBody (4 bytes, offset 90) = 0xffffffff
+ // - 6 unsigned char scales (6 bytes, offset 94) = all 128
+ // - Padding/additional fields (76 bytes, offset 100-175) = all zeros
+ const int CUSTOMIZE_DATA_SIZE = 176; // Match server expectation (176 bytes from response)
+ const uint CUSTOMIZE_DATA_VERSION = 0x10007001; // CUSTOMIZE_DATA_VERSION from C++
+ byte[] customDataBytes = new byte[CUSTOMIZE_DATA_SIZE];
+
+ // Step 1: memset to 0 (already done by new byte[])
+
+ // Step 2: Set dwVersion at offset 0-3 (little-endian)
+ byte[] versionBytes = BitConverter.GetBytes(CUSTOMIZE_DATA_VERSION);
+ Array.Copy(versionBytes, 0, customDataBytes, 0, 4);
+
+ // Step 3: FACE_CUSTOMIZEDATA at offset 4-87 is already zero (84 bytes)
+ // (In C++ this would be loaded from INI, but for now we use zeros)
+
+ // Step 4: bodyID at offset 88-89 is already zero (2 bytes)
+ // Note: There might be 2 bytes padding here if struct is 4-byte aligned
+
+ // Step 5: Set colorBody to 0xffffffff
+ // Try offset 90 first (no padding), if that doesn't work try 92 (with padding)
+ byte[] colorBodyBytes = BitConverter.GetBytes(0xffffffffu);
+ Array.Copy(colorBodyBytes, 0, customDataBytes, 90, 4); // Try 90 first
+
+ // Step 6: Set all 6 scale fields to 128
+ // Try offset 94 first (no padding), if that doesn't work try 96 (with padding)
+ for (int i = 94; i < 100; i++)
+ {
+ customDataBytes[i] = 128;
+ }
+
+ return new Octets(customDataBytes);
+ }
+
+ public void EnterWorldAsync(RoleInfo role, Action callback)
+ {
+ SendProtocol(new enterworld()
+ {
+ Roleid = _selectedRole.roleid,
+ Provider_link_id = 0,
+ }, callback);
+ }
+
+ public void RequestDropIvtrItem(byte index, int amount)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = C2SCommandFactory.CreateDropIvtrItem(index, amount);
+ SendProtocol(gamedatasendRequest);
+ }
+
+ public void RequestDropEquipItem(byte index)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = C2SCommandFactory.CreateDropEquipItem(index);
+ SendProtocol(gamedatasendRequest);
+ }
+
+ public void RequestPickupItem(int idItem, int tid)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = C2SCommandFactory.CreatePickupItem(idItem, tid);
+ SendProtocol(gamedatasendRequest);
+ }
+
+ public void c2s_SendCmdGetIvtrDetailData(byte byPackage, Action callback)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = CSNetwork.C2SCommand.C2SCommandFactory.c2s_SendCmdGetIvtrDetailData(byPackage);
+ SendProtocol(gamedatasendRequest, callback);
+ }
+
+ public void c2s_SendCmdQueryCashInfo()
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = C2SCommandFactory.c2s_SendCmdQueryCashInfo();
+ SendProtocol(gamedatasendRequest);
+ }
+
+ public void c2s_SendCmdOpenFashionTrash(string password)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = C2SCommandFactory.c2s_SendCmdOpenFashionTrash(password);
+ SendProtocol(gamedatasendRequest);
+ }
+
+ public void c2s_SendCmdEquipItem(byte iIvtrIdx, byte iEquipIdx, Action callback)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = CSNetwork.C2SCommand.C2SCommandFactory.c2s_SendCmdEquipItem(iIvtrIdx, iEquipIdx);
+ SendProtocol(gamedatasendRequest, callback);
+ }
+
+ public void c2s_SendCmdReviveVillage(int param = 0)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = C2SCommandFactory.c2s_SendCmdReviveVillage(param);
+ SendProtocol(gamedatasendRequest);
+ }
+ public void c2s_SendCmdReviveItem(int param = 0)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = C2SCommandFactory.c2s_SendCmdReviveVillage(param);
+ SendProtocol(gamedatasendRequest);
+ }
+ public void RequestReviveByPlayer(int param = 0)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = C2SCommandFactory.c2s_SendCmdReviveVillage(param);
+ SendProtocol(gamedatasendRequest);
+ }
+
+
+ public void c2s_SendCmdMallShopping(uint count, CMD_MallShopping.goods[] goodsArray)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = CSNetwork.C2SCommand.C2SCommandFactory.CreateGetMallShopping(count, goodsArray);
+ SendProtocol(gamedatasendRequest);
+ }
+ public void c2s_SendCmdGatherMaterial(int idMatter, int iToolPack, int idToolIndex, int idTool, int idTask)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = CSNetwork.C2SCommand.C2SCommandFactory.c2s_SendCmdGatherMaterial(idMatter, iToolPack, idToolIndex, idTool, idTask);
+ SendProtocol(gamedatasendRequest);
+ }
+
+ public void RequestOwnItemInfoAsync(
+ byte byPackage,
+ byte bySlot,
+ int type,
+ int expire_date,
+ int state,
+ uint count,
+ ushort crc,
+ ushort content_length,
+ byte[] content,
+ Action callback)
+ {
+ gamedatasend gamedatasendRequest = new gamedatasend();
+ gamedatasendRequest.Data = C2SCommandFactory.CreateOwnItemInfo(byPackage, bySlot, type, expire_date, state,
+ count, crc, content_length, content);
+ SendProtocol(gamedatasendRequest, callback);
+ }
+
+ // --- Protocol Sending ---
+ public void SendProtocol(Protocol protocol, Action complete = null)
+ {
+ if (IsConnected)
+ {
+ _logger.Log(LogType.Debug,
+ $"Sending protocol: {protocol.GetType().Name} (Detail: {protocol.ToString})");
+ Debug.Log($"[GameSession] Sending protocol: {protocol.GetType().Name} (Type: {protocol.GetPType()})");
+ _networkManager.Send(protocol);
+ complete?.Invoke();
+ }
+ else
+ {
+ _logger.Log(LogType.Warning, $"Cannot send protocol ({protocol.GetType().Name}), not connected.");
+ Debug.LogError($"[GameSession] Cannot send protocol ({protocol.GetType().Name}), not connected.");
+ }
+ }
+
+ // --- Event Handlers (from NetworkManager) ---
+
+ private void OnProtocolReceived(Protocol protocol)
+ {
+ _logger.Log(LogType.Debug, $"Received protocol: {protocol.GetType().Name} (Type: {protocol.Type})");
+ if (protocol is null)
+ return;
+
+
+ // Route protocol to appropriate handler
+ switch (protocol.GetPType())
+ {
+ case ProtocolType.PROTOCOL_CHALLENGE:
+ HandleChallenge((challenge)protocol);
+ break;
+ case ProtocolType.PROTOCOL_KEYEXCHANGE:
+ HandleKeyExchange((KeyExchange)protocol);
+ break;
+ case ProtocolType.PROTOCOL_ONLINEANNOUNCE:
+ HandleOnlineAnnounce((onlineannounce)protocol);
+ break;
+ case ProtocolType.PROTOCOL_ROLELIST_RE:
+ HandleRoleListResponse((RoleListResponse)protocol);
+ break;
+ // Add cases for other protocols GameSession might need to handle
+ case ProtocolType.PROTOCOL_SELECTROLE_RE:
+ HandleSelectRoleResponse((SelectRole_Re)protocol);
+ //_networkManager.IgnoreBytes = 2;
+ break;
+ case ProtocolType.PROTOCOL_CREATEROLE_RE:
+ HandleCreateRoleResponse((createrole_re)protocol);
+ break;
+ case ProtocolType.PROTOCOL_ERRORINFO:
+ HandleErrorInfo((errorinfo)protocol);
+ break;
+ case ProtocolType.PROTOCOL_S2CGAMEDATASEND:
+ case ProtocolType.PROTOCOL_GAMEDATASEND:
+ HandleServerDataSend((gamedatasend)protocol);
+ break;
+ case ProtocolType.PROTOCOL_CHATMESSAGE:
+ _logger.Log(LogType.Warning, $"HoangDev :ProtocolType.PROTOCOL_CHATMESSAGE {protocol.GetPType()}");
+ OnPrtcChatMessage(protocol, false);
+ break;
+ case ProtocolType.PROTOCOL_PLAYERBASEINFO_RE:
+ OnPrtcPlayerBaseInfoRe(protocol);
+ break;
+ case ProtocolType.PROTOCOL_GETUICONFIG_RE: OnPrtcGetConfigRe(protocol); break;
+
+ case ProtocolType.PROTOCOL_AUTOTEAMSETGOAL_RE:
+ {
+ // CECAutoTeam pAutoTeam = CECGameRun.Instance.GetHostPlayer().GetAutoTeam();
+ // if( pAutoTeam !=null)
+ // pAutoTeam.OnPrtcAutoTeamSetGoalRe((AutoTeamSetGoal_Re)protocol);
+ }
+ break;
+
+ default:
+ _logger.Log(LogType.Warning, $"Received unhandled protocol type: {protocol.GetPType()}");
+ break;
+ }
+ }
+
+ private void HandleServerDataSend(gamedatasend protocol)
+ {
+ int lenghtHeader = Marshal.SizeOf();
+ var pDataBuf = new byte[protocol.Data.ByteArray.Length - lenghtHeader];
+ var byteArrHeader = new byte[lenghtHeader];
+ long dwDataSize = protocol.Data.Size;
+
+ if (dwDataSize < Marshal.SizeOf())
+ {
+ _logger.Error($"### GameDataSend: size invalid {dwDataSize}");
+ return;
+ }
+
+ dwDataSize -= Marshal.SizeOf(); // subtract the header size (ushort)
+ for (int i = 0; i < protocol.Data.ByteArray.Length; i++)
+ {
+ if (i < lenghtHeader)
+ {
+ byteArrHeader[i] = protocol.Data.ByteArray[i];
+ }
+ else
+ {
+ pDataBuf[i - lenghtHeader] = protocol.Data.ByteArray[i];
+ }
+ }
+
+ var pCmdHeader = BitConverter.ToUInt16(byteArrHeader);
+ //sss
+#if UNITY_EDITOR
+ if (isDebug)
+ {
+ BMLogger.LogError($"### GameDataSend: CMDID {pCmdHeader}");
+ }
+#endif
+ int iHostID = _selectedRole.roleid;
+ switch (pCmdHeader)
+ {
+ case CommandID.PLAYER_INFO_2:
+ case CommandID.PLAYER_INFO_3:
+ case CommandID.PLAYER_INFO_4:
+ case CommandID.PLAYER_INFO_2_LIST:
+ case CommandID.PLAYER_INFO_3_LIST:
+ case CommandID.PLAYER_INFO_23_LIST:
+
+ break;
+
+ case CommandID.PLAYER_INFO_1:
+ case CommandID.PLAYER_ENTER_WORLD:
+ case CommandID.PLAYER_ENTER_SLICE:
+ case CommandID.PLAYER_INFO_1_LIST:
+ case CommandID.PLAYER_INFO_00:
+ case CommandID.SELF_INFO_1:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERINFO, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf,
+ pCmdHeader, iHostID);
+ break;
+ case CommandID.OBJECT_MOVE:
+ int lenghtDataType = Marshal.SizeOf();
+ byte[] arrByteData = GetBytes(pDataBuf, lenghtDataType, 0);
+ int idObjMove = BitConverter.ToInt32(arrByteData);
+ if (ISPLAYERID(idObjMove))
+ {
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERMOVE, (int)MANAGER_INDEX.MAN_PLAYER, -1,
+ pDataBuf, pCmdHeader, iHostID);
+ }
+ else if (ISNPCID(idObjMove))
+ {
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCMOVE, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf,
+ pCmdHeader);
+ }
+
+ break;
+ case CommandID.OBJECT_STOP_MOVE:
+ {
+ int id1 = GPDataTypeHelper.FromBytes(pDataBuf);
+
+ if (ISPLAYERID(id1))
+ {
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERSTOPMOVE, (int)MANAGER_INDEX.MAN_PLAYER, -1,
+ pDataBuf, pCmdHeader);
+ }
+ else if (ISNPCID(id1))
+ {
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCSTOPMOVE, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf,
+ pCmdHeader);
+ }
+
+ break;
+ }
+ case CommandID.OBJECT_LEAVE_SLICE:
+ {
+ int id = GPDataTypeHelper.FromBytes(pDataBuf);
+ if (ISPLAYERID(id))
+ {
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERRUNOUT, (int)MANAGER_INDEX.MAN_PLAYER, -1,
+ pDataBuf, pCmdHeader);
+ }
+ else if (ISNPCID(id))
+ {
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCRUNOUT, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf,
+ pCmdHeader);
+ }
+
+ break;
+ }
+ case CommandID.OWN_IVTR_DATA:
+ case CommandID.OWN_IVTR_DETAIL_DATA:
+ case CommandID.GET_OWN_MONEY:
+ case CommandID.CHANGE_IVTR_SIZE:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_IVTRINFO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader, iHostID);
+ break;
+ case CommandID.EXG_IVTR_ITEM:
+ case CommandID.MOVE_IVTR_ITEM:
+ case CommandID.PLAYER_DROP_ITEM:
+ case CommandID.EXG_EQUIP_ITEM:
+ case CommandID.EQUIP_ITEM:
+ case CommandID.MOVE_EQUIP_ITEM:
+ case CommandID.UNFREEZE_IVTR_SLOT:
+ case CommandID.PLAYER_EQUIP_TRASHBOX_ITEM:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_ITEMOPERATION, (int)MANAGER_INDEX.MAN_PLAYER, 0,
+ pDataBuf, pCmdHeader);
+ break;
+ case CommandID.PLAYER_CASH:
+ {
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_IVTRINFO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader, iHostID);
+ break;
+ }
+ case CommandID.MATTER_INFO_LIST:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_MM_MATTERINFO, (int)MANAGER_INDEX.MAN_MATTER, 0, pDataBuf,
+ pCmdHeader);
+ break;
+ case CommandID.MATTER_ENTER_WORLD:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_MM_MATTERENTWORLD, (int)MANAGER_INDEX.MAN_MATTER, 0,
+ pDataBuf, pCmdHeader);
+ break;
+ case CommandID.PICKUP_ITEM:
+ case CommandID.HOST_OBTAIN_ITEM:
+ case CommandID.PRODUCE_ONCE:
+ case CommandID.TASK_DELIVER_ITEM:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_PICKUPITEM, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader);
+ break;
+ case CommandID.MATTER_PICKUP:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PICKUPMATTER, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.PICKUP_MONEY:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_PICKUPMONEY, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader);
+ break;
+ case CommandID.HOST_CORRECT_POS:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CORRECTPOS, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader, iHostID);
+ break;
+ case CommandID.OWN_ITEM_INFO:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_OWNITEMINFO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader, iHostID);
+ break;
+ case CommandID.PLAYER_DIED:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERDIED, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.HOST_DIED:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_DIED, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.PLAYER_REVIVE:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERREVIVE, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.NOTIFY_HOSTPOS:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_GOTO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.NPC_ENTER_SLICE:
+ case CommandID.NPC_INFO_LIST:
+ case CommandID.NPC_INFO_00:
+ case CommandID.NPC_ENTER_WORLD:
+ case CommandID.NPC_VISIBLE_TID_NOTIFY:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCINFO, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf,
+ pCmdHeader, dwDataSize);
+ break;
+ case CommandID.TASK_DATA:
+ case CommandID.TASK_VAR_DATA:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TASKDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader, dwDataSize);
+ break;
+ case CommandID.BE_HURT:
+ case CommandID.HURT_RESULT:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_HURTRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader);
+ break;
+ case CommandID.OBJECT_ATTACK_RESULT:
+ //int id = GPDataTypeHelper.FromBytes(pDataBuf);
+ cmd_object_atk_result pCmdAtk = GPDataTypeHelper.FromBytes(pDataBuf);
+ //BMLogger.LogError($"OBJECT_ATTACK_RESULT: npc ? " + ISNPCID(id));
+
+ if (ISPLAYERID(pCmdAtk.attacker_id))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERATKRESULT, MANAGER_INDEX.MAN_PLAYER, -1,
+ pDataBuf, pCmdHeader);
+ else if (ISNPCID(pCmdAtk.attacker_id))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCATKRESULT, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.HOST_ATTACKRESULT:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_ATKRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader);
+ break;
+ case CommandID.HOST_ATTACKED:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_ATTACKED, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader);
+ break;
+
+ case CommandID.ERROR_MESSAGE:
+ {
+ int errRaw = BitConverter.ToInt32(pDataBuf, 0);
+ // Note: _logger may be configured as a file logger via SetLogPath(), so also log to console for visibility.
+ _logger.Info($"### GameDataSend: ERROR_MESSAGE: {errRaw}");
+#if UNITY_EDITOR
+ BMLogger.LogError($"### GameDataSend: ERROR_MESSAGE: {errRaw}");
+#endif
+ cmd_error_msg pCmd = GPDataTypeHelper.FromBytes(pDataBuf);
+#if UNITY_EDITOR
+ BMLogger.LogError($"### GameDataSend: ERROR_MESSAGE parsed iMessage={pCmd.iMessage}");
+#endif
+
+ if (pCmd.iMessage != 0)
+ {
+ // string szMsg = m_ErrorMsgs.GetWideString(pCmd.iMessage);
+ // if (string.IsNullOrEmpty(szMsg))
+ // BMLogger.LogError("SERVER - unknown error !");
+ //else if (pCmd.iMessage != 2)
+ //g_pGame.GetGameRun().AddChatMessage(szMsg, GP_CHAT_MISC);
+ }
+
+ if (pCmd.iMessage == 2)
+ {
+ // Attack target is too far
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TARGETISFAR, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ }
+ else if (pCmd.iMessage == 20)
+ {
+ // Failed to cast skill
+ //pGameRun.PostMessage(MSG_PM_CASTSKILL, MAN_PLAYER, 0, (DWORD)pDataBuf, pCmdHeader.cmd);
+ }
+ else if (pCmd.iMessage == 133 || pCmd.iMessage == 134)
+ {
+ // deal failed
+ //pGameRun.PostMessage(MSG_HST_BUY_SELL_FAIL, MAN_PLAYER, 0, (DWORD)pDataBuf, pCmdHeader.cmd);
+ }
+ else if (pCmd.iMessage == 158)
+ {
+ // µ±Ç°»ãÂʲ»¶Ô£¬ÖØÐÂÈ¡»ãÂÊ
+ //c2s_CmdGetCashMoneyRate();
+ }
+ else if (pCmd.iMessage == 108 /*&& pGameRun.GetHostPlayer().IsInKingService()*/)
+ {
+ /* CECGameUIMan* pGameUI = pGameRun.GetUIManager().GetInGameUIMan();
+ if (pGameUI)
+ pGameUI.EndNPCService();*/
+ }
+ else if
+ (pCmd.iMessage == 108 /*&& pGameRun.GetHostPlayer().GetOfflineShopCtrl().GetNPCSevFlag() != COfflineShopCtrl::NPCSEV_NULL*/
+ )
+ {
+ /* CECGameUIMan* pGameUI = pGameRun.GetUIManager().GetInGameUIMan();
+ if (pGameUI)
+ pGameUI.EndNPCService();*/
+ }
+ else if (pCmd.iMessage == 175)
+ {
+ //c2s_CmdQueryParallelWorld();
+ }
+ else if (pCmd.iMessage == 6)
+ {
+ //AP_ActionEvent(AP_EVENT_CANNOTPICKUP);
+ }
+
+ break;
+ }
+ case CommandID.SELECT_TARGET:
+ case CommandID.UNSELECT:
+
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_SELTARGET, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader);
+ break;
+ case CommandID.NPC_DIED:
+ case CommandID.NPC_DIED2:
+
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCDIED, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.OBJECT_DISAPPEAR:
+ {
+ int lenghtDataType1 = Marshal.SizeOf();
+ byte[] arrByteData1 = GetBytes(pDataBuf, lenghtDataType1, 0);
+ int objectId = BitConverter.ToInt32(arrByteData1);
+ if (ISPLAYERID(objectId))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERDISAPPEAR, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ else if (ISNPCID(objectId))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCDISAPPEAR, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
+ else if (ISMATTERID(objectId))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_MM_MATTERDISAPPEAR, MANAGER_INDEX.MAN_MATTER, 0, pDataBuf, pCmdHeader);
+
+ break;
+ }
+ case CommandID.SELF_INFO_00:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_INFO00, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
+ pCmdHeader);
+ break;
+ case CommandID.NPC_GREETING:
+ {
+ // If this greeting is from the skill-learn NPC, record it (C++ skill dialog relies on this).
+ try
+ {
+ cmd_npc_greeting greet = GPDataTypeHelper.FromBytes(pDataBuf);
+ CECHostSkillModel.Instance.OnNpcGreeting(greet.idObject);
+ }
+ catch (Exception ex)
+ {
+ _logger.Log(LogType.Warning, $"Failed to parse NPC_GREETING payload: {ex.Message}");
+ }
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_NPCGREETING, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ }
+ case CommandID.ACTIVATE_WAYPOINT:
+ case CommandID.WAYPOINT_LIST:
+
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_WAYPOINT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.SERVER_TIME:
+ {
+ cmd_server_time pcmd_server_time = GPDataTypeHelper.FromBytes(pDataBuf);
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_SERVERTIME, -1, 0, pcmd_server_time.time, pcmd_server_time.timebias);
+ break;
+ }
+ case CommandID.SCENE_SERVICE_NPC_LIST:
+ {
+ CECHostSkillModel.Instance.RecvNPCServiceList(protocol.Data);
+ break;
+ }
+ case CommandID.SKILL_DATA:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_SKILLDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.OBJECT_CAST_SKILL:
+ case CommandID.OBJECT_CAST_INSTANT_SKILL:
+ case CommandID.OBJECT_CAST_POS_SKILL:
+ {
+ cmd_object_cast_skill pCmd2 = GPDataTypeHelper.FromBytes(pDataBuf,true);
+ if (ISPLAYERID(pCmd2.caster))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_CASTSKILL, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ else if (ISNPCID(pCmd2.caster))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCCASTSKILL, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
+
+ break;
+ }
+ case CommandID.LEVEL_UP:
+ {
+ cmd_level_up pCmdLevelUp = GPDataTypeHelper.FromBytes(pDataBuf); ;
+ if (ISPLAYERID(pCmdLevelUp.id))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERLEVELUP, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ else if (ISNPCID(pCmdLevelUp.id))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCLEVELUP, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
+ break;
+ }
+ case CommandID.HOST_START_ATTACK:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_STARTATTACK, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
+ break;
+ case CommandID.HOST_STOPATTACK:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_STOPATTACK, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
+ break;
+ case CommandID.HOST_SKILL_ATTACK_RESULT:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_SKILLRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.CHANGE_FACE_START:
+ case CommandID.CHANGE_FACE_END:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CHANGEFACE, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
+ break;
+ case CommandID.ENCHANT_RESULT:
+ cmd_enchant_result pCmd3 = GPDataTypeHelper.FromBytes(pDataBuf);
+ if (ISPLAYERID(pCmd3.caster))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_ENCHANTRESULT, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ else if (ISNPCID(pCmd3.caster))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_ENCHANTRESULT, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.SKILL_PERFORM:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_CASTSKILL, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.SET_COOLDOWN:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_SETCOOLTIME, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.COMBO_SKILL_PREPARE:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_COMBO_SKILL_PREPARE, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
+ break;
+ case CommandID.PLAYER_EXT_PROP_BASE:
+ case CommandID.PLAYER_EXT_PROP_MOVE:
+ case CommandID.PLAYER_EXT_PROP_ATK:
+ case CommandID.PLAYER_EXT_PROP_DEF:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYEREXTPROP, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.OWN_EXT_PROP:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_OWNEXTPROP, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.OBJECT_DO_EMOTE:
+ case CommandID.OBJECT_EMOTE_RESTORE:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERDOEMOTE, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.OUT_OF_SIGHT_LIST:
+ {
+ cmd_out_of_sight_list pCmd5 = default;
+ pCmd5.uCount = GPDataTypeHelper.FromBytes(pDataBuf);
+ int offset2 = sizeof(uint);
+ pCmd5.idList = new int[pCmd5.uCount];
+ for (int i = 0; i < pCmd5.uCount; i++)
+ {
+ pCmd5.idList[i] = GPDataTypeHelper.FromBytes(pDataBuf, offset2);
+ offset2 += 4;//sizeof int;
+ }
+
+ for (uint n = 0; n < pCmd5.uCount; n++)
+ {
+ if (ISPLAYERID(pCmd5.idList[n]))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYEROUTOFVIEW, MANAGER_INDEX.MAN_PLAYER, -1, pCmd5.idList[n], pCmdHeader);
+ else if (ISNPCID(pCmd5.idList[n]))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCOUTOFVIEW, MANAGER_INDEX.MAN_NPC, 0, pCmd5.idList[n], pCmdHeader);
+ else if (ISMATTERID(pCmd5.idList[n]))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_MM_MATTEROUTOFVIEW, MANAGER_INDEX.MAN_MATTER, 0, pCmd5.idList[n], pCmdHeader);
+ }
+
+ break;
+ }
+ case CommandID.PLAYER_GATHER_START:
+ case CommandID.PLAYER_GATHER_STOP:
+ case CommandID.MINE_GATHERED:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERGATHER, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.COOLTIME_DATA:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_COOLTIMEDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.OBJECT_TAKEOFF:
+ {
+ cmd_object_takeoff pCmdTakeOff = GPDataTypeHelper.FromBytes((byte[])pDataBuf);
+ if (ISPLAYERID(pCmdTakeOff.object_id))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERFLY, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ break;
+ }
+ case CommandID.OBJECT_LANDING:
+ {
+ cmd_object_landing pCmdLanding = GPDataTypeHelper.FromBytes((byte[])pDataBuf);
+ if (ISPLAYERID(pCmdLanding.object_id))
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERFLY, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
+ break;
+ }
+ case CommandID.HOST_RUSH_FLY:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERFLY, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.FLYSWORD_TIME:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_FLYSWORDTIME, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.PRODUCE_START:
+ case CommandID.PRODUCE_END:
+ case CommandID.PRODUCE_NULL:
+ // Post MSG_HST_PRODUCEITEM message with command ID as parameter (matches C++ behavior)
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_PRODUCEITEM, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+
+
+ case CommandID.LEARN_SKILL:
+ BMLogger.LogError("### GameDataSend: LEARN_SKILL");
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_LEARNSKILL, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ case CommandID.EMBED_ITEM:
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_EMBEDITEM, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
+ break;
+ default:
+#if UNITY_EDITOR
+ if (isDebug)
+ {
+ BMLogger.LogError($"### GameDataSend: Unhandled CMDID {pCmdHeader} (payloadBytes={pDataBuf?.Length ?? 0})");
+ }
+#endif
+ break;
+ }
+ }
+
+
+ private void HandleSelectRoleResponse(SelectRole_Re protocol)
+ {
+ _logger.Info($"Select role response {protocol.result}");
+ _selectRoleCallback?.Invoke(_selectedRole);
+ }
+
+ private void HandleCreateRoleResponse(createrole_re protocol)
+ {
+ Debug.Log($"[GameSession] HandleCreateRoleResponse - result: {protocol.result}, roleid: {protocol.roleid}");
+
+ if (protocol.result != (int)ErrCode.ERR_SUCCESS)
+ {
+ string errorMsg = $"Create role failed with result code: {protocol.result} (ERR_SUCCESS = {(int)ErrCode.ERR_SUCCESS})";
+ _logger.Log(LogType.Error, errorMsg);
+ Debug.LogError($"[GameSession] {errorMsg}");
+ var callback = _createRoleCallback;
+ _createRoleCallback = null;
+ callback?.Invoke(null);
+ return;
+ }
+
+ Debug.Log($"[GameSession] Create role successful! RoleID: {protocol.roleid}");
+ var successCallback = _createRoleCallback;
+ _createRoleCallback = null;
+ successCallback?.Invoke(protocol.roleinfo);
+ }
+
+ private void HandleErrorInfo(errorinfo protocol)
+ {
+ Debug.LogError($"[GameSession] Server error - Errcode: {protocol.Errcode}");
+
+ // If we're waiting for create role response and get an error, fail the callback
+ if (_createRoleCallback != null)
+ {
+ Debug.LogError($"[GameSession] Create role failed due to server error: {protocol.Errcode}");
+ var callback = _createRoleCallback;
+ _createRoleCallback = null;
+ callback?.Invoke(null);
+ }
+ }
+
+ private void OnErrorOccurred(string errorMessage)
+ {
+ _logger.Log(LogType.Error, $"Network Error: {errorMessage}");
+ FailLoginInProgress(errorMessage);
+ FailRoleListInProgress(errorMessage);
+ }
+
+ private void OnDisconnected()
+ {
+ _logger.Log(LogType.Info, "Disconnected from server.");
+ _currentUserId = -1;
+ FailLoginInProgress("Disconnected");
+ FailRoleListInProgress("Disconnected");
+ // Clear command cache
+ m_CmdCache.RemoveAllCmds();
+ }
+
+ // --- Protocol Handling Logic ---
+
+ private void HandleChallenge(challenge challenge)
+ {
+ if (_loginCallback == null || string.IsNullOrEmpty(_username))
+ {
+ _logger.Log(LogType.Warning, "Received Challenge but not expecting it or username not set.");
+ return;
+ }
+
+ _logger.Log(LogType.Info, "Handling Challenge...");
+
+ response response = new response();
+ byte[] usernameBytes = Encoding.ASCII.GetBytes(_username);
+ byte[] passwordBytes = Encoding.ASCII.GetBytes(_password);
+ response.identity.Replace(usernameBytes);
+ response.Setup(new Octets(usernameBytes), new Octets(passwordBytes), challenge.nonce);
+
+ uint clientId = 0xffffffff;
+ byte[] clientIdBytes = BitConverter.GetBytes(clientId);
+ response.cli_fingerprint.Replace(clientIdBytes);
+ response.use_token = 0;
+
+ _networkManager.SetNonce(response.response_data);
+ SendProtocol(response);
+ _logger.Log(LogType.Info, "Sent Response.");
+ }
+
+ private void HandleKeyExchange(KeyExchange keyExchange)
+ {
+ if (_loginCallback == null || string.IsNullOrEmpty(_username))
+ {
+ _logger.Log(LogType.Warning, "Received KeyExchange but not expecting it.");
+ return;
+ }
+
+ _logger.Log(LogType.Info, "Handling KeyExchange...");
+ keyExchange.Setup(_networkManager, _username);
+ keyExchange.Blkickuser = 1;
+ SendProtocol(keyExchange);
+ _logger.Log(LogType.Info, "Sent KeyExchange acknowledgment/response.");
+ }
+
+ private void HandleOnlineAnnounce(onlineannounce announce)
+ {
+ if (_loginCallback == null)
+ {
+ _logger.Log(LogType.Warning, "Received OnlineAnnounce but not expecting it.");
+ return;
+ }
+
+ _logger.Log(LogType.Info, $"Login successful! UserID: {announce.Userid}, LocalSID: {announce.Localsid}");
+ _currentUserId = announce.Userid;
+ _localsid = announce.Localsid;
+
+ var callback = _loginCallback;
+ _loginCallback = null;
+ callback?.Invoke(true);
+ }
+
+ private void RequestRoleListInternal(int lastHandle = -1)
+ {
+ rolelist rolelistRequest = new rolelist();
+ rolelistRequest.Userid = _currentUserId;
+ rolelistRequest.Localsid = 0;
+ rolelistRequest.Handle = lastHandle;
+
+ SendProtocol(rolelistRequest);
+
+
+ //gamedatasend gamedatasendRequest = new gamedatasend();
+ //gamedatasendRequest.Data = C2SCommandFactory.CreatePlayerMove();
+
+ //SendProtocol(gamedatasendRequest);
+ }
+
+ private void HandleRoleListResponse(RoleListResponse response)
+ {
+ if (_roleListCallback == null || _accumulatedRoles == null)
+ {
+ _logger.Log(LogType.Warning, "Received RoleListResponse but not expecting it.");
+ return;
+ }
+
+ _logger.Log(LogType.Debug,
+ $"Received RoleListResponse. Handle: {response.handle}, Result: {response.result}, Count: {response.rolelist.Count}");
+
+ if (response.result == 0)
+ {
+ _accumulatedRoles.AddRange(response.rolelist);
+
+ foreach (var role in response.rolelist)
+ {
+ try
+ {
+ string roleName = Encoding.UTF8.GetString(role.name.ByteArray, 0, role.name.Length);
+ _logger.Log(LogType.Info, $" - Role ID: {role.roleid}, Name: {roleName}, Level: {role.level}");
+ }
+ catch (Exception ex)
+ {
+ _logger.Log(LogType.Error, $" - Error decoding role name: {ex.Message}");
+ _logger.LogException(ex);
+ }
+ }
+
+ if (response.handle != -1)
+ {
+ _logger.Log(LogType.Debug, $"Requesting next batch of roles (handle: {response.handle})...");
+ RequestRoleListInternal(response.handle);
+ }
+ else
+ {
+ _logger.Log(LogType.Info, $"Finished fetching roles. Total count: {_accumulatedRoles.Count}");
+ var callback = _roleListCallback;
+ var result = _accumulatedRoles;
+ _roleListCallback = null;
+ _accumulatedRoles = null;
+ callback?.Invoke(result);
+ }
+ }
+ else
+ {
+ _logger.Log(LogType.Error, $"Role list retrieval failed. Result code: {response.result}");
+ FailRoleListInProgress($"Role list retrieval failed (Result: {response.result})");
+ }
+ }
+
+ // --- Helper methods for failure handling ---
+ private void FailLoginInProgress(string reason)
+ {
+ if (_loginCallback != null)
+ {
+ _logger.Log(LogType.Error, $"Login failed: {reason}");
+ var callback = _loginCallback;
+ _loginCallback = null;
+ callback?.Invoke(false);
+ }
+ }
+
+ private void FailRoleListInProgress(string reason)
+ {
+ if (_roleListCallback != null)
+ {
+ _logger.Log(LogType.Error, $"Role list retrieval failed: {reason}");
+ var callback = _roleListCallback;
+ _roleListCallback = null;
+ _accumulatedRoles = null;
+ callback?.Invoke(null);
+ }
+ }
+
+ // --- IDisposable Implementation ---
+ private bool disposedValue = false;
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (!disposedValue)
+ {
+ if (disposing)
+ {
+ if (_networkManager != null)
+ {
+ _logger.Log(LogType.Info, "[DUCK] Disposing GameSession and disconnecting...");
+ _networkManager.ProtocolReceived -= OnProtocolReceived;
+ _networkManager.ErrorOccurred -= OnErrorOccurred;
+ _networkManager.Disconnected -= OnDisconnected;
+ _networkManager.Disconnect();
+ _networkManager.Dispose();
+ _networkManager = null;
+ }
+
+ _loginCallback = null;
+ _roleListCallback = null;
+ _accumulatedRoles = null;
+ }
+
+ disposedValue = true;
+ }
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+ // GC.SuppressFinalize(this);
+ }
+
+ public bool ISPLAYERID(int id)
+ {
+ return id != 0 && (id & 0x80000000) == 0;
+ }
+ public bool ISNPCID(int id) => ((id & 0x80000000) != 0) && ((id & 0x40000000) == 0);
+ public bool ISMATTERID(int id) => ((id) & 0xC0000000) == 0xC0000000;
+ private byte[] GetBytes(byte[] bytes, int length, int index)
+ {
+ byte[] arrByteData = new byte[length];
+ for (int i = 0; i < length; i++)
+ {
+ arrByteData[i] = bytes[i + index];
+ }
+
+ return arrByteData;
+ }
+
+ public void c2s_CmdPlayerMove(in Vector3 vCurPos, in Vector3 vDest,
+ int iTime, float fSpeed, int iMoveMode, ushort wStamp)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+
+ gamedatasend.Data =
+ C2SCommandFactory.CreatePlayerMove(vCurPos, vDest, (ushort)iTime, fSpeed, (byte)iMoveMode, wStamp);
+ SendProtocol(gamedatasend);
+ }
+ public void c2s_SendCmdCastSkill(int idSkill, byte byPVPMask, int iNumTarget, int[] aTargets)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+
+ gamedatasend.Data =
+ C2SCommandFactory.CreatePlayerCastSkill(idSkill, byPVPMask, iNumTarget, aTargets);
+
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdCastInstantSkill(int idSkill, byte byPVPMask, int iNumTarget, int[] aTargets)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+
+ gamedatasend.Data =
+ C2SCommandFactory.CreatePlayerCastInstantSkill(idSkill, byPVPMask, iNumTarget, aTargets);
+
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_CmdCastPosSkill(int idSkill, Vector3 vDest, byte byPVPMask, int iNumTarget, int aTargets)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+
+ gamedatasend.Data =
+ C2SCommandFactory.CreatePlayerCastPosSkill(idSkill, vDest, byPVPMask, iNumTarget, aTargets);
+
+ SendProtocol(gamedatasend);
+ }
+ public void c2s_SendCmdContinueAction()
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.CONTINUE_ACTION);
+ SendProtocol(gamedatasend);
+ }
+ public void c2s_SendCmdStopMove(in Vector3 vDest, float fSpeed, int iMoveMode,
+ byte byDir, ushort wStamp, int iTime)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+
+ gamedatasend.Data =
+ C2SCommandFactory.CreatePlayerStop(vDest, fSpeed, (byte)iMoveMode, byDir, wStamp, (ushort)iTime);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_CmdSendEnterPKPrecinctint()
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.ENTER_PK_PROTECTED);
+ SendProtocol(gamedatasend);
+ }
+ public void SendChatData(byte cChannel, in string szMsg, int iPack, int iSlot)
+ {
+ publicchat publicChat = new publicchat();
+ publicChat.Channel = cChannel;
+ publicChat.Roleid = m_iCharID;
+
+ byte[] unicodeBytes = Encoding.Unicode.GetBytes(szMsg);
+ publicChat.Msg.Replace(unicodeBytes);
+ _logger.Log(LogType.Warning, $"HoangDev : publicChat {publicChat}");
+ SendProtocol(publicChat);
+ }
+ public void LoadConfigData()
+ {
+ getuiconfig p = new getuiconfig();
+ p.Roleid = m_iCharID;
+ SendProtocol(p);
+ }
+ private void SetCharacterID(int iCharID)
+ {
+ m_iCharID = iCharID;
+ }
+
+ private void OnPrtcChatMessage(Protocol pProtocol, bool bCalledagain)
+ {
+ chatmessage p = (chatmessage)pProtocol;
+
+ string strTemp = System.Text.Encoding.Unicode.GetString(p.Msg.ToArray(), 0, p.Msg.Length);
+
+ _logger.Log(LogType.Warning, $"HoangDev : OnPrtcChatMessage :{strTemp}");
+ EventBus.Publish(new ChatMessageEvent(strTemp));
+ }
+
+ public struct ChatMessageEvent
+ {
+ public string context;
+
+ public ChatMessageEvent(string context)
+ {
+ this.context = context;
+ }
+ }
+ public void OnPrtcGetConfigRe(Protocol pProtocol)
+ {
+ getuiconfig_re p = (getuiconfig_re)pProtocol;
+ if (p.Result != (int)ErrCode.ERR_SUCCESS)
+ BMLogger.LogError("CECGameSession::OnPrtcGetConfigRe, link return error code of " + p.Result);
+ else
+ {
+ if (!CECGameRun.Instance.LoadConfigsFromServer(p.UiConfig.RawBuffer, p.UiConfig.Size))
+ {
+ // if load failed then use current setting directly
+ //TODO : fix later
+ EC_Game.GetConfigs().ApplyUserSetting();
+ }
+
+ // Now, Get config data request is sent after all host initial data ready.
+ // so when we receive this reply, we can do some last work before game
+ // really starts. Maybe it's not the best place to do these work, but
+ // now we do it here.
+ // Enalbe game UI
+ CECGameUIMan pGameUI = (CECGameUIMan)EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
+ if (pGameUI != null)
+ {
+ pGameUI.EnableUI(true);
+
+ // Get referral name for adding friend or other display
+ //TODO: a Hung lam phan select role info di
+ /* RoleInfo info = EC_Game.GetGameRun().GetSelectedRoleInfo();
+ if (info.referrer_role > 0)
+ GetPlayerBriefInfo(1, info.referrer_role, 2);*/
+ }
+
+ CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
+ pHost.OnAllInitDataReady();
+
+ /* if (pHost.IsGM())
+ {
+ CDlgCountryMap pDlgCountryMap = (CDlgCountryMap)pGameUI.GetDialog("Win_CountryMap");
+ pDlgCountryMap.GetConfig();
+ }
+
+ g_pGame.GetConfigs().ApplyOptimizeSetting();
+
+ if (g_pGame.GetConfigs().IsMiniClient())
+ CECMCDownload::GetInstance().SendGetDownloadOK();*/
+ }
+ }
+ private void OnPrtcPlayerBaseInfoRe(Protocol pProtocol)
+ {
+ playerbaseinfo_re p = (playerbaseinfo_re)pProtocol;
+ BMLogger.Log($"OnPrtcPlayerBaseInfoRe: {p.Roleid} {p.Player.cls} {p.Player.gender}");
+ EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERBASEINFO, MANAGER_INDEX.MAN_PLAYER, -1, p);
+ }
+
+ public void c2s_CmdNPCSevAcceptTask(int idTask, int idStorage, int idRefreshItem)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateCmdNPCSevAcceptTask(idTask, idStorage, idRefreshItem);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdGetAllData(bool byPack, bool byEquip, bool byTask)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+
+ gamedatasend.Data = C2SCommandFactory.CreateGetAllDataCommand(byPack, byEquip, byTask);
+ _logger.Log(LogType.Warning, $"[Dat]- SendCmdGetAllData {byPack},{byEquip},{byTask}");
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdNPCSevHello(int nid)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNPCSevHelloDataCommand(nid);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_CmdNormalAttack(byte byPVPMask)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNormalAttackDataCmd(byPVPMask);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdCancelAction()
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(CSNetwork.C2SCommand.CommandID.CANCEL_ACTION);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_CmdUnselect()
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(CSNetwork.C2SCommand.CommandID.UNSELECT);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdSelectTarget(int idTarget)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateSelectTarget(idTarget);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdNPCSevWaypoint()
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNPCSevWaypointCmd(NPC_service_type.GP_NPCSEV_WAYPOINT, 0);
+ SendProtocol(gamedatasend);
+ }
+ public void c2s_SendCmdNPCSevMakeItem(int idSkill, int idItem, uint dwCount)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNPCSevMakeItemCmd(idSkill, idItem, dwCount);
+ SendProtocol(gamedatasend);
+ }
+ public void GetRoleBaseInfo(int iNumRole, List aRoleIDs)
+ {
+ int iNumLimit = 128;
+ playerbaseinfo p = null;
+ int iCount = 0;
+
+ while (iCount < iNumRole)
+ {
+ p = new();
+ p.Roleid = _selectedRole.roleid;
+
+ int iNumSend = iNumLimit;
+ if (iCount + iNumLimit > iNumRole)
+ iNumSend = iNumRole - iCount;
+
+ if (iNumSend > 0)
+ {
+ p.playerList = new();
+ for (int i = 0; i < iNumSend; i++)
+ p.playerList.Add(aRoleIDs[iCount + i]);
+
+ SendProtocol(p);
+ }
+
+
+ iCount += iNumSend;
+ }
+ }
+
+ public void c2s_SendCmdGetOtherEquip(int iNumID, List aIDs)
+ {
+ // int iNumLimit = 250;
+ // int iCount = 0;
+
+ // while (iCount < iNumID)
+ // {
+ // int iNumSend = iNumLimit;
+ // if (iCount + iNumLimit > iNumID)
+ // iNumSend = iNumID - iCount;
+
+ // if (iNumSend > 0)
+ // {
+ // }
+ // }
+ }
+
+ public void c2s_SendCmdNPCSevAcceptTask(int idTask, int idStorage, int idRefreshItem)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateCmdNPCSevAcceptTask(
+ idTask,
+ idStorage,
+ idRefreshItem);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdNPCSevReturnTask(int idTask, int iChoice)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNPCSevReturnTaskCmd(
+ idTask,
+ iChoice);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdNPCSevTaskMatter(int idTask)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNPCSevTaskMatterCmd(idTask);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdNPCSevLearnSkill(int idSkill)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNPCSevLearnSkillCmd(idSkill);
+ BMLogger.LogError("HoangDev : c2s_SendCmdNPCSevLearnSkill gamedatasend.Data : " + gamedatasend.Data.Size);
+ BMLogger.LogError("HoangDev : c2s_SendCmdNPCSevLearnSkill idSkill : " + idSkill);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdNPCSevBuy(int itemNum, C2SCommand.npc_trade_item[] items)
+ {
+ if (itemNum <= 0 || items == null || items.Length < itemNum)
+ return;
+
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNPCSevBuyCmd(itemNum, items);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdNPCSevSell(int itemNum, C2SCommand.npc_sell_item[] items)
+ {
+ if (itemNum <= 0 || items == null || items.Length < itemNum)
+ return;
+
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNPCSevSellCmd(itemNum, items);
+ SendProtocol(gamedatasend);
+ }
+
+ public void GetRoleCustomizeData(int iNumRole, List aRoleIDs)
+ {
+ if (iNumRole <= 0 || aRoleIDs == null || aRoleIDs.Count == 0) return;
+
+ int iNumLimit = 240;
+ int iCount = 0;
+
+ while (iCount < iNumRole)
+ {
+ getcustomdata p = new();
+ p.Roleid = _selectedRole.roleid;
+
+ int iNumSend = iNumLimit;
+ if (iCount + iNumLimit > iNumRole)
+ iNumSend = iNumRole - iCount;
+
+ for (int i = 0; i < iNumSend; i++)
+ p.playerlist.Add(aRoleIDs[iCount + i]);
+
+ SendProtocol(p);
+
+ iCount += iNumSend;
+ }
+ }
+ public void c2s_SendCmdEmoteAction(uint wPose)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateEmoteActionCmd((int)wPose);
+ SendProtocol(gamedatasend);
+ }
+ public void c2s_SendCmdTaskNotify(byte[] pData, uint dwDataSize)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateTaskNotifyCmd( pData, dwDataSize);
+ BMLogger.Log($"[MH Task] c2s_SendCmdTaskNotify Command ID : {pData[0]} Size: {dwDataSize}");
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdStandUp()
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.STAND_UP);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdAutoTeamSetGoal(int type, int goal_id, int op)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateAutoTeamSetGoalCommand(type,goal_id, op);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_CmdGoto(float x, float y, float z)
+ {
+ c2s_SendCmdGoto(x, y, z);
+ }
+
+ // Send C2S::GOTO command data
+ void c2s_SendCmdGoto(float x, float y, float z)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateGoToCommed( x, y, z);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdUseItem(byte byPackage, byte bySlot, int tid, byte byCount)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateUseItemCmd(byPackage, bySlot, tid, byCount);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdGetExtProps()
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.GET_EXT_PROP);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdGivePresent(int roleid, int mail_id, int goods_id, int goods_index, int goods_slot)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateGivePresentCmd(roleid, mail_id, goods_id, goods_index, goods_slot);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdEnterSanctuary(int id)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateEnterSanctuaryCmd(id);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdEnterInstance(int iTransIdx, int idInst)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateEnterInstanceCmd(iTransIdx, idInst);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdActiveRushFly(bool bActive)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateActiveRushFlyCmd(bActive);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdPetCtrl(int idTarget, int cmd, byte[] pParamBuf, int iParamLen)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreatePetCtrlCmd(idTarget, cmd, pParamBuf, iParamLen);
+ SendProtocol(gamedatasend);
+ }
+
+ public void c2s_SendCmdQueryFactionPVPInfo(int faction_id)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateQueryFactionPVPInfo(faction_id);
+ SendProtocol(gamedatasend);
+ }
+ public void c2s_SendCmdNPCSevEmbed(ushort wStoneIdx, ushort wEquipIdx, int tidStone, int tidEquip)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateNPCSevEmbedCmd(wStoneIdx, wEquipIdx, tidStone, tidEquip);
+ SendProtocol(gamedatasend);
+ }
+ public void c2s_SendCmdGetItemInfo(byte byPackage, int bySlot)
+ {
+ gamedatasend gamedatasend = new gamedatasend();
+ gamedatasend.Data = C2SCommandFactory.CreateGetItemInfoCmd(byPackage, bySlot);
+ SendProtocol(gamedatasend);
+ }
+ }
}
\ No newline at end of file
From 1cd4375081c23e8373e4a0124df5b2bfd7f84347 Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Thu, 22 Jan 2026 10:04:13 +0700
Subject: [PATCH 05/17] Add roles equipment and make sure not null able while
encode
---
.../CSNetwork/Protocols/rpcdata/GRoleInventory.cs | 3 ++-
.../CSNetwork/Protocols/rpcdata/RoleInfo.cs | 15 ++++++++-------
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs
index a9d2a545ef..5dd802d59e 100644
--- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs
+++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/GRoleInventory.cs
@@ -35,7 +35,8 @@ namespace CSNetwork.Protocols.RPCData
os.Write(pos);
os.Write(count);
os.Write(max_count);
- os.Write(data);
+ // Server-side expects an Octets field here; null will crash encoding.
+ os.Write(data ?? new Octets());
os.Write(proctype);
os.Write(expire_date);
os.Write(guid1);
diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs
index 2929615f2f..ec05255c04 100644
--- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs
+++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/rpcdata/RoleInfo.cs
@@ -69,9 +69,10 @@ namespace CSNetwork.Protocols.RPCData
os.Write(occupation);
os.Write(level);
os.Write(level2);
- os.Write(name);
- os.Write(custom_data);
- os.WriteList(equipment);
+ // Avoid null Octets/List crashing protocol.Encode()
+ os.Write(name ?? new Octets());
+ os.Write(custom_data ?? new Octets());
+ os.WriteList(equipment ?? new List());
os.Write(status);
os.Write(delete_time);
os.Write(create_time);
@@ -80,12 +81,12 @@ namespace CSNetwork.Protocols.RPCData
os.Write(posy);
os.Write(posz);
os.Write(worldtag);
- os.Write(custom_status);
- os.Write(charactermode);
+ os.Write(custom_status ?? new Octets());
+ os.Write(charactermode ?? new Octets());
os.Write(referrer_role);
os.Write(cash_add);
- os.Write(reincarnation_data);
- os.Write(realm_data);
+ os.Write(reincarnation_data ?? new Octets());
+ os.Write(realm_data ?? new Octets());
}
public void Unmarshal(OctetsStream os)
From 1d680be52ee0863a468203031a4c05d71c8f91bb Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Thu, 22 Jan 2026 10:04:43 +0700
Subject: [PATCH 06/17] Add protocol createrole_re
---
.../CSNetwork/Protocols/createrole_re.cs | 58 +++++++++++++++++++
.../CSNetwork/Protocols/createrole_re.cs.meta | 2 +
2 files changed, 60 insertions(+)
create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole_re.cs
create mode 100644 Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole_re.cs.meta
diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole_re.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole_re.cs
new file mode 100644
index 0000000000..fccf37d8b0
--- /dev/null
+++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole_re.cs
@@ -0,0 +1,58 @@
+using System;
+using CSNetwork.Protocols.RPCData;
+
+namespace CSNetwork.Protocols
+{
+ public class createrole_re : Protocol
+ {
+ public int result { get; set; }
+ public int roleid { get; set; }
+ public uint localsid { get; set; }
+ public RoleInfo roleinfo { get; set; }
+ public int refretcode { get; set; }
+
+ public createrole_re() : base(ProtocolType.PROTOCOL_CREATEROLE_RE)
+ {
+ roleinfo = new RoleInfo();
+ }
+
+ public override Protocol Clone() => new createrole_re
+ {
+ result = result,
+ roleid = roleid,
+ localsid = localsid,
+ roleinfo = roleinfo?.Clone(),
+ refretcode = refretcode
+ };
+
+ public override void Marshal(OctetsStream os)
+ {
+ os.Write(result);
+ os.Write(roleid);
+ os.Write(localsid);
+ if (roleinfo != null)
+ {
+ roleinfo.Marshal(os);
+ }
+ else
+ {
+ new RoleInfo().Marshal(os);
+ }
+ os.Write(refretcode);
+ }
+
+ public override void Unmarshal(OctetsStream os)
+ {
+ result = os.ReadInt32();
+ roleid = os.ReadInt32();
+ localsid = os.ReadUInt32();
+ roleinfo = new RoleInfo();
+ roleinfo.Unmarshal(os);
+ refretcode = os.ReadInt32();
+ }
+
+ public override int PriorPolicy() => 101;
+
+ public override bool SizePolicy(int size) => size <= 8192;
+ }
+}
diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole_re.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole_re.cs.meta
new file mode 100644
index 0000000000..9dfcaf18de
--- /dev/null
+++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole_re.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 3640555d366b4e34bbefbbf040f7f339
\ No newline at end of file
From 9877c1eb9898bbf1835cfb4ed2cdfe2c2e061214 Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Thu, 22 Jan 2026 10:06:51 +0700
Subject: [PATCH 07/17] Update createrole protocols data
---
.../Network/CSNetwork/Protocols/createrole.cs | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs
index 5bfe6615bf..9f7019acfb 100644
--- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs
+++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/createrole.cs
@@ -1,23 +1,27 @@
using System;
using System.Collections.Generic;
+using CSNetwork.Protocols.RPCData;
namespace CSNetwork.Protocols
{
public class createrole : Protocol
{
public int Userid { get; set; }
- public int Localsid { get; set; }
+ public uint Localsid { get; set; }
+ public RoleInfo Roleinfo { get; set; }
public Octets Referid { get; set; }
public createrole() : base(ProtocolType.PROTOCOL_CREATEROLE)
{
Referid = new Octets();
+ Roleinfo = new RoleInfo();
}
public override Protocol Clone() => new createrole
{
Userid = Userid,
Localsid = Localsid,
+ Roleinfo = Roleinfo?.Clone(),
Referid = new Octets(Referid.ToArray())
};
@@ -25,13 +29,23 @@ namespace CSNetwork.Protocols
{
os.Write(Userid);
os.Write(Localsid);
+ if (Roleinfo != null)
+ {
+ Roleinfo.Marshal(os);
+ }
+ else
+ {
+ new RoleInfo().Marshal(os);
+ }
os.Write(Referid);
}
public override void Unmarshal(OctetsStream os)
{
Userid = os.ReadInt32();
- Localsid = os.ReadInt32();
+ Localsid = os.ReadUInt32();
+ Roleinfo = new RoleInfo();
+ Roleinfo.Unmarshal(os);
Referid = os.ReadOctets();
}
From c9ba22823d0a05c81948ce3b67faedd0e162304b Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Thu, 22 Jan 2026 10:07:09 +0700
Subject: [PATCH 08/17] Add CreateRoleAsync
---
Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs
index 4db362886e..a23f1aa2af 100644
--- a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs
+++ b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs
@@ -1,4 +1,4 @@
-using BrewMonster;
+using BrewMonster;
using BrewMonster.Common;
using CSNetwork;
using CSNetwork.C2SCommand;
@@ -171,6 +171,12 @@ namespace BrewMonster.Network
{
Instance._gameSession.SelectRoleAsync(roleInfo, callback);
}
+
+ public static void CreateRoleAsync(RoleInfo roleInfo, Octets referId, Action callback = null)
+ {
+ Instance._gameSession.CreateRoleAsync(roleInfo, referId, callback);
+ }
+
public static void EnterWorldAsync(RoleInfo roleInfo, Action callback = null)
{
Debug.Log("EnterWorldAsync !!!!! nay ");
From 82c33c5d6e730339104abf7a17d215224261683d Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Thu, 22 Jan 2026 10:07:37 +0700
Subject: [PATCH 09/17] Add OnCreateCharacterComplete update ui, data
---
.../PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs
index 0664d235eb..577a0d0b08 100644
--- a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs
+++ b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs
@@ -47,7 +47,7 @@ namespace BrewMonster.UI
{
if (_roleInfos != null)
{
- _selectCharacterScreen.InitScreen(_roleInfos, OnClickSelectCharacter);
+ _selectCharacterScreen.InitScreen(_roleInfos, OnClickSelectCharacter, OnCreateCharacterComplete);
_roleInfos = null;
}
@@ -110,6 +110,16 @@ namespace BrewMonster.UI
UnityGameSession.SelectRoleAsync(roleInfo, OnSelectRoleComplete);
}
+ ///
+ /// Callback when a new character is created.
+ /// Refreshes the role list and shows the character selection screen.
+ ///
+ private void OnCreateCharacterComplete()
+ {
+ BMLogger.Log("Character created, refreshing role list...");
+ UnityGameSession.GetRoleListAsync(OnGetRoleListComplete);
+ }
+
private void OnSelectRoleComplete(RoleInfo roleInfo)
{
context.Post(_ =>
From 649537a4ce9ced73765bb3d6e1bd4fe21a49977d Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Thu, 22 Jan 2026 10:08:37 +0700
Subject: [PATCH 10/17] Add Create role UI prefab
---
Assets/Prefabs/UI/CreateCharacterUI.prefab | 3208 +++++++++++++++++
.../Prefabs/UI/CreateCharacterUI.prefab.meta | 7 +
2 files changed, 3215 insertions(+)
create mode 100644 Assets/Prefabs/UI/CreateCharacterUI.prefab
create mode 100644 Assets/Prefabs/UI/CreateCharacterUI.prefab.meta
diff --git a/Assets/Prefabs/UI/CreateCharacterUI.prefab b/Assets/Prefabs/UI/CreateCharacterUI.prefab
new file mode 100644
index 0000000000..9b7b624e5d
--- /dev/null
+++ b/Assets/Prefabs/UI/CreateCharacterUI.prefab
@@ -0,0 +1,3208 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &8390788714743709
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2081568622547712671}
+ - component: {fileID: 6631151748195985363}
+ - component: {fileID: 4014334596545791648}
+ m_Layer: 5
+ m_Name: role_name
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2081568622547712671
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8390788714743709}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 6177334072438772605}
+ 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: 48, y: 0}
+ m_SizeDelta: {x: 200, y: 50}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6631151748195985363
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8390788714743709}
+ m_CullTransparentMesh: 1
+--- !u!114 &4014334596545791648
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8390788714743709}
+ 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: "Ki\u1EBFm kh\xE1ch"
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, 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: 33.07
+ m_fontSizeBase: 33.07
+ 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_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 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!1 &718756348298879219
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8094456115949331966}
+ - component: {fileID: 4958874393053821805}
+ - component: {fileID: 7027918029303066092}
+ m_Layer: 5
+ m_Name: icon_active
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!224 &8094456115949331966
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 718756348298879219}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 6177334072438772605}
+ 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: 48, y: 3}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4958874393053821805
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 718756348298879219}
+ m_CullTransparentMesh: 1
+--- !u!114 &7027918029303066092
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 718756348298879219}
+ 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: 21300000, guid: 360017f7378d2204da559134abb90341, type: 3}
+ 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!1 &1048885868194935103
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6769468973296223763}
+ - component: {fileID: 4758988310349555088}
+ 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 &6769468973296223763
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1048885868194935103}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 5278512018284549547}
+ - {fileID: 6315038336276611553}
+ m_Father: {fileID: 7659486194848820281}
+ 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.4999981}
+ m_SizeDelta: {x: -20, y: -13}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &4758988310349555088
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1048885868194935103}
+ 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 &1112119422135787773
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7659486194848820281}
+ - component: {fileID: 4230293974304074455}
+ - component: {fileID: 6093471340810202217}
+ - component: {fileID: 5515740729786715052}
+ m_Layer: 5
+ m_Name: role_name_inputfield
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7659486194848820281
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1112119422135787773}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 6769468973296223763}
+ m_Father: {fileID: 3790628511968890201}
+ 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: 497.2, y: 0}
+ m_SizeDelta: {x: 581.9843, y: 56.3131}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4230293974304074455
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1112119422135787773}
+ m_CullTransparentMesh: 1
+--- !u!114 &6093471340810202217
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1112119422135787773}
+ 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: 21300000, guid: 2a46ed30972da3f4495c8be9fa6df7a4, type: 3}
+ 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!114 &5515740729786715052
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1112119422135787773}
+ 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: 6093471340810202217}
+ m_TextViewport: {fileID: 6769468973296223763}
+ m_TextComponent: {fileID: 168213662849426957}
+ m_Placeholder: {fileID: 2381979708607754795}
+ 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.4
+ 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: 1, g: 1, b: 1, a: 1}
+ m_Text:
+ m_CaretBlinkRate: 0.85
+ m_CaretWidth: 1
+ m_ReadOnly: 0
+ m_RichText: 1
+ m_GlobalFontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_OnFocusSelectAll: 1
+ m_ResetOnDeActivation: 1
+ m_KeepTextSelectionVisible: 0
+ m_RestoreOriginalTextOnEscape: 1
+ m_isRichTextEditingAllowed: 0
+ m_LineLimit: 0
+ isAlert: 0
+ m_InputValidator: {fileID: 0}
+ m_ShouldActivateOnSelect: 1
+--- !u!1 &1248738765565036387
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5153513332544726621}
+ - component: {fileID: 8736218414010544263}
+ - component: {fileID: 1089717293345953834}
+ m_Layer: 5
+ m_Name: icon_inactive
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5153513332544726621
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1248738765565036387}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 4761143030539173368}
+ 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: 49, y: 0}
+ m_SizeDelta: {x: 71, y: 71}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8736218414010544263
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1248738765565036387}
+ m_CullTransparentMesh: 1
+--- !u!114 &1089717293345953834
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1248738765565036387}
+ 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: 21300000, guid: 580a6d6ccb718fe449afc60ac07f453f, type: 3}
+ 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!1 &1325716031922190994
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2122407543136953454}
+ - component: {fileID: 6957107297210416400}
+ - component: {fileID: 4988083158244363561}
+ m_Layer: 5
+ m_Name: icon_active
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!224 &2122407543136953454
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1325716031922190994}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 4761143030539173368}
+ 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: 48, y: 3}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6957107297210416400
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1325716031922190994}
+ m_CullTransparentMesh: 1
+--- !u!114 &4988083158244363561
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1325716031922190994}
+ 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: 21300000, guid: 360017f7378d2204da559134abb90341, type: 3}
+ 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!1 &1672211900584612212
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 491737577690776531}
+ - component: {fileID: 640202854220044291}
+ - component: {fileID: 230279262789054634}
+ m_Layer: 5
+ m_Name: icon_inactive
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &491737577690776531
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1672211900584612212}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 5205153028748836693}
+ 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: 36.5, y: 0.5}
+ m_SizeDelta: {x: 73, y: 73}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &640202854220044291
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1672211900584612212}
+ m_CullTransparentMesh: 1
+--- !u!114 &230279262789054634
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1672211900584612212}
+ 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: 21300000, guid: 8b9007911471aa34ab3cf2e67ff20db5, type: 3}
+ 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!1 &1774210792796478175
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6177334072438772605}
+ - component: {fileID: 4919638587972198863}
+ - component: {fileID: 8951551404941296338}
+ - component: {fileID: 2636794002453100072}
+ m_Layer: 5
+ m_Name: professional_1
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &6177334072438772605
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1774210792796478175}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 4960726430358965602}
+ - {fileID: 8094456115949331966}
+ - {fileID: 2081568622547712671}
+ m_Father: {fileID: 5320464328943649663}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 148, y: -48}
+ m_SizeDelta: {x: 296, y: 96}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4919638587972198863
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1774210792796478175}
+ m_CullTransparentMesh: 1
+--- !u!114 &8951551404941296338
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1774210792796478175}
+ 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: 21300000, guid: 7668deb8034f4e44c82183ad38ea5cab, type: 3}
+ 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!114 &2636794002453100072
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1774210792796478175}
+ 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: 8951551404941296338}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &1781843053649909282
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3062450172250455840}
+ - component: {fileID: 622960696705685891}
+ - component: {fileID: 6203485904433900301}
+ - component: {fileID: 2842754363616627556}
+ m_Layer: 5
+ m_Name: CreateCharacterUI
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!224 &3062450172250455840
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1781843053649909282}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 662315717489781323}
+ - {fileID: 3340562194466076090}
+ - {fileID: 3790628511968890201}
+ m_Father: {fileID: 0}
+ 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: 960, y: 0}
+ m_SizeDelta: {x: 1920, y: 1080}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &622960696705685891
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1781843053649909282}
+ m_CullTransparentMesh: 1
+--- !u!114 &6203485904433900301
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1781843053649909282}
+ 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.4324789, g: 0.6981132, b: 0.45709762, 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: 21300000, guid: 6435e919591072d4cb2f16690fff15fd, type: 3}
+ 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!114 &2842754363616627556
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1781843053649909282}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: aa9de023137e92348983cee3c59d620b, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ professionSelectionPanel: {fileID: 6078595199063207717}
+ professionButtons:
+ - {fileID: 2636794002453100072}
+ - {fileID: 7693531075628788285}
+ maleGenderButton: {fileID: 4799972544958627575}
+ femaleGenderButton: {fileID: 975101812964933518}
+ nameInputField: {fileID: 5515740729786715052}
+ confirmButton: {fileID: 2058345032894912639}
+ cancelButton: {fileID: 3605310658127377634}
+ backButton: {fileID: 3605310658127377634}
+--- !u!1 &2083311518824170680
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4761143030539173368}
+ - component: {fileID: 280833489724581650}
+ - component: {fileID: 8756397176823478499}
+ - component: {fileID: 7693531075628788285}
+ m_Layer: 5
+ m_Name: professional_2
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4761143030539173368
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2083311518824170680}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 5153513332544726621}
+ - {fileID: 6807838195513483817}
+ - {fileID: 2122407543136953454}
+ m_Father: {fileID: 5320464328943649663}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 148, y: -141.38}
+ m_SizeDelta: {x: 296, y: 90.76}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &280833489724581650
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2083311518824170680}
+ m_CullTransparentMesh: 1
+--- !u!114 &8756397176823478499
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2083311518824170680}
+ 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: 21300000, guid: 7668deb8034f4e44c82183ad38ea5cab, type: 3}
+ 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!114 &7693531075628788285
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2083311518824170680}
+ 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: 8756397176823478499}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &2310474316802759764
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5374954078487863948}
+ - component: {fileID: 1719391438410906740}
+ - component: {fileID: 4275644596711287807}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5374954078487863948
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2310474316802759764}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 5574759145337294436}
+ 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!222 &1719391438410906740
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2310474316802759764}
+ m_CullTransparentMesh: 1
+--- !u!114 &4275644596711287807
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2310474316802759764}
+ 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: "V\xE0o game"
+ 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: 40.04
+ m_fontSizeBase: 40.04
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ 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_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 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!1 &2512330218384385107
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5278512018284549547}
+ - component: {fileID: 1067589639299911659}
+ - component: {fileID: 2381979708607754795}
+ - component: {fileID: 3540016404734025586}
+ m_Layer: 5
+ m_Name: Placeholder
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5278512018284549547
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2512330218384385107}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 6769468973296223763}
+ 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!222 &1067589639299911659
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2512330218384385107}
+ m_CullTransparentMesh: 1
+--- !u!114 &2381979708607754795
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2512330218384385107}
+ 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: "T\xEAn nh\xE2n v\u1EADt: "
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 2164260863
+ m_fontColor: {r: 1, g: 1, b: 1, 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: 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_TextWrappingMode: 0
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 1
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 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!114 &3540016404734025586
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2512330218384385107}
+ 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!1 &3437005986705933597
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1160326660585609788}
+ - component: {fileID: 109116229138551521}
+ - component: {fileID: 2280847149185189015}
+ m_Layer: 5
+ m_Name: class_icon
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!224 &1160326660585609788
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3437005986705933597}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 3179460180582529441}
+ 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: 0, y: -9.9591}
+ m_SizeDelta: {x: 129.3735, y: 133.1912}
+ m_Pivot: {x: 0, y: 0.5}
+--- !u!222 &109116229138551521
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3437005986705933597}
+ m_CullTransparentMesh: 1
+--- !u!114 &2280847149185189015
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3437005986705933597}
+ 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: 21300000, guid: 1035be3522a507342bb22da8b150a085, type: 3}
+ 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!1 &3470728983594275925
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 65737090144538494}
+ - component: {fileID: 7376985028958001385}
+ - component: {fileID: 5193774270334423469}
+ - component: {fileID: 4528945614220125928}
+ m_Layer: 5
+ m_Name: Viewport
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &65737090144538494
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3470728983594275925}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 5444603765313937912}
+ m_Father: {fileID: 662315717489781323}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 21.9049, y: 0}
+ m_SizeDelta: {x: -21.905, y: -17}
+ m_Pivot: {x: 0, y: 1}
+--- !u!222 &7376985028958001385
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3470728983594275925}
+ m_CullTransparentMesh: 1
+--- !u!114 &5193774270334423469
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3470728983594275925}
+ 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!114 &4528945614220125928
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3470728983594275925}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ShowMaskGraphic: 0
+--- !u!1 &4148386573984726202
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5444603765313937912}
+ - component: {fileID: 4021128748820168485}
+ - component: {fileID: 9135338494670472884}
+ m_Layer: 5
+ m_Name: Content
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5444603765313937912
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4148386573984726202}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 3179460180582529441}
+ m_Father: {fileID: 65737090144538494}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0.0009808608, y: -0.00012207031}
+ m_SizeDelta: {x: 0.024810791, y: -496.19458}
+ m_Pivot: {x: 0, y: 1}
+--- !u!114 &4021128748820168485
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4148386573984726202}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_HorizontalFit: 2
+ m_VerticalFit: 2
+--- !u!114 &9135338494670472884
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4148386573984726202}
+ 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!1 &4193010227581748059
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1646554803010815852}
+ - component: {fileID: 2785125418031747739}
+ - component: {fileID: 7446128724324928062}
+ - component: {fileID: 975101812964933518}
+ m_Layer: 5
+ m_Name: female
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1646554803010815852
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4193010227581748059}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 7334860836592130921}
+ - {fileID: 5707222451975290202}
+ m_Father: {fileID: 2878487454571584107}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 48, y: -48}
+ m_SizeDelta: {x: 73, y: 73}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2785125418031747739
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4193010227581748059}
+ m_CullTransparentMesh: 1
+--- !u!114 &7446128724324928062
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4193010227581748059}
+ 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}
+ 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!114 &975101812964933518
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4193010227581748059}
+ 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: 7446128724324928062}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &4540249127197054457
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5574759145337294436}
+ - component: {fileID: 2898114879765516419}
+ - component: {fileID: 8602224352980688478}
+ - component: {fileID: 2058345032894912639}
+ m_Layer: 5
+ m_Name: enter_game_btn
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5574759145337294436
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4540249127197054457}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 5374954078487863948}
+ m_Father: {fileID: 3790628511968890201}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 1, y: 0}
+ m_AnchorMax: {x: 1, y: 0}
+ m_AnchoredPosition: {x: -230, y: 100}
+ m_SizeDelta: {x: 356, y: 99}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2898114879765516419
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4540249127197054457}
+ m_CullTransparentMesh: 1
+--- !u!114 &8602224352980688478
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4540249127197054457}
+ 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: 21300000, guid: edd33299d4203c34e957ca4cc602468a, type: 3}
+ 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!114 &2058345032894912639
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4540249127197054457}
+ 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: 8602224352980688478}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &4969099180817430004
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8960665641685729916}
+ - component: {fileID: 102923781619534958}
+ - component: {fileID: 8882151816084338994}
+ - component: {fileID: 3605310658127377634}
+ m_Layer: 5
+ m_Name: back_btn
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &8960665641685729916
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4969099180817430004}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 3340562194466076090}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 60, y: -40}
+ m_SizeDelta: {x: 85, y: 92}
+ m_Pivot: {x: 0, y: 1}
+--- !u!222 &102923781619534958
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4969099180817430004}
+ m_CullTransparentMesh: 1
+--- !u!114 &8882151816084338994
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4969099180817430004}
+ 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: 21300000, guid: 052d4b5b3b147d04cbd00f737f5c7c53, type: 3}
+ 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!114 &3605310658127377634
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4969099180817430004}
+ 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: 8882151816084338994}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &5391439180725082175
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5320464328943649663}
+ - component: {fileID: 7291663382380867983}
+ - component: {fileID: 6419711286652083200}
+ - component: {fileID: 2135475441182516523}
+ m_Layer: 5
+ m_Name: role_info
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5320464328943649663
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5391439180725082175}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 6177334072438772605}
+ - {fileID: 4761143030539173368}
+ m_Father: {fileID: 3179460180582529441}
+ 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: 0.000015258789, y: -0.00049782}
+ m_SizeDelta: {x: 292.94, y: 186.76}
+ m_Pivot: {x: 1, y: 0.5}
+--- !u!222 &7291663382380867983
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5391439180725082175}
+ m_CullTransparentMesh: 1
+--- !u!114 &6419711286652083200
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5391439180725082175}
+ 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}
+ 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!114 &2135475441182516523
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5391439180725082175}
+ 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!1 &5692330930089829494
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8208655804674536352}
+ - component: {fileID: 4475579639231163097}
+ - component: {fileID: 692835898052317172}
+ m_Layer: 5
+ m_Name: class_icon_active
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &8208655804674536352
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5692330930089829494}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 3179460180582529441}
+ 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: 0, y: 0.00019932}
+ m_SizeDelta: {x: 181.2439, y: 169.59}
+ m_Pivot: {x: 0, y: 0.5}
+--- !u!222 &4475579639231163097
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5692330930089829494}
+ m_CullTransparentMesh: 1
+--- !u!114 &692835898052317172
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5692330930089829494}
+ 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: 21300000, guid: fdb98ca30632e61448b46108a087d36a, type: 3}
+ 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!1 &5884725784508133492
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3340562194466076090}
+ - component: {fileID: 7198558082643002807}
+ - component: {fileID: 908278602247732383}
+ m_Layer: 5
+ m_Name: TopBar
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3340562194466076090
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5884725784508133492}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 8960665641685729916}
+ m_Father: {fileID: 3062450172250455840}
+ 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: 440}
+ m_SizeDelta: {x: 0, y: -880}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7198558082643002807
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5884725784508133492}
+ m_CullTransparentMesh: 1
+--- !u!114 &908278602247732383
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5884725784508133492}
+ 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}
+ m_RaycastTarget: 0
+ 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!1 &6018145128272436399
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5205153028748836693}
+ - component: {fileID: 8544846000892974643}
+ - component: {fileID: 7235948033659465321}
+ - component: {fileID: 4799972544958627575}
+ m_Layer: 5
+ m_Name: male
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5205153028748836693
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6018145128272436399}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 491737577690776531}
+ - {fileID: 4379489455093079590}
+ m_Father: {fileID: 2878487454571584107}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 96.4, y: -98.4}
+ m_SizeDelta: {x: 73, y: 73}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8544846000892974643
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6018145128272436399}
+ m_CullTransparentMesh: 1
+--- !u!114 &7235948033659465321
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6018145128272436399}
+ 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}
+ 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!114 &4799972544958627575
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6018145128272436399}
+ 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: 7235948033659465321}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &6078595199063207717
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 662315717489781323}
+ - component: {fileID: 5071118244985131843}
+ - component: {fileID: 523072040516423982}
+ - component: {fileID: 1843485783967983031}
+ m_Layer: 5
+ m_Name: LeftPanel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &662315717489781323
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6078595199063207717}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 65737090144538494}
+ m_Father: {fileID: 3062450172250455840}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: -711.9674, y: -9.977295}
+ m_SizeDelta: {x: -1423.9348, y: -380.0454}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5071118244985131843
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6078595199063207717}
+ m_CullTransparentMesh: 1
+--- !u!114 &523072040516423982
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6078595199063207717}
+ 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}
+ 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!114 &1843485783967983031
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6078595199063207717}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Content: {fileID: 5444603765313937912}
+ m_Horizontal: 0
+ m_Vertical: 1
+ m_MovementType: 1
+ m_Elasticity: 0.1
+ m_Inertia: 1
+ m_DecelerationRate: 0.135
+ m_ScrollSensitivity: 1
+ m_Viewport: {fileID: 65737090144538494}
+ m_HorizontalScrollbar: {fileID: 0}
+ m_VerticalScrollbar: {fileID: 0}
+ m_HorizontalScrollbarVisibility: 0
+ m_VerticalScrollbarVisibility: 0
+ m_HorizontalScrollbarSpacing: 0
+ m_VerticalScrollbarSpacing: 0
+ m_OnValueChanged:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &6216116771940871072
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2878487454571584107}
+ m_Layer: 5
+ m_Name: GameObject
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2878487454571584107
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6216116771940871072}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1646554803010815852}
+ - {fileID: 5205153028748836693}
+ m_Father: {fileID: 3790628511968890201}
+ 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: 133.8, y: -0.0000094975}
+ m_SizeDelta: {x: 144.8128, y: 180.05}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &6633967389022179900
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6807838195513483817}
+ - component: {fileID: 3103898763934254231}
+ - component: {fileID: 505306259484599358}
+ m_Layer: 5
+ m_Name: role_name
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &6807838195513483817
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6633967389022179900}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 4761143030539173368}
+ 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: 48, y: 0}
+ m_SizeDelta: {x: 200, y: 50}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3103898763934254231
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6633967389022179900}
+ m_CullTransparentMesh: 1
+--- !u!114 &505306259484599358
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6633967389022179900}
+ 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: "Ph\xE1p s\u01B0"
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, 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: 33.07
+ m_fontSizeBase: 33.07
+ 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_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 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!1 &6704138441118319172
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6315038336276611553}
+ - component: {fileID: 1888424759676558704}
+ - component: {fileID: 168213662849426957}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &6315038336276611553
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6704138441118319172}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 6769468973296223763}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 77.96466, y: 0}
+ m_SizeDelta: {x: -155.9294, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1888424759676558704
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6704138441118319172}
+ m_CullTransparentMesh: 1
+--- !u!114 &168213662849426957
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6704138441118319172}
+ 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: "\u200B"
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, 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: 35.4
+ m_fontSizeBase: 35.4
+ 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_TextWrappingMode: 3
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 1
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 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!1 &7097602782219794028
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4379489455093079590}
+ - component: {fileID: 2920292207163727520}
+ - component: {fileID: 4901377013400912804}
+ m_Layer: 5
+ m_Name: icon_active
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!224 &4379489455093079590
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7097602782219794028}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 5205153028748836693}
+ 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: 36.5, y: 0}
+ m_SizeDelta: {x: 73, y: 73}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2920292207163727520
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7097602782219794028}
+ m_CullTransparentMesh: 1
+--- !u!114 &4901377013400912804
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7097602782219794028}
+ 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: 21300000, guid: 74ac96ef496119c40b8181567132fe89, type: 3}
+ 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!1 &7559402666030530865
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4960726430358965602}
+ - component: {fileID: 7968798915149800718}
+ - component: {fileID: 1480011215069780661}
+ m_Layer: 5
+ m_Name: icon_inactive
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4960726430358965602
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7559402666030530865}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 6177334072438772605}
+ 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: 49, y: 0}
+ m_SizeDelta: {x: 71, y: 71}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7968798915149800718
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7559402666030530865}
+ m_CullTransparentMesh: 1
+--- !u!114 &1480011215069780661
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7559402666030530865}
+ 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: 21300000, guid: c632a663a74e3fe45b6c207d9e32f869, type: 3}
+ 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!1 &7665884498564744607
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5707222451975290202}
+ - component: {fileID: 506957418232537750}
+ - component: {fileID: 1414496684982568510}
+ m_Layer: 5
+ m_Name: icon_active
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!224 &5707222451975290202
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7665884498564744607}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1646554803010815852}
+ 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: 36.5, y: 0}
+ m_SizeDelta: {x: 73, y: 73}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &506957418232537750
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7665884498564744607}
+ m_CullTransparentMesh: 1
+--- !u!114 &1414496684982568510
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7665884498564744607}
+ 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: 21300000, guid: 88bac221127946f44a420ae289ac0b18, type: 3}
+ 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!1 &7856033654834726446
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3179460180582529441}
+ - component: {fileID: 946827543569852510}
+ - component: {fileID: 4032688252858390583}
+ - component: {fileID: 163891533284676085}
+ m_Layer: 5
+ m_Name: class_1
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3179460180582529441
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7856033654834726446}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1160326660585609788}
+ - {fileID: 8208655804674536352}
+ - {fileID: 5320464328943649663}
+ m_Father: {fileID: 5444603765313937912}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 237.0925, y: -93.380005}
+ m_SizeDelta: {x: 474.185, y: 186.76}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &946827543569852510
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7856033654834726446}
+ m_CullTransparentMesh: 1
+--- !u!114 &4032688252858390583
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7856033654834726446}
+ 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}
+ 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!114 &163891533284676085
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7856033654834726446}
+ 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: 4032688252858390583}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &8481623540506958494
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7334860836592130921}
+ - component: {fileID: 7108267208191054717}
+ - component: {fileID: 7564845971328356849}
+ m_Layer: 5
+ m_Name: icon_inactive
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7334860836592130921
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8481623540506958494}
+ 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_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1646554803010815852}
+ 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: 36.5, y: 0}
+ m_SizeDelta: {x: 73, y: 73}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7108267208191054717
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8481623540506958494}
+ m_CullTransparentMesh: 1
+--- !u!114 &7564845971328356849
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8481623540506958494}
+ 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: 21300000, guid: 31615242695e9d0489f8a728496657c6, type: 3}
+ 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!1 &8955858844608837945
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3790628511968890201}
+ - component: {fileID: 8932853420802939501}
+ - component: {fileID: 5567669285863963651}
+ m_Layer: 5
+ m_Name: BottomPanel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3790628511968890201
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8955858844608837945}
+ 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_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 5574759145337294436}
+ - {fileID: 7659486194848820281}
+ - {fileID: 2878487454571584107}
+ m_Father: {fileID: 3062450172250455840}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 1, y: 0}
+ m_AnchorMax: {x: 1, y: 0}
+ m_AnchoredPosition: {x: -711.96497, y: 90.024994}
+ m_SizeDelta: {x: 1423.9299, y: 180.04999}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8932853420802939501
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8955858844608837945}
+ m_CullTransparentMesh: 1
+--- !u!114 &5567669285863963651
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8955858844608837945}
+ 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}
+ 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
diff --git a/Assets/Prefabs/UI/CreateCharacterUI.prefab.meta b/Assets/Prefabs/UI/CreateCharacterUI.prefab.meta
new file mode 100644
index 0000000000..737ccc39e1
--- /dev/null
+++ b/Assets/Prefabs/UI/CreateCharacterUI.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: fd9306e92f60c254aba22e7fa622d485
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
From 7df843880318f3817c7370e80f76613885dca6ac Mon Sep 17 00:00:00 2001
From: HungDK <>
Date: Thu, 22 Jan 2026 16:14:05 +0700
Subject: [PATCH 11/17] Add create character bg
---
.../Resources/UI/Login/载入1280-15.jpg | Bin 0 -> 1173623 bytes
.../Resources/UI/Login/载入1280-15.jpg.meta | 130 ++++++++++++++++++
2 files changed, 130 insertions(+)
create mode 100644 Assets/PerfectWorld/Resources/UI/Login/载入1280-15.jpg
create mode 100644 Assets/PerfectWorld/Resources/UI/Login/载入1280-15.jpg.meta
diff --git a/Assets/PerfectWorld/Resources/UI/Login/载入1280-15.jpg b/Assets/PerfectWorld/Resources/UI/Login/载入1280-15.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..637d40be2dddc959469031c24dba5e0f97e84c71
GIT binary patch
literal 1173623
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