Merge remote-tracking branch 'origin/develop' into feature/chat
# Conflicts: # Assets/PerfectWorld/Scripts/NPC/CECNPC.cs # Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs # Assets/Scripts/EC_GameRun.cs
This commit is contained in:
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5de219a5b9756ae4ebf01e2919b92cde
|
||||
@@ -447,7 +447,7 @@ namespace BrewMonster
|
||||
// Ensure we are not under ground
|
||||
// 确保我们不在地下
|
||||
A3DVECTOR3 vNormal = new A3DVECTOR3();
|
||||
float vTerrainHeight = CECWorld.Instance.GetTerrainHeight(vPos, ref vNormal);
|
||||
float vTerrainHeight = CECGameRun.Instance.GetWorld().GetTerrainHeight(vPos, ref vNormal);
|
||||
if (vPos.y < vTerrainHeight)
|
||||
vPos.y = vTerrainHeight;
|
||||
|
||||
@@ -507,7 +507,7 @@ namespace BrewMonster
|
||||
// Ensure we are not under ground
|
||||
// 确保我们不在地下
|
||||
A3DVECTOR3 vNormal = new A3DVECTOR3();
|
||||
float vTerrainHeight = CECWorld.Instance.GetTerrainHeight(vPos, ref vNormal);
|
||||
float vTerrainHeight = CECGameRun.Instance.GetWorld().GetTerrainHeight(vPos, ref vNormal);
|
||||
if (vPos.y < vTerrainHeight)
|
||||
vPos.y = vTerrainHeight;
|
||||
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
using BrewMonster.Network;
|
||||
using CSNetwork;
|
||||
using CSNetwork.GPDataType;
|
||||
using BrewMonster.Scripts;
|
||||
using UnityEngine;
|
||||
using System.Threading.Tasks;
|
||||
using Cysharp.Threading.Tasks;
|
||||
namespace BrewMonster
|
||||
{
|
||||
public partial class CECHostPlayer
|
||||
{
|
||||
public void OnMsgPlayerChgShape(ECMSG Msg)
|
||||
{
|
||||
cmd_player_chgshape pCmd = GPDataTypeHelper.FromBytes<cmd_player_chgshape>((byte[])Msg.dwParam1);
|
||||
//ASSERT(pCmd && pCmd->idPlayer == m_PlayerInfo.cid);
|
||||
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())
|
||||
{
|
||||
// change to a dummy model, may cause an asynchronous loading
|
||||
await QueueLoadDummyModel(m_iShape, bLoadAtOnce);
|
||||
}
|
||||
else
|
||||
{
|
||||
// back to major model is a synchronous operation
|
||||
ApplyShapeModelChange(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;
|
||||
}
|
||||
/// <summary>Origin: notify server of force-attack (PVP) state so it accepts/rejects attacks on players. Call when duel starts (true) or ends (false).</summary>
|
||||
private void NotifyServerForceAttack(bool bForceAttack)
|
||||
{
|
||||
byte refuseBless = EC_Utility.glb_BuildRefuseBLSMask();
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0a1a767c85a0348eaa6c6bf78e8798e0
|
||||
@@ -61,6 +61,26 @@ namespace BrewMonster
|
||||
var (header, members) = GPDataTypeHelper.ParseTeamMemberData(data);
|
||||
if (m_pTeam == null || header.idLeader != m_pTeam.GetLeaderID()) return;
|
||||
m_pTeam.UpdateTeamData(header, members);
|
||||
var pPlayerMan = EC_ManMessageMono.Instance?.GetECManPlayer;
|
||||
if (pPlayerMan != null)
|
||||
{
|
||||
for (int i = 0; i < m_pTeam.GetMemberNum(); i++)
|
||||
{
|
||||
var pMember = m_pTeam.GetMemberByIndex(i);
|
||||
if (pMember == null || pMember.IsInfoReady())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var pPlayer = pPlayerMan.GetPlayer(pMember.GetCharacterID(), 0) as CECPlayer;
|
||||
if (pPlayer != null)
|
||||
{
|
||||
pMember.SetProfession(pPlayer.GetProfession());
|
||||
pMember.SetGender(pPlayer.GetGender());
|
||||
pMember.SetInfoReadyFlag(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
NotifyUIUpdateTeam();
|
||||
}
|
||||
catch { }
|
||||
|
||||
@@ -528,6 +528,7 @@ namespace BrewMonster
|
||||
if (pSkill.GetType() == (int)skill_type.TYPE_BLESS ||
|
||||
pSkill.GetType() == (int)skill_type.TYPE_NEUTRALBLESS)
|
||||
{
|
||||
BMLogger.LogError($"ApplySkillShortcut: Skill {pSkill.GetSkillID()} is a bless skill, applying bless skill target rules");
|
||||
if (iTargetType == 0 || !GPDataTypeHelper.ISPLAYERID(idSelTarget))
|
||||
idCastTarget = m_PlayerInfo.cid;
|
||||
|
||||
@@ -545,8 +546,7 @@ namespace BrewMonster
|
||||
idCastTarget = m_PlayerInfo.cid;
|
||||
else
|
||||
{
|
||||
EC_ElsePlayer pPlayer =
|
||||
(EC_ElsePlayer)EC_ManMessageMono.Instance.GetECManPlayer.GetPlayer(idCastTarget);
|
||||
EC_ElsePlayer pPlayer = (EC_ElsePlayer)EC_ManMessageMono.Instance.GetECManPlayer.GetPlayer(idCastTarget);
|
||||
if (pPlayer == null)
|
||||
{
|
||||
// Ä¿±êÏûʧ
|
||||
@@ -593,25 +593,43 @@ namespace BrewMonster
|
||||
}
|
||||
}
|
||||
}
|
||||
/* else if (pSkill.GetType() == CECSkill::TYPE_BLESSPET)
|
||||
{
|
||||
CECPet* pPet = g_pGame.GetGameRun().GetWorld().GetNPCMan().GetPetByID(idSelTarget);
|
||||
if (!pPet || pPet.GetMasterID() == GetCharacterID())
|
||||
{
|
||||
// Spell skill on host's pet
|
||||
CECPetData* pPetData = m_pPetCorral.GetActivePet();
|
||||
if (!pPetData ||
|
||||
pPetData.GetClass() != GP_PET_CLASS_COMBAT &&
|
||||
pPetData.GetClass() != GP_PET_CLASS_SUMMON &&
|
||||
pPetData.GetClass() != GP_PET_CLASS_EVOLUTION)
|
||||
return false;
|
||||
/*else if (pSkill.GetType() == (int)skill_type.TYPE_BLESSPET)
|
||||
{
|
||||
// Get pet by target ID
|
||||
// Note: In C++, this uses GetNPCMan()->GetPetByID()
|
||||
// For C#, we try to get the object and check if it's the host's active pet
|
||||
CECObject pPetObject = null;
|
||||
int activePetNPCID = m_pPetCorral.GetActivePetNPCID();
|
||||
|
||||
if (idSelTarget != 0)
|
||||
{
|
||||
pPetObject = CECWorld.Instance.GetObject(idSelTarget, 0);
|
||||
}
|
||||
|
||||
// If no pet found or target is host's active pet, cast on host's active pet
|
||||
if (pPetObject == null || idSelTarget == activePetNPCID)
|
||||
{
|
||||
// Spell skill on host's pet
|
||||
CECPetData pPetData = m_pPetCorral.GetActivePet();
|
||||
if (pPetData == null ||
|
||||
(pPetData.GetClass() != (int)GP_PET_TYPE.GP_PET_CLASS_COMBAT &&
|
||||
pPetData.GetClass() != (int)GP_PET_TYPE.GP_PET_CLASS_SUMMON &&
|
||||
pPetData.GetClass() != (int)GP_PET_TYPE.GP_PET_CLASS_EVOLUTION))
|
||||
return false;
|
||||
|
||||
idCastTarget = m_pPetCorral.GetActivePetNPCID();
|
||||
}
|
||||
// Only fighting pet can be blessed.
|
||||
if (pPet && !pPet.CanBeAttacked())
|
||||
return false;
|
||||
}*/
|
||||
idCastTarget = activePetNPCID;
|
||||
}
|
||||
// Only fighting pet can be blessed
|
||||
// Check if pet can be attacked (is in combat state)
|
||||
// Note: CanBeAttacked() check is commented out as it may not be implemented yet
|
||||
// Server will validate this
|
||||
if (pPetObject != null)
|
||||
{
|
||||
// TODO: Implement CanBeAttacked check when CECPet/CECNPC has this method
|
||||
// C++ code: if (pPet && !pPet->CanBeAttacked()) return false;
|
||||
// For now, we'll allow the cast - server will validate
|
||||
}
|
||||
}*/
|
||||
else
|
||||
{
|
||||
if (iTargetType != 0 && idCastTarget == 0)
|
||||
@@ -853,7 +871,7 @@ namespace BrewMonster
|
||||
break;
|
||||
|
||||
// Get target object
|
||||
CECObject pObject = CECWorld.Instance.GetObject(idTarget, 0);
|
||||
CECObject pObject = CECGameRun.Instance.GetWorld().GetObject(idTarget, 0);
|
||||
if (pObject == null) break;
|
||||
|
||||
A3DVECTOR3 vHostPos = EC_Utility.ToA3DVECTOR3(transform.position); // GetPos()
|
||||
|
||||
+397
-190
@@ -23,7 +23,9 @@ using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using static BrewMonster.CECPlayer;
|
||||
using cmd_select_target = CSNetwork.GPDataType.cmd_select_target;
|
||||
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<CSNetwork.GPDataType.OBJECT_COORD>;
|
||||
using Trace_reason = BrewMonster.CECHPWorkTrace.Trace_reason;
|
||||
@@ -104,6 +106,8 @@ namespace BrewMonster
|
||||
private int MAX_JUMP_COUNT = 2;
|
||||
bool m_bUsingTrashBox = false; // Whether being using trash box
|
||||
private float m_fPrayDistancePlus;
|
||||
private bool m_bInRebuildPet = false; // Whether rebuilding pet / 是否正在重建宠物
|
||||
private uint m_dwGMFlags = 0; // GM flags / GM标志
|
||||
private A3DVECTOR3 g_vOrigin = new A3DVECTOR3(0f);
|
||||
|
||||
private float EC_SLOPE_Y = 0.5f;
|
||||
@@ -532,7 +536,7 @@ namespace BrewMonster
|
||||
public void ProcessMessage(in ECMSG Msg)
|
||||
{
|
||||
var msg = (int)Msg.dwMsg;
|
||||
//Debug.LogError("HoangDev : ProcessMessageProcessMessageProcessMessage " + msg);
|
||||
//Debug.LogError("HoangDev : ProcessMessageProcessMessageProcessMessage " + msg);
|
||||
switch (msg)
|
||||
{
|
||||
case EC_MsgDef.MSG_HST_CORRECTPOS: OnMsgHstCorrectPos(Msg); break;
|
||||
@@ -605,7 +609,12 @@ namespace BrewMonster
|
||||
case EC_MsgDef.MSG_HST_TEAMINVITE: OnMsgHstTeamInvite(Msg); break;
|
||||
case EC_MsgDef.MSG_HST_TEAMMEMBERDATA: OnMsgHstTeamMemberData(Msg); break;
|
||||
case EC_MsgDef.MSG_PM_DUELOPT: OnMsgHstDuelOpt(Msg); break;
|
||||
case EC_MsgDef.MSG_HST_CLEARTESSERA: OnMsgHstClearTessera(Msg); break;
|
||||
case EC_MsgDef.MSG_PM_PLAYERCHGSHAPE :
|
||||
OnMsgPlayerChgShape(Msg); break;
|
||||
default:
|
||||
// Uncomment to debug unhandled messages
|
||||
// Debug.LogWarning($"[CECHostPlayer] ProcessMessage: Unhandled message {msg}");
|
||||
break;
|
||||
}
|
||||
|
||||
/*if (bActionStartSkill)
|
||||
@@ -629,13 +638,22 @@ namespace BrewMonster
|
||||
}
|
||||
private void NotifyUIUpdateTeam()
|
||||
{
|
||||
try
|
||||
//try
|
||||
//{
|
||||
// var ui = EC_Game.GetGameRun()?.GetUIManager()?.GetInGameUIMan();
|
||||
// if (ui is CECGameUIMan gui)
|
||||
// gui.UpdateTeam(false);
|
||||
//}
|
||||
//catch { }
|
||||
var uiMan = CECUIManager.Instance?.GetInGameUIMan();
|
||||
if (uiMan == null)
|
||||
return;
|
||||
|
||||
var dlgTeamMain = uiMan.GetDialog("Win_TeamMain") as DlgTeamMain;
|
||||
if (dlgTeamMain != null)
|
||||
{
|
||||
var ui = EC_Game.GetGameRun()?.GetUIManager()?.GetInGameUIMan();
|
||||
if (ui is CECGameUIMan gui)
|
||||
gui.UpdateTeam(false);
|
||||
dlgTeamMain.UpdateTeamInfo();
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
/// <summary>Update host duel state from S2C duel commands (MSG_PM_DUELOPT).</summary>
|
||||
@@ -738,14 +756,7 @@ namespace BrewMonster
|
||||
NotifyServerForceAttack(true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Origin: notify server of force-attack (PVP) state so it accepts/rejects attacks on players. Call when duel starts (true) or ends (false).</summary>
|
||||
private void NotifyServerForceAttack(bool bForceAttack)
|
||||
{
|
||||
byte refuseBless = EC_Utility.glb_BuildRefuseBLSMask();
|
||||
UnityGameSession.c2s_SendCmdNotifyForceAttack(glb_BuildPVPMask(bForceAttack), refuseBless);
|
||||
}
|
||||
|
||||
|
||||
#if UNITY_EDITOR
|
||||
/// <summary>
|
||||
/// Cycles through learned skills by removing all shortcuts and adding 2 new skills to slots 0 and 1.
|
||||
@@ -780,7 +791,7 @@ namespace BrewMonster
|
||||
while (true)
|
||||
{
|
||||
A3DVECTOR3 refake = new A3DVECTOR3();
|
||||
float terrianHeight = CECWorld.Instance.GetTerrainHeight(vTargetPos, ref refake);
|
||||
float terrianHeight = CECGameRun.Instance.GetWorld().GetTerrainHeight(vTargetPos, ref refake);
|
||||
if (terrianHeight > vTargetPos.y + 1E-4f)
|
||||
break;
|
||||
|
||||
@@ -978,7 +989,7 @@ namespace BrewMonster
|
||||
bool bFound = false;
|
||||
vPos = default;
|
||||
|
||||
CECWorld world = CECWorld.Instance;
|
||||
CECWorld world = CECGameRun.Instance.GetWorld();
|
||||
if (world == null)
|
||||
{
|
||||
return false;
|
||||
@@ -1053,7 +1064,7 @@ namespace BrewMonster
|
||||
// ×¢Ò⣺vPos ±»µ÷Õûºó£¬ÓпÉÄÜ´¦ÓÚ͹°üÖУ»Ðè¼ì²é·µ»Ø¸ß¶Èµ÷ÕûÖµ£¬ÒÔ±ÜÃâµ÷Õû¹ý´ó (Beware of large adjustments placing us back into brushes)
|
||||
|
||||
A3DVECTOR3 vTemp = new A3DVECTOR3(vPos);
|
||||
CECWorld world = CECWorld.Instance;
|
||||
CECWorld world = CECGameRun.Instance.GetWorld();
|
||||
if (world == null)
|
||||
{
|
||||
return vTemp.y;
|
||||
@@ -1983,226 +1994,182 @@ namespace BrewMonster
|
||||
return pNPC && ( /*!IsSkeletonReady() ||*/ CanSafelySelectWith(pNPC.GetDistToHost()));
|
||||
}
|
||||
|
||||
// Check whether host can do a behavior
|
||||
bool CanDo(int iThing)
|
||||
// Check whether host can do a behavior / 检查宿主是否可以执行某个行为
|
||||
public bool CanDo(int iThing)
|
||||
{
|
||||
bool bRet = true;
|
||||
|
||||
switch (iThing)
|
||||
{
|
||||
case ActionCanDo.CANDO_SITDOWN:
|
||||
|
||||
if (IsDead() /*|| IsAboutToDie() */ || IsJumping() /*|| IsTrading() || IsUsingTrashBox()*/ ||
|
||||
IsRooting() || /*IsReviving() || IsTalkingWithNPC() || IsChangingFace() ||*/
|
||||
!m_GndInfo
|
||||
.bOnGround /*|| GetBoothState() != 0 || m_iBuddyId || IsOperatingPet() || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsRidingOnPet() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove()*/
|
||||
)
|
||||
if (IsDead() || IsAboutToDie() || IsJumping() || IsTrading() || IsUsingTrashBox() ||
|
||||
IsRooting() || IsReviving() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
!m_GndInfo.bOnGround || GetBoothState() != 0 || m_iBuddyId != 0 || IsOperatingPet() != 0 || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsRidingOnPet() || GetShapeType() == (int)PlayerModelType.PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove())
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_MOVETO:
|
||||
{
|
||||
if (IsDead() /*|| IsSitting() || IsTrading() || IsUsingTrashBox()*/ || IsRooting() /*||
|
||||
IsReviving() || IsTalkingWithNPC() || IsChangingFace() || IsUsingItem() ||
|
||||
GetBoothState() != 0 || m_bHangerOn || IsOperatingPet() || IsRebuildingPet() || IsPassiveMove()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
}
|
||||
case ActionCanDo.CANDO_MELEE:
|
||||
|
||||
if (IsDead() /*|| IsSitting() */ || m_idSelTarget == 0 || m_idSelTarget == m_PlayerInfo.cid ||
|
||||
IsJumping() || GPDataTypeHelper.ISMATTERID(m_idSelTarget) /*|| IsTrading() || IsReviving() ||
|
||||
IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace()*/ || CannotAttack() /*||
|
||||
GetBoothState() != 0 || m_iBuddyId || IsRidingOnPet() || IsOperatingPet() || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsPassiveMove()*/)
|
||||
if (IsDead() || IsSitting() || IsTrading() || IsUsingTrashBox() || IsRooting() ||
|
||||
IsReviving() || IsTalkingWithNPC() || IsChangingFace() || IsUsingItem() ||
|
||||
GetBoothState() != 0 || m_bHangerOn || IsOperatingPet() != 0 || IsRebuildingPet() || IsPassiveMove())
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_MELEE:
|
||||
if (IsDead() || IsSitting() || m_idSelTarget == 0 || m_idSelTarget == m_PlayerInfo.cid ||
|
||||
IsJumping() || GPDataTypeHelper.ISMATTERID(m_idSelTarget) || IsTrading() || IsReviving() ||
|
||||
IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() || CannotAttack() ||
|
||||
GetBoothState() != 0 || m_iBuddyId != 0 || IsRidingOnPet() || IsOperatingPet() != 0 || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsPassiveMove())
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_ASSISTSEL:
|
||||
|
||||
if (IsDead() || !GPDataTypeHelper.ISPLAYERID(m_idSelTarget) ||
|
||||
m_idSelTarget == m_PlayerInfo.cid /*||
|
||||
!m_pTeam || !m_pTeam.GetMemberByID(m_idSelTarget) || m_iBuddyId || IsPassiveMove()*/ ||
|
||||
if (IsDead() || !GPDataTypeHelper.ISPLAYERID(m_idSelTarget) || m_idSelTarget == m_PlayerInfo.cid ||
|
||||
m_pTeam == null || m_pTeam.GetMemberByID(m_idSelTarget) == null || m_iBuddyId != 0 || IsPassiveMove() ||
|
||||
m_playerLimits[(int)PLAYER_LIMIT.PLAYER_LIMIT_NOCHANGESELECT])
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_FLY:
|
||||
|
||||
if (IsDead() || IsRooting() || IsSitting() || IsTrading() || IsReviving() ||
|
||||
IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() || GetBoothState() != 0 ||
|
||||
//IsFlashMoving() ||
|
||||
m_pWorkMan.HasWorkRunningOnPriority(CECHPWorkMan.Work_priority.PRIORITY_2) ||
|
||||
m_bHangerOn || /*IsOperatingPet() || IsRebuildingPet() ||*/
|
||||
IsUsingItem() || /*IsRidingOnPet() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 ||*/ IsPassiveMove() ||
|
||||
m_playerLimits[(int)PLAYER_LIMIT.PLAYER_LIMIT_NOFLY]/* || m_BattleInfo.IsChariotWar()*/)
|
||||
IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() || GetBoothState() != 0 ||
|
||||
IsFlashMoving() || (m_pWorkMan != null && m_pWorkMan.HasWorkRunningOnPriority(CECHPWorkMan.Work_priority.PRIORITY_2)) ||
|
||||
m_bHangerOn || IsOperatingPet() != 0 || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsRidingOnPet() || GetShapeType() == (int)PlayerModelType.PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove() ||
|
||||
m_playerLimits[(int)PLAYER_LIMIT.PLAYER_LIMIT_NOFLY] /*|| m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_PICKUP:
|
||||
case ActionCanDo.CANDO_GATHER:
|
||||
|
||||
if (IsDead() /*|| IsAboutToDie() || IsSitting() || IsTrading() || IsUsingTrashBox() ||
|
||||
IsReviving() || IsTalkingWithNPC() || IsChangingFace() || GetBoothState() != 0 ||
|
||||
GetBuddyState() == 1 || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove()*/)
|
||||
if (IsDead() || IsAboutToDie() || IsSitting() || IsTrading() || IsUsingTrashBox() ||
|
||||
IsReviving() || IsTalkingWithNPC() || IsChangingFace() || GetBoothState() != 0 ||
|
||||
GetBuddyState() == 1 || IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() || IsPassiveMove())
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_TRADE:
|
||||
|
||||
if (IsDead() || IsMeleeing() /*|| IsAboutToDie() || IsSitting() || IsJumping() ||
|
||||
IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
IsSpellingMagic() || GetBoothState() != 0 || m_iBuddyId || IsOperatingPet() || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsInvisible() || IsPassiveMove()*/)
|
||||
if (IsDead() || IsAboutToDie() || IsSitting() || IsJumping() || IsMeleeing() ||
|
||||
IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
IsSpellingMagic() || GetBoothState() != 0 || m_iBuddyId != 0 || IsOperatingPet() != 0 || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsInvisible() || IsPassiveMove())
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_PLAYPOSE:
|
||||
|
||||
if (IsDead() || IsMeleeing() || /*|| IsAboutToDie() || IsSitting() || IsJumping() || /* ||
|
||||
IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
IsSpellingMagic() || IsShapeChanged() || IsReviving() ||*/
|
||||
m_iMoveEnv != (int)MoveEnvironment.MOVEENV_GROUND /*||
|
||||
GetBoothState() != 0 || m_iBuddyId || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() ||
|
||||
IsRidingOnPet() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove() || m_BattleInfo.IsChariotWar()*/
|
||||
)
|
||||
if (IsDead() || IsAboutToDie() || IsSitting() || IsJumping() || IsMeleeing() ||
|
||||
IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
IsSpellingMagic() || IsShapeChanged() || IsReviving() || m_iMoveEnv != (int)MoveEnvironment.MOVEENV_GROUND ||
|
||||
GetBoothState() != 0 || m_iBuddyId != 0 || IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() ||
|
||||
IsRidingOnPet() || GetShapeType() == (int)PlayerModelType.PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove() /*|| m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
//case ActionCanDo.CANDO_SPELLMAGIC:
|
||||
// if (IsDead() || ISMATTERID(m_idSelTarget) || IsAboutToDie() || IsSitting() ||
|
||||
// IsJumping() || IsFlashMoving() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsChangingFace() || CannotAttack() || IsReviving() || GetBoothState() != 0 ||
|
||||
// m_iBuddyId || IsRidingOnPet() || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
case ActionCanDo.CANDO_SPELLMAGIC:
|
||||
if (IsDead() || GPDataTypeHelper.ISMATTERID(m_idSelTarget) || IsAboutToDie() || IsSitting() ||
|
||||
IsJumping() || IsFlashMoving() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace() || CannotAttack() || IsReviving() || GetBoothState() != 0 ||
|
||||
m_iBuddyId != 0 || IsRidingOnPet() || IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() || IsPassiveMove())
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_SUMMONPET:
|
||||
|
||||
if (IsDead() || GPDataTypeHelper.ISMATTERID(m_idSelTarget) || IsAboutToDie() || IsSitting() ||
|
||||
IsJumping() || /*IsFlashMoving() ||*/ IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace() || CannotAttack() || IsReviving() || GetBoothState() != 0 ||
|
||||
IsInvisible() /*|| IsGMInvisible()*/ || IsOperatingPet() != 0 || /*IsRebuildingPet() ||*/ IsUsingItem() || IsPassiveMove()
|
||||
/*|| m_BattleInfo.IsChariotWar()*/)
|
||||
IsJumping() || IsFlashMoving() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace() || CannotAttack() || IsReviving() || GetBoothState() != 0 ||
|
||||
IsInvisible() || IsGMInvisible() || IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() || IsPassiveMove()
|
||||
/*|| m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_REBUILDPET:
|
||||
|
||||
if (IsDead() || GPDataTypeHelper.ISMATTERID(m_idSelTarget) /*|| IsAboutToDie() || IsSitting() */ ||
|
||||
IsJumping() /*|| IsFlashMoving() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace()*/ || CannotAttack() /*|| IsReviving() || GetBoothState() != 0 ||
|
||||
m_iBuddyId || IsInvisible() || IsGMInvisible() || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove() ||
|
||||
IsPlayerMoving() || m_BattleInfo.IsChariotWar()*/)
|
||||
if (IsDead() || GPDataTypeHelper.ISMATTERID(m_idSelTarget) || IsAboutToDie() || IsSitting() ||
|
||||
IsJumping() || IsFlashMoving() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace() || CannotAttack() || IsReviving() || GetBoothState() != 0 ||
|
||||
m_iBuddyId != 0 || IsInvisible() || IsGMInvisible() || IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() || IsPassiveMove() ||
|
||||
IsPlayerMoving() /*|| m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
//case ActionCanDo.CANDO_USEITEM:
|
||||
|
||||
// if (IsAboutToDie() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsChangingFace() || GetBoothState() != 0 || IsPassiveMove() || m_BattleInfo.IsChariotWar())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
case ActionCanDo.CANDO_USEITEM:
|
||||
if (IsAboutToDie() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace() || GetBoothState() != 0 || IsPassiveMove() /*|| m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_JUMP:
|
||||
{
|
||||
if (IsDead() ||
|
||||
m_iJumpCount >= MAX_JUMP_COUNT ||
|
||||
// cannot jump more than one time if shape mode is type2
|
||||
//(IsJumping() && (GetShapeType() == PLAYERMODEL_DUMMYTYPE2)) ||
|
||||
IsJumpInWater() || m_iMoveEnv == Move_environment.MOVEENV_AIR || IsSitting() ||
|
||||
IsMeleeing() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace() || IsReviving() || IsSpellingMagic() || IsPicking() ||
|
||||
IsGathering() || IsRooting() || GetBoothState() != 0 ||
|
||||
m_bHangerOn || /*(IsJumping() && IsRidingOnPet()) ||*/
|
||||
/*IsOperatingPet() || IsRebuildingPet() ||*/ IsUsingItem() ||
|
||||
IsPassiveMove() /*|| m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
}
|
||||
//case ActionCanDo.CANDO_FOLLOW:
|
||||
// {
|
||||
// if (IsDead() || IsAboutToDie() || IsSitting() || IsMeleeing() || IsReviving() ||
|
||||
// IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
// IsSpellingMagic() || GetBoothState() != 0 || m_bHangerOn || IsOperatingPet() || IsRebuildingPet() ||
|
||||
// IsUsingItem() || IsPassiveMove())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
// }
|
||||
//case ActionCanDo.CANDO_BOOTH:
|
||||
|
||||
// if (IsDead() || IsAboutToDie() || IsPlayerMoving() || IsSitting() || IsReviving() ||
|
||||
// IsMeleeing() || IsJumping() || IsTrading() || IsUsingTrashBox() ||
|
||||
// IsTalkingWithNPC() || IsChangingFace() || IsSpellingMagic() || IsFlying() ||
|
||||
// IsUnderWater() || m_iBuddyId || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsRidingOnPet() || IsInvisible() ||
|
||||
// IsPassiveMove())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
|
||||
//case ActionCanDo.CANDO_FLASHMOVE:
|
||||
|
||||
// if (IsDead() || IsAboutToDie() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsJumping() || IsFlashMoving() || IsFalling() || IsChangingFace() || GetBoothState() != 0 || IsTakingOff() ||
|
||||
// m_pWorkMan.HasWorkRunningOnPriority(CECHPWorkMan::PRIORITY_2) ||
|
||||
// m_iBuddyId || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
|
||||
//case ActionCanDo.CANDO_BINDBUDDY:
|
||||
|
||||
// if (IsDead() || IsAboutToDie() || IsJumping() || IsSitting() ||
|
||||
// IsMeleeing() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsChangingFace() || IsReviving() || IsSpellingMagic() || IsPicking() ||
|
||||
// IsGathering() || IsRooting() || GetBoothState() != 0 ||
|
||||
// !m_pWorkMan.IsStanding() || m_iBuddyId ||
|
||||
// IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove() ||
|
||||
// m_playerLimits.test(PLAYER_LIMIT_NOBIND))
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
|
||||
//case ActionCanDo.CANDO_DUEL:
|
||||
|
||||
// if (IsDead() || IsAboutToDie() || IsSitting() || IsFighting() || IsTrading() ||
|
||||
// IsReviving() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
// GetBoothState() != 0 || m_iBuddyId || m_pvp.iDuelState != DUEL_ST_NONE ||
|
||||
// IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
|
||||
case ActionCanDo.CANDO_CHANGESELECT:
|
||||
|
||||
//if (m_playerLimits.test(PLAYER_LIMIT_NOCHANGESELECT))
|
||||
// bRet = false;
|
||||
|
||||
if (IsDead() ||
|
||||
m_iJumpCount >= MAX_JUMP_COUNT ||
|
||||
// cannot jump more than one time if shape mode is type2
|
||||
(IsJumping() && (GetShapeType() == (int)PlayerModelType.PLAYERMODEL_DUMMYTYPE2)) ||
|
||||
IsJumpInWater() || m_iMoveEnv == (int)MoveEnvironment.MOVEENV_AIR || IsSitting() ||
|
||||
IsMeleeing() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace() || IsReviving() || IsSpellingMagic() || IsPicking() ||
|
||||
IsGathering() || IsRooting() || GetBoothState() != 0 || m_bHangerOn || (IsJumping() && IsRidingOnPet()) ||
|
||||
IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() || IsPassiveMove() /*|| m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
//case ActionCanDo.CANDO_SWITCH_PARALLEL_WORLD:
|
||||
// if (IsDead() || IsAboutToDie() || IsJumping() || IsFighting() ||
|
||||
// IsMeleeing() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsChangingFace() || IsReviving() || IsSpellingMagic() || IsPicking() ||
|
||||
// IsGathering() || IsRooting() || GetBoothState() != 0 ||
|
||||
// m_iBuddyId || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() ||
|
||||
// GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove())
|
||||
// bRet = false;
|
||||
// break;
|
||||
case ActionCanDo.CANDO_FOLLOW:
|
||||
if (IsDead() || IsAboutToDie() || IsSitting() || IsMeleeing() || IsReviving() ||
|
||||
IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
IsSpellingMagic() || GetBoothState() != 0 || m_bHangerOn || IsOperatingPet() != 0 || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsPassiveMove())
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_BOOTH:
|
||||
if (IsDead() || IsAboutToDie() || IsPlayerMoving() || IsSitting() || IsReviving() ||
|
||||
IsMeleeing() || IsJumping() || IsTrading() || IsUsingTrashBox() ||
|
||||
IsTalkingWithNPC() || IsChangingFace() || IsSpellingMagic() || IsFlying() ||
|
||||
IsUnderWater() || m_iBuddyId != 0 || IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() || IsRidingOnPet() || IsInvisible() ||
|
||||
IsPassiveMove())
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_FLASHMOVE:
|
||||
if (IsDead() || IsAboutToDie() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsJumping() || IsFlashMoving() || IsFalling() || IsChangingFace() || GetBoothState() != 0 || IsTakingOff() ||
|
||||
(m_pWorkMan != null && m_pWorkMan.HasWorkRunningOnPriority(CECHPWorkMan.Work_priority.PRIORITY_2)) ||
|
||||
m_iBuddyId != 0 || IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() || IsPassiveMove())
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_BINDBUDDY:
|
||||
if (IsDead() || IsAboutToDie() || IsJumping() || IsSitting() ||
|
||||
IsMeleeing() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace() || IsReviving() || IsSpellingMagic() || IsPicking() ||
|
||||
IsGathering() || IsRooting() || GetBoothState() != 0 ||
|
||||
(m_pWorkMan != null && !m_pWorkMan.IsStanding()) || m_iBuddyId != 0 ||
|
||||
IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() || GetShapeType() == (int)PlayerModelType.PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove() ||
|
||||
m_playerLimits[(int)PLAYER_LIMIT.PLAYER_LIMIT_NOBIND])
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_DUEL:
|
||||
if (IsDead() || IsAboutToDie() || IsSitting() || IsFighting() || IsTrading() ||
|
||||
IsReviving() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
GetBoothState() != 0 || m_iBuddyId != 0 || m_pvp.iDuelState != (int)DuelState.DUEL_ST_NONE ||
|
||||
IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() || IsPassiveMove())
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_CHANGESELECT:
|
||||
if (m_playerLimits[(int)PLAYER_LIMIT.PLAYER_LIMIT_NOCHANGESELECT])
|
||||
bRet = false;
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_SWITCH_PARALLEL_WORLD:
|
||||
if (IsDead() || IsAboutToDie() || IsJumping() || IsFighting() ||
|
||||
IsMeleeing() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace() || IsReviving() || IsSpellingMagic() || IsPicking() ||
|
||||
IsGathering() || IsRooting() || GetBoothState() != 0 ||
|
||||
m_iBuddyId != 0 || IsOperatingPet() != 0 || IsRebuildingPet() || IsUsingItem() ||
|
||||
GetShapeType() == (int)PlayerModelType.PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove())
|
||||
bRet = false;
|
||||
break;
|
||||
}
|
||||
|
||||
return bRet;
|
||||
@@ -2295,6 +2262,73 @@ namespace BrewMonster
|
||||
return m_pWorkMan.IsPassiveMoving();
|
||||
}
|
||||
|
||||
// Is about to die / 是否即将死亡
|
||||
bool IsAboutToDie()
|
||||
{
|
||||
return m_bAboutToDie;
|
||||
}
|
||||
|
||||
// Is rebuilding pet / 是否正在重建宠物
|
||||
bool IsRebuildingPet()
|
||||
{
|
||||
return m_bInRebuildPet;
|
||||
}
|
||||
|
||||
// Is riding on pet / 是否骑乘宠物
|
||||
bool IsRidingOnPet()
|
||||
{
|
||||
return m_RidingPet.id != 0;
|
||||
}
|
||||
|
||||
// Is flash moving / 是否在闪移
|
||||
bool IsFlashMoving()
|
||||
{
|
||||
if (m_pWorkMan == null) return false;
|
||||
return m_pWorkMan.IsFlashMoving();
|
||||
}
|
||||
|
||||
// Get buddy state / 获取伙伴状态
|
||||
// return value: 0 = no buddy, 1 = has buddy, 2 = hanger on
|
||||
int GetBuddyState()
|
||||
{
|
||||
if (m_bHangerOn) return 2;
|
||||
if (m_iBuddyId != 0) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Is invisible / 是否隐身
|
||||
bool IsInvisible()
|
||||
{
|
||||
return (m_dwStates & (uint)PlayerNPCState.GP_STATE_INVISIBLE) != 0;
|
||||
}
|
||||
|
||||
// Is GM invisible / 是否GM隐身
|
||||
bool IsGMInvisible()
|
||||
{
|
||||
// GMF_INVISIBLE would be a constant, using bit check
|
||||
// GMF_INVISIBLE 将是一个常量,使用位检查
|
||||
return (m_dwGMFlags & 0x01) != 0; // Assuming GMF_INVISIBLE = 0x01
|
||||
}
|
||||
|
||||
// Is shape changed / 是否形状已改变
|
||||
bool IsShapeChanged()
|
||||
{
|
||||
return m_iShape != 0;
|
||||
}
|
||||
|
||||
// Is taking off / 是否正在起飞
|
||||
bool IsTakingOff()
|
||||
{
|
||||
if (m_pWorkMan == null) return false;
|
||||
return m_pWorkMan.IsFlyingOff();
|
||||
}
|
||||
|
||||
// Is flying / 是否在飞行
|
||||
bool IsFlying()
|
||||
{
|
||||
return (m_dwStates & (uint)PlayerNPCState.GP_STATE_FLY) != 0;
|
||||
}
|
||||
|
||||
//public void SetGroundInfoClient()
|
||||
//{
|
||||
// isGrounded = GroundCheck(out lastGroundHit);
|
||||
@@ -3547,7 +3581,11 @@ namespace BrewMonster
|
||||
// Update battle result time counter
|
||||
if (IsInBattle() && !IsInFortress() && m_BattleInfo.iResult != 0 && m_BattleInfo.iResultCnt != 0)
|
||||
{
|
||||
if ((m_BattleInfo.iResultCnt -= dwDeltaTime) < 0)
|
||||
// iResultCnt is time counter (likely in milliseconds as int), dwDeltaTime is in seconds (float)
|
||||
// iResultCnt是时间计数器(可能是毫秒为int),dwDeltaTime是秒数(float)
|
||||
// Convert seconds to milliseconds and subtract / 将秒转换为毫秒并减去
|
||||
int deltaTimeMs = (int)(dwDeltaTime * 1000f);
|
||||
if ((m_BattleInfo.iResultCnt -= deltaTimeMs) < 0)
|
||||
m_BattleInfo.iResultCnt = 0;
|
||||
}
|
||||
|
||||
@@ -3767,7 +3805,173 @@ namespace BrewMonster
|
||||
//private bool ISNPCID(int id) => ((id & 0x80000000) != 0) && ((id & 0x40000000) == 0);
|
||||
//private bool ISPLAYERID(int id) => id != 0 && (id & 0x80000000) == 0;
|
||||
//private bool ISMATTERID(int id) => ((id) & 0xC0000000) == 0xC0000000;
|
||||
}
|
||||
|
||||
// Release object
|
||||
public void Release()
|
||||
{
|
||||
// TODO: Release all objects created by player, such as inventory, skills, etc.
|
||||
// CECInstanceReenter::Instance().Clear();
|
||||
// CECShoppingItemsMover::Instance().Clear();
|
||||
// CECFashionShopManager::Instance().Clear();
|
||||
// CECShoppingManager::Instance().Clear();
|
||||
// CECUseUniversalTokenCommandManager::Instance().Clear();
|
||||
// CECUniversalTokenHTTPOSNavigatorTicketHandler::Instance().Clear();
|
||||
// RandMallShoppingManager::Instance().Release();
|
||||
// CECFactionPVPModel::Instance().Clear();
|
||||
// CECHostSkillModel::Instance().Release();
|
||||
// CECComboSkillState::Instance().Release();
|
||||
// CECPlayerLevelRankRealmChangeCheck::Instance().Release();
|
||||
// CECHostFashionEquipFromStorageSystem::Instance().Clear();
|
||||
//
|
||||
// m_pSaveLifeTrigger = NULL;
|
||||
// CECQuickBuyPopManager::Instance().ClearPolicies();
|
||||
//
|
||||
// // Ïú»ÙPlayerWrapper
|
||||
// CECAutoPolicy::GetInstance().OnLeaveWorld();
|
||||
//
|
||||
// // Save favorite auction list first
|
||||
// SaveFavorAucItems();
|
||||
//
|
||||
// // Release duel images
|
||||
// ReleaseDuelImages();
|
||||
//
|
||||
// // Release sounds
|
||||
// g_pGame->GetGameRun()->ReleaseSoundTable();
|
||||
// m_pCurMoveSnd = NULL;
|
||||
//
|
||||
// // Release friend manger
|
||||
// if (m_pFriendMan)
|
||||
// {
|
||||
// delete m_pFriendMan;
|
||||
// m_pFriendMan = NULL;
|
||||
// }
|
||||
//
|
||||
// // Release pet corral
|
||||
// if (m_pPetCorral)
|
||||
// {
|
||||
// delete m_pPetCorral;
|
||||
// m_pPetCorral = NULL;
|
||||
// }
|
||||
//
|
||||
// if (m_pPetWords)
|
||||
// {
|
||||
// delete m_pPetWords;
|
||||
// m_pPetWords = NULL;
|
||||
// }
|
||||
//
|
||||
// if (m_pForceMgr)
|
||||
// {
|
||||
// delete m_pForceMgr;
|
||||
// m_pForceMgr = NULL;
|
||||
// }
|
||||
//
|
||||
// if (m_pOnlineAwardCtrl)
|
||||
// {
|
||||
// delete m_pOnlineAwardCtrl;
|
||||
// m_pOnlineAwardCtrl = NULL;
|
||||
// }
|
||||
//
|
||||
// if (m_pOffShopCtrl)
|
||||
// {
|
||||
// delete m_pOffShopCtrl;
|
||||
// m_pOffShopCtrl = NULL;
|
||||
// }
|
||||
//
|
||||
// if (m_pAutoTeam)
|
||||
// {
|
||||
// delete m_pAutoTeam;
|
||||
// m_pAutoTeam = NULL;
|
||||
// }
|
||||
//
|
||||
// if (m_pChariot)
|
||||
// {
|
||||
// delete m_pChariot;
|
||||
// m_pChariot = NULL;
|
||||
// }
|
||||
//
|
||||
// int i;
|
||||
//
|
||||
// // Release all shortcuts
|
||||
// for (i=0; i < NUM_HOSTSCSETS1; i++)
|
||||
// A3DRELEASE(m_aSCSets1[i]);
|
||||
//
|
||||
// for (i=0; i < NUM_HOSTSCSETS2; i++)
|
||||
// A3DRELEASE(m_aSCSets2[i]);
|
||||
//
|
||||
// for (i=0; i < NUM_SYSMODSETS; i++)
|
||||
// A3DRELEASE(m_aSCSetSysMod[i]);
|
||||
//
|
||||
// // Release all inventories
|
||||
// A3DRELEASE(m_pPack);
|
||||
// A3DRELEASE(m_pEquipPack);
|
||||
// A3DRELEASE(m_pTrashBoxPack);
|
||||
// A3DRELEASE(m_pTrashBoxPack2);
|
||||
// A3DRELEASE(m_pTrashBoxPack3);
|
||||
// A3DRELEASE(m_pAccountBoxPack);
|
||||
// A3DRELEASE(m_pGeneralCardPack);
|
||||
// A3DRELEASE(m_pTaskPack);
|
||||
// A3DRELEASE(m_pDealPack);
|
||||
// A3DRELEASE(m_pEPDealPack);
|
||||
// A3DRELEASE(m_pTaskInterface);
|
||||
// A3DRELEASE(m_pSpritePortrait);
|
||||
// A3DRELEASE(m_pBuyPack);
|
||||
// A3DRELEASE(m_pSellPack);
|
||||
// A3DRELEASE(m_pBoothSPack);
|
||||
// A3DRELEASE(m_pBoothBPack);
|
||||
// A3DRELEASE(m_pEPBoothSPack);
|
||||
// A3DRELEASE(m_pEPBoothBPack);
|
||||
// A3DRELEASE(m_pEPEquipPack);
|
||||
// A3DRELEASE(m_pClientGenCardPack);
|
||||
//
|
||||
// for (i=0; i < NUM_NPCIVTR; i++)
|
||||
// {
|
||||
// A3DRELEASE(m_aNPCPacks[i]);
|
||||
// }
|
||||
//
|
||||
// // Release all skills
|
||||
// ReleaseSkills();
|
||||
//
|
||||
// // Clear current combo skill
|
||||
// ClearComboSkill();
|
||||
//
|
||||
// if (m_pWorkMan)
|
||||
// {
|
||||
// delete m_pWorkMan;
|
||||
// m_pWorkMan = NULL;
|
||||
// }
|
||||
//
|
||||
// m_CameraCtrl.Release();
|
||||
//
|
||||
// m_aTeamInvs.RemoveAll();
|
||||
//
|
||||
// g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pMoveTargetGFX);
|
||||
// g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pSelectedGFX);
|
||||
// g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pHoverGFX);
|
||||
// g_pGame->GetGFXCaster()->ReleaseGFXEx(m_pFloatDust);
|
||||
//
|
||||
// m_pMoveTargetGFX = NULL;
|
||||
// m_pSelectedGFX = NULL;
|
||||
// m_pHoverGFX = NULL;
|
||||
// m_pFloatDust = NULL;
|
||||
//
|
||||
// // Clear tab select table
|
||||
// m_aTabSels.RemoveAll(false);
|
||||
//
|
||||
// m_aForceInfo.RemoveAll();
|
||||
//
|
||||
// if (m_pActionSwitcher)
|
||||
// {
|
||||
// delete m_pActionSwitcher;
|
||||
// m_pActionSwitcher = NULL;
|
||||
// }
|
||||
//
|
||||
// CECQShopConfig::Instance().ClearBuyedItem();
|
||||
//
|
||||
// A3DRELEASE(m_pNavigatePlayer);
|
||||
//
|
||||
// CECPlayer::Release();
|
||||
}
|
||||
}
|
||||
public sealed class CECHPTraceSpellMatcher : CECHPWorkMatcher
|
||||
{
|
||||
public override bool Match(CECHPWork pWork, int priority, bool isDelayWork)
|
||||
@@ -3781,5 +3985,8 @@ namespace BrewMonster
|
||||
return trace.GetTraceReason() == Trace_reason.TRACE_SPELL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -378,11 +378,28 @@ namespace BrewMonster
|
||||
m_wingType = enumWingType.WINGTYPE_WING;
|
||||
//ChangeWing(pResult, static_cast<const WINGMANWING_ESSENCE*>(pEquip)->file_model);
|
||||
var pWingData = (WINGMANWING_ESSENCE)equipData;
|
||||
|
||||
var pWingPrefab = await AddressableManager.Instance.LoadPrefabAsync(pWingData.FileModel.ToLower().Replace('\\', '/'));
|
||||
Transform parentWing = FindChildRecursive(_pPlayerModel.transform, "HH_chibang");
|
||||
if(parentWing != null)
|
||||
{
|
||||
var pWingObject = Instantiate(pWingPrefab, parentWing);
|
||||
pWingObject.gameObject.SetActive(false);
|
||||
pWingObject.name = _wing;
|
||||
}
|
||||
BMLogger.Log($"ShowEquipments():: Wingman Wing Essence: {pWingData.id} {pWingData.Name} -- {pWingData.FileModel}");
|
||||
break;
|
||||
case DATA_TYPE.DT_FLYSWORD_ESSENCE:
|
||||
var pFlySword = (FLYSWORD_ESSENCE)equipData;
|
||||
m_wingType = FlyMode2WingType(pFlySword.fly_mode);
|
||||
var pflySwordPrefab = await AddressableManager.Instance.LoadPrefabAsync(pFlySword.FileModel.ToLower().Replace('\\', '/'));
|
||||
var parentSword = FindChildRecursive(_pPlayerModel.transform, "HH_feijian");
|
||||
if(parentSword != null)
|
||||
{
|
||||
var pflySwordObject = Instantiate(pflySwordPrefab, parentSword);
|
||||
pflySwordObject.gameObject.SetActive(false);
|
||||
pflySwordObject.name = _wing;
|
||||
}
|
||||
BMLogger.Log($"ShowEquipments():: Flysword Essence: {pFlySword.id} {pFlySword.Name} -- {pFlySword.FileModel}");
|
||||
break;
|
||||
default:
|
||||
@@ -480,6 +497,20 @@ namespace BrewMonster
|
||||
}
|
||||
}
|
||||
|
||||
Transform FindChildRecursive(Transform parent, string name)
|
||||
{
|
||||
foreach (Transform child in parent)
|
||||
{
|
||||
if (child.name == name)
|
||||
return child;
|
||||
|
||||
Transform found = FindChildRecursive(child, name);
|
||||
if (found != null)
|
||||
return found;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
#region Helper Methods
|
||||
private GameObject FindChildObjectRecursive(Transform parent, string name)
|
||||
{
|
||||
|
||||
@@ -197,6 +197,8 @@ public class CECUIManager : MonoSingleton<CECUIManager>
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public void UpdateSkillRelatedUI()
|
||||
{
|
||||
// ¸üм¼ÄÜÏà¹ØµÄ½çÃæÏÔʾ
|
||||
@@ -273,7 +275,25 @@ public class CECUIManager : MonoSingleton<CECUIManager>
|
||||
|
||||
if (string.Equals(pDlg.GetName(), "Game_Quit", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
// TODO
|
||||
// Cancel hotkey customize because hot key state is determinted by CECHostInputFilter
|
||||
// which is shared between repick role
|
||||
//
|
||||
// if (m_pDlgSettingQuickKey->IsShow())
|
||||
// m_pDlgSettingQuickKey->Show(false);
|
||||
|
||||
if( pSession.GameSession.IsConnected )
|
||||
{
|
||||
// TODO
|
||||
// if (CECCrossServer::Instance().IsOnSpecialServer())
|
||||
// g_pGame->GetGameRun()->GetPendingLogOut().AppendForSaveConfig(new CECPendingLogoutCrossServer());
|
||||
// else
|
||||
// g_pGame->GetGameRun()->GetPendingLogOut().AppendForSaveConfig(new CECPendingLogoutHalf());
|
||||
|
||||
EC_Game.GetGameRun().GetPendingLogOut().AppendForSaveConfig(new CECPendingLogoutHalf());
|
||||
}
|
||||
else
|
||||
EC_Game.GetGameRun().SetLogoutFlag(2);
|
||||
}
|
||||
else if ((string.Equals(pDlg.GetName(), "Game_TeachSkill", StringComparison.OrdinalIgnoreCase) && DialogBoxCommandIDs.IDOK == iRetVal) ||
|
||||
(string.Equals(pDlg.GetName(), "Game_LearnSkill", StringComparison.OrdinalIgnoreCase) && DialogBoxCommandIDs.IDOK == iRetVal))
|
||||
@@ -509,10 +529,10 @@ public class CECUIManager : MonoSingleton<CECUIManager>
|
||||
|
||||
public void OnClickedWaveHand()
|
||||
{
|
||||
if (EC_Game.GetGameRun().GetPoseCmdShortcuts() == null)
|
||||
{
|
||||
EC_Game.GetGameRun().StartGame(0, Vector3.zero);
|
||||
}
|
||||
// if (EC_Game.GetGameRun().GetPoseCmdShortcuts() == null)
|
||||
// {
|
||||
// EC_Game.GetGameRun().StartGame(0, Vector3.zero);
|
||||
// }
|
||||
CECShortcut pSC = EC_Game.GetGameRun().GetPoseCmdShortcuts().GetShortcut(slot);
|
||||
if (pSC != null) // && pObjSrc->GetDataPtr("ptr_CECShortcut") == pSC
|
||||
{
|
||||
|
||||
@@ -0,0 +1,290 @@
|
||||
|
||||
using BrewMonster;
|
||||
using BrewMonster.Network;
|
||||
using UnityEngine;
|
||||
|
||||
public partial class CECGameRun
|
||||
{
|
||||
int m_iGameState; // Game state
|
||||
// Logout flag (C++: m_iLogoutFlag)
|
||||
private int m_iLogoutFlag = -1;
|
||||
|
||||
// Logout
|
||||
public void Logout()
|
||||
{
|
||||
// ASSERT(m_iGameState == GS_GAME);
|
||||
if (m_iGameState != (int)GameState.GS_GAME)
|
||||
{
|
||||
BMLogger.LogError($"Logout called but game state is not GS_GAME, current state: {m_iGameState}");
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Check if we need to call OnLogout for UI and cross server here
|
||||
// overlay::GTOverlay::Instance().Logout();
|
||||
// CECCrossServer::Instance().OnLogout();
|
||||
|
||||
bool bExitApp = false;
|
||||
|
||||
// if (CECUIConfig::Instance().GetLoginUI().bAvoidLoginUI && m_iLogoutFlag != 1){
|
||||
if( 1 == 2 && m_iLogoutFlag != 1){ // TODO: check if we need to avoid login UI based on config and logout flag here
|
||||
bExitApp = true;
|
||||
}else if (m_iLogoutFlag == 0) // Exit application directly
|
||||
{
|
||||
bExitApp = true;
|
||||
}
|
||||
else if (m_iLogoutFlag == 1) // Logout game and re-select role
|
||||
{
|
||||
UnityGameSession.ReturnToSelectRole();
|
||||
|
||||
// TODO: Check if we need to send switch game for mini client here
|
||||
// Origin C++
|
||||
// StartLogin();
|
||||
StartLogin();
|
||||
|
||||
//
|
||||
// // ÏÂÔØÆ÷ÏìÓ¦Í˳öÓÎϷ״̬
|
||||
// if( g_pGame->GetConfigs()->IsMiniClient() )
|
||||
// CECMCDownload::GetInstance().SendSwitchGame(false);
|
||||
//
|
||||
// // Goto select role interface directly
|
||||
// CECLoginUIMan* pLoginUIMan = m_pUIManager->GetLoginUIMan();
|
||||
// if (pLoginUIMan)
|
||||
// {
|
||||
// if(GetSellingRoleID() == 0)
|
||||
// {
|
||||
// pLoginUIMan->LaunchCharacter();
|
||||
// }
|
||||
//
|
||||
// g_pGame->GetGameSession()->ReLogin(true);
|
||||
// pLoginUIMan->SetRoleListReady(false);
|
||||
// if (!CECReconnect::Instance().IsReconnecting()){
|
||||
// CECReconnect::Instance().SetRoleID(0);
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// ASSERT(pLoginUIMan);
|
||||
// bExitApp = true;
|
||||
// }
|
||||
}
|
||||
else if (m_iLogoutFlag == 2) // Logout game and goto login state
|
||||
{
|
||||
UnityGameSession.LogoutAccount();
|
||||
|
||||
// TODO: Check if we need to send switch game for mini client here
|
||||
// Origin C++
|
||||
// StartLogin();
|
||||
|
||||
// if (CECLoginUIMan* pLoginUIMan = m_pUIManager->GetLoginUIMan()){
|
||||
// g_pGame->GetGameRun()->SetSellingRoleID(0);
|
||||
// g_pGame->GetGameSession()->ReLogin(false);
|
||||
// if (CECCrossServer::Instance().IsWaitLogin()){
|
||||
// pLoginUIMan->LaunchCharacter();
|
||||
// pLoginUIMan->ChangeSceneByRole();
|
||||
// pLoginUIMan->ReclickLoginButton();
|
||||
// }else if (CECReconnect::Instance().IsReconnecting()){
|
||||
// pLoginUIMan->ChangeCameraByScene(CECLoginUIMan::LOGIN_SCENE_SELCHAR);
|
||||
// pLoginUIMan->ReclickLoginButton();
|
||||
// }
|
||||
}
|
||||
else
|
||||
{
|
||||
// ASSERT(NULL);
|
||||
bExitApp = true;
|
||||
}
|
||||
|
||||
|
||||
// if (m_pRandomMapProc)
|
||||
// A3DRELEASE(m_pRandomMapProc);
|
||||
|
||||
// if (bExitApp)
|
||||
// {
|
||||
// // Exit game application
|
||||
// EndGameState(false);
|
||||
// ::PostMessage(g_pGame->GetGameInit().hWnd, WM_QUIT, 0, 0);
|
||||
// }
|
||||
}
|
||||
|
||||
// End current game state
|
||||
void EndGameState(bool bReset = true/* true */)
|
||||
{
|
||||
if (m_iGameState == (int)GameState.GS_NONE)
|
||||
return;
|
||||
|
||||
int iCurState = m_iGameState;
|
||||
m_iGameState = (int)GameState.GS_NONE;
|
||||
|
||||
// TODO: Check if we need to call OnEndLoginState or OnEndGameState based on current state
|
||||
if (iCurState == (int)GameState.GS_LOGIN)
|
||||
OnEndLoginState();
|
||||
else if (iCurState == (int)GameState.GS_GAME)
|
||||
OnEndGameState();
|
||||
|
||||
// Stop background sound and music
|
||||
// CELBackMusic* pBackMusic = g_pGame->GetBackMusic();
|
||||
// if (pBackMusic)
|
||||
// {
|
||||
// pBackMusic->StopMusic(true, true);
|
||||
// pBackMusic->StopBackSFX();
|
||||
// }
|
||||
|
||||
// if (bReset)
|
||||
// g_pGame.Reset();
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Start login interface
|
||||
bool StartLogin()
|
||||
{
|
||||
// End current game state
|
||||
EndGameState();
|
||||
|
||||
m_iGameState = (int)GameState.GS_LOGIN;
|
||||
|
||||
// if( !CreateLoginWorld() )
|
||||
// {
|
||||
// a_LogOutput(1, "CECGameRun::StartLogin, Failed to create login world.");
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// // Change UI manager
|
||||
// if (!m_pUIManager->ChangeCurUIManager(CECUIManager::UIMAN_LOGIN))
|
||||
// {
|
||||
// a_LogOutput(1, "CECGameRun::StartLogin, Failed to change UI manager.");
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// m_pUIManager->GetLoginUIMan()->LaunchPreface();
|
||||
//
|
||||
// if (!m_pLogo){
|
||||
// m_pLogo = new A2DSprite;
|
||||
// if (!m_pLogo->Init(g_pGame->GetA3DDevice(), "logo.dds", 0)){
|
||||
// A3DRELEASE(m_pLogo);
|
||||
// }else{
|
||||
// m_pLogo->SetLinearFilter(true);
|
||||
// }
|
||||
// }
|
||||
// if (af_IsFileExist("surfaces\\kr.dds"))
|
||||
// {
|
||||
// if (!m_pClassification){
|
||||
// m_pClassification = new A2DSprite;
|
||||
// if (!m_pClassification->Init(g_pGame->GetA3DDevice(), "kr.dds", 0)){
|
||||
// A3DRELEASE(m_pClassification);
|
||||
// }else{
|
||||
// m_pClassification->SetLinearFilter(true);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// // Change cursor to default icon
|
||||
// g_pGame->ChangeCursor(RES_CUR_NORMAL);
|
||||
// // Discard current frame
|
||||
// g_pGame->DiscardFrame();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// End login state
|
||||
void OnEndLoginState()
|
||||
{
|
||||
// Release UI module
|
||||
// m_pUIManager.ChangeCurUIManager(-1);
|
||||
|
||||
// Release World
|
||||
// ReleaseLoginWorld();
|
||||
|
||||
// A3DRELEASE(m_pLogo);
|
||||
// A3DRELEASE(m_pClassification);
|
||||
}
|
||||
|
||||
// End game state
|
||||
void OnEndGameState()
|
||||
{
|
||||
ReleasePendingActions();
|
||||
|
||||
// Release UI module
|
||||
// m_pUIManager.ChangeCurUIManager(-1);
|
||||
|
||||
// Release shortcuts
|
||||
ReleaseShortcuts();
|
||||
|
||||
// Release team manager
|
||||
// A3DRELEASE(m_pTeamMan);
|
||||
if (m_pTeamMan != null)
|
||||
{
|
||||
m_pTeamMan.Release();
|
||||
m_pTeamMan = null;
|
||||
}
|
||||
|
||||
// Release host player before world released
|
||||
// ReleaseHostPlayer();
|
||||
|
||||
// Release world
|
||||
// ReleaseWorld();
|
||||
|
||||
// Release message manager
|
||||
// A3DRELEASE(m_pMessageMan);
|
||||
|
||||
// g_pGame.ReleaseInGameRes();
|
||||
|
||||
// Return the default memory state
|
||||
// m_pMemSimplify.OnEndGameState();
|
||||
// CECOptimize::Instance().OnEndGameState();
|
||||
}
|
||||
|
||||
// Release shortcuts
|
||||
void ReleaseShortcuts()
|
||||
{
|
||||
// A3DRELEASE(m_pNormalSCS);
|
||||
// A3DRELEASE(m_pTeamSCS);
|
||||
// A3DRELEASE(m_pTradeSCS);
|
||||
// A3DRELEASE(m_pPoseSCS);
|
||||
// A3DRELEASE(m_pFactionSCS);
|
||||
|
||||
m_pNormalSCS = null;
|
||||
m_pTeamSCS = null;
|
||||
m_pTradeSCS = null;
|
||||
m_pPoseSCS = null;
|
||||
m_pFactionSCS = null;
|
||||
}
|
||||
|
||||
// Release host player
|
||||
void ReleaseHostPlayer()
|
||||
{
|
||||
// C++ version:
|
||||
// Release host player
|
||||
// if (m_pHostPlayer)
|
||||
// {
|
||||
// m_pHostPlayer->Release();
|
||||
// delete m_pHostPlayer;
|
||||
// m_pHostPlayer = NULL;
|
||||
// }
|
||||
|
||||
// Release host player
|
||||
if (m_pHostPlayer)
|
||||
{
|
||||
m_pHostPlayer.Release();
|
||||
GameObject.Destroy(m_pHostPlayer.gameObject);
|
||||
m_pHostPlayer = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Release world
|
||||
void ReleaseWorld()
|
||||
{
|
||||
// m_pInputCtrl->ClearKBFilterStack();
|
||||
// m_pInputCtrl->ClearMouFilterStack();
|
||||
//
|
||||
// g_pGame->GetViewport()->SwitchCamera(false);
|
||||
|
||||
if (m_pWorld != null)
|
||||
{
|
||||
// if (m_pHostPlayer)
|
||||
// m_pHostPlayer.SetPlayerMan(NULL);
|
||||
|
||||
this.m_pWorld.Release();
|
||||
// delete m_pWorld;
|
||||
m_pWorld = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b039014c898e4659adb7c90cc570b637
|
||||
timeCreated: 1772439168
|
||||
@@ -13,10 +13,12 @@ using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using PerfectWorld.Scripts.Shop;
|
||||
using Unity.Cinemachine;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
public partial class CECGameRun
|
||||
public partial class CECGameRun : ITickable
|
||||
{
|
||||
private static CECGameRun instance;
|
||||
|
||||
@@ -39,9 +41,8 @@ public partial class CECGameRun
|
||||
|
||||
// private GameRunConfig _gameRunConfig;
|
||||
//[SerializeField] private Transform ground;
|
||||
CECHostPlayer hostPlayer;
|
||||
CECHostPlayer m_pHostPlayer;
|
||||
private CECWorld m_pWorld;
|
||||
int m_iGameState; // Game state
|
||||
|
||||
|
||||
protected CECUIManager m_pUIManager; // UI manager
|
||||
@@ -50,13 +51,13 @@ public partial class CECGameRun
|
||||
|
||||
#endregion
|
||||
|
||||
public CECWorld GetWorld()
|
||||
public CECWorld GetWorld()
|
||||
{
|
||||
if(m_pWorld == null)
|
||||
if (m_pWorld == null)
|
||||
{
|
||||
m_pWorld = CECWorld.Instance;
|
||||
m_pWorld = new CECWorld();
|
||||
}
|
||||
return m_pWorld;
|
||||
return m_pWorld;
|
||||
}
|
||||
|
||||
public CECTeamMan GetTeamMan() { return m_pTeamMan; }
|
||||
@@ -116,16 +117,17 @@ public partial class CECGameRun
|
||||
if (!m_InstTab.ContainsKey(161))
|
||||
m_InstTab.Add(161, new CECInstance());
|
||||
AddressableManager.Instance.OnDispose += Dispose;
|
||||
m_pWorld = CECWorld.Instance;
|
||||
StartGame(0, Vector3.zero);
|
||||
if (m_pWorld == null)
|
||||
m_pWorld = new CECWorld();
|
||||
|
||||
|
||||
m_pWorld = CECWorld.Instance;
|
||||
m_pendingLogout = new CECPendingActionArray( false);
|
||||
|
||||
TickInvoker.Instance.RegisterTickable(this);
|
||||
}
|
||||
|
||||
private static void Dispose()
|
||||
{
|
||||
TickInvoker.Instance.UnregisterTickable(instance);
|
||||
instance = null;
|
||||
}
|
||||
|
||||
@@ -152,26 +154,103 @@ public partial class CECGameRun
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
private bool init;
|
||||
public bool StartGame(int idInst, Vector3 vHostPos)
|
||||
{
|
||||
if (init)
|
||||
// TODO: Implement the rest of the StartGame logic based on the original C++ code, including:
|
||||
// End current game state
|
||||
EndGameState();
|
||||
//
|
||||
// memset(&m_WallowInfo, 0, sizeof(m_WallowInfo));
|
||||
m_iGameState = (int)GameState.GS_GAME;
|
||||
//
|
||||
// if (!g_pGame->LoadInGameRes())
|
||||
// {
|
||||
// a_LogOutput(1, "CECGameRun::StartGame, Failed to call LoadInGameRes().");
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// // Create message manager
|
||||
// if (!(m_pMessageMan = new CECMessageMan(this)))
|
||||
// {
|
||||
// glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECGameRun::StartGame", __LINE__);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// Create default game world
|
||||
if (!JumpToInstance(idInst, vHostPos))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// a_LogOutput(1, "CECGameRun::StartGame, Failed to create game world.");
|
||||
return false;
|
||||
}
|
||||
//
|
||||
// // ÉèÖÿç·þ³É¹¦±êʶ£¬ÒÔÀûÓÚ CECGameUIMan ¸ù¾Ý¿ç·þ״̬×öÏàÓ¦³õʼ»¯
|
||||
// if (CECCrossServer::Instance().IsWaitLogin()){
|
||||
// CECCrossServer::Instance().OnLoginSuccess();
|
||||
// }
|
||||
// if (CECReconnect::Instance().IsReconnecting()){
|
||||
// CECReconnect::Instance().OnReconnectSuccess();
|
||||
// }
|
||||
//
|
||||
// // Create host player
|
||||
// if (!CreateHostPlayer())
|
||||
// {
|
||||
// a_LogOutput(1, "CECGameRun::StartGame, Failed to create host player.");
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// // Create team manager
|
||||
// if (!(m_pTeamMan = new CECTeamMan))
|
||||
// {
|
||||
// glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECGameRun::StartGame", __LINE__);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// // Reset faction manager
|
||||
// g_pGame->GetFactionMan()->Release(false);
|
||||
//
|
||||
// Create shortcuts
|
||||
if (!CreateShortcuts())
|
||||
{
|
||||
return false;
|
||||
// a_LogOutput(1, "CECGameRun::StartGame, Failed to create shortcuts");
|
||||
return false;
|
||||
}
|
||||
if (!JumpToInstance(idInst, vHostPos))
|
||||
{
|
||||
BMLogger.LogError("CECGameRun::StartGame, Failed to create game world.");
|
||||
return false;
|
||||
}
|
||||
|
||||
init = true;
|
||||
//
|
||||
// // Change UI manager
|
||||
// if (!m_pUIManager->ChangeCurUIManager(CECUIManager::UIMAN_INGAME))
|
||||
// {
|
||||
// a_LogOutput(1, "CECGameRun::StartGame, Failed to change UI manager.");
|
||||
// return false;
|
||||
// }
|
||||
// m_pInputFilter->LoadHotKey();
|
||||
//
|
||||
// CECGameUIMan* pGameUIMan = m_pUIManager->GetInGameUIMan();
|
||||
// if (pGameUIMan)
|
||||
// pGameUIMan->ChangeWorldInstance(idInst);
|
||||
//
|
||||
// l_SaveCfgCnt.Reset();
|
||||
//
|
||||
// // Change cursor to default icon
|
||||
// g_pGame->ChangeCursor(RES_CUR_NORMAL);
|
||||
// // Discard current frame
|
||||
// g_pGame->DiscardFrame();
|
||||
//
|
||||
// // Clear frame controller
|
||||
// memset(&l_fc, 0, sizeof (l_fc));
|
||||
//
|
||||
// // ³õʼ»¯ÍøÂçÑÓ³Ù²éѯ
|
||||
// l_bFirstQuery = true;
|
||||
// m_iInGameDelay = 0;
|
||||
// l_DelayQueryCounter.Reset();
|
||||
//
|
||||
// l_QueryServerTime.Reset();
|
||||
//
|
||||
// // clear the selling id
|
||||
// m_SellingRoleID = 0;
|
||||
//
|
||||
// // ÏÂÔØÆ÷ÏìÓ¦½øÈëÓÎϷ״̬
|
||||
// if( g_pGame->GetConfigs()->IsMiniClient() )
|
||||
// CECMCDownload::GetInstance().SendSwitchGame(true);
|
||||
//
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -192,9 +271,14 @@ public partial class CECGameRun
|
||||
}
|
||||
}
|
||||
|
||||
public CECGameRun()
|
||||
{
|
||||
m_iGameState = (int)GameState.GS_NONE;
|
||||
}
|
||||
|
||||
public CECHostPlayer GetHostPlayer()
|
||||
{
|
||||
return hostPlayer;
|
||||
return m_pHostPlayer;
|
||||
}
|
||||
public void InitCharacter(cmd_self_info_1 info)
|
||||
{
|
||||
@@ -218,19 +302,19 @@ public partial class CECGameRun
|
||||
m_InstTab.Add(idInst, new CECInstance());
|
||||
|
||||
// Update global world instance id used by task checks
|
||||
CECWorld.Instance?.SetInstanceID(idInst);
|
||||
CECGameRun.Instance?.GetWorld()?.SetInstanceID(idInst);
|
||||
}
|
||||
}
|
||||
|
||||
CECPlayer.InitStaticRes();
|
||||
hostPlayer = ObjectSpawner.Instance.InstantiateObject(_playerPrefab, setThisAsParent: true).AddComponent<CECHostPlayer>();
|
||||
hostPlayer.InitCharacter(info);
|
||||
m_pHostPlayer = ObjectSpawner.Instance.InstantiateObject(_playerPrefab, setThisAsParent: true).AddComponent<CECHostPlayer>();
|
||||
m_pHostPlayer.InitCharacter(info);
|
||||
|
||||
if (hostPlayer != null)
|
||||
if (m_pHostPlayer != null)
|
||||
{
|
||||
var t = Type.GetType("BrewMonster.UI.SelectedTargetHUDController, Assembly-CSharp");
|
||||
if (t != null && hostPlayer.GetComponent(t) == null)
|
||||
hostPlayer.gameObject.AddComponent(t);
|
||||
if (t != null && m_pHostPlayer.GetComponent(t) == null)
|
||||
m_pHostPlayer.gameObject.AddComponent(t);
|
||||
}
|
||||
}
|
||||
public CECMonster GetMonster()
|
||||
@@ -927,6 +1011,172 @@ public partial class CECGameRun
|
||||
|
||||
public CECPendingActionArray GetPendingLogOut(){ return m_pendingLogout; }
|
||||
|
||||
// Game tick routine
|
||||
public bool Tick(uint dwDeltaTime)
|
||||
{
|
||||
// if (GetWallowInfo().anti_wallow_active &&
|
||||
// g_pGame->GetGameSession()->IsConnected() &&
|
||||
// GetGameState() == GS_GAME)
|
||||
// {
|
||||
// if (CECUIConfig::Instance().GetGameUI().nWallowHintType != CECUIConfig::GameUI::WHT_KOREA)
|
||||
// {
|
||||
// // ·À³ÁÃÔµ½3Сʱ£¬ÈôAU²»ÌßÈË£¨ÏûÏ¢¶ªÊ§£©£¬Ôò×Ô¶¯ÏÂÏß
|
||||
// int stime = g_pGame->GetServerGMTTime();
|
||||
// int nTime = stime - GetWallowInfo().play_time;
|
||||
// if (nTime >= 3 * 3600)
|
||||
// {
|
||||
// // ÒѾ³¬¹ý3Сʱ
|
||||
// g_pGame->GetGameSession()->SetBreakLinkFlag(CECGameSession::LBR_ANTI_WALLOW);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// DWORD dwTickTime = a_GetTime();
|
||||
//
|
||||
// CECGameSession* pSession = g_pGame->GetGameSession();
|
||||
// pSession->ProcessNewProtocols();
|
||||
// DWORD dwRealTime = g_pGame->GetRealTickTime();
|
||||
|
||||
if (m_iLogoutFlag >= 0)
|
||||
{
|
||||
Logout();
|
||||
m_iLogoutFlag = -1;
|
||||
}
|
||||
|
||||
// CECReconnect::Instance().Tick();
|
||||
//
|
||||
// if (m_pUIManager)
|
||||
// m_bUIHasCursor = m_pUIManager->UIControlCursor();
|
||||
// else
|
||||
// m_bUIHasCursor = false;
|
||||
//
|
||||
// // Deal input first
|
||||
// if (m_pInputCtrl)
|
||||
// m_pInputCtrl->Tick();
|
||||
//
|
||||
// // Tick world
|
||||
// if (!TickGameWorld(dwDeltaTime, g_pGame->GetViewport()))
|
||||
// return false;
|
||||
|
||||
// Tick UI
|
||||
// if (m_pUIManager)
|
||||
// m_pUIManager.Tick();
|
||||
|
||||
// // Tick GFX caster
|
||||
// g_pGame->GetGFXCaster()->Tick(dwDeltaTime);
|
||||
//
|
||||
// // Tick GFX Manager
|
||||
// g_pGame->GetA3DGFXExMan()->Tick(dwDeltaTime);
|
||||
//
|
||||
// // A3DEngine::TickAnimation trigger animation of many objects.
|
||||
// // For example: A3DSky objects, GFX objects etc.
|
||||
// static DWORD dwAnimTime = 0;
|
||||
// dwAnimTime += dwDeltaTime;
|
||||
// while (dwAnimTime >= TIME_TICKANIMATION)
|
||||
// {
|
||||
// dwAnimTime -= TIME_TICKANIMATION;
|
||||
// g_pGame->GetA3DEngine()->TickAnimation();
|
||||
// }
|
||||
//
|
||||
// // Update ear position so that all 3D sounds' positions are correct
|
||||
// static DWORD dwEarTime = 0;
|
||||
// if ((dwEarTime += dwDeltaTime) >= TIME_UPDATEEAR)
|
||||
// {
|
||||
// dwEarTime -= TIME_UPDATEEAR;
|
||||
//
|
||||
// CECHostPlayer* pHostPlayer = NULL;
|
||||
// if (m_pWorld)
|
||||
// pHostPlayer = m_pWorld->GetHostPlayer();
|
||||
//
|
||||
// A3DCamera * pCamera = g_pGame->GetViewport()->GetA3DCamera();
|
||||
//
|
||||
// if (GetGameState() == CECGameRun::GS_GAME && pHostPlayer && pHostPlayer->HostIsReady())
|
||||
// {
|
||||
// AM3DSoundDevice * pAM3DSoundDevice = g_pGame->GetA3DEngine()->GetAMSoundEngine()->GetAM3DSoundDevice();
|
||||
// A3DVECTOR3 vecDir = pCamera->GetDirH();
|
||||
// A3DVECTOR3 vecUp = A3DVECTOR3(0.0f, 1.0f, 0.0f);
|
||||
//
|
||||
// // Now we should adjust the 3d sound device's pos and orientation;
|
||||
// if (pAM3DSoundDevice)
|
||||
// {
|
||||
// pAM3DSoundDevice->SetPosition(pHostPlayer->GetPos() + A3DVECTOR3(0.0f, 0.8f, 0.0f));
|
||||
// pAM3DSoundDevice->SetOrientation(vecDir, vecUp);
|
||||
// pAM3DSoundDevice->UpdateChanges();
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// g_pGame->GetViewport()->GetA3DCamera()->UpdateEar();
|
||||
// }
|
||||
//
|
||||
// // Tick Run-Time debug information
|
||||
// g_pGame->GetRTDebug()->Tick(dwDeltaTime);
|
||||
//
|
||||
// // Save UI configs when time reached
|
||||
// if (m_iGameState == GS_GAME && l_SaveCfgCnt.IncCounter(dwRealTime))
|
||||
// {
|
||||
// l_SaveCfgCnt.Reset();
|
||||
// SaveConfigsToServer();
|
||||
// }
|
||||
//
|
||||
// l_StatCnt.IncCounter(dwDeltaTime);
|
||||
//
|
||||
// pSession->ClearOldProtocols();
|
||||
//
|
||||
// DWORD dwCurrentTick = a_GetTime();
|
||||
// dwTickTime = (dwCurrentTick > dwTickTime) ? (dwCurrentTick - dwTickTime) : 0;
|
||||
// l_Statistic.iTickTime = (int)dwTickTime;
|
||||
//
|
||||
// if (GetGameState() == CECGameRun::GS_GAME && l_fc.iAvgRdTime)
|
||||
// {
|
||||
// // Accumulate tick time
|
||||
// l_fc.iTickCnt++;
|
||||
// l_fc.iTickTime += (int)dwTickTime;
|
||||
// }
|
||||
//
|
||||
// if (GetGameState() == GS_GAME && GetHostPlayer() && GetHostPlayer()->HostIsReady())
|
||||
// {
|
||||
// if (l_bFirstQuery || l_DelayQueryCounter.IncCounter(dwDeltaTime))
|
||||
// {
|
||||
// // µÚÒ»´Î²éѯ£¬»òÕß²éѯ¼ÆÊýÆ÷µ½µã
|
||||
//
|
||||
// // ·¢ËÍÍøÂçÓµ¼·²éѯÐÒé
|
||||
// l_iDelayTimeStamp = timeGetTime();
|
||||
// g_pGame->GetGameSession()->c2s_CmdQueryNetworkDelay(l_iDelayTimeStamp);
|
||||
// l_DelayQueryCounter.Reset();
|
||||
// l_bFirstQuery = false;
|
||||
// }
|
||||
//
|
||||
// if (l_QueryServerTime.IncCounter(dwDeltaTime))
|
||||
// {
|
||||
// g_pGame->GetGameSession()->c2s_CmdSendGetServerTime();
|
||||
// l_QueryServerTime.Reset();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// m_pendingLogout.Update(dwDeltaTime);
|
||||
//
|
||||
// // ÓÅ»¯ÄÚ´æµÄÕ¼ÓÃ
|
||||
// m_pMemSimplify->Tick(dwDeltaTime);
|
||||
//
|
||||
// // ¸üÐÂÏÂÔØ×´Ì¬
|
||||
// CECMCDownload::GetInstance().Tick(dwDeltaTime);
|
||||
//
|
||||
// // ¸üÐÂ×Ô¶¯²ßÂÔ
|
||||
// CECAutoPolicy::GetInstance().Tick(dwDeltaTime);
|
||||
//
|
||||
// if(m_pRandomMapProc)
|
||||
// m_pRandomMapProc->Tick(dwDeltaTime);
|
||||
//
|
||||
// #ifdef _PROFILE_MEMORY
|
||||
// g_TickMemoryHistory();
|
||||
// #endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private Dictionary<string, int> m_Name2IDTab = new Dictionary<string, int>();
|
||||
private Dictionary<int, string> m_ID2NameTab = new Dictionary<int, string>();
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d68cfcd6293664808ba733553314250a
|
||||
Reference in New Issue
Block a user