diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/14.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/14.prefab index 0d76b00cdf..00b5b37890 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/14.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/14.prefab @@ -11,7 +11,8 @@ GameObject: - component: {fileID: 8870675310055835121} - component: {fileID: 1032798951918398042} - component: {fileID: 7301032545156009848} - m_Layer: 0 + - component: {fileID: 462207276974431652} + m_Layer: 8 m_Name: 14 m_TagString: Untagged m_Icon: {fileID: 0} @@ -86,6 +87,28 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &462207276974431652 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2583190483620898206} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: b659accf661a837479218c29e2eb3529, type: 2} --- !u!1 &5209988378375773062 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/24.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/24.prefab index 44c75b9261..57eba92041 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/24.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/24.prefab @@ -11,7 +11,8 @@ GameObject: - component: {fileID: 6162223966912026141} - component: {fileID: 965572838707464366} - component: {fileID: 2799419047870559492} - m_Layer: 0 + - component: {fileID: 3416380344146776827} + m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged m_Icon: {fileID: 0} @@ -86,6 +87,28 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &3416380344146776827 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1158422796600389547} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: fc25f780d25e0ef4ea66bd04e30ed658, type: 2} --- !u!1 &5766366828536359331 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/2663.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/2663.prefab index a8eb30bad5..13f551236c 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/2663.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/2663.prefab @@ -12,6 +12,7 @@ GameObject: - component: {fileID: 1106703170944066569} - component: {fileID: 5489700157768253589} - component: {fileID: 4298657190085613173} + - component: {fileID: 1609863900414086204} m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged @@ -88,6 +89,28 @@ MeshRenderer: m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!64 &4298657190085613173 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2129434667301194551} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: ce83280d624f8e74789ed3cdeb08e76e, type: 2} +--- !u!64 &1609863900414086204 MeshCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/47.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/47.prefab index 68bb638f1e..41039cb2eb 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/47.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/47.prefab @@ -11,7 +11,8 @@ GameObject: - component: {fileID: 2077347467210120610} - component: {fileID: 2965316739725448086} - component: {fileID: 1576250916172009662} - m_Layer: 0 + - component: {fileID: 4019614048923385075} + m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged m_Icon: {fileID: 0} @@ -86,6 +87,28 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &4019614048923385075 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5533184014301445498} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: 044737b6cc6aab9428ff497cc85b34fa, type: 2} --- !u!1 &8220570836172173197 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4737.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4737.prefab index 715dce4caf..b2ad4abf9a 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4737.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4737.prefab @@ -44,6 +44,7 @@ GameObject: - component: {fileID: 1085622182787639888} - component: {fileID: 116834778258431673} - component: {fileID: 3317247844365150934} + - component: {fileID: 3543540647331422299} m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged @@ -141,3 +142,25 @@ MeshCollider: m_Convex: 0 m_CookingOptions: 30 m_Mesh: {fileID: 4300000, guid: 9c42325bdd3279f40b20a5c67aea773a, type: 2} +--- !u!64 &3543540647331422299 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278964582912123360} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: 9c42325bdd3279f40b20a5c67aea773a, type: 2} diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4821.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4821.prefab index 66685a29d8..6753b1193c 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4821.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4821.prefab @@ -43,7 +43,8 @@ GameObject: - component: {fileID: 7062665856913133189} - component: {fileID: 5252691402266366719} - component: {fileID: 8181785019207413421} - m_Layer: 0 + - component: {fileID: 2607412906901198044} + m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged m_Icon: {fileID: 0} @@ -118,3 +119,25 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &2607412906901198044 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4719748383613153397} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: ac223a98475ce5040878ad73deeb960a, type: 2} diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4823.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4823.prefab index 5f86df403a..0dfcf3240f 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4823.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4823.prefab @@ -43,7 +43,8 @@ GameObject: - component: {fileID: 1478712142538266266} - component: {fileID: 2131850469933741979} - component: {fileID: 6697441912009192607} - m_Layer: 0 + - component: {fileID: 770633596912448150} + m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged m_Icon: {fileID: 0} @@ -118,3 +119,25 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &770633596912448150 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6077317593588673797} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: b2f7526b9b6eb6d4b976678628fec85d, type: 2} diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4838.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4838.prefab index 208f1913b9..70710a5bd1 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4838.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4838.prefab @@ -43,7 +43,8 @@ GameObject: - component: {fileID: 4941995905154783035} - component: {fileID: 8834982675719581640} - component: {fileID: 4008051189880721500} - m_Layer: 0 + - component: {fileID: 2927931621078331128} + m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged m_Icon: {fileID: 0} @@ -118,3 +119,25 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &2927931621078331128 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8870165540406502598} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: 5221555d479145f4098a1a90d443d25f, type: 2} diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4853.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4853.prefab index b472b5b0ed..a272d5e91a 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4853.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4853.prefab @@ -11,7 +11,8 @@ GameObject: - component: {fileID: 4601054390393476764} - component: {fileID: 8898356444586392207} - component: {fileID: 3768077324547372759} - m_Layer: 0 + - component: {fileID: 1187865960676330687} + m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged m_Icon: {fileID: 0} @@ -86,6 +87,28 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &1187865960676330687 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2908047605614509929} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: 71432f5f083a6eb46bd2e86c544240fe, type: 2} --- !u!1 &8693206018944694632 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4855.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4855.prefab index 87c1c576a7..36fb45e838 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/4855.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/4855.prefab @@ -43,7 +43,8 @@ GameObject: - component: {fileID: 636089995233464392} - component: {fileID: 2080258521648944025} - component: {fileID: 3480335849606063585} - m_Layer: 0 + - component: {fileID: 227664486918571123} + m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged m_Icon: {fileID: 0} @@ -118,3 +119,25 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &227664486918571123 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8682860827833279859} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: 7b8eb8acdca70014c8fb0b4690909469, type: 2} diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/49.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/49.prefab index 8401bb7361..574e5f520b 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/49.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/49.prefab @@ -43,7 +43,8 @@ GameObject: - component: {fileID: 6182866067743937211} - component: {fileID: 6890386030446961812} - component: {fileID: 3007527381162661553} - m_Layer: 0 + - component: {fileID: 6960099531645814751} + m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged m_Icon: {fileID: 0} @@ -118,3 +119,25 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &6960099531645814751 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8634685187563485881} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: 1417b7dbba8d24c4b8fcc930a31ea1ca, type: 2} diff --git a/Assets/ModelRenderer/Art/Models/maps/a61/waters/65.prefab b/Assets/ModelRenderer/Art/Models/maps/a61/waters/65.prefab index 107b2e0469..1e135a03de 100644 --- a/Assets/ModelRenderer/Art/Models/maps/a61/waters/65.prefab +++ b/Assets/ModelRenderer/Art/Models/maps/a61/waters/65.prefab @@ -11,7 +11,8 @@ GameObject: - component: {fileID: 2020333967464460385} - component: {fileID: 2497554547442989164} - component: {fileID: 8596635813813102696} - m_Layer: 0 + - component: {fileID: 3281521522256558373} + m_Layer: 8 m_Name: WaterMeshRenderer(Clone) m_TagString: Untagged m_Icon: {fileID: 0} @@ -86,6 +87,28 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &3281521522256558373 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 189273667865298136} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 4300000, guid: e869fae75abcd0d439c281909363035a, type: 2} --- !u!1 &3653160677674576190 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFall.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFall.cs index 89db36ccf7..0af9cbc10d 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFall.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFall.cs @@ -17,6 +17,9 @@ namespace BrewMonster.Scripts protected bool m_fForceDown; Vector3 g_vOrigin = Vector3.zero; + + const float EC_NACCE_WATER = -5.0f; + public static class FlyFallStage { public const int enumStageNone = 0, @@ -130,13 +133,13 @@ namespace BrewMonster.Scripts else FreeFall_Air(fDeltaTime); } - //else // m_pHost.m_iMoveEnv == CECPlayer::MOVEENV_WATER - //{ - // if (m_iFallType == Fall_type.TYPE_FLYFALL) - // Fall_Water(fDeltaTime); - // else - // FreeFall_Water(fDeltaTime); - //} + else // m_pHost.m_iMoveEnv == CECPlayer::MOVEENV_WATER + { + if (m_iFallType == Fall_type.TYPE_FLYFALL) + Fall_Water(fDeltaTime); + else + FreeFall_Water(fDeltaTime); + } } return true; @@ -303,6 +306,11 @@ namespace BrewMonster.Scripts return true; } + private float A3d_Magnitude(A3DVECTOR3 v) + { + return Mathf.Sqrt(v.x * v.x + v.y * v.y + v.z * v.z); + } + // Finish public void Finish() { @@ -313,5 +321,177 @@ namespace BrewMonster.Scripts //if (m_iFallType == Fall_type.TYPE_FLYFALL) // m_pHost.ShowWing(false); } + + // Free fall in water + bool Fall_Water(float fDeltaTime) + { + A3DVECTOR3 vCurPos = m_pHost.GetPos(); + A3DVECTOR3 vCurVel = m_pHost.m_vVelocity; + float fGndHei = m_pHost.m_GndInfo.fGndHei; + + if (!m_bEnterWater) + { + m_bEnterWater = true; + vCurVel = m_pHost.m_CDRInfo.vAbsVelocity; + float fWaterHei = m_pHost.m_GndInfo.fWaterHei; + if (fWaterHei - fGndHei > 1.5f) + m_nCurStage = FlyFallStage.enumStageDeepWater; + else + m_nCurStage = FlyFallStage.enumStageShallowWater; + } + + float fSpeed1 = vCurVel.Normalize(); + float na = -fSpeed1 * 0.7f + EC_NACCE_WATER * 4.0f; + float fSpeed2 = fSpeed1 + na * fDeltaTime; + if (fSpeed2 * fSpeed1 < 0.0f) + fSpeed2 = 0.0f; + + if (m_fForceDown) + { + // Note: When speed=0 we should check whether a special case: EstimateMoveEnv find + // we are in water but we stop at a underwater position which is very close + // to water surface. + // if (vCurPos.y < m_pHost.m_GndInfo.fWaterHei && + // m_pHost.m_GndInfo.fWaterHei - m_pHost.m_GndInfo.fGndHei > m_pHost.m_MoveConst.fShoreDepth && + if (m_pHost.CheckWaterMoveEnv(vCurPos, m_pHost.m_GndInfo.fWaterHei, m_pHost.m_GndInfo.fGndHei) && + m_pHost.m_GndInfo.fWaterHei - vCurPos.y < m_pHost.m_MoveConst.fShoreDepth) + { + vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vDirH, m_fSpeedH, fDeltaTime, -5.0f); + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + + if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) + { + // Fall on ground + Finish(); + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), m_pHost.m_vVelocity.Magnitude(), (int)GPMoveMode.GP_MOVE_WATER | m_iFallMode); + m_pHost.m_vVelocity.Clear(); + } + + return true; + } + } + + if (Math.Abs(fSpeed2 - 0f) > float.Epsilon) + { + A3DVECTOR3 vOldPos = vCurPos; + vCurPos = m_pHost.m_MoveCtrl.AirWaterMove(vCurVel, fSpeed2, fDeltaTime, false, false); + vCurVel *= fSpeed2; + + if (m_nCurStage == FlyFallStage.enumStageShallowWater) + { + if (vCurPos.y - fGndHei < 1.0f) + { + //if (m_pHost.UsingWing()) + if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING) + m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON, false); + else + m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON_SWORD, false); + + m_nCurStage = FlyFallStage.enumStageLandOn; + } + } + else if (m_nCurStage == FlyFallStage.enumStageDeepWater) + { + if (vCurVel.y > -9.0f) + m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_HANGINWATER, false); + } + + if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3 || + vCurPos.y - m_pHost.m_MoveConst.fMinWaterHei <= fGndHei) + { + // Fall on ground + Finish(); + + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), m_pHost.m_vVelocity.Magnitude(), (int)GPMoveMode.GP_MOVE_WATER | m_iFallMode); + + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + m_pHost.m_vVelocity.Clear(); + } + else + { + m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 2, EC_Utility.ToA3DVECTOR3(g_vOrigin), vCurVel, (int)GPMoveMode.GP_MOVE_WATER | m_iFallMode); + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + m_pHost.m_vVelocity = vCurVel; + } + + // If moving too small + if (A3d_Magnitude(vCurPos - vOldPos) < 0.001f) + m_fForceDown = true; + } + else + { + Finish(); + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed1, (int)GPMoveMode.GP_MOVE_WATER | m_iFallMode); + + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + m_pHost.m_vVelocity.Clear(); + } + + return true; + } + + // Free fall in water + bool FreeFall_Water(float fDeltaTime) + { + A3DVECTOR3 vCurPos = m_pHost.GetPos(); + A3DVECTOR3 vCurVel = m_pHost.m_vVelocity; + float fGndHei = m_pHost.m_GndInfo.fGndHei; + + if (!m_bEnterWater) + { + m_bEnterWater = true; + vCurVel = m_pHost.m_CDRInfo.vAbsVelocity; + float fWaterHei = m_pHost.m_GndInfo.fWaterHei; + if (fWaterHei - fGndHei > 1.5f) + m_nCurStage = FlyFallStage.enumStageDeepWater; + else + m_nCurStage = FlyFallStage.enumStageShallowWater; + } + + float fSpeed1 = vCurVel.Normalize(); + float na = EC_NACCE_WATER * 4.0f; + float fSpeed2 = fSpeed1 + na * fDeltaTime; + if (fSpeed2 * fSpeed1 < 0.0f) + fSpeed2 = 0.0f; + + if (Math.Abs(fSpeed2 - 0f) > float.Epsilon) + { + vCurPos = m_pHost.m_MoveCtrl.AirWaterMove(vCurVel, fSpeed2, fDeltaTime, false, false); + vCurVel *= fSpeed2; + + if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3 || + vCurPos.y - m_pHost.m_MoveConst.fMinWaterHei <= fGndHei) + { + // Fall on ground + Finish(); + + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), m_pHost.m_vVelocity.Magnitude(), (int)GPMoveMode.GP_MOVE_WATER | m_iFallMode); + + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + m_pHost.m_vVelocity.Clear(); + } + else + { + m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 2, EC_Utility.ToA3DVECTOR3(g_vOrigin), vCurVel, (int)GPMoveMode.GP_MOVE_WATER | m_iFallMode); + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + m_pHost.m_vVelocity = vCurVel; + + if (m_nCurStage == FlyFallStage.enumStageDeepWater) + m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_HANGINWATER, false); + else + m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_JUMP_LOOP, false); + } + } + else + { + Finish(); + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed1, (int)GPMoveMode.GP_MOVE_WATER | m_iFallMode); + + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + m_pHost.m_vVelocity.Clear(); + } + + return true; + } } } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs index 6bf6caa3fb..3639ffa7fe 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs @@ -1091,6 +1091,11 @@ namespace BrewMonster.Scripts // vUp = a3d_RotatePosAroundAxis(vUp, vPushDir, m_fPushPitch); //m_pHost.StartModelMove(vPushDir, vUp, 0); + + if (vPushDir != Vector3.zero) + { + m_pHost.SetRotationHPWithTime(vPushDir, 0.1f); + } } // if (bPush) @@ -1124,6 +1129,7 @@ namespace BrewMonster.Scripts // A3DVECTOR3 vVel = vPushDir * fSpeed2; Vector3 vVel = vVelDir * fSpeed2; vCurPos = m_pHost.m_MoveCtrl.AirWaterMove(EC_Utility.ToA3DVECTOR3(vVel), fDeltaTime, bInAir); + Debug.DrawLine(EC_Utility.ToVector3(m_pHost.GetPos()), EC_Utility.ToVector3(vCurPos), Color.red, 0.5f); if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) { Finish(); diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs index f94a64a928..5753ca0387 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs @@ -5,12 +5,15 @@ using CSNetwork.GPDataType; using PerfectWorld.Scripts; using CSNetwork; using UnityEngine; +using static BrewMonster.Scripts.CECHPWork; namespace BrewMonster { public partial class CECHostPlayer { - float _JumpTime = -1; + public float _JumpTime = -1; + public bool isPressMoveUp = false; + public bool isPressMoveDown = false; public void OnKeyDown() { @@ -18,10 +21,18 @@ namespace BrewMonster { OnMsgLBtnClick(); } +#if UNITY_EDITOR if (Input.GetKeyDown(KeyCode.Space)) { + isPressMoveUp = true; + OnMsgHstPushMove(); OnClickBtnJump(); } + if (Input.GetKeyUp(KeyCode.Space)) + { + isPressMoveUp = false; + } +#endif if (Input.GetKeyDown(KeyCode.Escape)) { OnClickBtnEscape(); @@ -119,7 +130,6 @@ namespace BrewMonster // Check for NPC with pate text (hover text) first // Note: This would require GetMouseOnPateTextNPC implementation // For now, we'll proceed with raycast - if (Physics.RaycastNonAlloc(ray, hits) > 0) { // Check if hit terrain, building, or forest (no CECObject component) @@ -513,6 +523,88 @@ namespace BrewMonster return true; } + private void OnClickJoystick(JoystickPressEvent joystickPressEvent) + { + OnMsgHstPushMove(); + } + + public void OnMsgHstPushMove() + { + //_playerStateMachine.ChangeState(_moveState); + /* if (m_pWorkMan.IsSitting()) + { + g_pGame.GetGameSession().c2s_CmdStandUp(); + return; + }*/ + m_dwMoveRelDir = 0; + if (!CanDo(ActionCanDo.CANDO_MOVETO)) return; + if (joystick.Vertical > 0) + { + if (joystick.Horizontal > 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_RIGHT); + } + else if (joystick.Horizontal < 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_LEFT); + } + else + { + m_dwMoveRelDir |= (uint)MOVE_DIR.MD_FORWARD; + } + } + else if (joystick.Vertical < 0) + { + if (joystick.Horizontal > 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_BACK | MOVE_DIR.MD_RIGHT); + } + else if (joystick.Horizontal < 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_BACK | MOVE_DIR.MD_LEFT); + } + else + { + m_dwMoveRelDir |= (uint)MOVE_DIR.MD_BACK; + } + } + else + { + if (joystick.Horizontal > 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_RIGHT); + } + else if (joystick.Horizontal < 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_LEFT); + } + } + if (isPressMoveUp) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_ABSUP); + } + if (isPressMoveDown) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_ABSDOWN); + } + bool bPushMove = true; + if (isPressMoveUp || isPressMoveDown) + { + if (m_iMoveEnv != (int)MoveEnvironment.MOVEENV_AIR && m_iMoveEnv != (int)MoveEnvironment.MOVEENV_WATER) + bPushMove = false; + } + + if (bPushMove && !IsAboutToDie() && CanDo(ActionCanDo.CANDO_MOVETO)) + { + if (m_pWorkMan.CanStartWork(Host_work_ID.WORK_MOVETOPOS)) + { + CECHPWorkMove pNewWork = (CECHPWorkMove)m_pWorkMan.CreateWork(Host_work_ID.WORK_MOVETOPOS); + pNewWork.SetDestination(CECHPWorkMove.DestTypes.DEST_PUSH, g_vOrigin); + m_pWorkMan.StartWork_p1(pNewWork); + } + } + } + public void OnClickBtnEscape() { // if( bInAutoMode ) break; diff --git a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs index fed3d7f048..43f8f903d1 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs @@ -88,6 +88,7 @@ namespace BrewMonster // 需要是可能 || Need is possible protected bool m_bHangerOn = false; protected int m_iCurAction; + bool m_bAboutToDie = false; public MOVECONST m_MoveConst; // Const used when moving control public Move_Mode m_MoveMode; @@ -1602,6 +1603,10 @@ namespace BrewMonster return bRet; } + + public bool IsAboutToDie() { return m_bAboutToDie; } + + public void SetAboutToDie(bool bFlag) { m_bAboutToDie = bFlag; } } public struct PlayActionEvent diff --git a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs index cc420dddd4..40d44284e4 100644 --- a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs +++ b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs @@ -176,7 +176,7 @@ namespace BrewMonster h0 = fHitsWater[0].point.y; } float h1 = 0f; - countHits0 = Physics.RaycastNonAlloc((vWatStart + vDelta), Vector3.down, fHitsWater, 1000f, 1 << 8); + countHits0 = Physics.RaycastNonAlloc((vWatStart + vDelta) + Vector3.up * 500f, Vector3.down, fHitsWater, 1000f, 1 << 8); if(countHits0 > 0) { h1 = fHitsWater[0].point.y; @@ -818,7 +818,7 @@ namespace BrewMonster trcInfo.dwCheckFlag = CDR_EVN.CDR_TERRAIN | CDR_EVN.CDR_BRUSH | CDR_EVN.CDR_WATER; trcInfo.vExt = vExt; - while (nTry < 1) + while (nTry < 4) { if (vDelta.SquaredMagnitude() < DIST_EPSILON) { @@ -850,7 +850,7 @@ namespace BrewMonster {//rescue from solid //@note : it may cause some problems. By Kuiwu[11/10/2005] float fHWater = 0f; - int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vStart) + Vector3.up * 900f, Vector3.down, fHitsWater, 1000f, 1 << 8); + int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vStart) + Vector3.up * 500f, Vector3.down, fHitsWater, 1000f, 1 << 8); if(countHits0 > 0) { fHWater = fHitsWater[0].point.y; diff --git a/Assets/PerfectWorld/Scripts/UI/JumpBtn.cs b/Assets/PerfectWorld/Scripts/UI/JumpBtn.cs index e8ecd1d768..58e29e3939 100644 --- a/Assets/PerfectWorld/Scripts/UI/JumpBtn.cs +++ b/Assets/PerfectWorld/Scripts/UI/JumpBtn.cs @@ -1,12 +1,14 @@ using BrewMonster.Network; using UnityEngine; +using UnityEngine.EventSystems; using UnityEngine.UI; namespace BrewMonster.UI { - public class JumpBtn : MonoBehaviour + public class JumpBtn : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { Button jumpBtn; + CECHostPlayer pHost => EC_Game.GetGameRun()?.GetHostPlayer(); // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() @@ -20,9 +22,24 @@ namespace BrewMonster.UI private void OnClickBtnJump() { - if(EC_Game.GetGameRun()?.GetHostPlayer() != null) + + } + + public void OnPointerDown(PointerEventData eventData) + { + if (pHost != null) { - EC_Game.GetGameRun()?.GetHostPlayer().OnClickBtnJump(); + pHost.isPressMoveUp = true; + pHost.OnMsgHstPushMove(); + pHost.OnClickBtnJump(); + } + } + + public void OnPointerUp(PointerEventData eventData) + { + if (pHost != null) + { + pHost.isPressMoveUp = false; } } } diff --git a/Assets/PerfectWorld/Scripts/World/CECWorld.cs b/Assets/PerfectWorld/Scripts/World/CECWorld.cs index a25ea8c4f4..6e2589f2ff 100644 --- a/Assets/PerfectWorld/Scripts/World/CECWorld.cs +++ b/Assets/PerfectWorld/Scripts/World/CECWorld.cs @@ -15,6 +15,7 @@ namespace BrewMonster.Scripts.World uint m_dwBornStamp = 0; CECAssureMove m_pAssureMove; // object used to assure move int m_idInst = 161; // id of instance + RaycastHit[] fHitsWater = new RaycastHit[5]; public uint GetBornStamp() { return m_dwBornStamp++; } @@ -39,8 +40,17 @@ namespace BrewMonster.Scripts.World public float GetWaterHeight(A3DVECTOR3 vPos) { // TODO: Hook into the actual water system once it is available. - A3DVECTOR3 dummy = default; - return GetTerrainHeight(vPos, ref dummy); + //A3DVECTOR3 dummy = default; + //return GetTerrainHeight(vPos, ref dummy); + + //Get Height Water in Unity + float h0 = 0f; + int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPos) + Vector3.up * 500f, Vector3.down, fHitsWater, 1000f, 1 << 8); + if (countHits0 > 0) + { + h0 = fHitsWater[0].point.y; + } + return h0; } public CECObject GetObject(int idObject, int iAliveFlag) diff --git a/Assets/Scenes/a61.unity b/Assets/Scenes/a61.unity index 9e0af8b2b1..bcd7bb6ff4 100644 --- a/Assets/Scenes/a61.unity +++ b/Assets/Scenes/a61.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d000c591a07dbcc738de27f875dae17a1efdb95215b343f09f55ae37bf13ee0 -size 200785881 +oid sha256:2e061f4870d980f3ea929a34fa1dc95ea640cd5d8071ed5638bcdd9a7ac5461c +size 200797970 diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index d3ad61433a..e037eedc6a 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -16,6 +16,7 @@ using ModelRenderer.Scripts.GameData; using PerfectWorld.Scripts; using PerfectWorld.Scripts.Managers; using System; +using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; @@ -2242,14 +2243,14 @@ namespace BrewMonster public void OnMsgHstCorrectPos(in ECMSG Msg) { - //Debug.LogError("HoangDev : OnMsgHstCorrectPos"); + Debug.LogError("HoangDev : OnMsgHstCorrectPos"); byte[] buf = (byte[])Msg.dwParam1; // chỗ bạn lưu pDataBuf GCHandle handle = GCHandle.Alloc(buf, GCHandleType.Pinned); cmd_host_correct_pos pCmd = (cmd_host_correct_pos)Marshal.PtrToStructure( handle.AddrOfPinnedObject(), typeof(cmd_host_correct_pos)); handle.Free(); //cmd_host_correct_pos pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); - //Debug.LogError("HoangDev :pCmd.pos " + pCmd.pos); + Debug.LogError("HoangDev :pCmd.pos " + pCmd.pos); SetPos(pCmd.pos); m_vVelocity.Clear(); m_CDRInfo.vAbsVelocity.Clear(); @@ -2471,7 +2472,7 @@ namespace BrewMonster m_dwResFlags = (uint)PlayerResourcesReadyFlag.RESFG_ALL; joystick = FindAnyObjectByType(); EventBus.Subscribe(JoystickRelease); - EventBus.Subscribe(OnMsgHstPushMove); + EventBus.Subscribe(OnClickJoystick); if (TryGetComponent(out var visual)) { visual.InitPlayerEventDoneHandler(); @@ -2562,79 +2563,10 @@ namespace BrewMonster // TODO: Move this to right flow later , it's just for test now } - private void OnMsgHstPushMove(JoystickPressEvent joystickPressEvent) - { - //_playerStateMachine.ChangeState(_moveState); - /* if (m_pWorkMan.IsSitting()) - { - g_pGame.GetGameSession().c2s_CmdStandUp(); - return; - }*/ - m_dwMoveRelDir = 0; - if (!CanDo(ActionCanDo.CANDO_MOVETO)) return; - if(joystick.Vertical > 0) - { - if(joystick.Horizontal > 0) - { - m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_RIGHT); - } - else if(joystick.Horizontal < 0) - { - m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_LEFT); - } - else - { - m_dwMoveRelDir |= (uint)MOVE_DIR.MD_FORWARD; - } - } - else if (joystick.Vertical < 0) - { - if (joystick.Horizontal > 0) - { - m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_BACK | MOVE_DIR.MD_RIGHT); - } - else if (joystick.Horizontal < 0) - { - m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_BACK | MOVE_DIR.MD_LEFT); - } - else - { - m_dwMoveRelDir |= (uint)MOVE_DIR.MD_BACK; - } - } - else - { - if (joystick.Horizontal > 0) - { - m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_RIGHT); - } - else if (joystick.Horizontal < 0) - { - m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_LEFT); - } - } - bool bPushMove = true; - /* if (Msg.dwParam1 == 8 || Msg.dwParam1 == 9) - { - if (m_iMoveEnv != (int)MoveEnvironment.MOVEENV_AIR && m_iMoveEnv != (int)MoveEnvironment.MOVEENV_WATER) - bPushMove = false; - }*/ - - if (bPushMove /*&& !IsAboutToDie()*/ && CanDo(ActionCanDo.CANDO_MOVETO)) - { - if (m_pWorkMan.CanStartWork(Host_work_ID.WORK_MOVETOPOS)) - { - CECHPWorkMove pNewWork = (CECHPWorkMove)m_pWorkMan.CreateWork(Host_work_ID.WORK_MOVETOPOS); - pNewWork.SetDestination(CECHPWorkMove.DestTypes.DEST_PUSH, g_vOrigin); - m_pWorkMan.StartWork_p1(pNewWork); - } - } - } - private void OnDestroy() { EventBus.Unsubscribe(JoystickRelease); - EventBus.Unsubscribe(OnMsgHstPushMove); + EventBus.Unsubscribe(OnClickJoystick); } //TODO: Remove this function. Since it has been deprecated. @@ -4523,6 +4455,14 @@ namespace BrewMonster vPushDir = Vector3.zero; if (joystick.Horizontal == 0 && joystick.Vertical == 0) { + if (isPressMoveUp) + { + vPushDir = Vector3.up; + } + else if (isPressMoveDown) + { + vPushDir = Vector3.down; + } return false; } @@ -4531,10 +4471,22 @@ namespace BrewMonster } else if (m_iMoveEnv == Move_environment.MOVEENV_WATER) { - vPushDir.x = joystick.Horizontal; - vPushDir.y = (transform.position - mainCam.transform.position).normalized.y; - vPushDir.z = joystick.Vertical; - vPushDir.Normalize(); + float angle = Vector2.Angle(new Vector2(joystick.Horizontal, joystick.Vertical), Vector2.up); + angle *= joystick.Horizontal < 0 ? 1 : -1; + Vector2 v2Cam = new Vector2(mainCam.transform.forward.x, mainCam.transform.forward.z); + v2Cam = Quaternion.Euler(0, 0, angle) * v2Cam; + v2Cam.Normalize(); + vPushDir.x = v2Cam.x; + vPushDir.y = ((transform.position + Vector3.up * m_CDRInfo.vExtent.y) - mainCam.transform.position).normalized.y; + if (isPressMoveUp) + { + vPushDir.y = Math.Abs(vPushDir.y) * Time.deltaTime; + } + else if (isPressMoveDown) + { + vPushDir.y = -Math.Abs(vPushDir.y) * Time.deltaTime; + } + vPushDir.z = v2Cam.y; } else { @@ -4554,12 +4506,28 @@ namespace BrewMonster // Is under water bool CanTakeOffWater() { - return true; + // TO DO: fix later //A3DVECTOR3 vPos = GetPos(); //if (vPos.y < EC_Game.GetGameRun().GetWorld().GetWaterHeight(vPos) - m_MoveConst.fShoreDepth) // return false; //else // return true; + + A3DVECTOR3 vPos = GetPos(); + float h0 = 0f; + int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPos) + Vector3.up * 500f, Vector3.down, hits, 1000f, 1 << 8); + if (countHits0 > 0) + { + h0 = hits[0].point.y; + } + if(vPos.y < h0 - m_MoveConst.fShoreDepth) + { + return false; + } + else + { + return true; + } } bool IsUsingItem() @@ -4583,6 +4551,27 @@ namespace BrewMonster transform.rotation = Quaternion.LookRotation(dir); } + public void SetRotationHPWithTime(Vector3 dir, float time) + { + StartCoroutine(RotateToDir(transform, dir, time)); + } + + IEnumerator RotateToDir(Transform target, Vector3 dir, float duration) + { + Quaternion startRot = target.rotation; + Quaternion endRot = Quaternion.LookRotation(dir); + float t = 0f; + + while (t < duration) + { + t += Time.deltaTime; + target.rotation = Quaternion.Slerp(startRot, endRot, t / duration); + yield return null; + } + + target.rotation = endRot; + } + void SetJumpInWater(bool b) { m_bJumpInWater = b; @@ -5328,7 +5317,7 @@ namespace BrewMonster } // Is under water - bool IsUnderWater() + public bool IsUnderWater() { return m_iMoveEnv == Move_environment.MOVEENV_WATER ? true : false; } @@ -5418,7 +5407,7 @@ namespace BrewMonster VertRayTrace(EC_Utility.ToVector3(vTestPos), ref vGndPos, ref m_GndInfo.vGndNormal, 1000f); m_GndInfo.fGndHei = vGndPos.y; - if(Physics.RaycastNonAlloc(EC_Utility.ToVector3(vTestPos), Vector3.down, hits, 1000f, 1<<8) > 0) + if (Physics.RaycastNonAlloc(EC_Utility.ToVector3(vTestPos) + Vector3.up * 500f, Vector3.down, hits, 1000f, 1 << 8) > 0) { m_GndInfo.fWaterHei = hits[0].point.y; } @@ -5520,13 +5509,13 @@ namespace BrewMonster LayerMask layerMaskTerrain = 1 << 6; LayerMask layerMaskBush = 1 << 7; - if (Physics.RaycastNonAlloc(vPos, (vPos + Vector3.down), hits, layerMaskTerrain) > 0) + if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, layerMaskTerrain) > 0) { vTerrainPos = hits[0].point; vTerrainNormal = hits[0].normal; } - if (Physics.RaycastNonAlloc(vPos, (vPos + Vector3.down), hits, DeltaY, layerMaskTerrain) > 0) + if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, DeltaY, layerMaskBush) > 0) { if (vBuildingPos.y > vTerrainPos.y) { @@ -5554,19 +5543,85 @@ namespace BrewMonster vHitPos.y -= DeltaY; LayerMask layerMask = 1 << 6 | 1 << 7; - if (Physics.BoxCastNonAlloc(vCenter, vExt, (vCenter + Vector3.down).normalized, - hits, transform.rotation, DeltaY, layerMask) == 0) + hits = new RaycastHit[5]; + int count = Physics.BoxCastNonAlloc(vCenter, vExt, (Vector3.down).normalized, + hits, transform.rotation, DeltaY, layerMask); + if (count == 0) { vHitPos = vCenter; vHitNormal = EC_Utility.ToA3DVECTOR3(Vector3.up); } else - { - vHitPos = hits[0].point; - vHitNormal = EC_Utility.ToA3DVECTOR3(hits[0].normal); + { + if (Math.Abs(hits[0].distance - 0f) <= float.Epsilon) + { + count = Physics.BoxCastNonAlloc(vCenter, new Vector3(vExt.x, 0.05f, vExt.z), (Vector3.down).normalized, + hits, transform.rotation, DeltaY, layerMask); + if(count == 0) + { + vHitPos = vCenter; + vHitNormal = EC_Utility.ToA3DVECTOR3(Vector3.up); + } + else + { + vHitPos = hits[0].point; + vHitPos.y += vExt.y; + vHitNormal = EC_Utility.ToA3DVECTOR3(hits[0].normal); + } + } } } + void DebugBoxCast(Vector3 center, Vector3 halfExtents, Vector3 direction, + Quaternion orientation, float distance, Color color) + { + Vector3 end = center + direction.normalized * distance; + + // Vẽ box ở vị trí bắt đầu + DebugDrawBox(center, halfExtents, orientation, color); + + // Vẽ box ở vị trí kết thúc + DebugDrawBox(end, halfExtents, orientation, color); + + // Vẽ đường nối giữa 2 box + Debug.DrawLine(center, end, color); + } + + // Vẽ 1 box từ center + halfExtents + rotation + void DebugDrawBox(Vector3 center, Vector3 halfExtents, Quaternion orientation, Color color) + { + var matrix = Matrix4x4.TRS(center, orientation, Vector3.one); + Vector3[] points = { + matrix.MultiplyPoint3x4(new Vector3(-halfExtents.x, -halfExtents.y, -halfExtents.z)), + matrix.MultiplyPoint3x4(new Vector3( halfExtents.x, -halfExtents.y, -halfExtents.z)), + matrix.MultiplyPoint3x4(new Vector3( halfExtents.x, -halfExtents.y, halfExtents.z)), + matrix.MultiplyPoint3x4(new Vector3(-halfExtents.x, -halfExtents.y, halfExtents.z)), + matrix.MultiplyPoint3x4(new Vector3(-halfExtents.x, halfExtents.y, -halfExtents.z)), + matrix.MultiplyPoint3x4(new Vector3( halfExtents.x, halfExtents.y, -halfExtents.z)), + matrix.MultiplyPoint3x4(new Vector3( halfExtents.x, halfExtents.y, halfExtents.z)), + matrix.MultiplyPoint3x4(new Vector3(-halfExtents.x, halfExtents.y, halfExtents.z)) + }; + + // đáy + Debug.DrawLine(points[0], points[1], color); + Debug.DrawLine(points[1], points[2], color); + Debug.DrawLine(points[2], points[3], color); + Debug.DrawLine(points[3], points[0], color); + + // đỉnh + Debug.DrawLine(points[4], points[5], color); + Debug.DrawLine(points[5], points[6], color); + Debug.DrawLine(points[6], points[7], color); + Debug.DrawLine(points[7], points[4], color); + + // cạnh + Debug.DrawLine(points[0], points[4], color); + Debug.DrawLine(points[1], points[5], color); + Debug.DrawLine(points[2], points[6], color); + Debug.DrawLine(points[3], points[7], color); + } + + void OnMsgHstExtProp(ECMSG Msg) { cmd_own_ext_prop pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1);