📄 role.cpp
字号:
else if(this->TestStatus(USERSTATUS_WOUND))
{
switch(m_Info.iActType)
{
case _ACTION_WALKL:
m_Info.iActType = _ACTION_WALKL_I;
break;
case _ACTION_WALKR:
m_Info.iActType = _ACTION_WALKR_I;
break;
}
}
*/
DWORD dwTerrain = g_objGameMap.GetTerrain(m_Info.posMap.x, m_Info.posMap.y);
m_Info.iActFrameAmount =m_pIRoleView->SetAction(m_Info.iActType, true, bPlaySound, m_Info.posWorld.x, m_Info.posWorld.y, true, dwTerrain);
if(m_Info.cmdProc.nFrameEnd != 0 && m_Info.cmdProc.nFrameStart < m_Info.cmdProc.nFrameEnd)
{
m_Info.iActFrameAmount = m_Info.cmdProc.nFrameEnd - m_Info.cmdProc.nFrameStart;
m_pIRoleView->SetVariable(_VAR_FRAME, m_Info.cmdProc.nFrameStart);
}
m_Info.timeFrameInterval = this->GetFrameInterval(m_Info.iActType);
if(m_Info.cmdProc.nFrameInterval != 0)
m_Info.timeFrameInterval = m_Info.cmdProc.nFrameInterval;
if(bAccelerate)
m_Info.timeFrameInterval = m_Info.timeFrameInterval/4;
m_Info.timeFirstFrame =::TimeGet();
// map 3d effect of action
int nTerrain = g_objGameMap.GetTerrain(m_Info.posMap);
const ActionMapEffectInfo* pInfo = g_obj3DRoleData.GetActionMapEffect(m_Info.usLook, m_Info.iActType, nTerrain);
if (pInfo && pInfo->nShowTime == 0) // effect show at begin of action
{
if (pInfo->nType == 0)
{
C3DMapEffect* pEffect = g_objGameMap.Add3DMapEffect(m_Info.posWorld, (char*)pInfo->szEffect);
if(pEffect && pInfo->bRotate)
{
pEffect->SetDir(pInfo->bRotate);
}
}
else if (pInfo->nType == 1)
{
m_objEffect.Add((char*)pInfo->szEffect,pInfo->bRotate,this->GetDir(),this->GetLook());
}
}
// 极品帽子的特效
ItemTypeInfo infoItem;
if(!CItem::s_ItemData.GetItemTypeInfo(this->GetArmet(), infoItem))
{
this->m_objEffect.Delete("elf");
return;
}
if(infoItem.ucRequiredLevel < 67)
{
this->m_objEffect.Delete("elf");
return;
}
if(infoItem.uID%10 != 9)
{
this->m_objEffect.Delete("elf");
return;
}
if(infoItem.uID/10000 != 11)
{
this->m_objEffect.Delete("elf");
return;
}
if((m_Info.iActType != _ACTION_STANDBY) &&
(m_Info.iActType != _ACTION_REST1) &&
(m_Info.iActType != _ACTION_REST2) &&
(m_Info.iActType != _ACTION_REST3) &&
(m_Info.iActType != _ACTION_ALERT) &&
(m_Info.iActType != _ACTION_FLY_STANDBY))
{
this->m_objEffect.Delete("elf");
return;
}
if(this->m_objEffect.TestEffect("elf"))
return;
this->m_objEffect.Add("elf",false,0,this->GetLook());
}
//--------------------------------------------------------------
void CRole::ResetActionData(void)
{
if(m_Info.cmdProc.iType == _COMMAND_DIE)
return;
if ((this->GetID() == g_objHero.GetID() || this->IsMyPet())
&& this->IsMoving())
return;
if (_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
this->ProcessCommand();
m_Info.iActFrameIndex = m_Info.iActFrameAmount;
m_Info.posWorld = m_Info.posActionEnd;
m_Info.nZ = m_Info.nZ;
g_objGameMap.World2Cell(m_Info.posWorld.x, m_Info.posWorld.y, m_Info.posMap.x, m_Info.posMap.y);
g_objGameMap.World2Screen(m_Info.posWorld.x, m_Info.posWorld.y, m_Info.posScr.x, m_Info.posScr.y);
}
//--------------------------------------------------------------
// return true means this action is end
BOOL CRole::ProcessAction(void)
{
if(this->GetID() == g_objHero.GetID() &&
m_Info.cmdProc.iType != _COMMAND_RUN)
{
g_objHero.m_nFastRunSetp = 0;
}
if(m_Info.cmdProc.nFrameEnd != 0 && m_Info.cmdProc.nFrameStart < m_Info.cmdProc.nFrameEnd)
{
if(m_Info.iActFrameIndex >= m_Info.cmdProc.nFrameEnd)
return true;
}
if(m_Info.iActFrameIndex >= m_Info.iActFrameAmount)
{
m_Info.bAdjustDir = false;
return true;
}
// get the current frame index
DWORD timeCurrent =::TimeGet();
m_Info.iActFrameIndex =(timeCurrent-m_Info.timeFirstFrame+m_Info.timeFrameInterval/2)/m_Info.timeFrameInterval;
if (m_Info.iActFrameIndex > m_Info.iActFrameAmount)
m_Info.iActFrameIndex =m_Info.iActFrameAmount;
// set world pos
m_Info.posWorld.x =m_Info.posActionBegin.x;
m_Info.posWorld.y =m_Info.posActionBegin.y;
m_Info.nZ = m_Info.nPosActionBeginZ;
// now get the world pos of role
int nDeltaX =m_Info.posActionEnd.x-m_Info.posActionBegin.x;
int nDeltaY =m_Info.posActionEnd.y-m_Info.posActionBegin.y;
int nDeltaZ =m_Info.nPosActionEndZ-m_Info.nPosActionBeginZ;
if (nDeltaX != 0 || nDeltaY != 0)
{
DWORD timeCost =__max(1, m_Info.timeFrameInterval*m_Info.iActFrameAmount);
DWORD timePass =__min(timeCost, timeCurrent-m_Info.timeFirstFrame);
DWORD dwKey = m_pIRoleView ? m_pIRoleView->GetVariable(_VAR_ACTION_DATA) : 0;
CONST CActionCtrlInfo* pInfo = g_obj3DRoleData.GetActionCtrlInfo(dwKey);
if (pInfo)
{
// 求当前的运动位移百分比
int nTimePercent = __min(100, 100 * timePass / timeCost);
for (int i = 0; i < pInfo->nSection; i++)
{
if (nTimePercent < pInfo->nTimePercent[i])
break;
}
if (i < pInfo->nSection)
{
// 求上一段的绝对时间
int nPreSectionTimePercent = (i <= 0) ? 0 : pInfo->nTimePercent[i - 1];
int nPreSectionTime = timeCost * nPreSectionTimePercent / 100;
// 此段的间隔时间
int nSectionTime = timeCost * pInfo->nTimePercent[i] / 100 - nPreSectionTime;
// 当前时间在段时间中的百分比例, 注意加上0.5是为了4舍5入
int nSectionPassTimePercent = 0.5f + 100.0f * (timePass - nPreSectionTime) / __max(1, nSectionTime);
if (nSectionPassTimePercent > 100)
nSectionPassTimePercent = 100;
// 上一段的位移百分比
int nPreSectionMovePercent = (i <= 0) ? 0 : pInfo->nMovePercent[i - 1];
// 求出当前时间的位移百分比
int nMovePercent = nPreSectionMovePercent + (pInfo->nMovePercent[i] - nPreSectionMovePercent) * nSectionPassTimePercent / 100;
// 得出当前世界坐标
DOUBLE dbChangeX = 1.0 * nDeltaX * nMovePercent / 100;
DOUBLE dbChangeY = 1.0 * nDeltaY * nMovePercent / 100;
m_Info.posWorld.x = m_Info.posActionBegin.x + ::Double2Int(dbChangeX);
m_Info.posWorld.y = m_Info.posActionBegin.y + ::Double2Int(dbChangeY);
}
else
{
m_Info.posWorld = m_Info.posActionEnd;
}
}
else
{
DOUBLE dbChangeX =1.0*nDeltaX*timePass/timeCost;
DOUBLE dbChangeY =1.0*nDeltaY*timePass/timeCost;
m_Info.posWorld.x =m_Info.posActionBegin.x + ::Double2Int(dbChangeX);
m_Info.posWorld.y =m_Info.posActionBegin.y + ::Double2Int(dbChangeY);
}
DOUBLE dbChangeZ =1.0*nDeltaZ*timePass/timeCost;
m_Info.nZ =m_Info.nPosActionBeginZ + ::Double2Int(dbChangeZ);
if(m_Info.nZ != 0)
int fdafa=1;
}
else
{
}
// get map pos according world pos
g_objGameMap.World2Cell(m_Info.posWorld.x, m_Info.posWorld.y, m_Info.posMap.x, m_Info.posMap.y);
// get screen pos of role
g_objGameMap.World2Screen(m_Info.posWorld.x, m_Info.posWorld.y, m_Info.posScr.x, m_Info.posScr.y);
// shall we show the last frame of action?
if(m_Info.cmdProc.nFrameEnd != 0 && m_Info.cmdProc.nFrameStart < m_Info.cmdProc.nFrameEnd
&& m_Info.iActFrameIndex >= m_Info.cmdProc.nFrameEnd)
{
// map 3d effect of action
int nTerrain = g_objGameMap.GetTerrain(m_Info.posMap);
const ActionMapEffectInfo* pInfo = g_obj3DRoleData.GetActionMapEffect(m_Info.usLook, m_Info.iActType, nTerrain);
if (pInfo && pInfo->nShowTime == 1) // effect show at end of action
{
if (pInfo->nType == 0)
{
C3DMapEffect* pEffect = g_objGameMap.Add3DMapEffect(m_Info.posWorld, (char*)pInfo->szEffect);
if(pEffect && pInfo->bRotate)
{
pEffect->SetDir(pInfo->bRotate);
}
}
else if (pInfo->nType == 1)
{
m_objEffect.Add((char*)pInfo->szEffect,pInfo->bRotate,this->GetDir(),this->GetLook());
}
}
{
m_Info.bAdjustDir = false;
return true;
}
}
else
if(m_Info.iActFrameIndex >= m_Info.iActFrameAmount)
{
// map 3d effect of action
int nTerrain = g_objGameMap.GetTerrain(m_Info.posMap);
const ActionMapEffectInfo* pInfo = g_obj3DRoleData.GetActionMapEffect(m_Info.usLook, m_Info.iActType, nTerrain);
if (pInfo && pInfo->nShowTime == 1) // effect show at end of action
{
if (pInfo->nType == 0)
{
C3DMapEffect* pEffect = g_objGameMap.Add3DMapEffect(m_Info.posWorld, (char*)pInfo->szEffect);
if(pEffect && pInfo->bRotate)
{
pEffect->SetDir(pInfo->bRotate);
}
}
else if (pInfo->nType == 1)
{
m_objEffect.Add((char*)pInfo->szEffect,pInfo->bRotate,this->GetDir(),this->GetLook());
}
}
{
m_Info.bAdjustDir = false;
return true;
}
}
else
return false;
}
//--------------------------------------------------------------
// return true if accomplished the command processed
BOOL CRole::ProcessCommand(void)
{
if (m_Info.cmdProc.iStatus == _CMDSTATUS_ACCOMPLISH)
{
// set default cmd
if(m_Info.nFlyOffset == 0)
m_Info.cmdProc.iType = _COMMAND_STANDBY;
else
m_Info.cmdProc.iType = _COMMAND_FLOAT;
m_Info.cmdProc.iStatus = _CMDSTATUS_BEGIN;
}
BOOL bAccomlished =true;
switch(m_Info.cmdProc.iType)
{
case _COMMAND_WALK:
bAccomlished =Walk();
break;
case _COMMAND_RUN:
bAccomlished =Run();
break;
case _COMMAND_JUMP:
bAccomlished =Jump();
break;
case _COMMAND_FOLLOW:
bAccomlished =Follow();
break;
case _COMMAND_EMOTION:
bAccomlished =Emotion();
break;
case _COMMAND_POSE:
bAccomlished =Pose();
break;
case _COMMAND_INTONE:
case _COMMAND_ACTION:
bAccomlished =Action();
break;
case _COMMAND_ATTACK:
case _COMMAND_SPATTACK:
bAccomlished =Attack();
break;
case _COMMAND_LOCKBOOTH:
bAccomlished =LockBooth();
break;
case _COMMAND_LOCKATK:
bAccomlished =LockAtk();
break;
case _COMMAND_BUMP:
bAccomlished =Bump();
break;
case _COMMAND_TEAMFOLLOW:
bAccomlished =TeamFollow();
break;
case _COMMAND_RUSHATK:
bAccomlished =RushAtk();
break;
case _COMMAND_DIE:
bAccomlished =Die();
break;
case _COMMAND_WALKFORWARD:
bAccomlished =WalkForward();
break;
case _COMMAND_RUNFORWARD:
bAccomlished =RunForward();
break;
case _COMMAND_PICKUP:
bAccomlished =PickUp();
break;
/* case _COMMAND_INTONE:
bAccomlished =InTone();
break;
*/
case _COMMAND_MINE:
bAccomlished =Mine();
break;
case _COMMAND_TAKEOFF:
bAccomlished =TakeOff();
break;
case _COMMAND_LANDING:
bAccomlished =Landing();
break;
case _COMMAND_FLOAT:
bAccomlished =Float();
break;
case _COMMAND_KONGFU:
bAccomlished =Kongfu();
break;
default:
bAccomlished =StandBy();
break;
}
/*
if (bAccomlished)
this->ClrRushPos();
*/
return bAccomlished;
}
//--------------------------------------------------------------
void CRole::Process(void* pInfo)
{
this->ProcessAniEffect();
if (this->ProcessAction())
{
this->ProcessCommand();
this->SetActionData();
}
if (this->GetActionType() == _ACTION_WALKL ||
this->GetActionType() == _ACTION_WALKR ||
this->GetActionType() == _ACTION_RUNL ||
this->GetActionType() == _ACTION_RUNR)
{
CMyPos posCurrent = m_Info.posMap;
CMyPos posPreStep;
int nDir = this->GetDir();
if(nDir > 3)
g_objGameMap.World2Cell(m_Info.posActionEnd.x, m_Info.posActionEnd.y, posPreStep.x, posPreStep.y);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -