670 lines
25 KiB
C#
670 lines
25 KiB
C#
using BrewMonster;
|
|
using CSNetwork;
|
|
using CSNetwork.GPDataType;
|
|
using CSNetwork.Protocols.RPCData;
|
|
using System;
|
|
using UnityEngine;
|
|
|
|
namespace PerfectWorld.Scripts.Player
|
|
{
|
|
public class EC_ElsePlayer : EC_Player
|
|
{
|
|
A3DVECTOR3 m_vMoveDir; // Player's velocity
|
|
A3DVECTOR3 m_vServerPos; // Player's real position on server
|
|
A3DVECTOR3 m_vStopDir; // The direction when player stop moving
|
|
// 是否是依附者 = Is it a dependent/attacher?
|
|
bool m_bHangerOn;
|
|
// 依附者或被依附者id = The ID of the attacher (dependent) or the attached target.
|
|
int m_iBuddyId;
|
|
bool m_bStopMove; // Stop move flag
|
|
public const float MAX_LAGDIST = 10.0f; // Maximum lag distance
|
|
A3DVECTOR3 g_vAxisY = new A3DVECTOR3(0.0f, 1.0f, 0.0f);
|
|
long m_dwLastMoveTime = 0; // Last move command arrived time
|
|
float m_fMoveSpeed; // Move speed
|
|
OtherPlayer_Move_Info m_cdr = new OtherPlayer_Move_Info();
|
|
// 和服务器提供的 aabb,无法影响朝向 = The AABB provided by the server cannot affect the facing/orientation
|
|
A3DAABB m_aabbServer = new A3DAABB();
|
|
A3DAABB m_aabb = new A3DAABB(); // Player's aabb£¬ÓÃÓÚÏÔʾµÄaabb£¬ÊÜËõ·ÅÓ°Ïì
|
|
string m_strName; // Player name
|
|
int m_iProfession; // Profession
|
|
int m_iGender; // Gender
|
|
float m_fScaleBySkill = 1f;
|
|
MOVECONST m_MoveConst; // Const used when moving control
|
|
int m_iMoveEnv; // Move environment
|
|
bool m_bWalkRun; // Walk-run switch, 0-walk, 1-run
|
|
int m_iMoveMode; // Player's move mode
|
|
|
|
public MOVECONST[] aMoveConsts = new MOVECONST[PROFESSION.NUM_PROFESSION * GENDER.NUM_GENDER]
|
|
{
|
|
// ÎäÏÀ
|
|
// fStepHei fMinAirHei fMinWaterHei fShoreDepth fWaterSurf
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
// ·¨Ê¦
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
// Î×ʦ
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
// Ñý¾«
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
// ÑýÊÞ
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.8f, 0.7f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
// ´Ì¿Í
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
// Óðâ
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
// ÓðÁé
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
// ½£Áé
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
// ÷ÈÁé
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
// Ò¹Ó°
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
// ÔÂÏÉ
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
|
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
|
};
|
|
|
|
public A3DVECTOR3[] aExts = new A3DVECTOR3[PROFESSION.NUM_PROFESSION * GENDER.NUM_GENDER]
|
|
{
|
|
new A3DVECTOR3(0.4f, 0.9f, 0.4f), // ÎäÏÀ
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ·¨Ê¦
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Î×ʦ
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Ñý¾«
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
new A3DVECTOR3(0.5f, 1.05f, 0.5f), // ÑýÊÞ
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f),
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ´Ì¿Í
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Óðâ
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ÓðÁé
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ½£Áé
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ÷ÈÁé
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Ò¹Ó°
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ÔÂÏÉ
|
|
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
|
};
|
|
|
|
public void Init(RoleInfo roleInfo, info_player_1 Info)
|
|
{
|
|
m_iProfession = roleInfo.occupation;
|
|
m_iGender = roleInfo.gender;
|
|
|
|
CalcPlayerAABB();
|
|
|
|
SetServerPos(Info.pos);
|
|
SetPos(Info.pos);
|
|
|
|
m_cdr.fStepHeight = m_MoveConst.fStepHei;
|
|
m_cdr.vExts = m_aabbServer.Extents;
|
|
m_cdr.vVelocity.Clear();
|
|
|
|
A3DVECTOR3 vPos = GetPos();
|
|
m_aabb.Center = vPos + new A3DVECTOR3(0.0f, m_aabb.Extents.y, 0.0f);
|
|
m_aabb.CompleteMinsMaxs();
|
|
m_aabbServer.Center = vPos + new A3DVECTOR3(0.0f, m_aabbServer.Extents.y, 0.0f);
|
|
m_aabbServer.CompleteMinsMaxs();
|
|
|
|
if (TryGetComponent<PlayerVisual>(out var visual))
|
|
{
|
|
visual.InitHostPlayerEventDoneHandler();
|
|
}
|
|
}
|
|
|
|
void CalcPlayerAABB()
|
|
{
|
|
int iIndex = m_iProfession * GENDER.NUM_GENDER + m_iGender;
|
|
|
|
m_aabb.Extents = aExts[iIndex] * m_fScaleBySkill;
|
|
m_aabbServer.Extents = aExts[iIndex];
|
|
m_MoveConst = aMoveConsts[iIndex];
|
|
}
|
|
|
|
public void MoveTo(cmd_object_move Cmd)
|
|
{
|
|
BrewMonster.BMLogger.Log("HoangDev : MoveToMoveTo");
|
|
|
|
if (Cmd.use_time == 0)
|
|
return;
|
|
SetServerPos(Cmd.dest);
|
|
m_vMoveDir = Cmd.dest - GetPos();
|
|
float fDist = m_vMoveDir.Normalize();
|
|
m_bStopMove = false;
|
|
|
|
// If destination position is too far to us, forcely pull player
|
|
// to that position.
|
|
if (fDist >= MAX_LAGDIST)
|
|
{
|
|
BrewMonster.BMLogger.Log("HoangDev : fDist >= MAX_LAGDIST");
|
|
SetPos(Cmd.dest);
|
|
//m_pEPWorkMan->FinishWork(CECEPWork::WORK_MOVE);
|
|
return;
|
|
}
|
|
|
|
int iMoveMode = Cmd.move_mode;
|
|
m_cdr.bTraceGround = true;
|
|
|
|
if (((GPMoveMode)iMoveMode & GPMoveMode.GP_MOVE_AIR) != 0)
|
|
{
|
|
m_iMoveEnv = (int)MoveEnvironment.MOVEENV_AIR;
|
|
m_cdr.bTraceGround = false;
|
|
}
|
|
else if (((GPMoveMode)iMoveMode & GPMoveMode.GP_MOVE_WATER) != 0)
|
|
{
|
|
m_iMoveEnv = (int)MoveEnvironment.MOVEENV_WATER;
|
|
m_cdr.bTraceGround = false;
|
|
//ShowWing(false);
|
|
}
|
|
else
|
|
{
|
|
m_iMoveEnv = (int)MoveEnvironment.MOVEENV_GROUND;
|
|
|
|
//if (!IsFlying())
|
|
// ShowWing(false);
|
|
}
|
|
|
|
switch ((GPMoveMode)iMoveMode & GPMoveMode.GP_MOVE_MASK)
|
|
{
|
|
case GPMoveMode.GP_MOVE_WALK: m_iMoveMode = (int)MoveMode.MOVE_MOVE; m_bWalkRun = false; break;
|
|
case GPMoveMode.GP_MOVE_RUN: m_iMoveMode = (int)MoveMode.MOVE_MOVE; m_bWalkRun = true; break;
|
|
case GPMoveMode.GP_MOVE_SLIDE: m_iMoveMode = (int)MoveMode.MOVE_SLIDE; break;
|
|
case GPMoveMode.GP_MOVE_FALL: m_iMoveMode = (int)MoveMode.MOVE_FREEFALL; m_cdr.bTraceGround = false; break;
|
|
case GPMoveMode.GP_MOVE_FLYFALL: m_cdr.bTraceGround = false; break;
|
|
case GPMoveMode.GP_MOVE_JUMP: m_iMoveMode = (int)MoveMode.MOVE_JUMP; m_cdr.bTraceGround = false; break;
|
|
}
|
|
|
|
long dwTimeNow = Environment.TickCount;
|
|
long dwDeltaTime = (dwTimeNow > m_dwLastMoveTime) ? (dwTimeNow - m_dwLastMoveTime) : 0;
|
|
m_dwLastMoveTime = dwTimeNow;
|
|
if (dwDeltaTime < 500)
|
|
dwDeltaTime = 500;
|
|
if (dwDeltaTime > 1000)
|
|
dwDeltaTime = 1000;
|
|
|
|
float fSpeed = (Cmd.sSpeed) / 256f; // short / 256 <=> FIX8TOFLOAT(short)
|
|
m_fMoveSpeed = fDist / (dwDeltaTime * 0.001f);
|
|
Mathf.Clamp(m_fMoveSpeed, 0.0f, fSpeed * 1.2f);
|
|
|
|
//if (!m_pPlayerModel) return;
|
|
//if (!IsValidAction(iCurAction)) return;
|
|
PlayAction(GetMoveStandAction(true), true, 1, false);
|
|
}
|
|
|
|
public bool MovingTo(float dwDeltaTime)
|
|
{
|
|
bool bRet = false;
|
|
|
|
A3DVECTOR3 vPos, vCurPos = GetPos();
|
|
float fDeltaTime = dwDeltaTime;
|
|
|
|
if (m_bStopMove)
|
|
{
|
|
A3DVECTOR3 vDir = m_vServerPos - vCurPos;
|
|
float fDist = vDir.Normalize();
|
|
if (vDir.IsZero()) return false;
|
|
|
|
Quaternion targetRotation = Quaternion.LookRotation(EC_Utility.ToVector3(vDir));
|
|
if (Quaternion.Angle(transform.rotation, targetRotation) < 0.5f)
|
|
transform.rotation = targetRotation;
|
|
else
|
|
transform.rotation = Quaternion.Slerp(
|
|
transform.rotation,
|
|
targetRotation,
|
|
rotationSpeed * Time.deltaTime
|
|
);
|
|
|
|
vPos = MoveStep(vDir, m_fMoveSpeed, fDeltaTime);
|
|
|
|
float fMoveDelta = A3d_Magnitude(vPos - vCurPos);
|
|
if (Math.Abs(fMoveDelta - 0f) <= float.Epsilon || fMoveDelta >= fDist) //!fMoveDelta <=> (Math.Abs(fMoveDelta - 0f) <= float.Epsilon) Compare with 0
|
|
{
|
|
BrewMonster.BMLogger.Log($"HoangDev : SetPosServer({m_vServerPos}) 1;");
|
|
SetPos(m_vServerPos);
|
|
PlayAction(GetMoveStandAction(false), true, 1, false);
|
|
bRet = true;
|
|
}
|
|
else
|
|
{
|
|
BrewMonster.BMLogger.Log($"HoangDev : SetPos({vPos}) 1;");
|
|
SetPos(vPos);
|
|
}
|
|
}
|
|
else // Just move on
|
|
{
|
|
// If we have move so far from destination and still don't
|
|
// receive new 'move' or 'stop move' command, it's better to
|
|
// stop moving and goto last destination at once
|
|
if (m_vMoveDir.IsZero()) return false;
|
|
A3DVECTOR3 vDir = m_vMoveDir;
|
|
vDir.Normalize();
|
|
|
|
Quaternion targetRotation = Quaternion.LookRotation(EC_Utility.ToVector3(vDir));
|
|
if (Quaternion.Angle(transform.rotation, targetRotation) < 0.5f)
|
|
transform.rotation = targetRotation;
|
|
else
|
|
transform.rotation = Quaternion.Slerp(
|
|
transform.rotation,
|
|
targetRotation,
|
|
rotationSpeed * Time.deltaTime
|
|
);
|
|
vPos = MoveStep(vDir, m_fMoveSpeed, fDeltaTime);
|
|
SetPos(vPos);
|
|
BrewMonster.BMLogger.Log("HoangDev : SetPos(vPos) 1;");
|
|
float fDist = A3d_Magnitude(m_vServerPos - vCurPos);
|
|
if (fDist >= MAX_LAGDIST)
|
|
{
|
|
BrewMonster.BMLogger.Log("HoangDev : SetPos(m_vServerPos) 2;");
|
|
SetPos(m_vServerPos);
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
public void StopMoveTo(cmd_object_stop_move Cmd)
|
|
{
|
|
m_vMoveDir = Cmd.dest - GetPos();
|
|
m_bStopMove = true;
|
|
m_fMoveSpeed = (Cmd.sSpeed) / 256f;
|
|
m_vStopDir = glb_DecompressDirH(Cmd.dir);
|
|
|
|
SetServerPos(Cmd.dest);
|
|
|
|
float fDist = m_vMoveDir.Normalize();
|
|
BrewMonster.BMLogger.Log($"HoangDev : {fDist} : {MAX_LAGDIST} || {m_fMoveSpeed}");
|
|
|
|
if (fDist >= MAX_LAGDIST || m_fMoveSpeed < 0.01f)
|
|
{
|
|
m_bStopMove = false;
|
|
SetPos(Cmd.dest);
|
|
PlayAction(GetMoveStandAction(true), true, 1, false);
|
|
return;
|
|
}
|
|
int iMoveMode = Cmd.move_mode;
|
|
m_cdr.bTraceGround = true;
|
|
|
|
if (((GPMoveMode)iMoveMode & GPMoveMode.GP_MOVE_AIR) != 0)
|
|
{
|
|
m_iMoveEnv = (int)MoveEnvironment.MOVEENV_AIR;
|
|
m_cdr.bTraceGround = false;
|
|
}
|
|
else if (((GPMoveMode)iMoveMode & GPMoveMode.GP_MOVE_WATER) != 0)
|
|
{
|
|
m_iMoveEnv = (int)MoveEnvironment.MOVEENV_WATER;
|
|
m_cdr.bTraceGround = false;
|
|
}
|
|
else
|
|
m_iMoveEnv = (int)MoveEnvironment.MOVEENV_GROUND;
|
|
|
|
switch ((GPMoveMode)iMoveMode & GPMoveMode.GP_MOVE_MASK)
|
|
{
|
|
case GPMoveMode.GP_MOVE_WALK: m_iMoveMode = (int)MoveMode.MOVE_MOVE; m_bWalkRun = false; break;
|
|
case GPMoveMode.GP_MOVE_RUN: m_iMoveMode = (int)MoveMode.MOVE_MOVE; m_bWalkRun = true; break;
|
|
case GPMoveMode.GP_MOVE_SLIDE: m_iMoveMode = (int)MoveMode.MOVE_SLIDE; break;
|
|
case GPMoveMode.GP_MOVE_FALL: m_iMoveMode = (int)MoveMode.MOVE_FREEFALL; m_cdr.bTraceGround = false; break;
|
|
case GPMoveMode.GP_MOVE_FLYFALL: m_cdr.bTraceGround = false; break;
|
|
case GPMoveMode.GP_MOVE_JUMP: m_iMoveMode = (int)MoveMode.MOVE_JUMP; m_cdr.bTraceGround = false; break;
|
|
}
|
|
|
|
PlayAction(GetMoveStandAction(true), true, 1, false);
|
|
}
|
|
|
|
// Decompress horizontal direction
|
|
A3DVECTOR3 glb_DecompressDirH(byte byDir)
|
|
{
|
|
float fInter = 360.0f / 256.0f;
|
|
|
|
float fRad = Mathf.Deg2Rad * (byDir * fInter);
|
|
A3DVECTOR3 v;
|
|
v.x = (float)Math.Cos(fRad);
|
|
v.z = (float)Math.Sin(fRad);
|
|
v.y = 0.0f;
|
|
|
|
return v;
|
|
}
|
|
|
|
private A3DVECTOR3 MoveStep(A3DVECTOR3 vDir, float fSpeed, float fTime)
|
|
{
|
|
A3DVECTOR3 vRealDir = vDir;
|
|
// OnAirMove only accept positive speed value
|
|
if (fSpeed < 0.0f)
|
|
{
|
|
vRealDir = -vDir;
|
|
fSpeed = -fSpeed;
|
|
}
|
|
m_cdr.vCenter = m_aabbServer.Center;
|
|
//Debug.LogError("m_aabbServer.Center = " + m_aabbServer.Center.x + "," + m_aabbServer.Center.y + ","+ m_aabbServer.Center.z);
|
|
m_cdr.vVelocity = vRealDir * fSpeed;
|
|
//Debug.LogError("vVelocity = " + m_cdr.vVelocity.x + "," + m_cdr.vVelocity.y + "," + m_cdr.vVelocity.z);
|
|
m_cdr.t = fTime;
|
|
m_cdr.bTestTrnOnly = false;
|
|
//OtherPlayerMove(m_cdr);
|
|
A3DVECTOR3 vDelta = m_cdr.t * m_cdr.vVelocity;
|
|
m_cdr.vCenter += vDelta;
|
|
|
|
m_cdr.vecGroundNormal = g_vAxisY;
|
|
//if (m_cdr.bTraceGround)
|
|
// SetGroundNormal(m_cdr.vecGroundNormal);
|
|
//else
|
|
// SetGroundNormal(g_vAxisY);
|
|
|
|
return m_cdr.vCenter - g_vAxisY * m_cdr.vExts.y;
|
|
}
|
|
|
|
void OtherPlayerMove(OtherPlayer_Move_Info OPMoveInfo)
|
|
{
|
|
A3DVECTOR3 vDelta = OPMoveInfo.t * OPMoveInfo.vVelocity;
|
|
OPMoveInfo.vCenter += vDelta;
|
|
|
|
OPMoveInfo.vecGroundNormal = g_vAxisY;
|
|
A3DVECTOR3 vGroundPos, vNormal;
|
|
|
|
// Now, we directly interpolate the pos, and we don't use bTraceGround
|
|
//if (OPMoveInfo.bTestTrnOnly)
|
|
//{
|
|
// GetTerrainInfo(OPMoveInfo.vCenter, vGroundPos, vNormal);
|
|
// vGroundPos.y += OPMoveInfo.vExts.y;
|
|
|
|
// if (OPMoveInfo.vCenter.y < vGroundPos.y + 0.1f)
|
|
// OPMoveInfo.vecGroundNormal = vNormal;
|
|
|
|
// // verify not below the terrain
|
|
// if (OPMoveInfo.vCenter.y < vGroundPos.y)
|
|
// OPMoveInfo.vCenter.y = vGroundPos.y;
|
|
//}
|
|
//else
|
|
//{
|
|
// if (VertRayTrace(OPMoveInfo.vCenter, vGroundPos, vNormal, 3.0f))
|
|
// {
|
|
// OPMoveInfo.vecGroundNormal = vNormal;
|
|
|
|
// vGroundPos.y += OPMoveInfo.vExts.y;
|
|
|
|
// // verify not below the ground
|
|
// if (OPMoveInfo.vCenter.y < vGroundPos.y)
|
|
// OPMoveInfo.vCenter.y = vGroundPos.y;
|
|
// }
|
|
//}
|
|
}
|
|
|
|
private float A3d_Magnitude(A3DVECTOR3 v)
|
|
{
|
|
return Mathf.Sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
|
}
|
|
|
|
// Set server position
|
|
public void SetServerPos(A3DVECTOR3 vPos)
|
|
{
|
|
BrewMonster.BMLogger.Log("SetServerPos ");
|
|
m_vServerPos = vPos;
|
|
// If this player is a mule, change it's rider's server pos too.
|
|
if (m_iBuddyId != 0 && !m_bHangerOn)
|
|
{
|
|
var pPlayer = EC_ManMessageMono.Instance.GetECManPlayer.GetElsePlayer(m_iBuddyId);
|
|
if (pPlayer)
|
|
pPlayer.SetServerPos(vPos);
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
MovingTo(Time.deltaTime);
|
|
}
|
|
|
|
private void SetPos(A3DVECTOR3 vPos)
|
|
{
|
|
Vector3 vector = new Vector3();
|
|
vector.x = vPos.x;
|
|
vector.y = vPos.y;
|
|
vector.z = vPos.z;
|
|
transform.position = vector;
|
|
|
|
m_aabb.Center = vPos + new A3DVECTOR3(0.0f, m_aabb.Extents.y, 0.0f);
|
|
m_aabb.CompleteMinsMaxs();
|
|
m_aabbServer.Center = vPos + new A3DVECTOR3(0.0f, m_aabbServer.Extents.y, 0.0f);
|
|
m_aabbServer.CompleteMinsMaxs();
|
|
}
|
|
|
|
private A3DVECTOR3 GetPos()
|
|
{
|
|
A3DVECTOR3 result = new A3DVECTOR3();
|
|
result.x = transform.position.x;
|
|
result.y = transform.position.y;
|
|
result.z = transform.position.z;
|
|
return result;
|
|
}
|
|
|
|
private int GetMoveStandAction(bool bMove, bool bFight = false)
|
|
{
|
|
int iMoveEnv = m_iMoveEnv;
|
|
//if (m_AttachMode != enumAttachNone)
|
|
//{
|
|
// bFight = false;
|
|
// if (m_bHangerOn)
|
|
// iMoveEnv = MOVEENV_GROUND;
|
|
//}
|
|
|
|
int iAction = (int)PLAYER_ACTION_TYPE.ACT_STAND;
|
|
|
|
if (bMove)
|
|
{
|
|
// Play appropriate actions
|
|
if (iMoveEnv == (int)MoveEnvironment.MOVEENV_GROUND)
|
|
{
|
|
if (m_bWalkRun)
|
|
iAction = (int)PLAYER_ACTION_TYPE.ACT_RUN;
|
|
else
|
|
iAction = (int)PLAYER_ACTION_TYPE.ACT_WALK;
|
|
}
|
|
//else if (iMoveEnv == MOVEENV_AIR)
|
|
//{
|
|
// //if (/*UsingWing()*/ m_wingType == WINGTYPE_WING)
|
|
// // iAction = ACT_FLY;
|
|
// //else
|
|
// // iAction = ACT_FLY_SWORD;
|
|
//}
|
|
//else if (iMoveEnv == MOVEENV_WATER)
|
|
//{
|
|
// //if (CanCombineWithMoveForSkill())
|
|
// //{
|
|
// // iAction = ACT_SWIM_FOR_MOVESKILL;
|
|
// //}
|
|
// //else
|
|
// //{
|
|
// // iAction = ACT_SWIM;
|
|
// //}
|
|
//}
|
|
}
|
|
else
|
|
{
|
|
// Play appropriate actions
|
|
if (iMoveEnv == (int)MoveEnvironment.MOVEENV_GROUND)
|
|
{
|
|
if (bFight)
|
|
iAction = (int)PLAYER_ACTION_TYPE.ACT_FIGHTSTAND;
|
|
else
|
|
iAction = (int)PLAYER_ACTION_TYPE.ACT_STAND;
|
|
}
|
|
//else if (iMoveEnv == MOVEENV_AIR)
|
|
//{
|
|
// if (/*UsingWing()*/ m_wingType == WINGTYPE_WING)
|
|
// iAction = ACT_HANGINAIR;
|
|
// else
|
|
// iAction = ACT_HANGINAIR_SWORD;
|
|
//}
|
|
//else if (iMoveEnv == MOVEENV_WATER)
|
|
// iAction = ACT_HANGINWATER;
|
|
}
|
|
|
|
return iAction;
|
|
}
|
|
}
|
|
|
|
// Player appear flag
|
|
public enum PlayerAppearFlag
|
|
{
|
|
APPEAR_DISAPPEAR = -1, // Player disappear
|
|
APPEAR_ENTERWORLD = 0, // Player join world
|
|
APPEAR_RUNINTOVIEW, // Player run into view
|
|
APPEAR_GHOST, // Player is in ghost state, in player list but not active
|
|
};
|
|
|
|
public struct OtherPlayer_Move_Info
|
|
{
|
|
// Bounding sphere of avator
|
|
public A3DVECTOR3 vCenter;
|
|
public A3DVECTOR3 vExts;
|
|
public float fStepHeight;
|
|
|
|
// Velocity
|
|
public A3DVECTOR3 vVelocity;
|
|
|
|
// time span ( sec )
|
|
public float t;
|
|
|
|
public bool bTraceGround; // Whether trace the ground
|
|
public bool bTestTrnOnly; // Trace terrain only
|
|
|
|
public A3DVECTOR3 vecGroundNormal; // if bTraceGround is true, this will contain the ground normal when returned
|
|
}
|
|
|
|
public class A3DAABB
|
|
{
|
|
public A3DVECTOR3 Center;
|
|
public A3DVECTOR3 Extents;
|
|
public A3DVECTOR3 Mins;
|
|
public A3DVECTOR3 Maxs;
|
|
|
|
public A3DAABB() { }
|
|
|
|
public A3DAABB(A3DAABB aabb)
|
|
{
|
|
Center = aabb.Center;
|
|
Extents = aabb.Extents;
|
|
Mins = aabb.Mins;
|
|
Maxs = aabb.Maxs;
|
|
}
|
|
|
|
public A3DAABB(A3DVECTOR3 mins, A3DVECTOR3 maxs)
|
|
{
|
|
Mins = mins;
|
|
Maxs = maxs;
|
|
Center = (mins + maxs) * 0.5f;
|
|
Extents = maxs - Center;
|
|
}
|
|
|
|
// Reset AABB về trạng thái rỗng
|
|
public void Clear()
|
|
{
|
|
Mins = new A3DVECTOR3(999999f, 999999f, 999999f);
|
|
Maxs = new A3DVECTOR3(-999999f, -999999f, -999999f);
|
|
Center = new A3DVECTOR3(0f, 0f, 0f);
|
|
Extents = new A3DVECTOR3(0f, 0f, 0f);
|
|
}
|
|
|
|
// Thêm 1 điểm vào AABB
|
|
public void AddVertex(A3DVECTOR3 v)
|
|
{
|
|
if (v.x < Mins.x) Mins.x = v.x;
|
|
if (v.y < Mins.y) Mins.y = v.y;
|
|
if (v.z < Mins.z) Mins.z = v.z;
|
|
|
|
if (v.x > Maxs.x) Maxs.x = v.x;
|
|
if (v.y > Maxs.y) Maxs.y = v.y;
|
|
if (v.z > Maxs.z) Maxs.z = v.z;
|
|
|
|
CompleteCenterExts();
|
|
}
|
|
|
|
// Hợp nhất 2 AABB
|
|
public void Merge(A3DAABB subAABB)
|
|
{
|
|
if (subAABB.Mins.x < Mins.x) Mins.x = subAABB.Mins.x;
|
|
if (subAABB.Mins.y < Mins.y) Mins.y = subAABB.Mins.y;
|
|
if (subAABB.Mins.z < Mins.z) Mins.z = subAABB.Mins.z;
|
|
|
|
if (subAABB.Maxs.x > Maxs.x) Maxs.x = subAABB.Maxs.x;
|
|
if (subAABB.Maxs.y > Maxs.y) Maxs.y = subAABB.Maxs.y;
|
|
if (subAABB.Maxs.z > Maxs.z) Maxs.z = subAABB.Maxs.z;
|
|
|
|
CompleteCenterExts();
|
|
}
|
|
|
|
// Cập nhật Mins, Maxs từ Center + Extents
|
|
public void CompleteMinsMaxs()
|
|
{
|
|
Mins = Center - Extents;
|
|
Maxs = Center + Extents;
|
|
}
|
|
|
|
// Cập nhật Center + Extents từ Mins, Maxs
|
|
public void CompleteCenterExts()
|
|
{
|
|
Center = (Mins + Maxs) * 0.5f;
|
|
Extents = Maxs - Center;
|
|
}
|
|
|
|
// Kiểm tra điểm có nằm trong AABB không
|
|
public bool IsPointIn(A3DVECTOR3 v)
|
|
{
|
|
return !(v.x > Maxs.x || v.x < Mins.x ||
|
|
v.y > Maxs.y || v.y < Mins.y ||
|
|
v.z > Maxs.z || v.z < Mins.z);
|
|
}
|
|
|
|
// Kiểm tra 1 AABB khác có nằm trong AABB này không
|
|
public bool IsAABBIn(A3DAABB aabb)
|
|
{
|
|
return (aabb.Mins.x >= Mins.x && aabb.Maxs.x <= Maxs.x &&
|
|
aabb.Mins.y >= Mins.y && aabb.Maxs.y <= Maxs.y &&
|
|
aabb.Mins.z >= Mins.z && aabb.Maxs.z <= Maxs.z);
|
|
}
|
|
|
|
// Xây AABB từ một tập vertices
|
|
public void Build(A3DVECTOR3[] vertices)
|
|
{
|
|
Clear();
|
|
foreach (var v in vertices)
|
|
AddVertex(v);
|
|
}
|
|
|
|
// Lấy các vertices (8 điểm) của AABB
|
|
public A3DVECTOR3[] GetVertices()
|
|
{
|
|
A3DVECTOR3[] verts = new A3DVECTOR3[8];
|
|
|
|
verts[0] = new A3DVECTOR3(Mins.x, Mins.y, Mins.z);
|
|
verts[1] = new A3DVECTOR3(Maxs.x, Mins.y, Mins.z);
|
|
verts[2] = new A3DVECTOR3(Maxs.x, Maxs.y, Mins.z);
|
|
verts[3] = new A3DVECTOR3(Mins.x, Maxs.y, Mins.z);
|
|
|
|
verts[4] = new A3DVECTOR3(Mins.x, Mins.y, Maxs.z);
|
|
verts[5] = new A3DVECTOR3(Maxs.x, Mins.y, Maxs.z);
|
|
verts[6] = new A3DVECTOR3(Maxs.x, Maxs.y, Maxs.z);
|
|
verts[7] = new A3DVECTOR3(Mins.x, Maxs.y, Maxs.z);
|
|
|
|
return verts;
|
|
}
|
|
}
|
|
}
|