From ff03d7d0ebc23376d91b7e8c9663cf44624fb15e Mon Sep 17 00:00:00 2001 From: Chomper9981 Date: Mon, 6 Apr 2026 13:39:39 +0700 Subject: [PATCH 1/2] Add Animation phoenix fly in the lv 10 quest. --- Assets/Addressable/force_navigate.txt | 14 +- .../npcs/宠物/骑宠/凤凰/tcks_凤凰/站立.anim | 1363 ++++++++++++++++- .../models/npcs/宠物/骑宠/凤凰/凤凰.prefab | 70 +- .../Scripts/Camera/CameraController.cs | 7 + .../Common/DataProcess/generate_item_temp.cs | 4 - .../Scripts/Common/EC_C2SCmdCache.cs | 2 +- .../Scripts/Managers/EC_HPWork.cs | 4 + .../Scripts/Managers/EC_HPWorkNavigate.cs | 154 +- .../Scripts/Managers/EC_Inventory.cs | 2 +- .../Managers/EC_IvtrItem/CECIvtrArrow.cs | 2 +- .../Managers/EC_IvtrItem/CECIvtrWeapon.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrArmor.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrArmorrune.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrAutoHp.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrAutoMp.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrBible.cs | 2 +- .../EC_IvtrItem/EC_IvtrCertificate.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrCongregate.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrDamagerune.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrDecoration.cs | 2 +- .../EC_IvtrItem/EC_IvtrDestroyingEssence.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrDoubleExp.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrDyeTicket.cs | 2 +- .../EC_IvtrItem/EC_IvtrDynSkillEquip.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrElement.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrEquip.cs | 3 +- .../Managers/EC_IvtrItem/EC_IvtrFacePill.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrFaceTicket.cs | 2 +- .../EC_IvtrItem/EC_IvtrFactionMaterial.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrFashion.cs | 3 +- .../Managers/EC_IvtrItem/EC_IvtrFirework.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrFlysword.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrForceToken.cs | 2 +- .../EC_IvtrItem/EC_IvtrGeneralCard.cs | 2 +- .../EC_IvtrItem/EC_IvtrGeneralCardDice.cs | 2 +- .../EC_IvtrItem/EC_IvtrGmGenerator.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrGoblin.cs | 2 +- .../EC_IvtrItem/EC_IvtrGoblinEquip.cs | 2 +- .../EC_IvtrItem/EC_IvtrGoblinExpPill.cs | 2 +- .../EC_IvtrItem/EC_IvtrIncSkillAbility.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrItem.cs | 3 +- .../EC_IvtrItem/EC_IvtrLookInfoItem.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrMaterial.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrMedicine.cs | 2 +- .../EC_IvtrItem/EC_IvtrMoneyConvertible.cs | 2 +- .../EC_IvtrItem/EC_IvtrMonsterSpirit.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrPetEgg.cs | 2 +- .../EC_IvtrItem/EC_IvtrPetFaceTicket.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrPetFood.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrRecipe.cs | 2 +- .../EC_IvtrItem/EC_IvtrRefineTicket.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrRevScroll.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrSharpener.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrShopToken.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrSkillMat.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrSkilltome.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrSpeaker.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrStone.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrTargetItem.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrTaskDice.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrTaskItem.cs | 2 +- .../EC_IvtrItem/EC_IvtrTaskNmMatter.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrTossMat.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrTownscroll.cs | 2 +- .../EC_IvtrItem/EC_IvtrTransmitScroll.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrType.cs | 2 +- .../EC_IvtrItem/EC_IvtrUnionscroll.cs | 2 +- .../EC_IvtrItem/EC_IvtrUniversalToken.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrUnknown.cs | 2 +- .../EC_IvtrItem/EC_IvtrWarTankCallin.cs | 2 +- .../EC_IvtrItem/EC_IvtrWeddingBookCard.cs | 2 +- .../EC_IvtrItem/EC_IvtrWeddingInviteCard.cs | 2 +- .../Managers/EC_IvtrItem/EC_IvtrWing.cs | 2 +- .../Scripts/Managers/EC_Object.cs | 9 +- Assets/PerfectWorld/Scripts/Move/CECPlayer.cs | 541 ++++++- Assets/PerfectWorld/Scripts/NPC/CECModel.cs | 61 + .../PerfectWorld/Scripts/Pet/EC_PetCorral.cs | 106 +- .../Scripts/Players/CECHostNavigatePlayer.cs | 391 +++++ .../Players/CECHostNavigatePlayer.cs.meta | 2 + .../Players/CECPlayerActionPlayPolicy.cs | 2 +- .../Scripts/Players/CECPlayerClone.cs | 142 ++ .../Scripts/Players/CECPlayerClone.cs.meta | 2 + .../Scripts/Players/CECPlayerWrapper.cs | 3 +- .../Scripts/Players/EC_ElsePlayer.cs | 4 + .../Scripts/Players/EC_HostMsg.cs | 2 +- .../PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs | 2 +- .../Scripts/UI/Dialogs/DlgPetHatch.cs | 2 +- .../Scripts/UI/Dialogs/DlgProduce.cs | 2 +- .../Scripts/UI/NPCShopDetailPanel.cs | 4 +- .../Scripts/UI/NPCShopItemPanel.cs | 2 +- .../Scripts/UI/NPCShopUIManager.cs | 4 +- .../Scripts/UI/ProduceItemPanel.cs | 3 +- .../PerfectWorld/Scripts/UI/ShopItemPanel.cs | 3 +- .../Scripts/World/LitModelHolder.cs | 21 +- .../Scripts/World/TerrainHolder.cs | 27 +- Assets/Scripts/CECHostPlayer.Inventory.cs | 2 +- Assets/Scripts/CECHostPlayer.Model.cs | 77 +- Assets/Scripts/CECHostPlayer.Pet.cs | 2 +- Assets/Scripts/CECHostPlayer.World.cs | 5 +- Assets/Scripts/CECHostPlayer.cs | 51 +- Assets/Scripts/CECPlayer_Inventory.cs | 2 +- Assets/Scripts/PlayerVisual.cs | 23 +- 102 files changed, 2846 insertions(+), 402 deletions(-) mode change 100755 => 100644 Assets/ModelRenderer/Art/Animations/models/npcs/宠物/骑宠/凤凰/tcks_凤凰/站立.anim mode change 100755 => 100644 Assets/ModelRenderer/Art/Models/models/npcs/宠物/骑宠/凤凰/凤凰.prefab create mode 100644 Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs create mode 100644 Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs create mode 100644 Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs.meta diff --git a/Assets/Addressable/force_navigate.txt b/Assets/Addressable/force_navigate.txt index b3a4544e1e..5045b6cdd2 100644 --- a/Assets/Addressable/force_navigate.txt +++ b/Assets/Addressable/force_navigate.txt @@ -1,9 +1,9 @@ // taskID,bezierID,speed,angle,dir,model file path -"32220,-1001,30,30.0,1,Models\NPCs\\\\.ecm" -"32221,-1003,30,30.0,1,Models\NPCs\\\\.ecm" -"32222,-1002,30,30.0,1,Models\NPCs\\\\.ecm" -"32223,-1004,30,30.0,1,Models\NPCs\\\\.ecm" -"32224,-1005,30,30.0,1,Models\NPCs\\\\.ecm" -"32428,-1006,30,30.0,1,Models\NPCs\\\\.ecm" -"32225,-1007,30,30.0,1,Models\NPCs\\\\.ecm" \ No newline at end of file +"32220,-1001,30,30.0,1,Models/npcs/宠物/骑宠/凤凰/凤凰.ecm" +"32221,-1003,30,30.0,1,Models/npcs/宠物/骑宠/凤凰/凤凰.ecm" +"32222,-1002,30,30.0,1,Models/npcs/宠物/骑宠/凤凰/凤凰.ecm" +"32223,-1004,30,30.0,1,Models/npcs/宠物/骑宠/凤凰/凤凰.ecm" +"32224,-1005,30,30.0,1,Models/npcs/宠物/骑宠/凤凰/凤凰.ecm" +"32428,-1006,30,30.0,1,Models/npcs/宠物/骑宠/凤凰/凤凰.ecm" +"32225,-1007,30,30.0,1,Models/npcs/宠物/骑宠/凤凰/凤凰.ecm" diff --git a/Assets/ModelRenderer/Art/Animations/models/npcs/宠物/骑宠/凤凰/tcks_凤凰/站立.anim b/Assets/ModelRenderer/Art/Animations/models/npcs/宠物/骑宠/凤凰/tcks_凤凰/站立.anim old mode 100755 new mode 100644 index 11a1928c8b..0cfe0298f9 --- a/Assets/ModelRenderer/Art/Animations/models/npcs/宠物/骑宠/凤凰/tcks_凤凰/站立.anim +++ b/Assets/ModelRenderer/Art/Animations/models/npcs/宠物/骑宠/凤凰/tcks_凤凰/站立.anim @@ -11670,7 +11670,1366 @@ AnimationClip: m_Center: {x: 0, y: 0, z: 0} m_Extent: {x: 0, y: 0, z: 0} m_ClipBindingConstant: - genericBindings: [] + genericBindings: + - serializedVersion: 2 + path: 2018908708 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3248292310 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 785229228 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3769069077 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2469333914 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3950068453 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2252325412 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 833408543 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3248292310 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1476469227 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 412633153 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 179557909 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3242450197 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3700982063 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2157330979 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2264718818 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1880894339 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2238711267 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2837274895 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 368691903 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 25393408 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 80999191 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1632332166 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3890470760 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2274230124 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1693242608 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 4187520912 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3992494752 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1497372484 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3333459983 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3659112490 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3789879400 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 790554106 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3405022377 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2107606832 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2341104476 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3699674172 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1588232296 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1047333261 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3945718961 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 4217509069 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 4019405381 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3618663269 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 584553710 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1439736952 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 83029738 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3436836290 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3310968907 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3528021482 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3802826126 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 4248340389 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2046112798 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 898714056 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1117157726 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3264382121 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3684640996 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 54069768 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3007174138 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3292194156 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3548896427 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2116945202 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3885673468 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1101621778 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 785229228 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3769069077 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1029198533 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3497741423 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2169235899 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2469333914 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3950068453 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3883273151 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2252325412 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 833408543 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 412633153 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 179557909 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3242450197 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3700982063 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2157330979 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2264718818 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1880894339 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2238711267 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2837274895 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 368691903 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 25393408 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 80999191 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1632332166 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3890470760 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2274230124 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 800478294 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1693242608 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 4187520912 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 898276792 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3992494752 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1497372484 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3333459983 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1494811861 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3659112490 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3789879400 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 790554106 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3405022377 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2107606832 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2341104476 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3699674172 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1588232296 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1834443150 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3804393666 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1047333261 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3953821231 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3921719187 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3945718961 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 4217509069 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 4019405381 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3618663269 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 584553710 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 4072368458 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1439736952 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 83029738 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3436836290 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3310968907 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3528021482 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3802826126 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 4248340389 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2046112798 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 898714056 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 886768393 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1117157726 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3264382121 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3684640996 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 54069768 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3007174138 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3292194156 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1540203259 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2018908708 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3548896427 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2116945202 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3885673468 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1101621778 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1029198533 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3497741423 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 2169235899 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3883273151 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 800478294 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 898276792 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1494811861 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1834443150 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3804393666 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3953821231 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 3921719187 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 4072368458 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 886768393 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1540203259 + attribute: 2 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 pptrCurveMapping: [] m_AnimationClipSettings: serializedVersion: 2 @@ -11682,7 +13041,7 @@ AnimationClip: m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 - m_LoopTime: 0 + m_LoopTime: 1 m_LoopBlend: 0 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 diff --git a/Assets/ModelRenderer/Art/Models/models/npcs/宠物/骑宠/凤凰/凤凰.prefab b/Assets/ModelRenderer/Art/Models/models/npcs/宠物/骑宠/凤凰/凤凰.prefab old mode 100755 new mode 100644 index 459ee3fc54..06f1faf66b --- a/Assets/ModelRenderer/Art/Models/models/npcs/宠物/骑宠/凤凰/凤凰.prefab +++ b/Assets/ModelRenderer/Art/Models/models/npcs/宠物/骑宠/凤凰/凤凰.prefab @@ -215,7 +215,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 700879706879584381} serializedVersion: 2 - m_LocalRotation: {x: 0.0000000011722103, y: -0.26373407, z: -0.00000023176595, w: 0.9645954} + m_LocalRotation: {x: 0.0000000011722104, y: -0.2637341, z: -0.00000023176597, w: 0.96459544} m_LocalPosition: {x: 0.16233289, y: -0.00000004810146, z: -0.000000061758335} m_LocalScale: {x: 1, y: 1.0000001, z: 0.9999999} m_ConstrainProportionsScale: 0 @@ -408,7 +408,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 870105474783592799} serializedVersion: 2 - m_LocalRotation: {x: -0.116904, y: 0.52980244, z: -0.18870111, w: 0.8185564} + m_LocalRotation: {x: -0.116904005, y: 0.5298025, z: -0.18870112, w: 0.8185565} m_LocalPosition: {x: 0.012014532, y: -0.0000000867314, z: -0.000000065188935} m_LocalScale: {x: 1, y: 0.9999999, z: 0.99999994} m_ConstrainProportionsScale: 0 @@ -792,7 +792,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2090055399504802636} serializedVersion: 2 - m_LocalRotation: {x: -0.000000007450579, y: 0.05836967, z: 0.000000015279507, w: 0.998295} + m_LocalRotation: {x: -0.0000000074505793, y: 0.058369674, z: 0.00000001527951, w: 0.99829507} m_LocalPosition: {x: 0.97464234, y: -0.0000001192093, z: -0.00000017881396} m_LocalScale: {x: 1.0000001, y: 0.99999994, z: 0.9999999} m_ConstrainProportionsScale: 0 @@ -857,7 +857,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2273991754805310631} serializedVersion: 2 - m_LocalRotation: {x: 0.000000015328007, y: 0.021831421, z: -0.000000014805245, w: 0.99976164} + m_LocalRotation: {x: 0.000000015328009, y: 0.021831423, z: -0.000000014805246, w: 0.9997617} m_LocalPosition: {x: 0.7527077, y: 0.000000009196029, z: -0.00045834482} m_LocalScale: {x: 0.9999999, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1290,6 +1290,8 @@ GameObject: m_Component: - component: {fileID: 3453975982983096240} - component: {fileID: 7816700123729441629} + - component: {fileID: 2347288213418982541} + - component: {fileID: 3641089161220139568} m_Layer: 0 m_Name: "\u51E4\u51F0" m_TagString: Untagged @@ -1305,7 +1307,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3590142514949932151} serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + 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 @@ -1315,7 +1317,7 @@ Transform: - {fileID: 6224603219712910697} - {fileID: 1727233940975520613} m_Father: {fileID: 1649783502964571937} - m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!95 &7816700123729441629 Animator: serializedVersion: 7 @@ -1338,6 +1340,46 @@ Animator: m_AllowConstantClipSamplingOptimization: 1 m_KeepAnimatorStateOnDisable: 0 m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &2347288213418982541 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3590142514949932151} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d449242bb6214e81944862a05b7aed33, type: 3} + m_Name: + m_EditorClassIdentifier: + bones: [] + bindPoses: [] + rootBone: {fileID: 4586536927667645884} +--- !u!114 &3641089161220139568 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3590142514949932151} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c75c0dcb6d50eb64abd727a90406ca2b, type: 3} + m_Name: + m_EditorClassIdentifier: + _Animator: {fileID: 7816700123729441629} + _ActionOnDisable: 0 + _PlayAutomatically: 1 + _Animations: + - {fileID: 7400000, guid: b612aa9768334a9438221e9ef67ab618, type: 2} + - {fileID: 7400000, guid: e7ff2fce14cfa304facf9adad5a885c1, type: 2} + - {fileID: 7400000, guid: 2335e6ff21363fe4682d43a44fb4e949, type: 2} + - {fileID: 7400000, guid: 4f487a471c7278b40bcd6a5cb13032b9, type: 2} + - {fileID: 7400000, guid: f54de864134717c47a4034684dc5d443, type: 2} + - {fileID: 7400000, guid: b612aa9768334a9438221e9ef67ab618, type: 2} + - {fileID: 7400000, guid: c80c98c187e5e4f4b8720cb0817760e4, type: 2} + - {fileID: 7400000, guid: e16a16712d922464e8a9d173dacffde4, type: 2} + - {fileID: 7400000, guid: f22348ccca70b4e408607ad52dc2d01e, type: 2} --- !u!1 &3602394898410287554 GameObject: m_ObjectHideFlags: 0 @@ -1393,7 +1435,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3786118911675041934} serializedVersion: 2 - m_LocalRotation: {x: 0.054106675, y: -0.048505306, z: 0.6238828, w: 0.7781325} + m_LocalRotation: {x: 0.054106668, y: -0.0485053, z: 0.6238827, w: 0.7781324} m_LocalPosition: {x: 1.4803655, y: -0.038035985, z: -0.024959266} m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999998} m_ConstrainProportionsScale: 0 @@ -1716,7 +1758,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4424724211710365003} serializedVersion: 2 - m_LocalRotation: {x: 0.00000008940696, y: -0.01583224, z: -0.00000006705522, w: 0.99987465} + m_LocalRotation: {x: 0.00000008940697, y: -0.015832242, z: -0.000000067055225, w: 0.9998747} m_LocalPosition: {x: 1.4131434, y: -0.00000023841852, z: 0.00000008940699} m_LocalScale: {x: 1, y: 1.0000001, z: 0.9999999} m_ConstrainProportionsScale: 0 @@ -1877,7 +1919,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4713013740437862723} serializedVersion: 2 - m_LocalRotation: {x: 0.1315189, y: 0.9698584, z: 0.027563425, w: 0.20326757} + m_LocalRotation: {x: 0.13151892, y: 0.96985847, z: 0.027563427, w: 0.20326759} m_LocalPosition: {x: 0.28217787, y: 0.14113632, z: -0.10175801} m_LocalScale: {x: 0.9999998, y: 1, z: 0.99999994} m_ConstrainProportionsScale: 0 @@ -2066,7 +2108,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5061385977300445428} serializedVersion: 2 - m_LocalRotation: {x: 0.000000054307304, y: -0.12958188, z: 0.00000052682435, w: 0.9915687} + m_LocalRotation: {x: 0.000000054307307, y: -0.1295819, z: 0.0000005268244, w: 0.99156874} m_LocalPosition: {x: 0.21596491, y: -0.000000013746504, z: -0.00022520378} m_LocalScale: {x: 0.9999999, y: 1.0000001, z: 0.99999994} m_ConstrainProportionsScale: 0 @@ -2098,7 +2140,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5127379530201908994} serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: 0.000000014901161, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -2345,7 +2387,7 @@ GameObject: m_Component: - component: {fileID: 4767090072160652241} m_Layer: 0 - m_Name: HH_ride + m_Name: HH_Ride m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -2518,7 +2560,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6367996995571276794} serializedVersion: 2 - m_LocalRotation: {x: 0.00000007823107, y: 0.05836964, z: -0.00000001660373, w: 0.998295} + m_LocalRotation: {x: 0.000000078231075, y: 0.058369644, z: -0.000000016603732, w: 0.99829507} m_LocalPosition: {x: 0.9746428, y: 0.00000035762793, z: -0.0000007152559} m_LocalScale: {x: 0.99999976, y: 0.9999999, z: 0.99999976} m_ConstrainProportionsScale: 0 @@ -3312,7 +3354,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8731122315004283578} serializedVersion: 2 - m_LocalRotation: {x: 0.54609156, y: 0.11095586, z: -0.8185872, w: 0.13923995} + m_LocalRotation: {x: 0.5460916, y: 0.110955864, z: -0.81858724, w: 0.13923997} m_LocalPosition: {x: -0.17678149, y: -0.22698992, z: 0.037154097} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 diff --git a/Assets/PerfectWorld/Scripts/Camera/CameraController.cs b/Assets/PerfectWorld/Scripts/Camera/CameraController.cs index d85034b7c5..0ec9ac5b52 100644 --- a/Assets/PerfectWorld/Scripts/Camera/CameraController.cs +++ b/Assets/PerfectWorld/Scripts/Camera/CameraController.cs @@ -98,5 +98,12 @@ namespace BrewMonster } } } + public void UpdateFollowObject(Transform followObject) + { + _cinemachineCamera.Follow = followObject; + _cinemachineCamera.ForceCameraPosition(followObject.position, Quaternion.identity); + orbital.HorizontalAxis.Value = 208; + orbital.VerticalAxis.Value = -268; + } } } diff --git a/Assets/PerfectWorld/Scripts/Common/DataProcess/generate_item_temp.cs b/Assets/PerfectWorld/Scripts/Common/DataProcess/generate_item_temp.cs index e280198877..bca396a2b3 100644 --- a/Assets/PerfectWorld/Scripts/Common/DataProcess/generate_item_temp.cs +++ b/Assets/PerfectWorld/Scripts/Common/DataProcess/generate_item_temp.cs @@ -1249,10 +1249,6 @@ public static class generate_item_temp return 0; } - public struct PetSkill { - public int skill; - public int level; - } public static int generate_pet_egg(uint id, ID_SPACE idspace, out byte[] data, out uint size, RAND_CLASS cls) { DATA_TYPE datatype = DATA_TYPE.DT_INVALID; diff --git a/Assets/PerfectWorld/Scripts/Common/EC_C2SCmdCache.cs b/Assets/PerfectWorld/Scripts/Common/EC_C2SCmdCache.cs index 1a0901486b..169d3f1490 100644 --- a/Assets/PerfectWorld/Scripts/Common/EC_C2SCmdCache.cs +++ b/Assets/PerfectWorld/Scripts/Common/EC_C2SCmdCache.cs @@ -1,5 +1,5 @@ using BrewMonster.Network; -using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts; using CSNetwork.C2SCommand; using CSNetwork.Protocols; using CSNetwork.S2CCommand; diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs index 12bf28ecb6..4c734423b1 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs @@ -455,6 +455,10 @@ namespace BrewMonster.Scripts { pWorkNavigate.Finish(); } + else + { + pWorkNavigate.Cancel(); + } } else { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs index fd3d601f64..6c55f50f18 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Text; -using System.Globalization; +using System.Threading.Tasks; using UnityEngine; using CSNetwork.GPDataType; using BrewMonster.Scripts.Task; @@ -151,6 +152,34 @@ namespace BrewMonster.Scripts private const string DEFAULT_FORCE_NAVIGATE_CONFIG_ADDRESS = "Assets/Addressable/force_navigate.txt"; private bool m_bConfigLoaded = false; + // Decode raw file bytes: UTF-8 (optional BOM), else strict UTF-8; on invalid UTF-8 fall back to GBK (code page 936) for legacy PC exports. + // 解码原始文件字节:UTF-8(可选 BOM),否则严格 UTF-8;非法 UTF-8 时回退到 GBK(代码页 936)以兼容老 PC 导出。 + private static string DecodeNavigateConfigText(byte[] bytes) + { + if (bytes == null || bytes.Length == 0) + { + return string.Empty; + } + + int offset = 0; + if (bytes.Length >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) + { + offset = 3; + } + + int len = bytes.Length - offset; + var utf8Strict = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); + try + { + return utf8Strict.GetString(bytes, offset, len); + } + catch (DecoderFallbackException) + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + return Encoding.GetEncoding(936).GetString(bytes, offset, len); + } + } + // Ensure default config is loaded (safe to call multiple times). // 确保默认配置已加载(可重复调用)。 private void EnsureDefaultConfigLoaded() @@ -184,13 +213,20 @@ namespace BrewMonster.Scripts { Addressables.InitializeAsync().WaitForCompletion(); var ta = Addressables.LoadAssetAsync(address).WaitForCompletion(); - if (ta == null || string.IsNullOrEmpty(ta.text)) + if (ta == null || ta.bytes == null || ta.bytes.Length == 0) { Debug.LogWarning($"CECNavigateCtrl::LoadConfigAddressable, failed to load '{address}'"); return false; } - return LoadConfigFromText(ta.text); + string text = DecodeNavigateConfigText(ta.bytes); + if (string.IsNullOrEmpty(text)) + { + Debug.LogWarning($"CECNavigateCtrl::LoadConfigAddressable, decoded empty text '{address}'"); + return false; + } + + return LoadConfigFromText(text); } catch (Exception ex) { @@ -293,7 +329,8 @@ namespace BrewMonster.Scripts return false; } - string text = File.ReadAllText(filePath); + byte[] raw = File.ReadAllBytes(filePath); + string text = DecodeNavigateConfigText(raw); return LoadConfigFromText(text); } catch (Exception) @@ -318,7 +355,7 @@ namespace BrewMonster.Scripts } // Prepare navigation // 准备导航 - public void OnPrepareNavigate(int task) + public async void OnPrepareNavigate(int task) { m_bForceNavigateState = true; m_taskID = task; @@ -329,27 +366,18 @@ namespace BrewMonster.Scripts INFO naviInfo = new INFO(); if (GetNavigateInfo(task, ref naviInfo)) { + Debug.Log($"CECNavigateCtrl::OnPrepareNavigate, GetNavigateInfo: {task} success"); m_curNavigateInfo = naviInfo; // Set navigate model file // 设置导航模型文件 - CECHostNavigatePlayer player = m_pHost != null ? m_pHost.GetNavigatePlayer() : null; - if (player != null) - { - player.SetNavigateModelFile(m_curNavigateInfo.strModelPath); - player.Init(); - } + CECHostNavigatePlayer player = m_pHost.GetNavigatePlayer(); + player.SetNavigateModelFile(m_curNavigateInfo.strModelPath); + await player.Init(); } else { - // Give up task if no navigation info found // 如果找不到导航信息则放弃任务 - if (m_pHost != null && m_pHost.GetTaskInterface() != null) - { - m_pHost.GetTaskInterface().GiveUpTask((uint)m_taskID); - } + m_pHost.GetTaskInterface().GiveUpTask((uint)m_taskID); } - //TODO: Refine Logic. - //This is work around. It need to create a clone and make it do the animation. - m_pHost.OnNaviageEvent(task,(int)CECNavigateCtrl.NavigateEvent.EM_BEGIN); - + } // Begin navigation // 开始导航 @@ -403,6 +431,7 @@ namespace BrewMonster.Scripts if (m_pHost != null && m_pHost.GetWorkMan() != null) { m_pHost.GetWorkMan().FinishRunningWork(CECHPWork.Host_work_ID.WORK_FORCENAVIGATEMOVE); + CameraController.Instance.UpdateFollowObject(m_pHost.PointCam); } // TODO: Implement UI helper // CECUIHelper::GetGameUIMan()->SetShowAllPanlesFlag(true); @@ -567,8 +596,8 @@ namespace BrewMonster.Scripts CECHostNavigatePlayer pClone = m_pHost.GetNavigatePlayer(); if (pClone != null) { - pClone.SetPos(vCurPos); - + pClone.SetPos(new Vector3(vCurPos.x, vCurPos.y, vCurPos.z)); + pClone.SetDirAndUp(new A3DVECTOR3(vDir.x, vDir.y, vDir.z), new A3DVECTOR3(vUp.x, vUp.y, vUp.z)); if(pNaviCtrl.GetCurrentNavigateInfo().bezierDir) { pClone.ChangeModelMoveDirAndUp(vDir, vUp); @@ -1016,86 +1045,7 @@ namespace BrewMonster.Scripts public bool GetLoopFlag() { return m_bLoop; } } - // CECHostNavigatePlayer class - Basic implementation for navigation player // CECHostNavigatePlayer类 - 导航玩家的基本实现 - public class CECHostNavigatePlayer - { - private CECNavigateCtrl m_pNavigateCtrl; // Force navigate // 强制导航 - private CECHostPlayer m_pHost = null; // Reference to host player // 对宿主玩家的引用 - - public CECHostNavigatePlayer(CECHostPlayer pHost) - { - // Initialize navigate control // 初始化导航控制 - m_pHost = pHost; - m_pNavigateCtrl = new CECNavigateCtrl(pHost); - } - - public A3DVECTOR3 GetDir() - { - if (m_pHost != null) - { - // Get direction from host's transform // 从宿主的变换获取方向 - Transform hostTransform = m_pHost.transform; - if (hostTransform != null) - { - Vector3 forward = hostTransform.forward; - return new A3DVECTOR3(forward.x, forward.y, forward.z); - } - } - return new A3DVECTOR3(0, 0, 1); - } - - public void SetPos(A3DVECTOR3 vPos) - { - if (m_pHost != null) - { - // Actually move the host player // 实际移动宿主玩家 - Vector3 newPos = new Vector3(vPos.x, vPos.y, vPos.z); - m_pHost.SetPos(newPos); - } - } - - public void ChangeModelMoveDirAndUp(A3DVECTOR3 vDir, A3DVECTOR3 vUp) - { - if (m_pHost != null && m_pHost.transform != null) - { - // Update host's rotation based on direction // 根据方向更新宿主的旋转 - Vector3 dir = new Vector3(vDir.x, vDir.y, vDir.z); - Vector3 up = new Vector3(vUp.x, vUp.y, vUp.z); - - if (dir.magnitude > 0.01f) - { - Quaternion rotation = Quaternion.LookRotation(dir, up); - m_pHost.transform.rotation = rotation; - } - } - } - public void SetNavigateModelFile(string szFile) { } // Stub - public bool Init() { return true; } // Stub - public CECNavigateCtrl GetNavigateCtrl() { return m_pNavigateCtrl; } - - // Handle navigation event // 处理导航事件 - public void OnNavigateEvent(int task, int e) - { - if (m_pNavigateCtrl == null) - { - return; - } - - if (e == (int)CECNavigateCtrl.NavigateEvent.EM_PREPARE) - { - m_pNavigateCtrl.OnPrepareNavigate(task); - } - else if (e == (int)CECNavigateCtrl.NavigateEvent.EM_BEGIN) - { - m_pNavigateCtrl.OnBeginNavigate(); - } - else if (e == (int)CECNavigateCtrl.NavigateEvent.EM_END) - { - m_pNavigateCtrl.OnEndNavigate(); - } - } - } - + ////////////////////////////////////////////////////////////////////////// // // CECBezierPoint class - Bezier curve point // 贝塞尔曲线点类 diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs b/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs index 7d113a8309..16ca5c2a1c 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using UnityEngine; -namespace BrewMonster.Scripts.Managers +namespace BrewMonster.Scripts { /// /// C# mirror of C++ CECInventory (EC_Inventory.h / EC_Inventory.cpp). diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrArrow.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrArrow.cs index 6dd9d4b727..9f77089423 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrArrow.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrArrow.cs @@ -12,7 +12,7 @@ using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; using System.Runtime.InteropServices; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Arrow item class (cac loai mui ten) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrWeapon.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrWeapon.cs index f2f1f55b28..d40dc3211f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrWeapon.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrWeapon.cs @@ -62,7 +62,7 @@ using BrewMonster.Scripts; // /////////////////////////////////////////////////////////////////////////// #endregion -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Weapon item class (cac loai vu khi) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmor.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmor.cs index 4938df1c5c..88197e2496 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmor.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmor.cs @@ -62,7 +62,7 @@ using BrewMonster.Scripts; // /////////////////////////////////////////////////////////////////////////// #endregion -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Armor item class (Mu + Ao + Quan + Giay) / Armor item class (Helmet + Armor + Pants + Boots) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmorrune.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmorrune.cs index f9ae470646..577624f869 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmorrune.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmorrune.cs @@ -1,6 +1,6 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrArmorrune : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoHp.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoHp.cs index 06f74fca57..a1013b362c 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoHp.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoHp.cs @@ -40,7 +40,7 @@ using BrewMonster.Scripts; using System.Runtime.InteropServices; using System; using CSNetwork.GPDataType; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Auto HP item class (tu dong hoi mau). This is a part of CEC_IvtrEquipMatter(C++) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoMp.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoMp.cs index e51e89d92e..2954110f13 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoMp.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoMp.cs @@ -40,7 +40,7 @@ using BrewMonster.Scripts; using System.Runtime.InteropServices; using System; using CSNetwork.GPDataType; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Auto MP item class (tu dong hoi mana). This is a part of CEC_IvtrEquipMatter(C++) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrBible.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrBible.cs index a34a4190bc..7b9b25c3be 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrBible.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrBible.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrBible : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrCertificate.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrCertificate.cs index 043e017336..1d9fe487f2 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrCertificate.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrCertificate.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrCertificate : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrCongregate.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrCongregate.cs index 8fbde128f4..77104c7d38 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrCongregate.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrCongregate.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrCongregate : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDamagerune.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDamagerune.cs index a56e251ac8..8067007137 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDamagerune.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDamagerune.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrDamagerune : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDecoration.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDecoration.cs index b805e5b45d..e2c5133918 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDecoration.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDecoration.cs @@ -37,7 +37,7 @@ using System.Collections.Generic; using BrewMonster.Network; using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Decoration item class (boi + nhan + ) / Decoration item class (various types of decorations) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDestroyingEssence.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDestroyingEssence.cs index 46aea629db..fd78132528 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDestroyingEssence.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDestroyingEssence.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrDestroyingEssence : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDoubleExp.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDoubleExp.cs index 9b57dca6f0..dca60f47f6 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDoubleExp.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDoubleExp.cs @@ -1,6 +1,6 @@ using BrewMonster; using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrDoubleExp : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDyeTicket.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDyeTicket.cs index 833643040b..d401b00a4c 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDyeTicket.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDyeTicket.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrDyeTicket : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDynSkillEquip.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDynSkillEquip.cs index a69242f043..4d54f98b3e 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDynSkillEquip.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDynSkillEquip.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrDynSkillEquip : EC_IvtrEquip { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrElement.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrElement.cs index abd218aa70..2aabf3ca58 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrElement.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrElement.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrElement : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrEquip.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrEquip.cs index c3df0b8b5d..a7650f3420 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrEquip.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrEquip.cs @@ -14,7 +14,7 @@ using System.Text.RegularExpressions; using System.Reflection; using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Equipment item class that handles all equipment-specific functionality @@ -496,6 +496,7 @@ namespace PerfectWorld.Scripts.Managers m_strDesc = oldDesc; return result; } + public ushort GetStoneMask() { return StoneMask; } private static object TryFindElementByScanningArraysLocal(object edm, uint id) { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFacePill.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFacePill.cs index 204f6c30f5..0785f1c546 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFacePill.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFacePill.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrFacePill : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFaceTicket.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFaceTicket.cs index 79dd7fc463..284b22aaee 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFaceTicket.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFaceTicket.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrFaceTicket : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFactionMaterial.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFactionMaterial.cs index d1ab1f1a26..e45f537f8f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFactionMaterial.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFactionMaterial.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrFactionMaterial : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFashion.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFashion.cs index bc8f057142..e1e8b351bf 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFashion.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFashion.cs @@ -12,7 +12,7 @@ using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; using System.Runtime.InteropServices; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrFashion : EC_IvtrEquip { @@ -115,6 +115,7 @@ namespace PerfectWorld.Scripts.Managers { return new Color(((color & (0x1f << 10)) >> 7), ((color & (0x1f << 5)) >> 2), ((color & 0x1f) << 3)); } + public ushort GetWordColor() { return m_wColor; } public string GetSubTypeName() { // Try Unicode first (for Vietnamese/wide char names), then fallback to CP936 diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFirework.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFirework.cs index 53de98e6c4..81e7079408 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFirework.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFirework.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrFirework : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFlysword.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFlysword.cs index eb3f651307..7af2269687 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFlysword.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFlysword.cs @@ -12,7 +12,7 @@ using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; using System.Runtime.InteropServices; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrForceToken.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrForceToken.cs index dd7c6db0f6..65575f96e5 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrForceToken.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrForceToken.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrForceToken : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCard.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCard.cs index 53e3c432cd..eefc8cd03f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCard.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCard.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrGeneralCard : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCardDice.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCardDice.cs index a18c70d014..54e3b9aa5b 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCardDice.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCardDice.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrGeneralCardDice : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGmGenerator.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGmGenerator.cs index bd2f7818c0..6f7c93aadf 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGmGenerator.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGmGenerator.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrGmGenerator : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblin.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblin.cs index 4d6f69ee70..b4c5beb0df 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblin.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblin.cs @@ -14,7 +14,7 @@ using CSNetwork.GPDataType; using System.Runtime.InteropServices; using BrewMonster.Scripts; using BrewMonster.Scripts.Skills; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// The goblin item class (cac loai tinh linh).(not completed, need generate class). diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblinEquip.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblinEquip.cs index bfed287446..e9491fa8c9 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblinEquip.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblinEquip.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrGoblinEquip : EC_IvtrEquip { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblinExpPill.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblinExpPill.cs index 24a6cd08ae..044079b6e8 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblinExpPill.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGoblinExpPill.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrGoblinExpPill : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrIncSkillAbility.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrIncSkillAbility.cs index 6baa876812..6562ccb296 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrIncSkillAbility.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrIncSkillAbility.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrIncSkillAbility : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs index 8498617bb8..34e8ae8761 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs @@ -7,10 +7,9 @@ using BrewMonster; using ModelRenderer.Scripts.Common; using ModelRenderer.Scripts.GameData; using UnityEngine; -using PerfectWorld.Scripts.Managers; using BrewMonster.Network; -namespace BrewMonster.Scripts.Managers +namespace BrewMonster.Scripts { // NOTE: The original lightweight EC_IvtrItem packet struct has been merged into the // EC_IvtrItem class below (which mirrors C++ CECIvtrItem). Network-only fields such as diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrLookInfoItem.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrLookInfoItem.cs index 17268fd3c8..fea868cf04 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrLookInfoItem.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrLookInfoItem.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrLookInfoItem : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMaterial.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMaterial.cs index c0a2f041e9..0bb4186f09 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMaterial.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMaterial.cs @@ -4,7 +4,7 @@ using BrewMonster.Scripts; using ModelRenderer.Scripts.GameData; using ModelRenderer.Scripts.Common; using BrewMonster.Network; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrMaterial : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMedicine.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMedicine.cs index cf58d71afb..7ae2af6e3c 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMedicine.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMedicine.cs @@ -5,7 +5,7 @@ using BrewMonster.Network; using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Medicine item class (cac loai thuoc). diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMoneyConvertible.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMoneyConvertible.cs index 8b63f1de47..0e2c359b39 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMoneyConvertible.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMoneyConvertible.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrMoneyConvertible : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMonsterSpirit.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMonsterSpirit.cs index bd6764a593..c5b495d249 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMonsterSpirit.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMonsterSpirit.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrMonsterSpirit : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetEgg.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetEgg.cs index b6b46dc274..40049b5361 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetEgg.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetEgg.cs @@ -12,7 +12,7 @@ using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; using System.Runtime.InteropServices; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public struct PETSKILL { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetFaceTicket.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetFaceTicket.cs index b63611c18a..c28636639f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetFaceTicket.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetFaceTicket.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrPetFaceTicket : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetFood.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetFood.cs index f2624bc637..df3cc98e3f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetFood.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrPetFood.cs @@ -13,7 +13,7 @@ using BrewMonster.Scripts; using CSNetwork.GPDataType; using System.Runtime.InteropServices; using BrewMonster.Scripts.Pet; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrPetFood : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRecipe.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRecipe.cs index 30c8ef0c29..cd3d06555f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRecipe.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRecipe.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrRecipe : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRefineTicket.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRefineTicket.cs index f05d3b4185..7bdc3166c0 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRefineTicket.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRefineTicket.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrRefineTicket : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRevScroll.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRevScroll.cs index 87f463fa93..f28c1ce7c7 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRevScroll.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrRevScroll.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrRevScroll : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSharpener.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSharpener.cs index 67c92ec17d..c4c774861d 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSharpener.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSharpener.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrSharpener : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrShopToken.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrShopToken.cs index 18737cd4fb..273685fe4a 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrShopToken.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrShopToken.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrShopToken : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSkillMat.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSkillMat.cs index 75b283885f..61a2f282a4 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSkillMat.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSkillMat.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrSkillMat : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSkilltome.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSkilltome.cs index c5752a7091..61f592ad88 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSkilltome.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSkilltome.cs @@ -11,7 +11,7 @@ using PerfectWorld.Scripts.Managers; using BrewMonster.Network; using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Skill tome item class(sach ky nang). This is a part of CEC_IvtrScroll(C++) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSpeaker.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSpeaker.cs index 325312ca78..bcb8513361 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSpeaker.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrSpeaker.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrSpeaker : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrStone.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrStone.cs index 19a79ed787..b725b3bfbd 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrStone.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrStone.cs @@ -2,7 +2,7 @@ using BrewMonster; using BrewMonster.Scripts.Managers; using ModelRenderer.Scripts.GameData; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrStone : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTargetItem.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTargetItem.cs index 32e5d36a37..addba53146 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTargetItem.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTargetItem.cs @@ -1,6 +1,6 @@ using BrewMonster; using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrTargetItem : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskDice.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskDice.cs index 77db9842cb..b785dc97ff 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskDice.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskDice.cs @@ -12,7 +12,7 @@ using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; using System.Runtime.InteropServices; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Task Dice Item (Tui qua random). diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskItem.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskItem.cs index 876649a2ca..fea0107ad5 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskItem.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskItem.cs @@ -12,7 +12,7 @@ using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; using System.Runtime.InteropServices; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrTaskItem : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskNmMatter.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskNmMatter.cs index 9212fb9644..ea8fe3781d 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskNmMatter.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskNmMatter.cs @@ -12,7 +12,7 @@ using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; using System.Runtime.InteropServices; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Task Normal Matter Item.(non interactable quest item). it is a part of IvtrTaskItem(C++) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTossMat.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTossMat.cs index 56c3acf4f0..96542d6eab 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTossMat.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTossMat.cs @@ -1,6 +1,6 @@ using BrewMonster; using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrTossMat : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTownscroll.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTownscroll.cs index 5a6b9d321d..04a9de0289 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTownscroll.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTownscroll.cs @@ -4,7 +4,7 @@ using BrewMonster.Network; using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Town scroll item class (hoi thanh phu). It is a part of EC_IvtrScroll(c++) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTransmitScroll.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTransmitScroll.cs index 862526f25b..e96ff37426 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTransmitScroll.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTransmitScroll.cs @@ -4,7 +4,7 @@ using BrewMonster.Network; using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { /// /// Transmit scroll item(Da dich chuyen). It is a part of EC_IvtrConsume(c++) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs index 306ebb5dd3..cbc5082bf4 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs @@ -4,7 +4,7 @@ using UnityEngine; using ModelRenderer.Scripts.GameData; using BrewMonster; -namespace BrewMonster.Scripts.Managers +namespace BrewMonster.Scripts { public enum IndexOfIteminEquipmentInventory : byte { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUnionscroll.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUnionscroll.cs index 284bfee4b0..505910f0d7 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUnionscroll.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUnionscroll.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrUnionscroll : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUniversalToken.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUniversalToken.cs index ccbb54084a..37b4a0d7b7 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUniversalToken.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUniversalToken.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrUniversalToken : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUnknown.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUnknown.cs index 88fa159127..d14a33c03d 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUnknown.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrUnknown.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrUnknown : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWarTankCallin.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWarTankCallin.cs index 36c6b6ebbe..89b469c36f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWarTankCallin.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWarTankCallin.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrWarTankCallin : EC_IvtrItem { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeddingBookCard.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeddingBookCard.cs index cfc59969f9..b645c4181e 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeddingBookCard.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeddingBookCard.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrWeddingBookCard : EC_IvtrEquip { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeddingInviteCard.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeddingInviteCard.cs index 6eb42b8782..295a85060b 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeddingInviteCard.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeddingInviteCard.cs @@ -1,5 +1,5 @@ using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrWeddingInviteCard : EC_IvtrEquip { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWing.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWing.cs index 804474b158..fca1b55d39 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWing.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWing.cs @@ -12,7 +12,7 @@ using BrewMonster.Scripts.Managers; using BrewMonster.Scripts; using CSNetwork.GPDataType; using System.Runtime.InteropServices; -namespace PerfectWorld.Scripts.Managers +namespace BrewMonster.Scripts { public class EC_IvtrWing : EC_IvtrEquip diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs index 95f9c347d2..d7fb0a78ae 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Threading.Tasks; using BrewMonster; using BrewMonster.Managers; +using BrewMonster.Scripts; using CSNetwork.GPDataType; using CSNetwork.Protocols; using PerfectWorld.Scripts; @@ -13,7 +14,7 @@ using UnityEngine; // /////////////////////////////////////////////////////////////////////////// -public partial class CECObject : MonoBehaviour +public partial class CECObject : MonoBehaviour, ITickable { protected static int ALPHA_HASH = Shader.PropertyToID("_Alpha"); protected Quaternion targetRotation; @@ -76,6 +77,7 @@ public partial class CECObject : MonoBehaviour public virtual void SetUpCECObject() { + TickInvoker.Instance.RegisterTickable(this); m_dwBornStamp = 0; m_bBornInSight = false; //m_bSelectable = false; @@ -85,7 +87,7 @@ public partial class CECObject : MonoBehaviour public void SetSelectable(bool bSelectable) { m_bSelectable = bSelectable; } // Tick routine - public bool Tick(float dwDeltaTime) + public virtual bool Tick(uint dwDeltaTime) { if (m_bAdjustOrient) AdjustOrientation(dwDeltaTime); @@ -116,6 +118,9 @@ public partial class CECObject : MonoBehaviour m_bAdjustOrient = false; } // Set destination orientation of model + public virtual void SetDirAndUp(A3DVECTOR3 vDir, A3DVECTOR3 vUp){ + SetDirAndUp(EC_Utility.ToVector3(vDir), EC_Utility.ToVector3(vUp)); + } public void SetDestDirAndUp(A3DVECTOR3 vDir, Vector3 vUp, float dwTime) { m_bAdjustOrient = true; diff --git a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs index 8653f2a557..c449c659f8 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs @@ -32,7 +32,7 @@ namespace BrewMonster private static PLAYER_ACTION[] _default_actions; [ResetStatic] private static PLAYER_ACTION[] _turning_actions; - PLAYER_ACTION[] m_PlayerActions; + protected PLAYER_ACTION[] m_PlayerActions; [SerializeField] internal INFO m_PlayerInfo; public CECModel m_pPlayerCECModel; protected GameObject m_pPlayerModel => m_pPlayerCECModel.m_pPlayerModel; @@ -66,6 +66,7 @@ namespace BrewMonster public bool m_bInSanctuary = true; public A3DAABB m_aabbServer = new A3DAABB(); // Óë·þÎñÆ÷±£³ÖÒ»ÖµÄaabb£¬ ²»ÊÜËõ·ÅÓ°Ïì public A3DAABB m_aabb = new A3DAABB(); // Player's aabb£¬ÓÃÓÚÏÔʾµÄaabb£¬ÊÜËõ·ÅÓ°Ïì + protected bool m_bCastShadow; // flag indicates whether it will cast shadow public int m_iProfession; // Profession public float m_fScaleBySkill; public int m_iGender; // Gender @@ -75,7 +76,7 @@ namespace BrewMonster public uint[] m_aExtStatesShown = new uint[OBJECT_EXT_STATE_COUNT]; // Visible extend states currently shown private QueueActionEvent queueActionEvent; protected static PLAYER_LEVELEXP_CONFIG _player_levelup_exp; - private CECPlayerActionController m_pActionController; + protected CECPlayerActionController m_pActionController; protected enumWingType m_wingType = enumWingType.WINGTYPE_FLYSWORD; protected int m_idCurSkillTarget; protected CECSkill m_pCurSkill; @@ -102,7 +103,7 @@ namespace BrewMonster protected bool m_bAboutToDie = false; public bool m_bCandHangerOn = false; public bool m_bPetInSanctuary = false; // true, the pet pet of the player is in sanctuary - //The ID of the currently summoned pet + //The ID of the currently summoned pet protected int m_idCurPet = 0; public List m_aIconStates = new List(); protected byte m_byPariahLvl = 0; // Pariah level @@ -114,9 +115,9 @@ namespace BrewMonster // ÒÀ¸½ÀàÐÍ AttachMode m_AttachMode = AttachMode.enumAttachNone; // ÒÀ¸½Õß»ò±»ÒÀ¸½Õßid - protected int m_iBuddyId; + protected int m_iBuddyId; protected int m_idCandBuddy; // ID of candidate buddy - EC_ManPlayer m_pPlayerMan => EC_ManMessageMono.Instance?.GetECManPlayer; // Player manager + protected EC_ManPlayer m_pPlayerMan => EC_ManMessageMono.Instance?.GetECManPlayer; // Player manager protected Transform playerTransform => _objectTransform ??= transform; protected Transform m_HH_chibang = null; @@ -292,6 +293,7 @@ namespace BrewMonster protected GameObject GetDummyModel(int i) => (i!=(int)PLAYERMODEL_TYPE.PLAYERMODEL_MAJOR&&i<(int)PLAYERMODEL_TYPE.PLAYERMODEL_MAX) ? m_pModels[i]:null; protected GameObject GetMajorModel() => m_pModels[(int)PLAYERMODEL_TYPE.PLAYERMODEL_MAJOR]; protected GameObject GetPetModel() => m_pPetModel; + protected CECModel GetPlayerModel() => m_pPlayerCECModel; protected const int OBJECT_EXT_STATE_COUNT = 6; protected bool IsMajorModel(GameObject pModel) => GetMajorModel() != null && pModel == GetMajorModel(); public enum WeaponHangerPosition @@ -311,7 +313,13 @@ namespace BrewMonster /// This function will get the coressponding model player for the player based on the profession and gender public async Task SetPlayerModel(byte profession, byte gender) { - parentModel = transform.GetChild(0); + // PC prefab used first child as model root; runtime spawns may have no children — avoid GetChild(0) OOB. + // PC 预制体用第一个子物体作模型根;运行时生成可能没有子物体 — 避免 GetChild(0) 越界 + if (transform.childCount > 0) + parentModel = transform.GetChild(0); + else + parentModel = transform; + txtName = GetComponentInChildren(); if (transform.childCount >= 3) { @@ -580,7 +588,7 @@ namespace BrewMonster } return result; } - bool IsShapeModelChanged() + protected virtual bool IsShapeModelChanged() { return m_pModels[(int)PLAYERMODEL_TYPE.PLAYERMODEL_MAJOR] != m_pPlayerModel; } @@ -2966,7 +2974,7 @@ namespace BrewMonster } } - public void SetPos(Vector3 pos) + public virtual void SetPos(Vector3 pos) { playerTransform.position = pos; @@ -3123,30 +3131,201 @@ namespace BrewMonster return result; } - protected bool LoadPlayerSkeleton(bool bAtOnce) + protected async Task LoadPlayerSkeleton(bool bAtOnce) { - EC_PLAYERLOADRESULT Ret = default; - if (bAtOnce /*|| !IsLoadThreadReady()*/) + + int[] aEnabledEquips = new int[InventoryConst.SIZE_ALL_EQUIPIVTR]; + for (int i = 0; i < InventoryConst.SIZE_ALL_EQUIPIVTR; i++) { - // Under normal circumstances, only HostPlayer can reach here - /* if (!LoadPlayerModel(m_iProfession, m_iGender, m_CustomizeData.bodyID, aEquips, szPetPath, Ret, false, false)) - { - a_LogOutput(1, "CECPlayer::Init, failed to call LoadPlayerModel() !"); - return false; - }*/ - - SetPlayerLoadedResult(Ret); - - /* if (IsShapeChanged() && !QueueLoadDummyModel(m_iShape, true)) - { - // ignore the dummy model loading failure - a_LogOutput(1, "CECPlayer::Init, failed to call QueueLoadDummyModel() !"); - }*/ + // TODO: m_i64EquipDisabled — zero slot when disabled: ((1L << i) & m_i64EquipDisabled) != 0 ? 0 : m_aEquips[i] + aEnabledEquips[i] = m_aEquips[i]; } + string szPetPath = null; + if (m_RidingPet.id != 0) + szPetPath = GetRidingPetFileName(m_RidingPet.id); + + int[] aEquips = new int[InventoryConst.IVTRSIZE_EQUIPPACK]; + uint EquipMask = 0; + if (aEnabledEquips[InventoryConst.EQUIPIVTR_WEAPON] > 0) + EquipMask |= 1 << InventoryConst.EQUIPIVTR_WEAPON; + if (aEnabledEquips[InventoryConst.EQUIPIVTR_FASHION_WEAPON] > 0) + EquipMask |= 1 << InventoryConst.EQUIPIVTR_FASHION_WEAPON; + Array.Copy(aEnabledEquips, aEquips, InventoryConst.IVTRSIZE_EQUIPPACK); + DecideWeaponLoad(aEquips, EquipMask); + + // Same pipeline as SetPlayerModel / TransformShape: NPCManager model load + optional pet + dummy shape. + int shapeSnapshot = m_iShape; + try + { + await SetPlayerModel((byte)m_iProfession, (byte)m_iGender); + } + catch (Exception ex) + { + BMLogger.LogError($"CECPlayer::LoadPlayerSkeleton, SetPlayerModel failed: {ex.Message}"); + return false; + } + + SetPlayerLoadedResult(default(EC_PLAYERLOADRESULT)); + + if (!string.IsNullOrEmpty(szPetPath)) + { + GameObject petGo = await LoadPetModel(szPetPath); + SetPetLoadResult(petGo); + } + + if (shapeSnapshot != 0 && !await QueueLoadDummyModel(shapeSnapshot, bAtOnce)) + { + BMLogger.LogError("CECPlayer::LoadPlayerSkeleton, failed to call QueueLoadDummyModel() !"); + return false; + } + BMLogger.Log($"CECPlayer::LoadPlayerSkeleton completed, shapeSnapshot: {shapeSnapshot}"); return true; } + void DecideWeaponLoad(int[] pEquipmentID, uint Mask) + { + bool bNormalWeaponChanged = ((1 << InventoryConst.EQUIPIVTR_WEAPON) & Mask) != 0; + bool bFashionWeaponChanged = ((1 << InventoryConst.EQUIPIVTR_FASHION_WEAPON) & Mask) != 0; + WEAPON_ESSENCE pWeapon = new WEAPON_ESSENCE(); + FASHION_ESSENCE pFashion = new FASHION_ESSENCE(); + WEAPON_SUB_TYPE pSubType = new WEAPON_SUB_TYPE(); + int[] Index = {InventoryConst.EQUIPIVTR_WEAPON, InventoryConst.EQUIPIVTR_FASHION_WEAPON}; + for (int i = 0; i < 2; ++i) + { + int idEquipment = pEquipmentID[Index[i]]; + idEquipment &= 0x0000ffff; + DATA_TYPE dt = DATA_TYPE.DT_INVALID; + if (idEquipment != 0) + { + var pEquip =ElementDataManProvider.GetElementDataMan().get_data_ptr( // TODO: Implement this + (uint)idEquipment, + ID_SPACE.ID_SPACE_ESSENCE, + ref dt); + if (dt == DATA_TYPE.DT_WEAPON_ESSENCE) + { + pWeapon = (WEAPON_ESSENCE)pEquip; + pSubType =(WEAPON_SUB_TYPE)ElementDataManProvider.GetElementDataMan().get_data_ptr( + pWeapon.id_sub_type, + ID_SPACE.ID_SPACE_ESSENCE, + ref dt); + if (dt != DATA_TYPE.DT_WEAPON_SUB_TYPE) pSubType = new WEAPON_SUB_TYPE(); + } + else if (dt == DATA_TYPE.DT_FASHION_ESSENCE) pFashion = (FASHION_ESSENCE)pEquip; + } + } + // bool bCanShowFashionWeaponBefore = CanShowFashionWeapon((int)m_uAttackType, m_iFashionWeaponType); + // bool bCanShowFashionWeapon = false; + //var pGameUI = GameUIManagerProvider.GetGameUIManager().GetInGameUIMan(); + // ��ͨ�����ı� + // if (bNormalWeaponChanged) + // { + // // ʱװ�����ı� + // if (bFashionWeaponChanged) + // { + // // װ��ʱװ��������ͨ���� + // if (pSubType != null && pFashion != null) + // { + // if (CanShowFashionWeapon((int)pSubType.action_type, (int)pFashion.action_type)) + // { + // CLEAR_WEAPON(InventoryConst.EQUIPIVTR_WEAPON); + // } + // else + // { + // CLEAR_WEAPON(InventoryConst.EQUIPIVTR_FASHION_WEAPON); + // } + // } + // // װ����ͨ���� + // else if(pSubType && !pFashion) + // { + + // } + // // װ��ʱװ���� + // else if (!pSubType && pFashion) + // { + // if (CanShowFashionWeapon(m_uAttackType, pFashion->action_type)) + // { + // CLEAR_WEAPON(EQUIPIVTR_WEAPON); + // } + // else + // { + // CLEAR_WEAPON(EQUIPIVTR_FASHION_WEAPON); + // } + // } + // // û��װ���������� + // else + // { + + // } + // if (pSubType) RECORD_NORMAL_WEAPON( + // pWeapon->file_model_left, pWeapon->file_model_right, pSubType->action_type); + // if (pFashion) RECORD_FASHION_WEAPON( + // pFashion->file_model_left, pFashion->file_model_right, pFashion->action_type); + // } + // else + // { + // // װ����ͨ���� + // if (pSubType) + // { + // bCanShowFashionWeapon = CanShowFashionWeapon(pSubType->action_type, m_iFashionWeaponType); + // if (bCanShowFashionWeapon) + // { + // CLEAR_WEAPON(EQUIPIVTR_WEAPON); + // if (!bCanShowFashionWeaponBefore) + // SET_WEAPON(EQUIPIVTR_FASHION_WEAPON, m_aEquips[EQUIPIVTR_FASHION_WEAPON]); + // } + // RECORD_NORMAL_WEAPON( + // pWeapon->file_model_left, pWeapon->file_model_right, pSubType->action_type); + // } + // // ������ͨ���� + // else + // { + // bCanShowFashionWeapon = CanShowFashionWeapon(DEFAULT_ACTION_TYPE, m_iFashionWeaponType); + // if (bCanShowFashionWeapon) + // { + // CLEAR_WEAPON(EQUIPIVTR_WEAPON); + // if (!bCanShowFashionWeaponBefore) + // SET_WEAPON(EQUIPIVTR_FASHION_WEAPON, m_aEquips[EQUIPIVTR_FASHION_WEAPON]); + // } + // RECORD_NORMAL_WEAPON((char*)NULL, (char*)NULL, DEFAULT_ACTION_TYPE); + // } + // } + // } + // else if (bFashionWeaponChanged) + // { + // // װ��ʱװ���� + // if (pFashion) + // { + // bCanShowFashionWeapon = CanShowFashionWeapon(m_uAttackType, pFashion->action_type); + // if (!bCanShowFashionWeapon) + // { + // if (pGameUI && this == g_pGame->GetGameRun()->GetHostPlayer() && InFashionMode()) + // pGameUI->AddChatMessage(pGameUI->GetStringFromTable(906), GP_CHAT_SYSTEM); + // CLEAR_WEAPON(EQUIPIVTR_FASHION_WEAPON); + // if (bCanShowFashionWeaponBefore) + // SET_WEAPON(EQUIPIVTR_WEAPON, m_aEquips[EQUIPIVTR_WEAPON]); + // } + // // ����ʾʱװ�������˴�Ҫ��m_stoneWeapon���� + // else CLEAR_WEAPON(EQUIPIVTR_WEAPON); + // RECORD_FASHION_WEAPON( + // pFashion->file_model_left, pFashion->file_model_right, pFashion->action_type); + // } + // // ����ʱװ���� + // else + // { + // if (0 != m_aEquips[EQUIPIVTR_WEAPON]) + // { + // CLEAR_WEAPON(EQUIPIVTR_FASHION_WEAPON); + // if (bCanShowFashionWeaponBefore) + // SET_WEAPON(EQUIPIVTR_WEAPON, m_aEquips[EQUIPIVTR_WEAPON]); + // } + // RECORD_FASHION_WEAPON((char*)NULL, (char*)NULL, DEFAULT_ACTION_TYPE); + // } + // } + // if (bCanShowFashionWeaponBefore && !bCanShowFashionWeapon + // && pGameUI && !bFashionWeaponChanged && bNormalWeaponChanged && this == g_pGame->GetGameRun()->GetHostPlayer()) + // pGameUI->AddChatMessage(pGameUI->GetStringFromTable(906), GP_CHAT_SYSTEM); + } protected bool SetPlayerLoadedResult(EC_PLAYERLOADRESULT ret) { OnAllResourceReady(); @@ -3171,6 +3350,318 @@ namespace BrewMonster else m_dwResFlags &= ~dwFlag; } + public virtual void Release() + { + //TODO: Implement this latter + // DetachBuddy(); + + // // Clear extend states before model is released + // ClearShowExtendStates(); + // ::memset(m_aExtStates, 0, sizeof(m_aExtStates)); + // m_aIconStates.clear(); + + // if (m_pPateName) + // { + // delete m_pPateName; + // m_pPateName = NULL; + // } + + // if (m_pPateMarry) + // { + // delete m_pPateMarry; + // m_pPateMarry = NULL; + // } + + // if (m_pPateForce) + // { + // delete m_pPateForce; + // m_pPateForce = NULL; + // } + + // if (m_pPateTitle) + // { + // delete m_pPateTitle; + // m_pPateTitle = NULL; + // } + + // if (m_pPateLastWords1) + // { + // delete m_pPateLastWords1; + // m_pPateLastWords1 = NULL; + // } + + // if (m_pPateLastWords2) + // { + // delete m_pPateLastWords2; + // m_pPateLastWords2 = NULL; + // } + + // if (m_pPateTeamReq) + // { + // delete m_pPateTeamReq; + // m_pPateTeamReq = NULL; + // } + + // if (m_pPateBooth) + // { + // delete m_pPateBooth; + // m_pPateBooth = NULL; + // } + + // if (m_pPateFaction) + // { + // delete m_pPateFaction; + // m_pPateFaction = NULL; + // } + + // if (m_pFactionDecal) + // { + // delete m_pFactionDecal; + // m_pFactionDecal = NULL; + // } + + // if (m_pPateCountry) + // { + // delete m_pPateCountry; + // m_pPateCountry = NULL; + // } + // if (m_pCountryDecal) + // { + // delete m_pCountryDecal; + // m_pCountryDecal = NULL; + // } + + // if (m_pBubbleTexts) + // { + // delete m_pBubbleTexts; + // m_pBubbleTexts = NULL; + // } + + // if (m_pLevelUpGFX) + // { + // g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pLevelUpGFX); + // m_pLevelUpGFX = NULL; + // } + + // if (m_pPetCureGFX) + // { + // A3DGFXExMan *pGFXExMan = g_pGame->GetA3DGFXExMan(); + // if (pGFXExMan) + // pGFXExMan->CacheReleasedGfx(m_pPetCureGFX); + // m_pPetCureGFX = NULL; + // m_pPetCureGFXtate = -1; + // } + // for (int i = 0; i < sizeof(m_pMonsterSpiritGFX) / sizeof(m_pMonsterSpiritGFX[0]); ++i) { + // A3DGFXExMan *pGFXExMan = g_pGame->GetA3DGFXExMan(); + // if (pGFXExMan) + // pGFXExMan->CacheReleasedGfx(m_pMonsterSpiritGFX[i]); + // m_pMonsterSpiritGFX[i] = NULL; + // } + + // if (m_pWaterWaveStill) + // { + // g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pWaterWaveStill); + // m_pWaterWaveStill = NULL; + // } + + // if (m_pWaterWaveMove) + // { + // g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pWaterWaveMove); + // m_pWaterWaveMove = NULL; + // } + + // if (m_pAirBubble) + // { + // g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pAirBubble); + // m_pAirBubble = NULL; + // } + + // if (m_pSwimBubble) + // { + // g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pSwimBubble); + // m_pSwimBubble = NULL; + // } + + // if (m_pTransformGfx) + // { + // g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pTransformGfx); + // m_pTransformGfx = NULL; + // } + + // if (m_pDuelStateGFX) + // { + // g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pDuelStateGFX); + // m_pDuelStateGFX = NULL; + // } + + // if (m_pPetModel) + // { + // m_pPetModel->RemoveChildModel(_hanger_ride, false); + // A3DRELEASE(m_pPetModel); + // } + + // ClearBoothModel(); + + // for (MOEffectMAP::iterator it = m_mapMOEffect.begin();it != m_mapMOEffect.end();++it) + // { + // A3DGFXExMan *pGFXExMan = g_pGame->GetA3DGFXExMan(); + // pGFXExMan->CacheReleasedGfx(it->second); + // } + + // m_mapMOEffect.clear(); + + // // Release face model + // ReleaseFaceModel(); + + // // Release player model + // ReleasePlayerModel(); + + // // Clear resource ready flags + // SetResReadyFlag(RESFG_ALL, false); + + // m_bAboutToDie = false; + } + public void CloneSimplePropertyTo(CECPlayer player) + { + //TOdo: Complete this function(remove all commented code) + player.transform.position = m_pPlayerModel.transform.position; + player.transform.rotation = m_pPlayerModel.transform.rotation; + player.SetGroundNormal(GetGroundNormal()); + player.SetUseGroundNormal(GetUseGroundNormal()); + + // CECPlayer + player.m_PlayerInfo = GetPlayerInfo(); + player.SetBornStamp(GetBornStamp()); + player.name = GetName(); + //player.SetProps(&GetBasicProps(), &GetExtendProps()); + player.m_iGender = GetGender(); + player.m_iProfession = GetProfession(); + //player.m_pvp = GetPVPInfo(); + //player.m_aIconStates = GetIconStates(); + player.SetMoneyAmount(GetMoneyAmount()); + player.m_iMaxMoney = GetMaxMoneyAmount(); + //player.m_i64EquipDisabled = m_i64EquipDisabled; + //player.SetBoothState(GetBoothState()); + //player.m_factionPVPMask= m_factionPVPMask; + //player.m_RidingPet = GetRidingPetInfo(); + //player.m_iBattleCamp = GetBattleCamp(); + //player.m_dwGMFlags = m_dwGMFlags; + //player.SetSpouse(GetSpouse()); + player.m_idForce = GetForce(); + //player.SetCountry(GetCountry()); + //player.SetMoveMode(GetMoveMode()); + //player.SetMoveEnv(GetMoveEnv()); + //player.SetWalkRunFlag(GetWalkRunFlag()); + player.m_MoveConst = m_MoveConst; + player.m_aabbServer = m_aabbServer; + player.m_aabb = m_aabb; + player.m_dwStates = m_dwStates; + //player.m_dwStates2 = m_dwStates2; + player.m_fTouchRad = GetTouchRadius(); + //player.m_byPariahLvl = GetPariahLevel(); + //player.SetBoothName(GetBoothName()); + + // player.m_CustomizeFactor = m_CustomizeFactor; + // player.ChangeCustomizeData(m_CustomizeData); + // for (int i=0; i < GetEffectCount(); i++) + // player.ApplyEffect(GetEffect(i), true); + + // player.SetFactionID(GetFactionID()); + player.SetCurPetID(GetCurPetID()); + // player.SetCurrentTitle(GetCurrentTitle()); + // player.SetReputation(GetReputation()); + // player.SetFashionMode(InFashionMode()); + // player.SetFRoleID(GetFRoleID()); + // player.SetMeridiansProp(GetMeridiansProp()); + // player->SetReincarnationCount(GetReincarnationCount()); + // player.SetRealmLevel(GetRealmLevel()); + // player.ScaleBody(GetScaleBySkill()); + // player.SetTeamRequire(GetTeamRequire(), false); + player.SetNewExtendStates(0, m_aExtStates, OBJECT_EXT_STATE_COUNT); + // player.m_GoblinRenderCnt = m_GoblinRenderCnt; + // player.m_bRenderGoblin = m_bRenderGoblin; + } + public int GetOriginalShapeID() + { + return m_iShape; + } + public async Task TransformShape(byte iShape, bool bLoadAtOnce = false/* =false */) + { + SetShape(iShape); + //a_LogOutput(1, "CECPlayer::TransformShape(iShape=%d)(iShapeType=%d,iShapeID=%d)", iShape, PLAYERMODEL_GETTYPE(iShape), PLAYERMODEL_GETID(iShape)); + + if (!GetMajorModel()) return; + + if (IsShapeChanged()) + { + m_bWeaponAttached = false; + // change to a dummy model, may cause an asynchronous loading + await QueueLoadDummyModel(m_iShape, bLoadAtOnce); + } + else + { + m_bWeaponAttached = true; + // back to major model is a synchronous operation + ApplyShapeModelChange(GetMajorModel()); + } + OnModelChange(GetMajorModel()); + } + void SetShape(byte iShape) + { + // The shape id from the server is a 8-bit number + // The meaning of each bit: + // | 7 6 | 5 4 3 2 1 0 | + // |-TYPE-|-----Model ID-----| + int iNewShape = (iShape & 0xff); // only accept 8bit + // �Ծɵ�Shape�������ݽ������� + FixOldShapeInfo(ref iNewShape); + + // ְҵ������Model IDҪ��ת�� + if( PLAYERMODEL_GETTYPE(iNewShape) == (int)PLAYERMODEL_TYPE.PLAYERMODEL_PROFESSION ) + { + int iRealID = _GetProfessionTransformModelID( + m_iProfession, m_iGender, PLAYERMODEL_GETID(iNewShape)); + iNewShape = 0x40 | iRealID; + } + // ��ְҵ������Model IDΪEC_Resource.h���ֵ���ʲ������� + else + { + + } + + // store the original data into 8~15 bit + m_iShape = iNewShape | ((iShape & 0xff) << 8); + } + void FixOldShapeInfo(ref int iShape) + { + // �Ǹ�ʱ��shapeΪ0����û�б�������0����ְҵ���� + if(iShape != 0 && PLAYERMODEL_GETTYPE(iShape) == 0) + iShape |= 0x40; + } + public int _GetProfessionTransformModelID(int nChar, int nGender, int nModelID) + { + int result = 0; + switch (nChar){ + case (int)PROFESSION.PROF_HAG: // ���� + result = (2 == nModelID) ? (int)ModelResourceType.RES_MOD_ORC_FOX2 : (int)ModelResourceType.RES_MOD_ORC_FOX; + break; + case (int)PROFESSION.PROF_ORC: // ���� + result = (2 == nModelID) ? (int)ModelResourceType.RES_MOD_ORC_PANDER : (int)ModelResourceType.RES_MOD_ORC_TIGER; + break; + case (int)PROFESSION.PROF_MONK: // ��ʦ + case (int)PROFESSION.PROF_GHOST: // �̿� + result = ((int)Gender.GENDER_MALE == nGender) ? (int)ModelResourceType.RES_MOD_SHADOW_FISH_M : (int)ModelResourceType.RES_MOD_SHADOW_FISH_F; + break; + case (int)PROFESSION.PROF_YEYING: // ҹӰ + result = ((int)Gender.GENDER_MALE == nGender) ? (int)ModelResourceType.RES_MOD_YEYING_RESHAPE_M : (int)ModelResourceType.RES_MOD_YEYING_RESHAPE_F; + break; + case (int)PROFESSION.PROF_YUEXIAN: // ���� + result = ((int)Gender.GENDER_MALE == nGender) ? (int)ModelResourceType.RES_MOD_YUEXIAN_RESHAPE_M : (int)ModelResourceType.RES_MOD_YUEXIAN_RESHAPE_F; + break; + } + return result; + } + } public struct PlayActionEvent diff --git a/Assets/PerfectWorld/Scripts/NPC/CECModel.cs b/Assets/PerfectWorld/Scripts/NPC/CECModel.cs index 2d656cf06a..907ad04428 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECModel.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECModel.cs @@ -363,6 +363,9 @@ public class CLuaMemTbl public class CECModel { + + private bool m_bInheritParentId = true; + private int m_nId = 0; public GameObject m_pPlayerModel; private const uint COMACT_FLAG_MODE_NONE = 0; protected CECModelStaticData m_pMapModel; @@ -370,6 +373,8 @@ public class CECModel private Dictionary m_hookCache = new Dictionary(); private Dictionary m_childModels = new Dictionary(); private Transform m_transform; + public bool InheritParentId() => m_bInheritParentId; + public void SetId(int nId) => m_nId = nId; public void ClearComActFlag(bool bSignalCurrent) { ClearComActFlag(0, bSignalCurrent); } public void ClearComActFlag(int nChannel, bool bSignalCurrent) { @@ -586,6 +591,62 @@ public class CECModel return m_childModels.TryGetValue(hangerName, out CECModel child) ? child : null; } + public bool AddChildModel( + string szHangerName, + bool bOnBone, + string szHookName, + CECModel pChild, + string szCCName) + { + if (m_childModels.TryGetValue(szHangerName, out _)) + return false; + + if (pChild == null) + { + Debug.LogError($"CECModel::AddChildModel, pChild is null"); + return false; + } + + Transform hook = m_skeletonBuilder.GetHook(szHookName, true); + Transform hangger = pChild.m_skeletonBuilder.GetHook(szCCName, true); + if (hook == null || hangger == null) + { + Debug.LogError($"CECModel::AddChildModel, hook or hanger missing (hook={szHookName}, cc={szCCName})"); + return false; + } + + // Align child CC/hanger to parent hook in world space, then parent with world pose preserved. + // 先在世界里对齐子模型挂点与父挂点,再挂接并保持世界坐标不变。 + Vector3 worldAlign = hook.position - hangger.position; + pChild.transform.position += worldAlign; + pChild.transform.SetParent(hook.transform, true); + + // if (m_pA3DSkinModel && pChild->m_pA3DSkinModel) + // { + // if (!m_pA3DSkinModel->AddChildModel( + // szHangerName, + // bOnBone, + // szHookName, + // pChild->m_pA3DSkinModel, + // szCCName)) + // return false; + + // pChild->m_pA3DSkinModel->SetAutoAABBType(A3DSkinModel::AUTOAABB_INITMESH); + // pChild->m_bLoadSkinModel = false; + // } + + // pChild->m_strHookName = szHookName; + // pChild->m_strCC = szCCName; + // pChild->SetGfxUseLOD(m_bGfxUseLod, false); + // pChild->SetDisableCamShake(m_bDisableCamShake); + // pChild->SetCreatedByGfx(m_bCreatedByGfx); + + if (pChild.InheritParentId()) + pChild.SetId(m_nId); + + m_childModels[szHangerName] = pChild; + return true; + } public void PlayGfx(string szPath, string szHook, float fScale, bool bFadeOut, A3DVECTOR3 vOffset, float fPitch, float fYaw, float fRot, bool bUseECMHook, uint dwFadeOutTime) { if (!bFadeOut) diff --git a/Assets/PerfectWorld/Scripts/Pet/EC_PetCorral.cs b/Assets/PerfectWorld/Scripts/Pet/EC_PetCorral.cs index 03c94f7e96..71e2b8189c 100644 --- a/Assets/PerfectWorld/Scripts/Pet/EC_PetCorral.cs +++ b/Assets/PerfectWorld/Scripts/Pet/EC_PetCorral.cs @@ -15,7 +15,7 @@ namespace BrewMonster.Scripts.Pet { using PlantVec = System.Collections.Generic.List; - // ֲ + // ֲ������� // public struct CECPlantPetData { @@ -46,17 +46,17 @@ namespace BrewMonster.Scripts.Pet m_lifeTimeLeft = 0; } - int GetLifeTime() { return m_lifeTime * 1000; } // ܴʱ䣨룩 - int GetLifeTimeLeft() { return m_lifeTimeLeft; } // ʣʱ䣨룩 + int GetLifeTime() { return m_lifeTime * 1000; } // �ܴ��ʱ�䣨���룩 + int GetLifeTimeLeft() { return m_lifeTimeLeft; } // ʣ����ʱ�䣨���룩 - int m_tid; // ģID - public int m_nid; // ID - int m_lifeTime; // ʱ䣨0Ϊ - int m_lifeTimeLeft; // ʱ䵹ʱ - float m_HPFactor; // ǰ HP ռ HP ı - int m_HP; // ǰ HP - float m_MPFactor; // ǰ MP ռ MP ı - int m_MP; // ǰ MP + int m_tid; // �����ģ��ID + public int m_nid; // ���������ID + int m_lifeTime; // ���ʱ�䣨��������0Ϊ���� + int m_lifeTimeLeft; // ���ʱ�䵹��ʱ���������� + float m_HPFactor; // ��ǰ HP ռ�� HP �ı��� + int m_HP; // ��ǰ HP + float m_MPFactor; // ��ǰ MP ռ�� MP �ı��� + int m_MP; // ��ǰ MP public CECPlantPetData(int tid = 0, int nid = 0, int lifeTime = 0, int lifeTimeLeft = 0, float hPFactor = 1f, int hP = 0, float mPFactor = 1f, int mP = 0) { @@ -104,7 +104,7 @@ namespace BrewMonster.Scripts.Pet public int m_iMoveMode; // Current moving mode of pet public int m_iAttackMode; // Current attacking mode of pet - public int m_iPetLifeTime; // ǰĴڣ0ʾã + public int m_iPetLifeTime; // ��ǰ����Ĵ���ڣ�0��ʾ���ã� public PlantVec m_Plants; @@ -348,7 +348,7 @@ namespace BrewMonster.Scripts.Pet public void SetActivePetNPCID(int nid) { m_nidPet = nid; } - // ѯõǰʱ + // ��ѯ�����õ�ǰ���������ʱ�� public int GetActivePetLifeTime() { return m_iPetLifeTime; } public void SetActivePetLifetime(int lifetime) { m_iPetLifeTime = lifetime; } @@ -402,14 +402,14 @@ namespace BrewMonster.Scripts.Pet return m_pDBEvoConfig; } - bool CheckRebuildPetItemCond(int iPetIndex, int iSel, int type) // ѡƷţtype0(),1(Ը),2(ϴϵ) + bool CheckRebuildPetItemCond(int iPetIndex, int iSel, int type) // ����������ѡ�����Ʒ��ţ�type��0(����),1(�Ը���),2(ϴ��ϵ��) { CECPetData pPet = GetPetData(iPetIndex); if (pPet == null) return false; //int(*p)[2] = NULL; int[,] p = null; - if (type == 0) // + if (type == 0) // ���� { if(pPet.GetPetEssence() != null) { @@ -424,7 +424,7 @@ namespace BrewMonster.Scripts.Pet } } } - else if (type == 1) // Ը + else if (type == 1) // �Ը� { if (pPet.GetPetEssence() != null) { @@ -439,7 +439,7 @@ namespace BrewMonster.Scripts.Pet } } } - else if (type == 2) // ϴ + else if (type == 2) // ϴ�� { if (pPet.GetPetEssence() != null) { @@ -467,13 +467,13 @@ namespace BrewMonster.Scripts.Pet { // TO DO: fix later //pGameUI.MessageBox("", pGameUI.GetStringFromTable(10110), MB_OK, A3DCOLORRGBA(255, 255, 255, 160)); - return false; // 鲻 + return false; // �����鲻�� } if (pack.GetItemTotalNum(12980) < p[iSel,1]) { // TO DO: fix later //pGameUI.MessageBox("", pGameUI.GetStringFromTable(10111), MB_OK, A3DCOLORRGBA(255, 255, 255, 160)); - return false; // Ǭʯ + return false; // Ǭ��ʯ���� } return true; @@ -495,35 +495,35 @@ namespace BrewMonster.Scripts.Pet // Hunger level public enum ePetData_HUNGER_LEVEL { - HUNGER_LEVEL_0, // ʳ - HUNGER_LEVEL_1, // - HUNGER_LEVEL_2, // ̶һ + HUNGER_LEVEL_0, // ��ʳ + HUNGER_LEVEL_1, // ���� + HUNGER_LEVEL_2, // ���̶�һ�� HUNGER_LEVEL_3, - HUNGER_LEVEL_4, // ̶ȶ + HUNGER_LEVEL_4, // ���̶ȶ��� HUNGER_LEVEL_5, HUNGER_LEVEL_6, - HUNGER_LEVEL_7, // ̶ + HUNGER_LEVEL_7, // ���̶����� HUNGER_LEVEL_8, HUNGER_LEVEL_9, HUNGER_LEVEL_10, - HUNGER_LEVEL_11, // ̶ļ + HUNGER_LEVEL_11, // ���̶��ļ� HUNGER_LEVEL_COUNT, }; // Intimacy level public enum ePetData_INTIMACY_LEVEL { - INTIMACY_LEVEL_0, // Ұѱ, 0-50 - INTIMACY_LEVEL_1, // ޳, 51-150 - INTIMACY_LEVEL_2, // , 151-500 - INTIMACY_LEVEL_3, // Ĺ, 501-999 + INTIMACY_LEVEL_0, // Ұ����ѱ, 0-50 + INTIMACY_LEVEL_1, // �����޳�, 51-150 + INTIMACY_LEVEL_2, // ��������, 151-500 + INTIMACY_LEVEL_3, // ���Ĺ���, 501-999 INTIMACY_LEVEL_COUNT, INTIMACY_POINT_MAX = 999, }; // enum // { - // MAX_SKILLNUM = 4, // Ը + // MAX_SKILLNUM = 4, // �������Ը��� // }; public struct PETSKILL @@ -536,35 +536,35 @@ namespace BrewMonster.Scripts.Pet public enum SKILLTYPE { - EM_SKILL_DEFAULT = 0, // Ը - EM_SKILL_NORMAL, // ͨ - EM_SKILL_NATURE, // Ը - EM_SKILL_SPECIAL, // ר + EM_SKILL_DEFAULT = 0, // �������Ը��� + EM_SKILL_NORMAL, // ��ͨ���� + EM_SKILL_NATURE, // �Ը��� + EM_SKILL_SPECIAL, // ר������ }; - int m_iIntimacy; // øж - int m_iHunger; // - int m_tid; // ģID - int m_tidVis; // ģIDΪ0ʾɼID - int m_idEgg; // ﵰID - int m_iClass; // ս裬裬ͳ - float m_fHPFactor; // Ѫջʱʹã 0Ϊ + int m_iIntimacy; // �øж� + int m_iHunger; // ������ + int m_tid; // �����ģ��ID + int m_tidVis; // ���������ģ��ID�����Ϊ0�����ʾ������ɼ�ID�� + int m_idEgg; // ���ﵰ��ID + int m_iClass; // �������� ս�裬��裬���ͳ� + float m_fHPFactor; // Ѫ��������������ջ�ʱʹ�ã� 0��Ϊ���� float m_fMPFactor; - int m_iLevel; // V - bool m_isBind; // Ƿ˺һ - bool m_canWebTrade; // ǷѰɽ - ushort m_color; // ȾɫɫλΪ1ʱЧ - int m_iExp; // ﵱǰ - int m_iSkillPt; // ʣ༼ܵ + int m_iLevel; // ���V�� + bool m_isBind; // �Ƿ����˺�һ + bool m_canWebTrade; // �Ƿ�Ѱ�����ɽ��� + ushort m_color; // ���Ⱦɫ��ɫ����λΪ1ʱ��Ч + int m_iExp; // ���ﵱǰ���� + int m_iSkillPt; // ʣ�༼�ܵ� string m_strName; int m_iHP; // Only fight pets have this int m_iMP; PETSKILL[] m_aSkills = new PETSKILL[(int)GP_PET_SKILL_NUM.GP_PET_SKILL_NUM]; - List m_vecNorSkillIndex = new List(); // ֹԸܺͨ˳ҵ漼 m_aSkills + List m_vecNorSkillIndex = new List(); // ��ֹ�Ը��ܺ���ͨ����˳����ҵ���������漼���� m_aSkills������ List m_vecDynSkillIndex = new List(); - int m_iSpecialSkillIndex; // רm_aSkillsţֻнһ˼ + int m_iSpecialSkillIndex; // ����ר��������m_aSkills�����ţ�ֻ�н�������һ���˼��� CECCounter m_cntAutoSkill = new CECCounter(); List m_aAutoSkills = new List(); @@ -648,7 +648,7 @@ namespace BrewMonster.Scripts.Pet EC_Game.GetGameRun().GetUIManager().FilterBadWords(ref m_strName); } } - // Ըñ + // �������Ը������ñ� object pDBData = pDB.get_data_ptr((uint)Info.evo_prop.nature, ID_SPACE.ID_SPACE_CONFIG, ref DataType); PET_EVOLVED_SKILL_CONFIG? pDynSkills = null; if (pDBData != null && DataType == DATA_TYPE.DT_PET_EVOLVED_SKILL_CONFIG) @@ -699,7 +699,7 @@ namespace BrewMonster.Scripts.Pet bool bNormal = true; if (pDynSkills != null) { - for (int j = 0; j < 2; j++) // Ը + for (int j = 0; j < 2; j++) // �����Ը��� { if (pDynSkills?.skills[j].id == skill_id) { @@ -915,7 +915,7 @@ namespace BrewMonster.Scripts.Pet return 0; // } - // ȡʾ + // ��ȡ������ʾ������ public ROLEEXTPROP GetExtendProps() { return m_ExtProps; } public void SetExtendProps(ROLEEXTPROP prop) { m_ExtProps = prop; } @@ -993,7 +993,7 @@ namespace BrewMonster.Scripts.Pet return ""; } - // Զͷż + // �����Զ��ͷż��� public void AddAutoSkill(int skill_id) { m_aAutoSkills.Add(skill_id); diff --git a/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs b/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs new file mode 100644 index 0000000000..6358535e7b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs @@ -0,0 +1,391 @@ +using BrewMonster; +using BrewMonster.Scripts; +using System.Threading.Tasks; +using UnityEngine; +using CSNetwork.GPDataType; +using Cysharp.Threading.Tasks; +namespace BrewMonster.Scripts +{ + // CECHostNavigatePlayer class - Basic implementation for navigation player // CECHostNavigatePlayer类 - 导航玩家的基本实现 + public class CECHostNavigatePlayer : CECClonePlayer + { + protected CECNavigateCtrl m_pNavigateCtrl; // Force navigate // 强制导航 + protected CECHostPlayer m_pHostPlayer = null; // Reference to host player // 对宿主玩家的引用 + protected string m_szNavigateModelFile; + protected CECModel m_pNavigateModel; + protected CECModel playerModel; + protected bool m_bNavigateModelApplied; // Whether navigate model has been applied // 移动模型是否已应用 + /// + /// MonoBehaviour must not be constructed with new; use AddComponent then call this. + /// MonoBehaviour 不能用 new 构造;请用 AddComponent 再调用本方法。 + /// + public void InitializeHost(CECHostPlayer pHost) + { + + m_szNavigateModelFile = null; + m_bNavigateModelApplied = false; + m_pNavigateModel = null; + + m_iCID = (int)Class_ID.OCID_CLONED_PLAYER; + m_bCastShadow = true; + m_bShowCustomize = true; + m_pHostPlayer = pHost; + m_pNavigateCtrl = pHost != null ? new CECNavigateCtrl(pHost) : null; + } + + public A3DVECTOR3 GetDir() + { + if (m_pHostPlayer != null) + { + // Get direction from host's transform // 从宿主的变换获取方向 + Transform hostTransform = m_pHostPlayer.transform; + if (hostTransform != null) + { + Vector3 forward = hostTransform.forward; + return new A3DVECTOR3(forward.x, forward.y, forward.z); + } + } + return new A3DVECTOR3(0, 0, 1); + } + public A3DVECTOR3 GetUp() + { + Transform hostTransform = m_pHostPlayer.transform; + if (hostTransform != null) + { + Vector3 up = hostTransform.up; + return new A3DVECTOR3(up.x, up.y, up.z); + } + return new A3DVECTOR3(0, 1, 0); + } + + + public void ChangeModelMoveDirAndUp(A3DVECTOR3 vDir, A3DVECTOR3 vUp) + { + if (m_pHostPlayer != null && m_pHostPlayer.transform != null) + { + // Update host's rotation based on direction // 根据方向更新宿主的旋转 + Vector3 dir = new Vector3(vDir.x, vDir.y, vDir.z); + Vector3 up = new Vector3(vUp.x, vUp.y, vUp.z); + + if (dir.magnitude > 0.01f) + { + Quaternion rotation = Quaternion.LookRotation(dir, up); + m_pHostPlayer.transform.rotation = rotation; + } + } + } + public void SetNavigateModelFile(string szFile) + { + m_szNavigateModelFile = szFile; + } + + public CECNavigateCtrl GetNavigateCtrl() { return m_pNavigateCtrl; } + + // Handle navigation event // 处理导航事件 + public void OnNavigateEvent(int task, int e) + { + if (m_pNavigateCtrl == null) + { + return; + } + + if (e == (int)CECNavigateCtrl.NavigateEvent.EM_PREPARE) + { + m_pNavigateCtrl.OnPrepareNavigate(task); + } + else if (e == (int)CECNavigateCtrl.NavigateEvent.EM_BEGIN) + { + m_pNavigateCtrl.OnBeginNavigate(); + } + else if (e == (int)CECNavigateCtrl.NavigateEvent.EM_END) + { + m_pNavigateCtrl.OnEndNavigate(); + } + } + + public bool LoadConfig() + { + m_pNavigateCtrl = new CECNavigateCtrl(m_pHostPlayer); + if (m_pNavigateCtrl != null) + return m_pNavigateCtrl.LoadConfig("configs\\force_navigate.txt"); + else + { + BMLogger.LogError("CECHostNavigatePlayer::Init, Failed to load config."); + } + return false; + } + public override CECModel GetRenderModel() + { + return m_pNavigateModel != null ? m_pNavigateModel : base.GetRenderModel(); + } + public bool IsNavigateMoving() + { + if (m_pNavigateCtrl != null && m_pNavigateCtrl.GetBezierWalker() != null) + return m_pNavigateCtrl.GetBezierWalker().IsWalking(); + return false; + } + public override void Release() + { + TeardownNavigatePlayerVisual(); + base.Release(); + if (m_pNavigateModel != null && m_pNavigateModel.m_pPlayerModel != null) + { + Transform hhRide = m_pNavigateModel.m_pPlayerModel.transform.Find("HH_ride"); + if (hhRide != null) + { + Destroy(hhRide.gameObject); + } + Destroy(m_pNavigateModel.m_pPlayerModel); + m_pNavigateModel = null; + } + if (m_pNavigateCtrl != null) + { + m_pNavigateCtrl = null; + } + m_bNavigateModelApplied = false; + TickInvoker.Instance.UnregisterTickable(this); + } + /// + /// Load optional force-navigate dummy model via Addressables, then clone host visuals. + /// 通过 Addressables 加载可选的强制导航替身模型,再克隆宿主外观。 + /// + public async Task Init() + { + if (m_pHostPlayer == null) + { + return false; + } + int debugStep = 0; + m_bNavigateModelApplied = false; + + // Load navigate model // 加载导航模型 + if (!string.IsNullOrEmpty(m_szNavigateModelFile)) + { + if (m_pNavigateModel != null) + { + if (m_pNavigateModel.m_pPlayerModel != null) + { + Transform hhRide = m_pNavigateModel.m_pPlayerModel.transform.Find("HH_ride"); + if (hhRide != null) + foreach (Transform child in hhRide) + { + Destroy(child.gameObject); + } + + Destroy(m_pNavigateModel.m_pPlayerModel); + } + m_pNavigateModel = null; + } + string address = AFile.NormalizePath(m_szNavigateModelFile.ToLower(), true); + GameObject prefab = await AddressableManager.Instance.LoadPrefabAsync(address); + if (prefab == null) + { + BMLogger.LogError($"CECHostNavigatePlayer::InitAsync, Failed to load navigate model: {address}"); + } + else + { + GameObject instance = ObjectSpawner.Instance.InstantiateObject(prefab); + instance.transform.localPosition = Vector3.zero; + instance.transform.localRotation = Quaternion.identity; + instance.transform.localScale = Vector3.one; + + m_pNavigateModel = new CECModel(); + m_pNavigateModel.m_pPlayerModel = instance; + SkeletonBuilder skeletonBuilder = instance.GetComponentInChildren(true); + if (skeletonBuilder != null) + { + m_pNavigateModel.SetSkeletonBuilder(skeletonBuilder); + m_pNavigateModel.SetTransform(instance.transform); + m_pNavigateModel.InitializeSkeletonBuilder(); + } + else + { + m_pNavigateModel.SetTransform(instance.transform); + } + + AddressableManager.Instance.ReleaseAsset(address); + } + } + + CameraController.Instance.UpdateFollowObject(m_pNavigateModel.transform); + TickInvoker.Instance.RegisterTickable(this); + // Clone host player model/equipment // 克隆宿主玩家模型与装备 + BMLogger.Log($"CECHostNavigatePlayer::InitAsync, debugStep: {debugStep++}"); + bool loaded = await LoadFrom(m_pHostPlayer, false); + if (loaded) + SetupNavigatePlayerVisual(); + return loaded; + } + + /// + /// Subscribe navigate clone to the same cid animation channel as the host (host unsubscribes first). + /// 与宿主相同 cid 的动画通道:先取消宿主订阅,再初始化导航克隆的 PlayerVisual。 + /// + void SetupNavigatePlayerVisual() + { + if (!TryGetComponent(out var navigateVisual)) + return; + if (m_pHostPlayer != null && m_pHostPlayer.TryGetComponent(out var hostVisual)) + hostVisual.UnregisterPlayerEventHandlers(); + navigateVisual.InitPlayerEventDoneHandler(); + } + + /// + /// Restore host PlayerVisual subscriptions when force navigate ends. + /// 强制导航结束时恢复宿主的 PlayerVisual 订阅。 + /// + void TeardownNavigatePlayerVisual() + { + if (TryGetComponent(out var navigateVisual)) + navigateVisual.UnregisterPlayerEventHandlers(); + if (m_pHostPlayer != null && m_pHostPlayer.TryGetComponent(out var hostVisual)) + hostVisual.InitPlayerEventDoneHandler(); + } + public bool IsReadyNavigate() + { + return IsAllResReady() && m_bNavigateModelApplied; + } + public bool PlayNavigateAction() + { + if (m_pNavigateModel != null) + { + string szPetAct = null; + szPetAct = CECNPC.GetBaseActionName((int)PLAYER_ACTION_TYPE.ACT_WALK); + EventBus.PublishChannel(m_PlayerInfo.cid, new PlayActionEvent(szPetAct, 200, true)); + } + + PLAYER_ACTION action = m_PlayerActions[(int)PLAYER_ACTION_TYPE.ACT_STAND]; + + string szAct = $"{action.data.ActionPrefix}_骑乘_通用"; + + PlayNonSkillActionWithName(szAct); + return true; + } + public bool PlayNonSkillActionWithName(string szAct) + { + if (m_pActionController != null) + { + Debug.Log($"CECHostNavigatePlayer::PlayNonSkillActionWithName, szAct: {szAct} of object {m_pActionController.PlayerModel.transform.parent.name}"); + return m_pActionController.PlayNonSkillActionWithName(GetMoveStandAction(false, IsFighting()), szAct); + } + return false; + } + public override bool Tick(uint dwDeltatime) + { + base.Tick(dwDeltatime); + Debug.Log($"CECHostNavigatePlayer::Tick, m_bNavigateModelApplied: {m_bNavigateModelApplied}"); + if (!m_bNavigateModelApplied /*&& IsAllResReady()*/) + { + ApplyNavigateModel(); + // if(!IsShapeChanged()) + // ApplyNavigateModel(); + // else if (IsShapeChanged() && IsShapeModelChanged() && m_pNavigateModel != null) + // ApplyNavigateModel(); + } + return true; + } + public Vector3 GetNavigateModelPosition() + { + if (m_pNavigateModel == null || m_pNavigateModel.m_pPlayerModel == null) + return m_pHostPlayer.transform.position; + return m_pNavigateModel.m_pPlayerModel.transform.position; + } + + /// + /// Safe world position for streaming when navigate model is not ready yet. + /// 导航模型未就绪时用于流式加载的安全世界坐标。 + /// + public bool TryGetNavigateModelPosition(out Vector3 position) + { + position = default; + if (m_pNavigateModel == null || m_pNavigateModel.m_pPlayerModel == null) + return false; + position = m_pNavigateModel.m_pPlayerModel.transform.position; + return true; + } + + // A3DAABB CECHostNavigatePlayer::GetShadowAABB(){ + // A3DAABB shadowAABB; + // shadowAABB.Clear(); + // shadowAABB.Merge(m_aabb); + // + // if(m_pNavigateModel) + // shadowAABB.Merge(m_pNavigateModel->GetModelAABB()); + // else if (IsRidingOnPet() && m_pPetModel && m_pPetModel->GetA3DSkinModel()) + // shadowAABB.Merge(m_pPetModel->GetModelAABB()); + // else if (GetPlayerModel() && GetPlayerModel()->GetA3DSkinModel()) + // shadowAABB.Merge(GetPlayerModel()->GetModelAABB()); + // + // return shadowAABB; + // } + public override void SetDirAndUp(A3DVECTOR3 vDir, A3DVECTOR3 vUp) + { + base.SetDirAndUp(vDir, vUp); + if (m_pNavigateModel != null) + { + Vector3 dir = new Vector3(vDir.x, vDir.y, vDir.z); + Vector3 up = new Vector3(vUp.x, vUp.y, vUp.z); + if (dir.magnitude > 0.01f) + { + Quaternion lookRot = Quaternion.LookRotation(dir, up); + m_pNavigateModel.m_pPlayerModel.transform.rotation = lookRot; + } + m_bAdjustOrient = false; + } + } + protected override bool ShouldLoadEquipment(int index) + { + return index != InventoryConst.EQUIPIVTR_FLYSWORD; + } + protected override void OnCloneSimpleProperty() + { + // m_pNavigateModel needs mount hook on cloned model; duplicate attach/release — do not load riding pet again here // m_pNavigateModel 需要挂接克隆模型挂点,避免重复释放,故不再加载骑宠 + m_RidingPet.Reset(); + } + public override void SetPos(Vector3 vPos) + { + base.SetPos(vPos); + if (m_pNavigateModel != null) + { + m_pNavigateModel.m_pPlayerModel.transform.position = + vPos; + } + + } + + private bool ApplyNavigateModel() + { + + // if ( !GetMajorModel() || m_pNavigateModel == null || m_bNavigateModelApplied) + // return false; + + A3DVECTOR3 vCurPos = GetPos(); + + m_aabbServer.Center = vCurPos + new A3DVECTOR3(0.0f, m_aabbServer.Extents.y, 0.0f); + m_aabbServer.CompleteMinsMaxs(); + + SetUseGroundNormal(true); + + // Hang character model on force-navigate model // 把角色模型挂到强制移动模型上 + // int iIndex; + // A3DSkeletonHook* pHook = GetMajorModel()->GetA3DSkinModel()->GetSkeleton()->GetHook(_cc_ride, &iIndex); + // if (pHook) pHook->SetFixDirFlag(true); + + m_pNavigateModel.AddChildModel(_hanger_ride, false, _hh_ride, GetPlayerModel(), _cc_ride); + // if(IsShapeModelChanged()) + // m_pNavigateModel.AddChildModel(_hanger_ride, false, _hh_ride, GetPlayerModel(), "HH_feijian"); + // else + // m_pNavigateModel.AddChildModel(_hanger_ride, false, _hh_ride, GetMajorModel(), _cc_ride); + + //m_pNavigateModel->GetA3DSkinModel()->Update(0); + + // PlayAction(GetMoveStandAction(false, IsFighting()), 1.0f, true); + PlayNavigateAction(); + + m_bNavigateModelApplied = true; + + OnNavigateEvent(0, (int)CECNavigateCtrl.NavigateEvent.EM_BEGIN); + return true; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs.meta b/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs.meta new file mode 100644 index 0000000000..74a9d01ee9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 23d5d05595a4474cb298d23fe6e7c923 diff --git a/Assets/PerfectWorld/Scripts/Players/CECPlayerActionPlayPolicy.cs b/Assets/PerfectWorld/Scripts/Players/CECPlayerActionPlayPolicy.cs index eab5b405cb..1fc18dd68c 100644 --- a/Assets/PerfectWorld/Scripts/Players/CECPlayerActionPlayPolicy.cs +++ b/Assets/PerfectWorld/Scripts/Players/CECPlayerActionPlayPolicy.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace BrewMonster { diff --git a/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs b/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs new file mode 100644 index 0000000000..13c2a0adc2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs @@ -0,0 +1,142 @@ +using BrewMonster.Scripts; +using System.Threading.Tasks; +using UnityEngine; +using CSNetwork.GPDataType; +namespace BrewMonster +{ + public class CECClonePlayer : CECPlayer + { + protected bool m_bShowCustomize; // ��ʾ���Ի� + protected bool m_bUseHintModel; // ʹ��˵��ģ�� + + public CECClonePlayer(){ + m_iCID = (int)Class_ID.OCID_CLONED_PLAYER; + m_bCastShadow = true; + m_bShowCustomize= true; + //Todo: add cofig feature to game + //m_bUseHintModel = GetConfigs().GetVideoSettings().bModelLimit; + } + public bool CanClone(CECPlayer player) + { + return player != null + && (player.IsHostPlayer() || player.IsElsePlayer()); + } + public async Task Clone(CECPlayer player, bool atOnce){ + if (!player){ + return false; + } + if (player.IsHostPlayer()){ + if (await LoadFrom((CECHostPlayer)player, atOnce)){ + return true; + } + } + if (player.IsElsePlayer()){ + if (await LoadFrom((EC_ElsePlayer)player, atOnce)){ + return true; + } + } + return false; + } + protected async Task LoadFrom(CECHostPlayer player, bool atOnce) + { + int i = 0; + EC_IvtrItem[] aEquipItems = new EC_IvtrItem[InventoryConst.SIZE_ALL_EQUIPIVTR]; + + // Create equipments + for (i=0; i < player.GetEquipment().GetSize(); i++){ + if (!ShouldLoadEquipment(i)){ + continue; + } + EC_IvtrItem Equip = player.GetEquipment().GetItem(i); + aEquipItems[i] = Equip; + } + + // // Todo: Create goblin + // if( aEquipItems[EQUIPIVTR_GOBLIN] ) + // { + // m_pGoblin = new CECGoblin(); + // CECIvtrGoblin* pIvtrGoblin = (CECIvtrGoblin*)aEquipItems[EQUIPIVTR_GOBLIN]; + // m_pGoblin->Init(pIvtrGoblin->GetTemplateID(), pIvtrGoblin, this); + // } + + // Build new equipments id array (must match SIZE_ALL_EQUIPIVTR — LoadPlayerSkeleton iterates full range) + int[] aNewEquips = new int[InventoryConst.SIZE_ALL_EQUIPIVTR]; + + for (i=0; i < InventoryConst.IVTRSIZE_EQUIPPACK; i++) { + EC_IvtrItem pItem = aEquipItems[i]; + if (pItem != null) { + aNewEquips[i] = pItem.GetTemplateID(); + if( ((i >= InventoryConst.EQUIPIVTR_FASHION_BODY && i <= InventoryConst.EQUIPIVTR_FASHION_WRIST) + || i == InventoryConst.EQUIPIVTR_FASHION_HEAD ) && + pItem.GetClassID() == (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_FASHION ) { + EC_IvtrFashion pFashionItem = (EC_IvtrFashion)pItem; + aNewEquips[i] |= (pFashionItem.GetWordColor() << 16) & 0x7fffffff; + } + else { + EC_IvtrEquip pEquip = (EC_IvtrEquip) pItem; + ushort stoneStatus = pEquip != null ? pEquip.GetStoneMask() : (ushort)0; + aNewEquips[i] |= (stoneStatus << 16) & 0x7fffffff; + } + } + else{ + aNewEquips[i] = 0; + } + } + + m_aEquips = aNewEquips; + + 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++){ + if (!ShouldLoadEquipment(i)){ + continue; + } + m_aEquips[i] = player.GetEquipment(i); + } + return await Load(player, atOnce); + } + public override void SetDirAndUp(A3DVECTOR3 vDir, A3DVECTOR3 vUp){ + base.SetDirAndUp(vDir, vUp); + if(m_pPlayerCECModel != null) + { + Vector3 dir = new Vector3(vDir.x, vDir.y, vDir.z); + Vector3 up = new Vector3(vUp.x, vUp.y, vUp.z); + if (dir.magnitude > 0.01f) + { + Quaternion lookRot = Quaternion.LookRotation(dir, up); + m_pPlayerCECModel.m_pPlayerModel.transform.rotation = lookRot; + } + m_bAdjustOrient = false; + } + //m_pPlayerCECModel.SetDirAndUp(vDir,vUp); + } + protected async Task Load(CECPlayer player, bool atOnce){ + player.CloneSimplePropertyTo(this); + OnCloneSimpleProperty(); + if (!await LoadPlayerSkeleton(atOnce)){ + BMLogger.LogError("CECCloneElsePlayer::Load, Failed to load skeleton."); + return false; + } + 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); + } + } + +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs.meta b/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs.meta new file mode 100644 index 0000000000..5b46803364 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 938059b66516247539bb36cc9d80cf98 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Players/CECPlayerWrapper.cs b/Assets/PerfectWorld/Scripts/Players/CECPlayerWrapper.cs index cf4acee790..e6b161aa42 100644 --- a/Assets/PerfectWorld/Scripts/Players/CECPlayerWrapper.cs +++ b/Assets/PerfectWorld/Scripts/Players/CECPlayerWrapper.cs @@ -2,11 +2,10 @@ using BrewMonster; using BrewMonster.Managers; using BrewMonster.Network; -using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts; using CSNetwork; using CSNetwork.GPDataType; using PerfectWorld.Scripts; -using PerfectWorld.Scripts.Managers; using System; using System.Collections.Generic; using System.Runtime.CompilerServices; diff --git a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs index f9878ddd59..8b7cbe0ea4 100644 --- a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs +++ b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs @@ -1164,6 +1164,10 @@ namespace BrewMonster return true; } + public int GetEquipment(int index) + { + return m_aEquips[index]; + } } // Player appear flag diff --git a/Assets/PerfectWorld/Scripts/Players/EC_HostMsg.cs b/Assets/PerfectWorld/Scripts/Players/EC_HostMsg.cs index 7e4dd949e0..f7d798cfe4 100644 --- a/Assets/PerfectWorld/Scripts/Players/EC_HostMsg.cs +++ b/Assets/PerfectWorld/Scripts/Players/EC_HostMsg.cs @@ -178,7 +178,7 @@ namespace BrewMonster { for (int i = 0; i < pPet.GetSkillNum(SKILLTYPE.EM_SKILL_DEFAULT); i++) { - PETSKILL? pSkill = pPet.GetSkill(SKILLTYPE.EM_SKILL_DEFAULT, i); + CECPetData.PETSKILL? pSkill = pPet.GetSkill(SKILLTYPE.EM_SKILL_DEFAULT, i); if (pSkill != null && EC_Game.IsPetAutoSkill(pSkill.Value.idSkill)) pPet.AddAutoSkill(pSkill.Value.idSkill); } diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs index 3705c9fba6..4683542a8c 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs @@ -2,7 +2,7 @@ using BrewMonster.Assets.PerfectWorld.Scripts.UI; using BrewMonster.Common; using BrewMonster.Managers; using BrewMonster.Network; -using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts; using BrewMonster.Scripts.Task; using CSNetwork; using CSNetwork.Common; diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetHatch.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetHatch.cs index ef5c4102e7..dcf14c6d1c 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetHatch.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetHatch.cs @@ -12,7 +12,7 @@ using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; -using static BrewMonster.Scripts.Managers.EC_Inventory; +using static BrewMonster.Scripts.EC_Inventory; namespace BrewMonster.UI { diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgProduce.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgProduce.cs index 936bbfbb21..bff4cd5b87 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgProduce.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgProduce.cs @@ -1,5 +1,5 @@ using BrewMonster.Network; -using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts; using BrewMonster.Scripts.Task; using BrewMonster.UI; using ModelRenderer.Scripts.Common; diff --git a/Assets/PerfectWorld/Scripts/UI/NPCShopDetailPanel.cs b/Assets/PerfectWorld/Scripts/UI/NPCShopDetailPanel.cs index 0955fa0986..c4ce78adde 100644 --- a/Assets/PerfectWorld/Scripts/UI/NPCShopDetailPanel.cs +++ b/Assets/PerfectWorld/Scripts/UI/NPCShopDetailPanel.cs @@ -5,9 +5,7 @@ using UnityEngine; using UnityEngine.UI; using TMPro; -using PerfectWorld.Scripts.Shop; -using PerfectWorld.Scripts.Managers; -using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts; using BrewMonster.Network; using CSNetwork.C2SCommand; diff --git a/Assets/PerfectWorld/Scripts/UI/NPCShopItemPanel.cs b/Assets/PerfectWorld/Scripts/UI/NPCShopItemPanel.cs index e112a3e4ea..191b5afef0 100644 --- a/Assets/PerfectWorld/Scripts/UI/NPCShopItemPanel.cs +++ b/Assets/PerfectWorld/Scripts/UI/NPCShopItemPanel.cs @@ -7,7 +7,7 @@ using UnityEngine.UI; using TMPro; using System.Collections; using PerfectWorld.Scripts.Shop; -using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts; public class NPCShopItemPanel : MonoBehaviour { diff --git a/Assets/PerfectWorld/Scripts/UI/NPCShopUIManager.cs b/Assets/PerfectWorld/Scripts/UI/NPCShopUIManager.cs index 94820c8658..07100688db 100644 --- a/Assets/PerfectWorld/Scripts/UI/NPCShopUIManager.cs +++ b/Assets/PerfectWorld/Scripts/UI/NPCShopUIManager.cs @@ -5,11 +5,11 @@ using BrewMonster; using BrewMonster.Network; using BrewMonster.Scripts.Managers; + +using BrewMonster.Scripts; using BrewMonster.UI; using CSNetwork.C2SCommand; using ModelRenderer.Scripts.Common; -using PerfectWorld.Scripts.Managers; -using PerfectWorld.Scripts.Shop; using System; using System.Collections.Generic; using TMPro; diff --git a/Assets/PerfectWorld/Scripts/UI/ProduceItemPanel.cs b/Assets/PerfectWorld/Scripts/UI/ProduceItemPanel.cs index ad9bd16318..bc85793b16 100644 --- a/Assets/PerfectWorld/Scripts/UI/ProduceItemPanel.cs +++ b/Assets/PerfectWorld/Scripts/UI/ProduceItemPanel.cs @@ -1,5 +1,5 @@ using BrewMonster; -using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts; using System.Collections; using TMPro; using UnityEngine; @@ -12,7 +12,6 @@ public class ProduceItemPanel : MonoBehaviour public Image icon; public TextMeshProUGUI text_name; public TextMeshProUGUI text_level; - private uint recipeId; private Coroutine loadIconCoroutine; private DlgProduce ownerDlg; diff --git a/Assets/PerfectWorld/Scripts/UI/ShopItemPanel.cs b/Assets/PerfectWorld/Scripts/UI/ShopItemPanel.cs index 8ddc14a964..e6b8f165ca 100644 --- a/Assets/PerfectWorld/Scripts/UI/ShopItemPanel.cs +++ b/Assets/PerfectWorld/Scripts/UI/ShopItemPanel.cs @@ -1,8 +1,7 @@ -using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts; using UnityEngine; using UnityEngine.UI; using TMPro; -using PerfectWorld.Scripts.Managers; public class ShopItemPanel : MonoBehaviour { diff --git a/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs b/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs index faf39ee844..8651386e9a 100644 --- a/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs +++ b/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs @@ -148,7 +148,15 @@ public class LitModelHolder : MonoSingleton await Task.Delay(100, destroyToken); // wait for the host player to be initialized. - _currentHostPosOxz = _hostPlayer.GetPosVector3(); + //In c++ version. clone object position is used as the host object position when force navigate. + if(_hostPlayer.IsInForceNavigateState()) + { + _currentHostPosOxz = _hostPlayer.GetNavigatePlayer().GetNavigateModelPosition(); + } + else + { + _currentHostPosOxz = _hostPlayer.GetPosVector3(); + } _currentHostPosOxz.y = 0; LoadAllObjectsNearPosition(_currentHostPosOxz, destroyToken); } @@ -311,9 +319,18 @@ public class LitModelHolder : MonoSingleton private void UpdateHostPlayerPosition() { _hostPlayer = GetHostPlayer(); + + if (_hostPlayer != null) { - _currentHostPosOxz = _hostPlayer.GetPosVector3(false); + if(_hostPlayer.IsInForceNavigateState()) + { + _currentHostPosOxz = _hostPlayer.GetNavigatePlayer().GetNavigateModelPosition(); + } + else + { + _currentHostPosOxz = _hostPlayer.GetPosVector3(false); + } _currentHostPosOxz.y = 0; _hostPosReady = true; } diff --git a/Assets/PerfectWorld/Scripts/World/TerrainHolder.cs b/Assets/PerfectWorld/Scripts/World/TerrainHolder.cs index 86e53a49c7..d7b6142b0c 100644 --- a/Assets/PerfectWorld/Scripts/World/TerrainHolder.cs +++ b/Assets/PerfectWorld/Scripts/World/TerrainHolder.cs @@ -2,6 +2,7 @@ using UnityEngine; using Cysharp.Threading.Tasks; using System.Threading; using BrewMonster.Network; +using BrewMonster.Scripts; using System; using System.Collections.Generic; @@ -195,16 +196,34 @@ namespace BrewMonster _objectsToUnload.Clear(); } + /// + /// Main-thread anchor for terrain streaming: host position, or navigate clone when force-navigate is active (same idea as LitModelHolder). + /// 地形流式锚点:普通用宿主;强制导航用导航克隆(与 LitModelHolder 一致)。 + /// private void UpdateGlobalDataForStreaming() { _realTimeSinceStartUp = Time.realtimeSinceStartup; if (_hostPlayer == null) - { _hostPlayer = CECGameRun.Instance.GetHostPlayer(); + + if (_hostPlayer == null) + { + _hostPosReady = false; + return; + } + //In c++ version. clone object position is used as the host object position when force navigate. + if (_hostPlayer.IsInForceNavigateState()) + { + CECHostNavigatePlayer nav = _hostPlayer.GetNavigatePlayer(); + if (nav != null && nav.TryGetNavigateModelPosition(out Vector3 clonePos)) + { + _currentHostPosOxz = clonePos; + } + } + else + { + _currentHostPosOxz = _hostPlayer.GetPosVector3(false); } - if (_hostPlayer == null) return; - - _currentHostPosOxz = _hostPlayer.GetPosVector3(); _currentHostPosOxz.y = 0f; _hostPosReady = true; } diff --git a/Assets/Scripts/CECHostPlayer.Inventory.cs b/Assets/Scripts/CECHostPlayer.Inventory.cs index 2d383f5e3b..5dcc6a5133 100644 --- a/Assets/Scripts/CECHostPlayer.Inventory.cs +++ b/Assets/Scripts/CECHostPlayer.Inventory.cs @@ -11,7 +11,7 @@ using BrewMonster.UI; using PerfectWorld.Scripts.Managers; using UnityEngine; using static BrewMonster.Scripts.CECHPWork; -using static BrewMonster.Scripts.Managers.EC_Inventory; +using static BrewMonster.Scripts.EC_Inventory; namespace BrewMonster { diff --git a/Assets/Scripts/CECHostPlayer.Model.cs b/Assets/Scripts/CECHostPlayer.Model.cs index 6bc8df16f7..afaf11fa71 100644 --- a/Assets/Scripts/CECHostPlayer.Model.cs +++ b/Assets/Scripts/CECHostPlayer.Model.cs @@ -16,59 +16,6 @@ namespace BrewMonster TransformShape(pCmd.shape); } - public async Task TransformShape(byte iShape, bool bLoadAtOnce = false/* =false */) - { - SetShape(iShape); - //a_LogOutput(1, "CECPlayer::TransformShape(iShape=%d)(iShapeType=%d,iShapeID=%d)", iShape, PLAYERMODEL_GETTYPE(iShape), PLAYERMODEL_GETID(iShape)); - - if (!GetMajorModel()) return; - - if (IsShapeChanged()) - { - m_bWeaponAttached = false; - // change to a dummy model, may cause an asynchronous loading - await QueueLoadDummyModel(m_iShape, bLoadAtOnce); - } - else - { - m_bWeaponAttached = true; - // back to major model is a synchronous operation - ApplyShapeModelChange(GetMajorModel()); - } - OnModelChange(GetMajorModel()); - } - void SetShape(byte iShape) - { - // The shape id from the server is a 8-bit number - // The meaning of each bit: - // | 7 6 | 5 4 3 2 1 0 | - // |-TYPE-|-----Model ID-----| - int iNewShape = (iShape & 0xff); // only accept 8bit - // �Ծɵ�Shape�������ݽ������� - FixOldShapeInfo(ref iNewShape); - - // ְҵ������Model IDҪ��ת�� - if( PLAYERMODEL_GETTYPE(iNewShape) == (int)PLAYERMODEL_TYPE.PLAYERMODEL_PROFESSION ) - { - int iRealID = _GetProfessionTransformModelID( - m_iProfession, m_iGender, PLAYERMODEL_GETID(iNewShape)); - iNewShape = 0x40 | iRealID; - } - // ��ְҵ������Model IDΪEC_Resource.h���ֵ���ʲ������� - else - { - - } - - // store the original data into 8~15 bit - m_iShape = iNewShape | ((iShape & 0xff) << 8); - } - void FixOldShapeInfo(ref int iShape) - { - // �Ǹ�ʱ��shapeΪ0����û�б�������0����ְҵ���� - if(iShape != 0 && PLAYERMODEL_GETTYPE(iShape) == 0) - iShape |= 0x40; - } /// Origin: notify server of force-attack (PVP) state so it accepts/rejects attacks on players. Call when duel starts (true) or ends (false). private void NotifyServerForceAttack(bool bForceAttack) { @@ -76,28 +23,6 @@ namespace BrewMonster UnityGameSession.c2s_SendCmdNotifyForceAttack(glb_BuildPVPMask(bForceAttack), refuseBless); } - public int _GetProfessionTransformModelID(int nChar, int nGender, int nModelID) - { - int result = 0; - switch (nChar){ - case (int)PROFESSION.PROF_HAG: // ���� - result = (2 == nModelID) ? (int)ModelResourceType.RES_MOD_ORC_FOX2 : (int)ModelResourceType.RES_MOD_ORC_FOX; - break; - case (int)PROFESSION.PROF_ORC: // ���� - result = (2 == nModelID) ? (int)ModelResourceType.RES_MOD_ORC_PANDER : (int)ModelResourceType.RES_MOD_ORC_TIGER; - break; - case (int)PROFESSION.PROF_MONK: // ��ʦ - case (int)PROFESSION.PROF_GHOST: // �̿� - result = ((int)Gender.GENDER_MALE == nGender) ? (int)ModelResourceType.RES_MOD_SHADOW_FISH_M : (int)ModelResourceType.RES_MOD_SHADOW_FISH_F; - break; - case (int)PROFESSION.PROF_YEYING: // ҹӰ - result = ((int)Gender.GENDER_MALE == nGender) ? (int)ModelResourceType.RES_MOD_YEYING_RESHAPE_M : (int)ModelResourceType.RES_MOD_YEYING_RESHAPE_F; - break; - case (int)PROFESSION.PROF_YUEXIAN: // ���� - result = ((int)Gender.GENDER_MALE == nGender) ? (int)ModelResourceType.RES_MOD_YUEXIAN_RESHAPE_M : (int)ModelResourceType.RES_MOD_YUEXIAN_RESHAPE_F; - break; - } - return result; - } + } } diff --git a/Assets/Scripts/CECHostPlayer.Pet.cs b/Assets/Scripts/CECHostPlayer.Pet.cs index 02af041802..8ca49a6b47 100644 --- a/Assets/Scripts/CECHostPlayer.Pet.cs +++ b/Assets/Scripts/CECHostPlayer.Pet.cs @@ -10,7 +10,7 @@ using BrewMonster.Assets.PerfectWorld.Scripts.Players; using UnityEngine; using static BrewMonster.Scripts.Pet.CECPetData; using BrewMonster.Scripts.Managers; -using static PerfectWorld.Scripts.Managers.EC_IvtrEquip; +using static BrewMonster.Scripts.EC_IvtrEquip; using PerfectWorld.Scripts.Managers; namespace BrewMonster diff --git a/Assets/Scripts/CECHostPlayer.World.cs b/Assets/Scripts/CECHostPlayer.World.cs index 3f02371a88..4ff30f7311 100644 --- a/Assets/Scripts/CECHostPlayer.World.cs +++ b/Assets/Scripts/CECHostPlayer.World.cs @@ -259,8 +259,9 @@ namespace BrewMonster // Update camera if available // 如果可用则更新相机 // UpdateFollowCamera(false, 10); // Uncomment if UpdateFollowCamera method exists - - LitModelHolder.Instance.LoadAllObjectsNearTargetPosition(vPos).Forget(); + // Streaming anchor follows navigate clone when force-navigate is active (LitModelHolder.UpdateStreamingAnchorPosition). + // 强制导航时流式锚点跟随导航克隆(LitModelHolder.UpdateStreamingAnchorPosition)。 + LitModelHolder.Instance.LoadAllObjectsNearTargetPosition(default, useHostPlayerPosition: true).Forget(); }; // Jump to instance (change world/instance) // 跳转到实例(更改世界/实例) diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index 0676666c4e..9d94d64bc5 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -29,6 +29,7 @@ using cmd_player_chgshape = CSNetwork.GPDataType.cmd_player_chgshape; using Host_work_ID = BrewMonster.Scripts.CECHPWork.Host_work_ID; using ObjectCoords = System.Collections.Generic.List; using Trace_reason = BrewMonster.CECHPWorkTrace.Trace_reason; +using System.Threading.Tasks; namespace BrewMonster { @@ -249,12 +250,6 @@ namespace BrewMonster private CECHostNavigatePlayer m_pNavigatePlayer = null; public CECHostNavigatePlayer GetNavigatePlayer() { - if (m_pNavigatePlayer == null) - { - // Create navigate player on-demand (C++: host owns a navigate/clone player + controller) - // 按需创建导航玩家(C++:宿主玩家持有导航/克隆玩家 + 控制器) - m_pNavigatePlayer = new CECHostNavigatePlayer(this); - } return m_pNavigatePlayer; } @@ -273,15 +268,37 @@ namespace BrewMonster public void OnNaviageEvent(int task, int e) { UnityEngine.Debug.Log($"[CECHostPlayer] OnNaviageEvent: Task={task}, Event={e} ({(BrewMonster.Scripts.CECNavigateCtrl.NavigateEvent)e})"); - CECHostNavigatePlayer pNavigatePlayer = GetNavigatePlayer(); - if (pNavigatePlayer != null) + if (e == (int)CECNavigateCtrl.NavigateEvent.EM_PREPARE) { - UnityEngine.Debug.Log($"[CECHostPlayer] OnNaviageEvent: Forwarding to NavigatePlayer"); - pNavigatePlayer.OnNavigateEvent(task, e); + CreateNavigatePlayer(); } - else + if (m_pNavigatePlayer != null) { - UnityEngine.Debug.LogWarning($"[CECHostPlayer] OnNaviageEvent: NavigatePlayer is null"); + m_pNavigatePlayer.OnNavigateEvent(task, e); + } + if(e == (int)CECNavigateCtrl.NavigateEvent.EM_END) + { + ReleaseNavigatePlayer(); + } + } + private void CreateNavigatePlayer() + { + ReleaseNavigatePlayer(); + GameObject navigateGo = new GameObject("HostNavigatePlayer"); + navigateGo.transform.SetParent(transform, false); + navigateGo.transform.localScale = Vector3.one; + navigateGo.AddComponent(); + CECHostNavigatePlayer navigatePlayer = navigateGo.AddComponent(); + navigatePlayer.InitializeHost(this); + //navigatePlayer.LoadConfig(); + m_pNavigatePlayer = navigatePlayer; + } + private void ReleaseNavigatePlayer() + { + if (m_pNavigatePlayer != null) + { + m_pNavigatePlayer.Release(); + m_pNavigatePlayer = null; } } @@ -331,7 +348,7 @@ namespace BrewMonster TickTask().Forget(); } - public bool LoadResources() + public async Task LoadResources() { //BMLogger.LogError("HoangDev: CECHostPlayer::LoadResources"); RoleInfo RoleInfo = UnityGameSession.Instance.GetRoleInfo(); @@ -344,7 +361,7 @@ namespace BrewMonster EC_Game.GetGameRun().AddPlayerName(m_PlayerInfo.cid, m_strName); - if (!LoadPlayerSkeleton(true)) + if (!await LoadPlayerSkeleton(true)) { BMLogger.LogError("HoangDev CECHostPlayer::LoadResources, Failed to load skeleton"); return false; @@ -1471,7 +1488,7 @@ namespace BrewMonster m_bEnterGame = false; } - public async void InitCharacter(cmd_self_info_1 role) + public async Task InitCharacter(cmd_self_info_1 role) { SetUpPlayer(); m_dwStates = (uint)role.state; @@ -1486,9 +1503,7 @@ namespace BrewMonster // roleName = Encoding.UTF8.GetString(role.name.ByteArray, 0, role.name.Length); //} SetPlayerInfor(new INFO(role.cid, role.crc_e, role.crc_c)); - LoadResources(); - await SetPlayerModel(UnityGameSession.Instance.GetRoleInfo().occupation, - UnityGameSession.Instance.GetRoleInfo().gender); + await LoadResources(); isDataAwaitToReady = true; Vector3 pos = new Vector3(role.pos.x, role.pos.y, role.pos.z); string roleName = Encoding.Unicode.GetString(UnityGameSession.Instance.GetRoleInfo().name.ByteArray); diff --git a/Assets/Scripts/CECPlayer_Inventory.cs b/Assets/Scripts/CECPlayer_Inventory.cs index 4b5f1f6739..90e83a1204 100644 --- a/Assets/Scripts/CECPlayer_Inventory.cs +++ b/Assets/Scripts/CECPlayer_Inventory.cs @@ -17,7 +17,7 @@ namespace BrewMonster public static readonly string _right_hand_weapon = "RightHand"; public static readonly string _wing = "Wing"; public static readonly string _wing2 = "Wing2"; - public const string _cc_ride = "CC_Ride"; + public const string _cc_ride = "CC_ride"; public static readonly string _cc_ride2 = "CC_Ride2"; public const string _hh_ride = "HH_Ride"; public const string _hanger_ride = "Rider"; diff --git a/Assets/Scripts/PlayerVisual.cs b/Assets/Scripts/PlayerVisual.cs index 551f726213..e6123b63a1 100644 --- a/Assets/Scripts/PlayerVisual.cs +++ b/Assets/Scripts/PlayerVisual.cs @@ -24,6 +24,7 @@ namespace BrewMonster [SerializeField] private bool isHit; [SerializeField] private int id; [SerializeField] private bool isDebug; + private bool _eventBusSubscribed; private const float FadeTime = 100; private const FadeMode FadeMode = Animancer.FadeMode.FixedDuration; @@ -55,11 +56,28 @@ namespace BrewMonster return; } + if (_eventBusSubscribed) + UnregisterPlayerEventHandlers(); + _playerInfo = player.GetPlayInfo(); id = _playerInfo.cid; EventBus.SubscribeChannel(_playerInfo.cid, PlayActionEventHandler); EventBus.SubscribeChannelClass(_playerInfo.cid, QueueActionEventHandler); EventBus.SubscribeChannel(_playerInfo.cid, ClearComActFlagAllRankNodesEventHandler); + _eventBusSubscribed = true; + } + + /// + /// Unsubscribe from per-cid animation events (e.g. hand off to navigate clone). / 取消按 cid 订阅(例如交给导航克隆体) + /// + public void UnregisterPlayerEventHandlers() + { + if (!_eventBusSubscribed) + return; + EventBus.UnsubscribeChannel(_playerInfo.cid, PlayActionEventHandler); + EventBus.UnsubscribeChannelClass(_playerInfo.cid, QueueActionEventHandler); + EventBus.UnsubscribeChannel(_playerInfo.cid, ClearComActFlagAllRankNodesEventHandler); + _eventBusSubscribed = false; } // public void InitElsePlayerEventDoneHandler(INFO playerInfo) @@ -155,10 +173,7 @@ namespace BrewMonster } private void OnDestroy() { - EventBus.UnsubscribeChannel(_playerInfo.cid, PlayActionEventHandler); - EventBus.UnsubscribeChannelClass(_playerInfo.cid, QueueActionEventHandler); - EventBus.UnsubscribeChannel(_playerInfo.cid, ClearComActFlagAllRankNodesEventHandler); - // EventBus.UnsubscribeAllInChannel(_playerInfo.cid); + UnregisterPlayerEventHandlers(); } public bool IsAnimationExist(string animationName) { From 47a219866b0c2583b2672549cf24d1673347f272 Mon Sep 17 00:00:00 2001 From: Chomper9981 Date: Mon, 6 Apr 2026 14:31:09 +0700 Subject: [PATCH 2/2] Fix some bug related to flying phoenix --- .../Scripts/Managers/EC_HPWorkNavigate.cs | 1 + .../Scripts/Managers/EC_Object.cs | 4 ++++ Assets/PerfectWorld/Scripts/NPC/CECModel.cs | 19 ++++++++++++++++--- .../Scripts/Players/CECHostNavigatePlayer.cs | 8 +++++++- .../Scripts/Players/CECPlayerClone.cs | 15 --------------- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs index 6c55f50f18..14bf5f7c39 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs @@ -598,6 +598,7 @@ namespace BrewMonster.Scripts { pClone.SetPos(new Vector3(vCurPos.x, vCurPos.y, vCurPos.z)); pClone.SetDirAndUp(new A3DVECTOR3(vDir.x, vDir.y, vDir.z), new A3DVECTOR3(vUp.x, vUp.y, vUp.z)); + pClone.ResetHookPosition(); if(pNaviCtrl.GetCurrentNavigateInfo().bezierDir) { pClone.ChangeModelMoveDirAndUp(vDir, vUp); diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs index d7fb0a78ae..b1ea428c4b 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs @@ -95,6 +95,10 @@ public partial class CECObject : MonoBehaviour, ITickable m_vecGroundNormal = Normalize(m_vecGroundNormal * 0.85f + m_vecGroundNormalSet * 0.15f); return true; } + protected virtual void OnDestroy() + { + TickInvoker.Instance.UnregisterTickable(this); + } // Set absolute forward and up direction public virtual void SetDirAndUp(Vector3 vDir, Vector3 vUp) diff --git a/Assets/PerfectWorld/Scripts/NPC/CECModel.cs b/Assets/PerfectWorld/Scripts/NPC/CECModel.cs index 907ad04428..79b992ee74 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECModel.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECModel.cs @@ -371,6 +371,7 @@ public class CECModel protected CECModelStaticData m_pMapModel; public SkeletonBuilder m_skeletonBuilder; private Dictionary m_hookCache = new Dictionary(); + private Dictionary m_hangerPositionCache = new Dictionary(); private Dictionary m_childModels = new Dictionary(); private Transform m_transform; public bool InheritParentId() => m_bInheritParentId; @@ -603,7 +604,6 @@ public class CECModel if (pChild == null) { - Debug.LogError($"CECModel::AddChildModel, pChild is null"); return false; } @@ -611,7 +611,6 @@ public class CECModel Transform hangger = pChild.m_skeletonBuilder.GetHook(szCCName, true); if (hook == null || hangger == null) { - Debug.LogError($"CECModel::AddChildModel, hook or hanger missing (hook={szHookName}, cc={szCCName})"); return false; } @@ -620,7 +619,9 @@ public class CECModel Vector3 worldAlign = hook.position - hangger.position; pChild.transform.position += worldAlign; pChild.transform.SetParent(hook.transform, true); - + m_hookCache.Add(szHookName, hook); + m_childModels.Add(szHookName, pChild); + m_hangerPositionCache.Add(szHookName, hangger); // if (m_pA3DSkinModel && pChild->m_pA3DSkinModel) // { // if (!m_pA3DSkinModel->AddChildModel( @@ -647,6 +648,18 @@ public class CECModel m_childModels[szHangerName] = pChild; return true; } + public void ResetHookPosition(string szHookName) + { + Transform hook = m_hookCache.TryGetValue(szHookName, out Transform cachedHook) ? cachedHook : null; + Transform hangger = m_hangerPositionCache.TryGetValue(szHookName, out Transform cachedHangger) ? cachedHangger : null; + GameObject childObject = m_childModels.TryGetValue(szHookName, out CECModel child) ? child.m_pPlayerModel : null; + + if (hook != null && hangger != null && child != null) + { + Vector3 worldAlign = hook.position - hangger.position; + child.transform.position += worldAlign; + } + } public void PlayGfx(string szPath, string szHook, float fScale, bool bFadeOut, A3DVECTOR3 vOffset, float fPitch, float fYaw, float fRot, bool bUseECMHook, uint dwFadeOutTime) { if (!bFadeOut) diff --git a/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs b/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs index 6358535e7b..88f59eb123 100644 --- a/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs +++ b/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs @@ -333,6 +333,13 @@ namespace BrewMonster.Scripts m_bAdjustOrient = false; } } + public void ResetHookPosition() + { + if (m_pNavigateModel != null) + { + m_pNavigateModel.ResetHookPosition(_hh_ride); + } + } protected override bool ShouldLoadEquipment(int index) { return index != InventoryConst.EQUIPIVTR_FLYSWORD; @@ -381,7 +388,6 @@ namespace BrewMonster.Scripts // PlayAction(GetMoveStandAction(false, IsFighting()), 1.0f, true); PlayNavigateAction(); - m_bNavigateModelApplied = true; OnNavigateEvent(0, (int)CECNavigateCtrl.NavigateEvent.EM_BEGIN); diff --git a/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs b/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs index 13c2a0adc2..db2433f3d4 100644 --- a/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs +++ b/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs @@ -97,21 +97,6 @@ namespace BrewMonster } return await Load(player, atOnce); } - public override void SetDirAndUp(A3DVECTOR3 vDir, A3DVECTOR3 vUp){ - base.SetDirAndUp(vDir, vUp); - if(m_pPlayerCECModel != null) - { - Vector3 dir = new Vector3(vDir.x, vDir.y, vDir.z); - Vector3 up = new Vector3(vUp.x, vUp.y, vUp.z); - if (dir.magnitude > 0.01f) - { - Quaternion lookRot = Quaternion.LookRotation(dir, up); - m_pPlayerCECModel.m_pPlayerModel.transform.rotation = lookRot; - } - m_bAdjustOrient = false; - } - //m_pPlayerCECModel.SetDirAndUp(vDir,vUp); - } protected async Task Load(CECPlayer player, bool atOnce){ player.CloneSimplePropertyTo(this); OnCloneSimpleProperty();