show equipment when use player clone

This commit is contained in:
Le Duc Anh
2026-04-07 15:27:42 +07:00
parent 48d1171689
commit ea6eff72ca
4 changed files with 193 additions and 7 deletions
@@ -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
@@ -3159,6 +3159,8 @@ namespace BrewMonster
try
{
await SetPlayerModel((byte)m_iProfession, (byte)m_iGender);
// load all equipments
}
catch (Exception ex)
{
@@ -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<bool> LoadFrom(CECHostPlayer player, bool atOnce)
{
int i = 0;
@@ -87,6 +88,7 @@ namespace BrewMonster
return await Load(player, atOnce);
}
protected async Task<bool> 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<bool> 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<SkinnedMeshRenderer>();
var skinnedMeshRenderereFromDataList = armorObject.GetComponentsInChildren<SkinnedMeshRenderFromData>();
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<const WINGMANWING_ESSENCE*>(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);
}
}
}
+3 -3
View File
@@ -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)
{