diff --git a/Assets/ModelRenderer/Art/Models/litmodels/a61/7/litmodel_1013.bmd.prefab b/Assets/ModelRenderer/Art/Models/litmodels/a61/7/litmodel_1013.bmd.prefab
index 31120e208d..b517a43e66 100755
--- a/Assets/ModelRenderer/Art/Models/litmodels/a61/7/litmodel_1013.bmd.prefab
+++ b/Assets/ModelRenderer/Art/Models/litmodels/a61/7/litmodel_1013.bmd.prefab
@@ -2082,7 +2082,6 @@ GameObject:
- component: {fileID: 3165494068242929401}
- component: {fileID: 5334810740042598332}
- component: {fileID: 7700292349787736273}
- - component: {fileID: 3017834984568792303}
m_Layer: 7
m_Name: Object3377
m_TagString: Untagged
@@ -2158,28 +2157,6 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
---- !u!64 &3017834984568792303
-MeshCollider:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 189128314675701766}
- 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: e1fd0f7fe1695472f9549089cb896347, type: 2}
--- !u!1 &213712246934505364
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFly.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFly.cs
index 3ad168a30c..785023fdab 100644
--- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFly.cs
+++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFly.cs
@@ -116,7 +116,6 @@ namespace BrewMonster.Scripts
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_TAKEOFF);
else
{
- Debug.LogError("(int)PLAYER_ACTION_TYPE.ACT_TAKEOFF_SWORD");
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_TAKEOFF_SWORD);
}
}
diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs
index 000fb86a8b..a83510f471 100644
--- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs
+++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs
@@ -821,6 +821,7 @@ namespace BrewMonster.Scripts
}
vCurPos = m_pHost.m_MoveCtrl.GroundMove(EC_Utility.ToA3DVECTOR3(vMoveDir), fSpeed, fDeltaTime, m_pHost.m_fVertSpeed);
+ //BoxCastDrawer.DrawCenterAxis(EC_Utility.ToVector3(vCurPos), Quaternion.identity, 1f, 3f);
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
}
else
diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs
index 2c4c8b2301..ecd61f5a1a 100644
--- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs
+++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs
@@ -139,7 +139,6 @@ namespace BrewMonster.Scripts
public override bool Tick(float dwDeltaTime)
{
base.Tick(dwDeltaTime);
-
int iMoveReason = ShouldMove();
if (iMoveReason != 0)
{
@@ -282,4 +281,4 @@ namespace BrewMonster.Scripts
return m_bStopSlide;
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs
index 59f224fcfc..e1f2fcc4eb 100644
--- a/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs
+++ b/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs
@@ -219,7 +219,7 @@ namespace BrewMonster
Vector3 vDelta = vDest - vStart;
const int allLayers = -1;
- if (Physics.RaycastNonAlloc(ray, hits, Mathf.Infinity, allLayers) > 0)
+ if (Physics.RaycastNonAlloc(ray, hits, maxDistance: 1000f, allLayers) > 0)
{
int hostCid = GetCharacterID();
CECObject clickedObject = null;
diff --git a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs
index 5662678bbd..1312cd3726 100644
--- a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs
+++ b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs
@@ -1,13 +1,9 @@
using BrewMonster.Network;
using BrewMonster.Scripts;
-using BrewMonster.Scripts.Ornament;
using BrewMonster.Scripts.World;
using CSNetwork.GPDataType;
using System;
using UnityEngine;
-using UnityEngine.UI;
-using static BrewMonster.CECHostMove;
-using static System.Net.Mime.MediaTypeNames;
using WORD = System.UInt16;
namespace BrewMonster
@@ -124,16 +120,25 @@ namespace BrewMonster
if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_BRUSH) == CDR_EVN.CDR_BRUSH)
{
+ float fFractionBrush = 100f;
+ Vector3 v3Normal = Vector3.zero;
dir = vDelta;
- //hits = new RaycastHit[5];
countHits = Physics.BoxCastNonAlloc(vStart, vExt, dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask);
- if (countHits > 0)
+ for(int i = 0; i < countHits; i++)
{
- System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
- pEnvTrc.fFraction = (hits[0].distance) / vDelta.magnitude;
- pEnvTrc.vHitNormal = EC_Utility.ToA3DVECTOR3(hits[0].normal);
- pEnvTrc.dwClsFlag = CDR_EVN.CDR_BRUSH;
+ if (hits[i].distance > 0f)
+ {
+ float fFraction = (hits[i].distance) / vDelta.magnitude;
+ if(fFraction < fFractionBrush)
+ {
+ fFractionBrush = fFraction;
+ v3Normal = hits[i].normal;
+ }
+ }
}
+ pEnvTrc.fFraction = fFractionBrush;
+ pEnvTrc.vHitNormal = EC_Utility.ToA3DVECTOR3(v3Normal);
+ pEnvTrc.dwClsFlag = CDR_EVN.CDR_BRUSH;
}
if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_TERRAIN) == CDR_EVN.CDR_TERRAIN)
{
@@ -149,7 +154,7 @@ namespace BrewMonster
vTerStart.y = fHitsTerrain[0].point.y;
}
}
- fHitsTerrain = new RaycastHit[5];
+
countHits = Physics.RaycastNonAlloc(vTerStart, dir.normalized, fHitsTerrain, vDelta.magnitude, TerrainMask);
if ((countHits > 0 && Vector3.Distance(vTerStart, fHitsTerrain[0].point) > 0.0009f))
{
@@ -184,13 +189,13 @@ namespace BrewMonster
else
{
float h0 = 0f;
- int countHits0 = Physics.RaycastNonAlloc(vWatStart + Vector3.up * 500f, Vector3.down, fHitsWater, 1000f, WaterMask);
+ int countHits0 = Physics.RaycastNonAlloc(vWatStart + Vector3.up * 500f, Vector3.down, fHitsWater, maxDistance: 1000f, WaterMask);
if (countHits0 > 0)
{
h0 = fHitsWater[0].point.y;
}
float h1 = 0f;
- countHits0 = Physics.RaycastNonAlloc((vWatStart + vDelta) + Vector3.up * 500f, Vector3.down, fHitsWater, 1000f, WaterMask);
+ countHits0 = Physics.RaycastNonAlloc((vWatStart + vDelta) + Vector3.up * 500f, Vector3.down, fHitsWater, maxDistance: 1000f, WaterMask);
if(countHits0 > 0)
{
h1 = fHitsWater[0].point.y;
@@ -241,8 +246,21 @@ namespace BrewMonster
int countHits = Physics.RaycastNonAlloc(origin, Vector3.down, hits, dist, mask);
if (countHits > 0)
{
- vHitNormal = hits[0].normal;
- vEnd = new Vector3(vStart.x, hits[0].point.y + vExt.y, vStart.z);
+ float minDistance = 100f;
+ int idx = 0;
+ for (int i = 0; i < countHits; i++)
+ {
+ if (hits[i].collider != null && hits[i].distance > 0f)
+ {
+ if(hits[i].distance < minDistance)
+ {
+ minDistance = hits[i].distance;
+ idx = i;
+ }
+ }
+ }
+ vHitNormal = hits[idx].normal;
+ vEnd = new Vector3(vStart.x, hits[idx].point.y + vExt.y, vStart.z);
bSupport = (vHitNormal.y >= 0f);
return true;
}
@@ -521,6 +539,7 @@ namespace BrewMonster
while (nTry < MAX_TRY)
{
+ //hits = new RaycastHit[5];
vDelta = vVelocity * fTime;
vFinalPos = vStart;
float fDeltaDist = vDelta.Magnitude();
@@ -564,13 +583,25 @@ namespace BrewMonster
env_trace_t tmpInfo = new env_trace_t();
tmpInfo.vStart = vStart;
tmpInfo.vDelta = new A3DVECTOR3(0.0f, CDRInfo.fStepHeight, 0.0f);
- tmpInfo.vExt = vExt;
+ tmpInfo.vExt = new A3DVECTOR3(vExt.x, 0.01f, vExt.z);
//@note : need check terrain?? By Kuiwu[8/10/2005]
tmpInfo.dwCheckFlag = CDR_EVN.CDR_BRUSH | CDR_EVN.CDR_TERRAIN;
tmpInfo.vTerStart = vStart;
tmpInfo.vTerStart.y -= vExt.y;
+ //bPull = !CollideWithEnv(ref tmpInfo);
+ bPull = !CheckFootStepUp(tmpInfo);
- bPull = !CollideWithEnv(ref tmpInfo);
+ //int count1 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(tmpInfo.vStart), EC_Utility.ToVector3(tmpInfo.vDelta).normalized, hits, EC_Utility.ToVector3(tmpInfo.vDelta).magnitude, BrushMask | TerrainMask);
+ //bPull = !(count1 < 0);
+ //if(count1 > 0)
+ //{
+ // Debug.DrawLine(EC_Utility.ToVector3(tmpInfo.vStart), hits[0].point, Color.yellow, 10f);
+ //}
+ //if(bPull == false)
+ //{
+ // BoxCastDrawer.Draw(EC_Utility.ToVector3(tmpInfo.vStart), EC_Utility.ToVector3(tmpInfo.vExt), EC_Utility.ToVector3(tmpInfo.vDelta).normalized,
+ // Quaternion.identity, EC_Utility.ToVector3(tmpInfo.vDelta).magnitude, hits, 1, nTry == 0 ? Color.red : Color.green, 10f);
+ //}
if (bPull)
{
vStart.y += CDRInfo.fStepHeight;
@@ -585,8 +616,8 @@ namespace BrewMonster
{
vDelta *= tmpInfo.fFraction;
}
-
- if (vDelta.SquaredMagnitude() < vExt.x * vExt.x * 4)
+ float value = vDelta.SquaredMagnitude();
+ if (value < (vExt.x * vExt.x * 4))
{
vStart.y -= CDRInfo.fStepHeight;
bPull = false;
@@ -661,7 +692,7 @@ namespace BrewMonster
groundTrc.fDeltaY = 0.0f;
}
- if (!RetrieveSupportPlane(ref groundTrc))
+ if (!RetrieveSupportPlane(ref groundTrc, true))
{//@note : do NOT change position. By Kuiwu[14/9/2005]
CDRInfo.fMoveDist = 0.0f;
// if (groundTrc.bSupport)
@@ -692,6 +723,27 @@ namespace BrewMonster
CDRInfo.vTPNormal = vTPNormal;
}
+ private static bool CheckFootStepUp(env_trace_t pEnvTrc)
+ {
+ Vector3 vExt = EC_Utility.ToVector3(pEnvTrc.vExt);
+ Vector3 vStart = EC_Utility.ToVector3(pEnvTrc.vStart);
+ Vector3 vDelta = EC_Utility.ToVector3(pEnvTrc.vDelta);
+ Vector3 dir = vDelta;
+ int countHits = 0;
+ countHits = Physics.BoxCastNonAlloc(vStart, vExt, dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask);
+ if (countHits > 0)
+ {
+ for(int i = 0; i < countHits; i++)
+ {
+ if (hits[i].collider != null && hits[i].point.y > (vStart.y + vExt.y))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
//@desc : used to retrieve support plane (ground or brush), By Kuiwu[12/9/2005]
public struct ground_trace_t
{
@@ -704,7 +756,7 @@ namespace BrewMonster
public bool bSupport; //false if ground missed
};
- public static bool RetrieveSupportPlane(ref ground_trace_t pTrc)
+ public static bool RetrieveSupportPlane(ref ground_trace_t pTrc, bool check = false)
{
A3DVECTOR3 vTerrainPos = new A3DVECTOR3(), vTerrainNormal = new A3DVECTOR3();
@@ -715,7 +767,7 @@ namespace BrewMonster
BrushTraceInfo trcInfo = new BrushTraceInfo();
trcInfo.Init(pTrc.vStart, new A3DVECTOR3(0.0f, -pTrc.fDeltaY, 0.0f), pTrc.vExt);
Vector3 hitPoint = new Vector3();
- if (AABBCollideWithBrush(ref trcInfo, ref hitPoint))
+ if (AABBCollideWithBrush(ref trcInfo, ref hitPoint, check))
{
if (trcInfo.bStartSolid)
{
@@ -752,7 +804,7 @@ namespace BrewMonster
trcInfo.Init(pTrc.vStart, vDelta, pTrc.vExt);
pTrc.vHitNormal = vTerrainNormal;
pTrc.bSupport = true;
- return !AABBCollideWithBrush(ref trcInfo);
+ return !AABBCollideWithBrush(ref trcInfo, ref hitPoint, check);
}
return true;
@@ -763,19 +815,26 @@ namespace BrewMonster
{
vPosOnSurface = vPos;
int countHits = 0;
- countHits = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPosOnSurface), Vector3.down, fHitsTerrain,maxDistance: 1000f, TerrainMask);
+ countHits = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPosOnSurface), Vector3.down, fHitsTerrain, maxDistance: 1000f, TerrainMask);
if (countHits > 0)
{
- System.Array.Sort(fHitsTerrain, 0, fHitsTerrain.Length, raycastHitDistanceComparer);
- for(int i = 0; i < fHitsTerrain.Length; i++)
+ int idx = 0;
+ float maxDistance = 100f;
+ //System.Array.Sort(fHitsTerrain, 0, fHitsTerrain.Length, raycastHitDistanceComparer);
+ for (int i = 0; i < countHits; i++)
{
- if (fHitsTerrain[i].distance > 0.0009f)
+ if (fHitsTerrain[i].collider != null && fHitsTerrain[i].distance > 0f)
{
- vPosOnSurface.y = fHitsTerrain[i].point.y;
- vNormal = EC_Utility.ToA3DVECTOR3(fHitsTerrain[i].normal);
- return;
+ if(fHitsTerrain[i].distance < maxDistance)
+ {
+ maxDistance = fHitsTerrain[i].distance;
+ idx = i;
+ }
}
}
+ vPosOnSurface.y = fHitsTerrain[idx].point.y;
+ vNormal = EC_Utility.ToA3DVECTOR3(fHitsTerrain[idx].normal);
+ return;
}
}
@@ -977,70 +1036,82 @@ namespace BrewMonster
Vector3 vDelta = EC_Utility.ToVector3(brushTraceInfo.vDelta);
Vector3 dir = vDelta;
int countHits = 0;
- float num = 10f;
- //Quaternion quaternion = EC_Game.GetGameRun().GetWorld().GetPlayerMan().GetHostPlayer().transform.rotation;
- Vector3[] arrVExt = new Vector3[5] {
- vExt
- ,new Vector3(vExt.x / num, vExt.y, vExt.z),
- new Vector3(vExt.x, vExt.y / num, vExt.z),
- new Vector3(vExt.x, vExt.y, vExt.z / num),
- vExt / num
- };
- for (int i = 0; i < arrVExt.Length; i++)
+ float fFraction = 100f;
+ Vector3 normal = Vector3.zero;
+ Vector3 hitP = Vector3.zero;
+ countHits = Physics.BoxCastNonAlloc(vStart, vExt, dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask);
+ for (int i = 0; i < countHits; i++)
{
- countHits = Physics.BoxCastNonAlloc(vStart, arrVExt[i], dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask);
- if (countHits > 0)
+ if (hits[i].collider != null && hits[i].distance > 0f)
{
- if(hits[0].distance > 0.0009f)
+ float value = (hits[i].distance) / vDelta.magnitude;
+ if (value < fFraction)
{
- brushTraceInfo.fFraction = (hits[0].distance) / vDelta.magnitude;
- brushTraceInfo.normal = EC_Utility.ToA3DVECTOR3(hits[0].normal);
- return true;
+ fFraction = value;
+ normal = hits[i].normal;
+ hitP = hits[i].point;
}
}
}
+ if (fFraction < 100f)
+ {
+ if (fFraction > 0f && fFraction <= 1f)
+ {
+ brushTraceInfo.fFraction = fFraction;
+ brushTraceInfo.normal = EC_Utility.ToA3DVECTOR3(normal);
+ }
+ if (Math.Abs(fFraction - 0f) < float.Epsilon)
+ {
+ brushTraceInfo.bStartSolid = true;
+ }
+ return true;
+ }
brushTraceInfo.normal = new A3DVECTOR3(0f);
brushTraceInfo.fFraction = 100f;
return false;
}
- public static bool AABBCollideWithBrush(ref BrushTraceInfo brushTraceInfo, ref Vector3 hitPoint)
+ public static bool AABBCollideWithBrush(ref BrushTraceInfo brushTraceInfo, ref Vector3 hitPoint, bool check)
{
Vector3 vExt = EC_Utility.ToVector3(brushTraceInfo.vExtents);
Vector3 vStart = EC_Utility.ToVector3(brushTraceInfo.vStart);
Vector3 vDelta = EC_Utility.ToVector3(brushTraceInfo.vDelta);
Vector3 dir = vDelta;
int countHits = 0;
- float num = 10f;
- //Quaternion quaternion = EC_Game.GetGameRun().GetWorld().GetPlayerMan().GetHostPlayer().transform.rotation;
- Vector3[] arrVExt = new Vector3[5] {
- vExt
- ,new Vector3(vExt.x / num, vExt.y, vExt.z),
- new Vector3(vExt.x, vExt.y / num, vExt.z),
- new Vector3(vExt.x, vExt.y, vExt.z / num),
- vExt / num
- };
- for (int i = 0; i < arrVExt.Length; i++)
+ float fFraction = 100f;
+ Vector3 normal = Vector3.zero;
+ Vector3 hitP = Vector3.zero;
+ countHits = Physics.BoxCastNonAlloc(vStart, vExt, dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask);
+ for (int i = 0; i < countHits; i++)
{
- countHits = Physics.BoxCastNonAlloc(vStart, arrVExt[i], dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask);
- if (countHits > 0)
+ if (hits[i].collider != null && hits[i].distance > 0f)
{
- System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
- if (Math.Abs(hits[0].distance - 0f) < float.Epsilon)
+ float value = (hits[i].distance) / vDelta.magnitude;
+ if(value < fFraction)
{
- brushTraceInfo.bStartSolid = true;
- }
- else
- {
- brushTraceInfo.fFraction = (hits[0].distance) / vDelta.magnitude;
- brushTraceInfo.normal = EC_Utility.ToA3DVECTOR3(hits[0].normal);
- hitPoint = hits[0].point;
- return true;
+ fFraction = value;
+ normal = hits[i].normal;
+ hitP = hits[i].point;
}
}
}
+ if(fFraction < 100f)
+ {
+ if(fFraction > 0f && fFraction <= 1f)
+ {
+ brushTraceInfo.fFraction = fFraction;
+ brushTraceInfo.normal = EC_Utility.ToA3DVECTOR3(normal);
+ hitPoint = hitP;
+ }
+ if (Math.Abs(fFraction - 0f) < float.Epsilon)
+ {
+ brushTraceInfo.bStartSolid = true;
+ }
+ return true;
+ }
brushTraceInfo.normal = new A3DVECTOR3(0f);
brushTraceInfo.fFraction = 100f;
+ hitPoint = Vector3.zero;
return false;
}
@@ -1153,7 +1224,7 @@ namespace BrewMonster
awmInfo.bMeetHeightThresh = true;
float fHWater = 0f;
- int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vFinalPos) + Vector3.up * 500f, Vector3.down, fHitsWater, 1000f, 1 << 8);
+ int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vFinalPos) + Vector3.up * 500f, Vector3.down, fHitsWater, maxDistance: 1000f, WaterMask);
if (countHits0 > 0)
{
fHWater = fHitsWater[0].point.y;
@@ -1265,7 +1336,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 * 500f, Vector3.down, fHitsWater, 1000f, 1 << 8);
+ int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vStart) + Vector3.up * 500f, Vector3.down, fHitsWater, maxDistance: 1000f, WaterMask);
if(countHits0 > 0)
{
fHWater = fHitsWater[0].point.y;
@@ -1318,7 +1389,7 @@ namespace BrewMonster
if (bAdjust && (vOverTp.y + awmInfo.fHeightThresh > vFinalPos.y))
{
float fHWater = 0f;
- int countHits = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vFinalPos), Vector3.down, fHitsWater, 1000f, 1 << 8);
+ int countHits = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vFinalPos), Vector3.down, fHitsWater, maxDistance: 1000f, WaterMask);
if (countHits > 0)
{
fHWater = fHitsWater[0].point.y;
@@ -1423,9 +1494,11 @@ namespace BrewMonster
return true;
}
- static float DotProduct(A3DVECTOR3 v1, A3DVECTOR3 v2) { return v1.x* v2.x + v1.y* v2.y + v1.z* v2.z;
+ static float DotProduct(A3DVECTOR3 v1, A3DVECTOR3 v2) { return v1.x* v2.x + v1.y* v2.y + v1.z* v2.z;}
}
-}
+
+
+
public struct OtherPlayer_Move_Info
{
// Bounding sphere of avator
@@ -1489,4 +1562,113 @@ namespace BrewMonster
// still be satisfied, bMeetHeightThresh is set to true.
public bool bMeetHeightThresh;
};
+
+ public static class BoxCastDrawer
+ {
+ ///
+ /// Vẽ BoxCast để Debug
+ ///
+ /// Thời gian tồn tại của đường kẻ (giây). Mặc định là 0 (1 frame)
+ public static void Draw(
+ Vector3 center,
+ Vector3 halfExtents,
+ Vector3 direction,
+ Quaternion orientation,
+ float distance,
+ RaycastHit[] hits,
+ int hitCount,
+ Color color,
+ float duration = 0f) // Thêm tham số duration ở đây
+ {
+ // 1. Tính toán các góc
+ Vector3[] startCorners = GetBoxCorners(center, halfExtents, orientation);
+
+ float drawDistance = distance;
+ if (hitCount > 0)
+ {
+ float minDistance = distance;
+ for (int i = 0; i < hitCount; i++)
+ {
+ if (hits[i].distance < minDistance && hits[i].distance > 0)
+ minDistance = hits[i].distance;
+ }
+ drawDistance = minDistance;
+ }
+
+ Vector3 endCenter = center + direction.normalized * drawDistance;
+ Vector3[] endCorners = GetBoxCorners(endCenter, halfExtents, orientation);
+
+ // 2. Thiết lập màu sắc
+ //Color color = hitCount > 0 ? Color.red : Color.green;
+ //Color sweepColor = new Color(0.5f, 0.5f, 0.5f, 0.5f); // Màu xám mờ
+ Color sweepColor = color; // Màu xám mờ
+
+ // 3. VẼ TÂM (CENTER) - Hiển thị trục tọa độ Local của hộp
+ DrawCenterAxis(center, orientation, 0.3f, duration); // Tâm bắt đầu
+ DrawCenterAxis(endCenter, orientation, 0.3f, duration); // Tâm kết thúc
+
+ // 3. Vẽ các đường Line với Duration
+ for (int i = 0; i < 4; i++)
+ {
+ // Vẽ hộp bắt đầu
+ Debug.DrawLine(startCorners[i], startCorners[(i + 1) % 4], color, duration);
+ Debug.DrawLine(startCorners[i + 4], startCorners[((i + 1) % 4) + 4], color, duration);
+ Debug.DrawLine(startCorners[i], startCorners[i + 4], color, duration);
+
+ // Vẽ hộp kết thúc/va chạm
+ Debug.DrawLine(endCorners[i], endCorners[(i + 1) % 4], color, duration);
+ Debug.DrawLine(endCorners[i + 4], endCorners[((i + 1) % 4) + 4], color, duration);
+ Debug.DrawLine(endCorners[i], endCorners[i + 4], color, duration);
+
+ // Vẽ các đường nối (Sweep lines)
+ Debug.DrawLine(startCorners[i], endCorners[i], sweepColor, duration);
+ Debug.DrawLine(startCorners[i + 4], endCorners[i + 4], sweepColor, duration);
+ }
+
+ // 4. Vẽ chi tiết va chạm
+ for (int i = 0; i < hitCount; i++)
+ {
+ // Vẽ pháp tuyến (Normal) tại điểm chạm
+ Debug.DrawRay(hits[i].point, hits[i].normal * 0.5f, Color.yellow, duration);
+ // Vẽ một dấu X nhỏ tại điểm va chạm chính xác
+ DrawCross(hits[i].point, 0.1f, Color.cyan, duration);
+ }
+ }
+
+ private static void DrawCross(Vector3 point, float size, Color color, float duration)
+ {
+ Debug.DrawLine(point + Vector3.up * size, point - Vector3.up * size, color, duration);
+ Debug.DrawLine(point + Vector3.right * size, point - Vector3.right * size, color, duration);
+ Debug.DrawLine(point + Vector3.forward * size, point - Vector3.forward * size, color, duration);
+ }
+
+ private static Vector3[] GetBoxCorners(Vector3 center, Vector3 halfExtents, Quaternion orientation)
+ {
+ Vector3[] corners = new Vector3[8];
+ Vector3 h = halfExtents;
+ corners[0] = center + orientation * new Vector3(-h.x, -h.y, h.z);
+ corners[1] = center + orientation * new Vector3(h.x, -h.y, h.z);
+ corners[2] = center + orientation * new Vector3(h.x, h.y, h.z);
+ corners[3] = center + orientation * new Vector3(-h.x, h.y, h.z);
+ corners[4] = center + orientation * new Vector3(-h.x, -h.y, -h.z);
+ corners[5] = center + orientation * new Vector3(h.x, -h.y, -h.z);
+ corners[6] = center + orientation * new Vector3(h.x, h.y, -h.z);
+ corners[7] = center + orientation * new Vector3(-h.x, h.y, -h.z);
+ return corners;
+ }
+
+ public static void DrawCenterAxis(Vector3 pos, Quaternion rot, float size, float duration)
+ {
+ Debug.DrawRay(pos, rot * Vector3.right * size, Color.red, duration);
+ Debug.DrawRay(pos, rot * Vector3.up * size, Color.green, duration);
+ Debug.DrawRay(pos, rot * Vector3.forward * size, Color.blue, duration);
+
+ // Vẽ thêm một khối diamond nhỏ màu trắng tại tâm để dễ nhận diện
+ float s = size * 0.2f;
+ Debug.DrawLine(pos + rot * Vector3.up * s, pos + rot * Vector3.right * s, Color.white, duration);
+ Debug.DrawLine(pos + rot * Vector3.right * s, pos - rot * Vector3.up * s, Color.white, duration);
+ Debug.DrawLine(pos - rot * Vector3.up * s, pos - rot * Vector3.left * s, Color.white, duration);
+ Debug.DrawLine(pos - rot * Vector3.left * s, pos + rot * Vector3.up * s, Color.white, duration);
+ }
+ }
}
diff --git a/Assets/Scenes/a61.unity b/Assets/Scenes/a61.unity
index 3fee0d9cea..c9c8d55992 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:4998c3fd4977cc180a6b20f03502e6e6d150dfa206d77d4e4c30a83700377c8d
-size 5918457
+oid sha256:22d2dd330d4c89637e26553582e52c7587f88277f0593ba28a6206bcb69394d4
+size 5919058
diff --git a/Assets/Scripts/CECHostPlayer.World.cs b/Assets/Scripts/CECHostPlayer.World.cs
index 4b691dc090..68ce17d8af 100644
--- a/Assets/Scripts/CECHostPlayer.World.cs
+++ b/Assets/Scripts/CECHostPlayer.World.cs
@@ -21,6 +21,7 @@ namespace BrewMonster
handle.AddrOfPinnedObject(), typeof(cmd_host_correct_pos));
handle.Free();
//cmd_host_correct_pos pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1);
+ Debug.LogError("OnMsgHstCorrectPos = " + pCmd.pos);
SetPos(pCmd.pos);
m_vVelocity.Clear();
m_CDRInfo.vAbsVelocity.Clear();
@@ -212,7 +213,7 @@ namespace BrewMonster
// 注意:暂时跳过地形高度检查,因为它需要世界访问
A3DVECTOR3 vNormal = new A3DVECTOR3();
float vTerrainHeight = vPos.y;
- if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, 1000f, 1 << 6) > 0)
+ if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, maxDistance: 1000f, EC_CDR.TerrainMask) > 0)
{
vTerrainHeight = hits[0].point.y;
vNormal = EC_Utility.ToA3DVECTOR3(hits[0].normal);
diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs
index 9a296d95c5..932f7bf2f9 100644
--- a/Assets/Scripts/CECHostPlayer.cs
+++ b/Assets/Scripts/CECHostPlayer.cs
@@ -1390,9 +1390,9 @@ namespace BrewMonster
m_CDRInfo.vExtent = m_aabbServer.Extents;
Vector3 pStart = pos;
pos.y += m_CDRInfo.vExtent.y;
- if (Physics.RaycastNonAlloc(pos, Vector3.down, hits, m_CDRInfo.vExtent.y, 1 << 6) > 0)
+ if (Physics.RaycastNonAlloc(pos, Vector3.down, hits, m_CDRInfo.vExtent.y, EC_CDR.TerrainMask) > 0)
{
- System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
+ //System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
m_CDRInfo.vTPNormal = EC_Utility.ToA3DVECTOR3(hits[0].normal);
}
else
@@ -1799,14 +1799,14 @@ namespace BrewMonster
float fTerrainHeight = 0f;
if (Physics.RaycastNonAlloc(startPoint, dir, hits, layerGround) > 0)
{
- System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
+ //System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
fTerrainHeight = Vector3.Distance(hits[0].point, startPoint);
}
float fWaterHeight = 0f;
if (Physics.RaycastNonAlloc(startPoint, dir, hits, layerWater) > 0)
{
- System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
+ //System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
fWaterHeight = Vector3.Distance(hits[0].point, startPoint);
}
@@ -2459,10 +2459,10 @@ namespace BrewMonster
A3DVECTOR3 vPos = GetPos();
float h0 = 0f;
- int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPos) + Vector3.up * 500f, Vector3.down, hits, 1000f, 1 << 8);
+ int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPos) + Vector3.up * 500f, Vector3.down, hits, maxDistance: 1000f, EC_CDR.WaterMask);
if (countHits0 > 0)
{
- System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
+ //System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
h0 = hits[0].point.y;
}
if (vPos.y < h0 - m_MoveConst.fShoreDepth)
@@ -3184,7 +3184,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.up * 500f, Vector3.down, hits, 1000f, 1 << 8) > 0)
+ if (Physics.RaycastNonAlloc(EC_Utility.ToVector3(vTestPos) + Vector3.up * 500f, Vector3.down, hits, maxDistance: 1000f, EC_CDR.WaterMask) > 0)
{
System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
m_GndInfo.fWaterHei = hits[0].point.y;
@@ -3286,9 +3286,10 @@ namespace BrewMonster
LayerMask layerMaskTerrain = 1 << 6;
LayerMask layerMaskBush = 1 << 7;
- if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, 1000f, layerMaskTerrain) > 0 /*&& hits[0].distance > 0.0009f*/)
+
+ if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, maxDistance: 1000f, layerMaskTerrain) > 0 /*&& hits[0].distance > 0.0009f*/)
{
- System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
+ //System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer);
vTerrainPos = hits[0].point;
vTerrainNormal = hits[0].normal;
}