📄 magiceffect.cpp
字号:
pPlayer->ResetStepDir();
if(infoMagicType.dwSenderAction == _ACTION_INTONE_DURATION)
infoMagicType.dwSenderAction = _ACTION_INTONE_LAUNCH;
CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget);
if(infoMagicType.dwSenderAction != 0)
{
if(infoMagicType.idNextMagic != ID_NONE)
pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, true);
else
pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, false);
}
}
if(strcmp(infoMagicType.szSenderSound, "NULL") != 0)
{
CMyPos posWorld;
pPlayer->GetWorldPos(posWorld);
::DXPlaySound(infoMagicType.szSenderSound, posWorld.x, posWorld.y, nRange);
}
}
this->BeginScreenEffect(infoMagicType.dwScreenRepresent);
m_bBegin = true;
m_dwMoment = 0;
}
if(::TimeGet() - m_dwBegin >= infoMagicType.dwTargetDelay && m_dwMoment == 0)
{
for(int i = 0; i < m_setRoleInfo.size(); i++)
{
MagicEffectRoleInfo* pRoleInfo = m_setRoleInfo[i];
if(!pRoleInfo)
continue;
CPlayer* pPlayer= g_objPlayerSet.GetPlayer(pRoleInfo->idRole, true);
if(pPlayer)
{
if(strcmp(infoMagicType.szTargetEffect, "NULL") != 0)
{
pPlayer->m_objEffect.Add(infoMagicType.szTargetEffect,false,0,pPlayer->GetLook());
}
}
}
m_dwMoment = 1;
}
if(::TimeGet() - m_dwBegin >= infoMagicType.dwTargetDelay + infoMagicType.dwTargetWoundDelay)
{
for(int i = 0; i < m_setRoleInfo.size(); i++)
{
MagicEffectRoleInfo* pRoleInfo = m_setRoleInfo[i];
if(!pRoleInfo)
continue;
CPlayer* pPlayer= g_objPlayerSet.GetPlayer(pRoleInfo->idRole, true);
if(pPlayer)
{
if((infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_CROSS_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SECTOR_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_ROUND_HP))
if(!pPlayer->TestStatus(USERSTATUS_DIE) && !pPlayer->IsMoving() && infoMagicType.dwSenderAction != 0)
{
pPlayer->ResetStepDir();
pPlayer->SetIntoneCmd(_ACTION_BRUISE0, pPlayer->GetDir());
}
DWORD dwColor = _COLOR_YELLOW;
if (pPlayer->GetID() == g_objHero.GetID())
dwColor = _COLOR_RED;
if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
dwColor = 0xff33ff33;
// 万箭穿心
if(infoMagicType.idMagicType/10 == 1006
|| infoMagicType.idMagicType/10 == 1005
|| infoMagicType.idMagicType/10 == 1007)
{
int nAmount = infoMagicType.idMagicType%10+2;
for(int j = 0; j < nAmount; j ++)
{
if(j != nAmount-1)
{
if (pPlayer->IsGuard())
dwColor = _COLOR_BLUE;
pPlayer->AddZoomNum(pRoleInfo->dwData/nAmount, dwColor, 300*j);
}
else
{
if (pPlayer->IsGuard())
dwColor = _COLOR_BLUE;
pPlayer->AddZoomNum(pRoleInfo->dwData-
(nAmount-1)*(pRoleInfo->dwData/nAmount),
dwColor, 100*i);
}
}
}
else
{
if(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_STATUS ||
infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_STATUS ||
infoMagicType.dwActionSort == MAGICSORT_ATTRACK_MONSTER)
{
}
else
{
if (pPlayer->IsGuard())
dwColor = _COLOR_BLUE;
pPlayer->AddZoomNum(pRoleInfo->dwData, dwColor, 100);
}
}
BOOL bAddLife = false;
if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
bAddLife = true;
if(pPlayer->GetID() != g_objHero.GetID())
{
if(!bAddLife)
pPlayer->SetData(CPlayer::_PLAYER_LIFE, __max(0, (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)-(int)pRoleInfo->dwData));
else
pPlayer->SetData(CPlayer::_PLAYER_LIFE, __min((int)pPlayer->GetMaxLife(), (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)+(int)pRoleInfo->dwData));
}
if (strcmp(infoMagicType.szTargetSound, "NULL") != 0)
{
CMyPos posWorld;
pPlayer->GetWorldPos(posWorld);
::DXPlaySound(infoMagicType.szTargetSound, posWorld.x, posWorld.y, nRange);
}
}
}
return true;
}
return false;
}
//----------------------------------------------------------------------------------------
BOOL CMagicEffect::CreateTerrain(OBJID idSender, CMyPos posTarget, DWORD dwMagicType, DWORD dwLevel)
{
m_idSender = idSender;
m_posTarget = posTarget;
m_dwMagicType = dwMagicType;
m_dwLevel = dwLevel;
m_nType = MAGICEFFECT_BODY_TERRAIN_BODY;
return true;
}
//----------------------------------------------------------------------------------------
CMagicEffect* CMagicEffect::CreateNewTerrain(OBJID idSender, CMyPos posTarget, DWORD dwMagicType, DWORD dwLevel)
{
CMagicEffect* pEffect = new CMagicEffect;
MYASSERT(pEffect);
if(!pEffect->CreateTerrain(idSender, posTarget, dwMagicType, dwLevel))
{
SAFE_DELETE(pEffect);
return NULL;
}
return pEffect;
}
//----------------------------------------------------------------------------------------
BOOL CMagicEffect::ProcessBodyTerrainBody()
{
MagicTypeInfo infoMagicType;
if(!CMagic::s_objMagicData.GetMagicTypeInfo(m_dwMagicType, m_dwLevel, infoMagicType))
return true;
const int nRange = 3000;
if(!m_bBegin)
{
m_dwBegin = ::TimeGet();
CPlayer* pPlayer= g_objPlayerSet.GetPlayer(m_idSender, true);
if(pPlayer)
{
if(strcmp(infoMagicType.szSenderEffect, "NULL") != 0)
{
pPlayer->m_objEffect.Add(infoMagicType.szSenderEffect,false,0,pPlayer->GetLook());
}
if(infoMagicType.dwSenderAction != 0)
if(!pPlayer->IsDead() )
{
if(infoMagicType.dwSenderAction == _ACTION_INTONE_DURATION)
infoMagicType.dwSenderAction = _ACTION_INTONE_LAUNCH;
pPlayer->ResetStepDir();
CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget);
if(infoMagicType.idNextMagic != ID_NONE)
pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pPlayer->GetDir(), 0, true);
else
pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pPlayer->GetDir(), 0, false);
}
if(strcmp(infoMagicType.szSenderSound, "NULL") != 0)
{
CMyPos posWorld;
pPlayer->GetWorldPos(posWorld);
::DXPlaySound(infoMagicType.szSenderSound, posWorld.x, posWorld.y, nRange);
}
// transport
CONST MAGICTYPE_TRASNPORT = 1080;
if (MAGICTYPE_TRASNPORT == infoMagicType.idMagicType)
{
pPlayer->SetPos(m_posTarget);
if (pPlayer->GetID() == g_objHero.GetID())
g_objHero.SetAlignPos(m_posTarget.x, m_posTarget.y);
}
}
// 直线攻击不走地效魔法
if(infoMagicType.dwActionSort == MAGICSORT_LINE)
{
CInteractiveLayer* pLayer = g_objGameMap.GetInteractiveLayer();
if (!pLayer)
return true;
CMyPos posBegin;
pPlayer->GetWorldPos(posBegin);
CMyPos posWorld;
g_objGameMap.Cell2World(m_posTarget.x, m_posTarget.y, posWorld.x, posWorld.y);
C3DMapEffect* pObj = C3DMapEffect::CreateNew(posBegin, infoMagicType.szGroundEffect);
if(pObj)
{
pLayer->AddMapObj(pObj);
CMy3DPos posMyBegin, posMyEnd;
CMy3DDir dir3D;
posMyBegin.x = posBegin.x;
posMyBegin.y = posBegin.y;
posMyBegin.z = 0;
posMyEnd.x = posWorld.x;
posMyEnd.y = posWorld.y;
posMyEnd.z = 0;
CPhysics::S3Get3DDir(posMyBegin, posMyEnd, dir3D);
pObj->SetRotate(dir3D.fHorizontal+1.57, dir3D.fVertical);
}
}
else
{
// 添加地效魔法对象
char szDir[]="ini/tme/";
char szFile[_MAX_PATH];
sprintf(szFile, "%s%s", szDir, infoMagicType.szGroundEffect);
CTerainEffectUnit* pUnit = CTerainEffectUnit::CreateNew(szFile);
if(pUnit)
{
CMyPos posWorld;
g_objGameMap.Cell2World(m_posTarget.x, m_posTarget.y, posWorld.x, posWorld.y);
pUnit->SetPos(posWorld);
// 判断是不是方向魔法
if(infoMagicType.dwActionSort == MAGICSORT_LINE ||
MAGIC_SORT_ATTACK_CROSS_HP == infoMagicType.dwActionSort ||
MAGIC_SORT_ATTACK_SECTOR_HP == infoMagicType.dwActionSort)
{
CMyPos posSender;
CPlayer* pPlayer= g_objPlayerSet.GetPlayer(m_idSender);
if(!pPlayer && (m_idSender == g_objHero.GetID()))
pPlayer = &g_objHero;
if(pPlayer)
pPlayer->GetWorldPos(posSender);
pUnit->SetPos(posSender);
pUnit->Rotate(posSender, posWorld);
if(pPlayer)
{
CMyPos posPlayer;
pPlayer->GetPos(posPlayer);
//int nDir = g_objGameMap.GetDirection(posPlayer.x, posPlayer.y, m_posTarget.x, m_posTarget.y);
pUnit->SetDir(m_nDir);
}
}
g_objGameMap.AddTerrainMagicUnit(pUnit);
}
}
this->BeginScreenEffect(infoMagicType.dwScreenRepresent);
m_bBegin = true;
}
if(::TimeGet() - m_dwBegin >= infoMagicType.dwTargetDelay)
{
for(int i = 0; i < m_setRoleInfo.size(); i++)
{
MagicEffectRoleInfo* pRoleInfo = m_setRoleInfo[i];
if(!pRoleInfo)
continue;
CPlayer* pPlayer= g_objPlayerSet.GetPlayer(pRoleInfo->idRole);
if(!pPlayer && (pRoleInfo->idRole == g_objHero.GetID()))
pPlayer = &g_objHero;
if(pPlayer)
{
if((infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_CROSS_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SECTOR_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_ROUND_HP))
if(!pPlayer->TestStatus(USERSTATUS_DIE) && !pPlayer->IsMoving() && infoMagicType.dwSenderAction != 0)
{
pPlayer->ResetStepDir();
pPlayer->SetIntoneCmd(_ACTION_BRUISE0, pPlayer->GetDir());
}
if(strcmp(infoMagicType.szTargetEffect, "NULL") != 0)
{
pPlayer->m_objEffect.Add(infoMagicType.szTargetEffect,false,0,pPlayer->GetLook());
}
DWORD dwColor = _COLOR_YELLOW;
if (pPlayer->GetID() == g_objHero.GetID())
dwColor = _COLOR_RED;
if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
dwColor = 0xff33ff33;
if(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_STATUS ||
infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_STATUS)
{
}
else
{
if (pPlayer->IsGuard())
dwColor = _COLOR_BLUE;
pPlayer->AddZoomNum(pRoleInfo->dwData, dwColor, 100);
}
BOOL bAddLife = false;
if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
bAddLife = true;
if(pPlayer->GetID() != g_objHero.GetID())
{
if(!bAddLife)
pPlayer->SetData(CPlayer::_PLAYER_LIFE, __max(0, (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)-(int)pRoleInfo->dwData));
else
pPlayer->SetData(CPlayer::_PLAYER_LIFE, __min((int)pPlayer->GetMaxLife(), (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)+(int)pRoleInfo->dwData));
}
if (strcmp(infoMagicType.szTargetSound, "NULL") != 0)
{
CMyPos posWorld;
pPlayer->GetWorldPos(posWorld);
::DXPlaySound(infoMagicType.szTargetSound, posWorld.x, posWorld.y, nRange);
}
}
}
return true;
}
return false;
}
//----------------------------------------------------------------------------------------
BOOL CMagicEffect::ProcessBodyTraceBody()
{
MagicTypeInfo infoMagicType;
if(!CMagic::s_objMagicData.GetMagicTypeInfo(m_dwMagicType, m_dwLevel, infoMagicType))
return true;
const int nRange = 3000;
if(!m_bBegin)
{
m_dwBegin = ::TimeGet();
CPlayer* pPlayer= g_objPlayerSet.GetPlayer(m_idSender);
if(!pPlayer && (m_idSender == g_objHero.GetID()))
pPlayer = &g_objHero;
if(pPlayer)
{
if(strcmp(infoMagicType.szSenderEffect, "NULL") != 0)
{
pPlayer->m_objEffect.Add(infoMagicType.szSenderEffect,false,0,pPlayer->GetLook());
}
if(infoMagicType.dwSenderAction != 0)
if(!pPlayer->IsDead())
{
pPlayer->ResetStepDir();
CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget);
if(infoMagicType.dwSenderAction == _ACTION_INTONE_DURATION)
infoMagicType.dwSenderAction = _ACTION_INTONE_LAUNCH;
if(infoMagicType.idNextMagic != ID_NONE)
pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, true);
else
pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, false);
}
if(strcmp(infoMagicType.szSenderSound, "NULL") != 0)
{
CMyPos posWorld;
pPlayer->GetWorldPos(posWorld);
::DXPlaySound(infoMagicType.szSenderSound, posWorld.x, posWorld.y, nRange);
}
}
// 添加3DMapEffect
CMyPos posWorld, posCell;
pPlayer->GetPos(posCell);
g_objGameMap.Cell2World(posCell.x, posCell.y, posWorld.x, posWorld.y);
m_posBegin = posWorld;
CInteractiveLayer* pLayer = g_objGameMap.GetInteractiveLayer();
if (!pLayer)
return true;
C3DMapEffect* pObj = C3DMapEffect::CreateNew(m_posBegin, infoMagicType.szTraceEffect, false);
if(pObj)
{
pLayer->AddMapObj(pObj);
}
m_pData = pObj;
m_bBegin = true;
this->BeginScreenEffect(infoMagicType.dwScreenRepresent);
pPlayer = g_objPlayerSet.GetPlayer(m_idTarget, true);
if(!pPlayer)
{
pObj->Die();
pObj = NULL;
return true;
}
CMyPos posEnd;
CMy3DPos posMyBegin, posMyEnd;
CMy3DDir dir3D;
posMyBegin.x = m_posBegin.x;
posMyBegin.y = m_posBegin.y;
posMyBegin.z = 0;
pPlayer->GetPos(posCell);
g_objGameMap.Cell2World(posCell.x, posCell.y, posEnd.x, posEnd.y);
posEnd.y += 50;
posMyEnd.x = posEnd.x;
posMyEnd.y = posEnd.y;
posMyEnd.z = 0;
CPhysics::S3Get3DDir(posMyBegin, posMyEnd, dir3D);
pObj->SetRotate(dir3D.fHorizontal+1.57, dir3D.fVertical);
return false;
}
C3DMapEffect* pObj = (C3DMapEffect*)m_pData;
if(!pObj)
return false;
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idTarget, true);
if(!pPlayer)
{
pObj->Die();
pObj = NULL;
return true;
}
// 加速画线到人身上 // 初速度 0 // 加速度 300 象素/秒
CMyPos posEnd, posCurrent, posCell;
int nV = 100;
float fA = (float)300;
DWORD dwTime = ::TimeGet() - m_dwBegin;
float fTime = dwTime*1.0/1000;
int nCurrentV = nV + fTime * fA;
float fCurrentTime = (::TimeGet() - m_dwBegin)*1.0/1000;;
pPlayer->GetPos(posCell);
g_objGameMap.Cell2World(posCell.x, posCell.y, posEnd.x, posEnd.y);
posEnd.y += 50;
CMy3DPos posMyBegin, posMyEnd;
CMy3DDir dir3D;
posMyBegin.x = m_posBegin.x;
posMyBegin.y = m_posBegin.y;
posMyBegin.z = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -