diff --git a/Assets/PerfectWorld/Resources/UI/LoginScreenCharacterRT.renderTexture b/Assets/PerfectWorld/Resources/UI/LoginScreenCharacterRT.renderTexture index 4accc2f58e..bcbb5508fb 100644 --- a/Assets/PerfectWorld/Resources/UI/LoginScreenCharacterRT.renderTexture +++ b/Assets/PerfectWorld/Resources/UI/LoginScreenCharacterRT.renderTexture @@ -12,8 +12,8 @@ RenderTexture: Hash: 00000000000000000000000000000000 m_IsAlphaChannelOptional: 0 serializedVersion: 6 - m_Width: 512 - m_Height: 512 + m_Width: 1024 + m_Height: 1024 m_AntiAliasing: 1 m_MipCount: -1 m_DepthStencilFormat: 90 diff --git a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs index c449c659f8..70749e0773 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs @@ -3159,6 +3159,8 @@ namespace BrewMonster try { await SetPlayerModel((byte)m_iProfession, (byte)m_iGender); + + // load all equipments } catch (Exception ex) { diff --git a/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs b/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs index db2433f3d4..940d8c3160 100644 --- a/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs +++ b/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs @@ -1,7 +1,7 @@ using BrewMonster.Scripts; using System.Threading.Tasks; using UnityEngine; -using CSNetwork.GPDataType; +using Cysharp.Threading.Tasks; namespace BrewMonster { public class CECClonePlayer : CECPlayer @@ -37,6 +37,7 @@ namespace BrewMonster } return false; } + protected async Task LoadFrom(CECHostPlayer player, bool atOnce) { int i = 0; @@ -87,6 +88,7 @@ namespace BrewMonster return await Load(player, atOnce); } + protected async Task LoadFrom(EC_ElsePlayer player, bool atOnce){ // Create equipments for (int i=0; i < InventoryConst.SIZE_ALL_EQUIPIVTR; i++){ @@ -97,6 +99,7 @@ namespace BrewMonster } return await Load(player, atOnce); } + protected async Task Load(CECPlayer player, bool atOnce){ player.CloneSimplePropertyTo(this); OnCloneSimpleProperty(); @@ -104,24 +107,205 @@ namespace BrewMonster BMLogger.LogError("CECCloneElsePlayer::Load, Failed to load skeleton."); return false; } + await LoadAllPlayerEquipments(); SetNewExtendStates(0, m_aExtStates, OBJECT_EXT_STATE_COUNT); if (player.GetOriginalShapeID() != 0){ await TransformShape(player.GetShapeMask(), true); } return true; - } + } + protected virtual bool ShouldLoadEquipment(int index) { return true; } + protected virtual void OnCloneSimpleProperty(){} + public virtual CECModel GetRenderModel(){ return m_pPlayerCECModel; //m_pPetModel ? m_pPetModel : m_pPlayerModel; //Todo: add pet model when implement pet? system } + public void PlayActionByName(string szActName){ m_pActionController.PlayNonSkillActionWithName((int)PLAYER_ACTION_TYPE.ACT_MAX, szActName); } + + + private async UniTask LoadAllPlayerEquipments() + { + var elemendataman = BrewMonster.ElementDataManProvider.GetElementDataMan(); + + DATA_TYPE DataType = default; + bool useDefaultUpper = true; + bool useDefaultLower = true; + bool useDefaultWrist = true; + bool useDefaultFoot = true; + + int equipment = 0; + + for(int i = 0; i < m_aEquips.Length; i++) + { + equipment = m_aEquips[i]; + + var equipData = elemendataman.get_data_ptr((uint)equipment, ID_SPACE.ID_SPACE_ESSENCE, ref DataType); + + if (equipData == null) + { + switch (i) + { + case InventoryConst.EQUIPIVTR_BODY: + useDefaultUpper = true; + break; + case InventoryConst.EQUIPIVTR_LEG: + useDefaultLower = true; + break; + case InventoryConst.EQUIPIVTR_WRIST: + useDefaultWrist = true; + break; + case InventoryConst.EQUIPIVTR_FOOT: + useDefaultFoot = true; + break; + } + continue; + } + + switch (DataType) + { + case DATA_TYPE.DT_WEAPON_ESSENCE: + var weaponData = (WEAPON_ESSENCE)equipData; + + string fileModelRight = AFile.NormalizePath(weaponData.FileModelRight, true).ToLower(); + string fileModelLeft = AFile.NormalizePath(weaponData.FileModelLeft, true).ToLower(); + + GameObject weaponPrefab = null; + if (!string.IsNullOrEmpty(fileModelRight)) + { + weaponPrefab = await AddressableManager.Instance.LoadPrefabAsync(fileModelRight); + var weaponObject = Instantiate(weaponPrefab); + if (weaponObject != null) + { + weaponObject.transform.SetParent(FindChildObjectRecursive(transform, _hh_right_hand_weapon).transform); + weaponObject.transform.localPosition = weaponPrefab.transform.localPosition; + weaponObject.transform.localRotation = weaponPrefab.transform.localRotation; + weaponObject.transform.localScale = Vector3.one; + weaponObject.SetActive(true); + } + } + + if (!string.IsNullOrEmpty(fileModelLeft)) + { + weaponPrefab = await AddressableManager.Instance.LoadPrefabAsync(fileModelLeft); + var weaponObject = Instantiate(weaponPrefab); + if (weaponObject != null) + { + weaponObject.transform.SetParent(FindChildObjectRecursive(transform, _hh_left_hand_weapon).transform); + weaponObject.transform.localPosition = weaponPrefab.transform.localPosition; + weaponObject.transform.localRotation = weaponPrefab.transform.localRotation; + weaponObject.transform.localScale = Vector3.one; + weaponObject.SetActive(true); + } + } + break; + case DATA_TYPE.DT_ARMOR_ESSENCE: + var pArmor = (ARMOR_ESSENCE)equipData; + var nLocation = pArmor.equip_location; + // BMLogger.Log($"ShowEquipments():: Armor Essence: {pArmor.RealName}"); + + var armorSkinPath = _GenEquipmentSkinPath(m_iProfession, m_iGender, pArmor.RealName); + if (!armorSkinPath.EndsWith(".ecm")) + { + armorSkinPath += ".ecm"; + } + var armorPrefab = await AddressableManager.Instance.LoadPrefabAsync(armorSkinPath); + if (armorPrefab != null) + { + var armorObject = Instantiate(armorPrefab); + armorObject.transform.SetParent(GetSkeletonBuilder()?.transform); + armorObject.transform.localPosition = Vector3.zero; + armorObject.transform.localRotation = Quaternion.identity; + armorObject.transform.localScale = Vector3.one; + + var skinnedMeshRenderer = armorObject.GetComponent(); + var skinnedMeshRenderereFromDataList = armorObject.GetComponentsInChildren(); + foreach (var skinnedMeshRenderereFromData in skinnedMeshRenderereFromDataList) + { + if (skinnedMeshRenderereFromData != null) + { + skinnedMeshRenderereFromData._skinnedMeshRenderer.bones = GetSkeletonBuilder().GetBones(skinnedMeshRenderereFromData.BoneNames); + skinnedMeshRenderereFromData._skinnedMeshRenderer.rootBone = skinnedMeshRenderereFromData._skinnedMeshRenderer.bones[^1]; + } + } + + // disable/enable the default equipment + switch (nLocation) + { + case (uint)CECPlayer.SkinIndex.SKIN_UPPER_BODY_INDEX: + useDefaultUpper = false; + break; + case (uint)CECPlayer.SkinIndex.SKIN_LOWER_INDEX: + useDefaultLower = false; + break; + case (uint)CECPlayer.SkinIndex.SKIN_WRIST_INDEX: + useDefaultWrist = false; + break; + case (uint)CECPlayer.SkinIndex.SKIN_FOOT_INDEX: + useDefaultFoot = false; + break; + } + } + break; + //TODO: Handle Wings later + // case DATA_TYPE.DT_WINGMANWING_ESSENCE: + // m_wingType = enumWingType.WINGTYPE_WING; + // //ChangeWing(pResult, static_cast(pEquip)->file_model); + // var pWingData = (WINGMANWING_ESSENCE)equipData; + // //string path1 = "models/players/通用装备/翅膀/天鹅之翼/天鹅之翼_Test.ecm"; + // //var pWingPrefab = await AddressableManager.Instance.LoadPrefabAsync(path1); + // var pWingPrefab = await AddressableManager.Instance.LoadPrefabAsync(pWingData.FileModel.ToLower().Replace('\\', '/')); + // //Transform parentWing = FindChildRecursive(_pPlayerModel.transform, "HH_chibang"); + // if(pWingPrefab != null) + // { + // var pflySwordObject = Instantiate(pWingPrefab).transform; + // pflySwordObject.parent = m_pPlayerCECModel.m_skeletonBuilder.GetHook("HH_chibang").transform; + // pflySwordObject.localPosition = Vector3.zero; + // pflySwordObject.localRotation = Quaternion.identity; + // pflySwordObject.localScale = Vector3.one; + + // m_Wing = pflySwordObject.transform; + + // m_Wing.gameObject.SetActive(false); + // } + // BMLogger.Log($"ShowEquipments():: Wingman Wing Essence: {pWingData.id} {pWingData.Name} -- {pWingData.FileModel}"); + // break; + default: + break; + + + + switch (i) + { + case InventoryConst.EQUIPIVTR_BODY: + useDefaultUpper = false; + break; + case InventoryConst.EQUIPIVTR_LEG: + useDefaultLower = false; + break; + case InventoryConst.EQUIPIVTR_WRIST: + useDefaultWrist = false; + break; + case InventoryConst.EQUIPIVTR_FOOT: + useDefaultFoot = false; + break; + } + } + } + + PlayerDefaultEquipments.DefaultUpper.SetActive(useDefaultUpper); + PlayerDefaultEquipments.DefaultLower.SetActive(useDefaultLower); + PlayerDefaultEquipments.DefaultWirst.SetActive(useDefaultWrist); + PlayerDefaultEquipments.DefaultFoot.SetActive(useDefaultFoot); + } } } \ No newline at end of file diff --git a/Assets/Scripts/CECPlayer_Inventory.cs b/Assets/Scripts/CECPlayer_Inventory.cs index 90e83a1204..7259a5e06e 100644 --- a/Assets/Scripts/CECPlayer_Inventory.cs +++ b/Assets/Scripts/CECPlayer_Inventory.cs @@ -127,7 +127,7 @@ namespace BrewMonster // Track instantiated weapon objects private GameObject _currentRightHandWeapon; private GameObject _currentLeftHandWeapon; - private PlayerDefaultEquipments PlayerDefaultEquipments + protected PlayerDefaultEquipments PlayerDefaultEquipments { get { @@ -534,7 +534,7 @@ namespace BrewMonster } #region Helper Methods - private GameObject FindChildObjectRecursive(Transform parent, string name) + protected GameObject FindChildObjectRecursive(Transform parent, string name) { foreach (Transform child in parent) { @@ -551,7 +551,7 @@ namespace BrewMonster return null; } - private SkeletonBuilder GetSkeletonBuilder() + protected SkeletonBuilder GetSkeletonBuilder() { if (_skeletonBuilder == null) {