本文整理汇总了C++中CMonster::SetTObject方法的典型用法代码示例。如果您正苦于以下问题:C++ CMonster::SetTObject方法的具体用法?C++ CMonster::SetTObject怎么用?C++ CMonster::SetTObject使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CMonster
的用法示例。
在下文中一共展示了CMonster::SetTObject方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DoRunAway
void CStateMachinen::DoRunAway(CMonster& monster, eStateEvent evt)
{
StateParameter& stateParamter = monster.mStateParamter;
if( monster.GetAbnormalStatus()->IsStun ||
monster.GetAbnormalStatus()->IsFreezing ||
monster.GetAbnormalStatus()->IsStone ||
monster.GetAbnormalStatus()->IsSlip ||
monster.GetAbnormalStatus()->IsMoveStop ||
monster.GetAbnormalStatus()->IsParalysis )
{
return;
}
switch(evt)
{
case eSEVENT_Enter:
{
monster.RemoveAllAggro();
monster.SetTObject(0);
VECTOR3 position = {0};
position.x = float(monster.GetFiniteStateMachine().GetMemory().GetVariable(
"__runaway_x__"));
position.z = float(monster.GetFiniteStateMachine().GetMemory().GetVariable(
"__runaway_z__"));
monster.OnMove(
&position);
stateParamter.nextTime = gCurTime + CCharMove::GetMoveEstimateTime(&monster) + 1000;
break;
}
case eSEVENT_Process:
{
if(gCurTime > stateParamter.nextTime)
{
SetState(
&monster,
eMA_STAND);
break;
}
break;
}
}
}
示例2: DoAttack
void CStateMachinen::DoAttack(CMonster& monster, eStateEvent evt)
{
const BASE_MONSTER_LIST& baseMonsterList = monster.GetSMonsterList();
StateParameter& stateParamter = monster.mStateParamter;
if( monster.GetAbnormalStatus()->IsStun ||
monster.GetAbnormalStatus()->IsFreezing ||
monster.GetAbnormalStatus()->IsStone ||
monster.GetAbnormalStatus()->IsSlip ||
monster.GetAbnormalStatus()->IsParalysis )
{
return;
}
switch(evt)
{
case eSEVENT_Enter:
{
stateParamter.AttackStartTime = 0;
stateParamter.nextTime = 0;
break;
}
case eSEVENT_Process:
{
if(stateParamter.AttackStartTime > gCurTime)
{
break;
}
else if(stateParamter.CurAttackKind >= baseMonsterList.AttackNum)
{
SetState(
&monster,
eMA_STAND);
break;
}
else if(0 == monster.GetTObject() ||
(monster.GetTObject() && ( monster.GetTObject()->GetState() == eObjectState_Die || monster.GetTObject()->GetInited() == FALSE )))
{
SetState(
&monster,
eMA_WALKAROUND);
break;
}
else if(monster.IsInvalidTarget(*monster.GetTObject()))
{
monster.SetTObject(
0);
SetState(
&monster,
eMA_STAND);
break;
}
const size_t maxSkillSize = sizeof(baseMonsterList.SkillInfo) / sizeof(*baseMonsterList.SkillInfo);
if(maxSkillSize <= stateParamter.CurAttackKind)
{
break;
}
cActiveSkillInfo* const activeSkillInfo = baseMonsterList.SkillInfo[stateParamter.CurAttackKind];
if(0 == activeSkillInfo)
{
break;
}
VECTOR3 ObjectPos = *CCharMove::GetPosition(&monster);
VECTOR3 TObjectPos = *CCharMove::GetPosition(monster.GetTObject());
const DWORD Distance = (DWORD)CalcDistanceXZ( &ObjectPos, &TObjectPos );
if(Distance > activeSkillInfo->GetInfo().Range)
{
SetState(
&monster,
eMA_PERSUIT);
break;
}
stateParamter.AttackStartTime = gCurTime + baseMonsterList.SkillInfo[stateParamter.CurAttackKind]->GetInfo().CoolTime;
monster.DoAttack(baseMonsterList.AttackIndex[stateParamter.CurAttackKind]);
RandCurAttackKind(
baseMonsterList,
stateParamter);
break;
}
}
}
示例3: DoStand
void CStateMachinen::DoStand(CMonster& monster, eStateEvent evt)
{
const BASE_MONSTER_LIST& baseMonsterList = monster.GetSMonsterList();
StateParameter& stateParamter = monster.mStateParamter;
switch(evt)
{
case eSEVENT_Enter:
{
// 소유주가 전투중인 경우 도와주러 간다
if(CObject* const ownerObject = g_pUserTable->FindUser(monster.GetOwnerIndex()))
{
if(ownerObject->GetObjectBattleState() &&
TRUE == monster.SetTObject(ownerObject->GetTObject()))
{
SetState(
&monster,
eMA_PERSUIT);
stateParamter.nextTime = gCurTime + 500;
break;
}
}
stateParamter.nextTime = gCurTime + baseMonsterList.StandTime;
monster.DoStand();
if(FALSE == monster.IsNoCheckCollision())
{
break;
}
VECTOR3 vPos = {0};
monster.GetPosition(&vPos);
if(g_pServerSystem->GetMap()->CollisionTilePos(
vPos.x,
vPos.z,
g_pServerSystem->GetMapNum()))
{
break;
}
monster.SetNoCheckCollision(FALSE);
break;
}
case eSEVENT_Process:
{
if(stateParamter.nextTime > gCurTime)
{
break;
}
Mon_SpeechState speechState = eMon_Speech_MAX;
const BYTE rate = BYTE(rand() % 100);
if(rate < baseMonsterList.StandRate)
{
SetState(
&monster,
eMA_STAND);
speechState = eMon_Speech_KeepWalkAround;
}
else
{
SetState(
&monster,
eMA_WALKAROUND);
speechState = eMon_Speech_WalkAround;
}
// 100617 ONS 정지상태에서 타겟이 죽었을 경우, 배회상태로 변경한다.
if( monster.GetTObject() && monster.GetTObject()->GetState() == eObjectState_Die )
{
monster.SetTObject(0);
SetState(
&monster,
eMA_WALKAROUND);
}
const MonSpeechInfo* const speechInfo = MON_SPEECHMGR->GetCurStateSpeechIndex(
monster.GetMonsterKind(),
speechState);
if(0 == speechInfo)
{
break;
}
monster.AddSpeech(
speechInfo->SpeechType,
speechInfo->SpeechIndex);
break;
}
}
}
示例4: DoWalkAround
void CStateMachinen::DoWalkAround(CMonster& monster, eStateEvent evt)
{
const BASE_MONSTER_LIST& baseMonsterList = monster.GetSMonsterList();
StateParameter& stateParamter = monster.mStateParamter;
if( monster.GetAbnormalStatus()->IsStun ||
monster.GetAbnormalStatus()->IsFreezing ||
monster.GetAbnormalStatus()->IsStone ||
monster.GetAbnormalStatus()->IsSlip ||
monster.GetAbnormalStatus()->IsMoveStop ||
monster.GetAbnormalStatus()->IsParalysis )
{
SetState(
&monster,
eMA_STAND);
return;
}
switch(evt)
{
case eSEVENT_Enter:
{
// 소유주가 있을 경우 그 중심으로 행동한다
if(CObject* const ownerObject = g_pUserTable->FindUser(monster.GetOwnerIndex()))
{
if(ownerObject->GetObjectBattleState())
{
SetState(
&monster,
eMA_STAND);
break;
}
VECTOR3 ownerPosition = {0};
ownerObject->GetPosition(
&ownerPosition);
const float distance = ownerObject->GetRadius() * 3;
VECTOR3 monsterPosition = {0};
monster.GetPosition(
&monsterPosition);
if(distance > CalcDistanceXZ(&ownerPosition, &monsterPosition))
{
SetState(
&monster,
eMA_STAND);
break;
}
const float randomRateX = float(rand()) / RAND_MAX;
const float randomRateZ = float(rand()) / RAND_MAX;
const float randomAxisX = (randomRateX < 0.5f ? -1.0f : 1.0f) * (ownerObject->GetRadius() * (1.0f + randomRateX));
const float randomAxisZ = (randomRateZ < 0.5f ? -1.0f : 1.0f) * (ownerObject->GetRadius() * (1.0f + randomRateZ));
monster.GetFiniteStateMachine().GetMemory().SetVariable(
"__move_x__",
int(ownerPosition.x + randomAxisX));
monster.GetFiniteStateMachine().GetMemory().SetVariable(
"__move_z__",
int(ownerPosition.z + randomAxisZ));
SetState(
&monster,
eMA_SCRIPT_RUN);
// 이렇게 하지 않으면 eSEVENT_Process 루틴으로 들어가서 상태를 바꿔버린다
stateParamter.nextTime = gCurTime + 500;
break;
}
monster.SetTObject(0);
monster.DoWalkAround();
stateParamter.nextTime = gCurTime + CCharMove::GetMoveEstimateTime(&monster);
break;
}
case eSEVENT_Process:
{
if( stateParamter.nextTime > gCurTime )
{
break;
}
Mon_SpeechState speechState = eMon_Speech_MAX;
const int rate = rand() % 100;
if(0 <= rate && rate < baseMonsterList.StandRate )
{
SetState(
&monster,
eMA_STAND);
speechState = eMon_Speech_Stand;
}
else
{
SetState(
&monster,
eMA_WALKAROUND);
//.........这里部分代码省略.........
示例5: SubProcess
void CStateMachinen::SubProcess(CMonster& monster, eStateEvent evt)
{
const BASE_MONSTER_LIST& baseMonsterList = monster.GetSMonsterList();
StateParameter& stateParamter = monster.mStateParamter;
if( monster.GetAbnormalStatus()->IsStun ||
monster.GetAbnormalStatus()->IsFreezing ||
monster.GetAbnormalStatus()->IsStone ||
monster.GetAbnormalStatus()->IsSlip ||
monster.GetAbnormalStatus()->IsParalysis )
{
return;
}
switch(stateParamter.stateCur)
{
case eMA_STAND:
case eMA_WALKAROUND:
{
const cActiveSkillInfo* const skillInfo = baseMonsterList.SkillInfo[monster.mStateParamter.CurAttackKind];
if(0 == skillInfo)
{
break;
}
CObject* object = 0;
if(monster.IsForeAttack() &&
(stateParamter.SearchLastTime < gCurTime))
{
stateParamter.SearchLastTime = gCurTime + baseMonsterList.SearchPeriodicTime;
CObject* const ownerObject = g_pUserTable->FindUser(monster.GetOwnerIndex());
if(0 == ownerObject)
{
object = monster.DoSearch();
}
else if(eObjectKind_Player == ownerObject->GetObjectKind())
{
object = monster.DoFriendSearch(
skillInfo->GetInfo().Range);
}
else if(eObjectKind_Monster & ownerObject->GetObjectKind())
{
object = monster.DoSearch();
}
}
else if(baseMonsterList.AttackNum &&
(stateParamter.CollSearchLastTime < gCurTime))
{
stateParamter.CollSearchLastTime = gCurTime + 500;
CObject* const ownerObject = g_pUserTable->FindUser(monster.GetOwnerIndex());
if(0 == ownerObject)
{
break;
}
else if(eObjectKind_Player == ownerObject->GetObjectKind())
{
object = monster.DoFriendSearch(
skillInfo->GetInfo().Range);
}
else if(eObjectKind_Monster & ownerObject->GetObjectKind())
{
object = monster.DoSearch();
}
}
if(0 == object)
{
break;
}
else if(FALSE == monster.SetTObject(object))
{
break;
}
SetState(
&monster,
eMA_PERSUIT);
}
break;
}
}