📄 heromagic.cpp
字号:
if (!pMagic)
{
const OBJID idMagicTypeError = 100056;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicTypeError));
return;
}
if(pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC )
{
if (g_objHero.GetTeamMemberAmount() < 3)
{
g_objGameMsg.AddMsg((char*)g_objGameDataSet.GetStr(100171)); //结界需要有3人以上的组队方可使用
return;
}
if (!g_objHero.IsTeamLeader())
return;
}
if(g_objGameMap.GetType() & MAPTYPE_BOOTH_ENABLE)
{
if(!pMagic->m_infoMagicType.dwCanBeusedInMarket)
return;
}
CMyPos posTarget;
CPlayer* pTarget = g_objPlayerSet.GetPlayer(idPlayer);
if (!pTarget && idPlayer == this->GetID())
pTarget = this;
if(!pTarget)
return;
if(pTarget->TestStatus(USERSTATUS_PK_PROTECT))
return;
if(pMagic->m_infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP ||
(pMagic->m_infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_STATUS &&
!pMagic->m_infoMagicType.dwCrime))
{
if(!pTarget->IsPlayer() && !(pTarget->GetID() == g_objHero.GetID()) )
return;
}
pTarget->GetPos(posTarget.x, posTarget.y);
this->Direction(posTarget.x, posTarget.y);
CMyPos posHero;
this->GetPos(posHero);
if(!g_objGameMap.IsPkRegion(posHero) && pMagic->m_infoMagicType.dwCrime && pTarget->IsPlayer()) //禁止pk区域检测
{
const OBJID idStr = 100157;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(100157));
return;
}
this->BeginChangeUp(pMagic->GetIDType(), pMagic->GetLevel());
if(pMagic->m_infoMagicType.dwActionSort == MAGICSORT_DANCE)
{
const OBJID idDance = 100030;
if(this->GetLWeapon() == ID_NONE && this->GetRWeapon() == ID_NONE)
this->Emotion(pMagic->m_infoMagicType.dwSenderAction);
else
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(100030));
return;
}
if (pMagic->GetWeaponRequired() != 0)
{
CItem* pWeaponR = this->GetEquipment(ITEMPOSITION_WEAPONR);
CItem* pWeaponL = this->GetEquipment(ITEMPOSITION_WEAPONL);
BOOL bCanUse = FALSE;
if ((pWeaponR && pWeaponR->GetWeaponSkillType() == pMagic->GetWeaponRequired())
|| (pWeaponL && pWeaponL->GetWeaponSkillType() == pMagic->GetWeaponRequired()))
{
bCanUse = TRUE;
}
if (pMagic->GetWeaponRequired() == 400
&& ((pWeaponR && (pWeaponR->GetWeaponSkillType () == 410 || pWeaponR->GetWeaponSkillType () == 420) )
|| ( pWeaponL && (pWeaponL->GetWeaponSkillType () == 410 || pWeaponL->GetWeaponSkillType () == 420))))
{
bCanUse = TRUE;
}
if (bCanUse == FALSE)
return;
}
if(pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TRANSFORM)
{
m_dwBeginUseTransformMagicTime = ::TimeGet();
}
int nManaCost = pMagic->m_infoMagicType.dwMpCost;
if (this->GetData(CPlayer::_PLAYER_MANA) < nManaCost)
{
OBJID idLowPower = 100057;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idLowPower));
return;
}
int nPotential = pMagic->m_infoMagicType.dwPotential;
if (this->GetPotential() < nPotential)
{
OBJID idLowPotential = 100166;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idLowPotential));
return;
}
int nPhysicalForceCost = pMagic->m_infoMagicType.dwUsePP;
if (this->GetPhysicalForce() < nPhysicalForceCost)
{
OBJID idLowPP = 100118;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idLowPP));
return;
}
if(!pMagic->IsEnable())
{
OBJID idMagicAttackToFast = 100055;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicAttackToFast));
return;
}
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(idPlayer);
if (!pPlayer)
{
if (pMagic->TestTarget(MAGIC_TARGET_SELF)
|| pMagic->TestTarget(MAGIC_TARGET_NONE)
|| pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC)
{
if (this->GetID() == idPlayer)
pPlayer = this;
}
if (!pPlayer)
{
OBJID idErrorTarget = 100059;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idErrorTarget));
return;
}
}
const OBJID idGuard = 100028;
if (pPlayer->IsNpc() && strstr(pPlayer->GetName(), g_objGameDataSet.GetStr(idGuard)))
{
if (!(bForce && PKMODE_FREE == this->GetPkMode()))
{
const OBJID idCanNotPkGuard = 100029;
g_objGameMsg.AddMsg(_TXTATR_SYSTEM, g_objGameDataSet.GetStr(idCanNotPkGuard));
return;
}
}
// target check
CONST MAGIC_REBORN = 2009;
CONST XP_GETSOUL = 3012; //收魂技能
if (pPlayer->IsDead() && XP_GETSOUL != idMagicType && MAGIC_REBORN != idMagicType &&
!(pMagic->m_infoMagicType.dwTarget&PLAYER_INCLUDEDEADMONSTER))
{
OBJID idErrorTarget = 100060;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idErrorTarget));
return;
}
if (pPlayer->IsNpc() && MAGIC_REBORN == idMagicType)
{
OBJID idErrorTarget = 100060;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idErrorTarget));
return;
}
if (pPlayer->IsPlayer() && (pMagic->m_infoMagicType.dwTarget&PLAYER_INCLUDEDEADMONSTER))
{
OBJID idErrorTarget = 100060;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idErrorTarget));
return;
}
if ((pPlayer->TestStatus(USERSTATUS_DISAPPEARING)|| !pPlayer->TestStatus(USERSTATUS_DIE)) && (pMagic->m_infoMagicType.dwTarget&PLAYER_INCLUDEDEADMONSTER))
{
OBJID idErrorTarget = 100060;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idErrorTarget));
return;
}
// ....
if (pMagic->m_infoMagicType.dwCrime
&& !this->CanPk(pPlayer)
&& (!bForce || this->GetPkMode() != PKMODE_FREE) && pPlayer->GetID() != g_objHero.GetID())
{
OBJID idCanNotPk = 100061;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idCanNotPk));
return;
}
posHero = this->GetAlignPos();
pPlayer->GetPos(posTarget);
int nRange = pMagic->m_infoMagicType.dwDistance;
//nRange += g_objHero.GetAddSize() + g_objHero.GetAtkRange() + (pPlayer->GetAddSize() + 1)/2;
if (abs(posTarget.x - posHero.x) > nRange || abs(posTarget.y - posHero.y) > nRange)
{
OBJID idNoTarget = 100058;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idNoTarget));
return;
}
switch(idMagicType)
{
case 1015:
{
//const OBJID idMagicNote = 100063;
//g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicNote));
}
break;
case 1020:
{
//const OBJID idMagicNote = 100064;
//g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicNote));
}
break;
default:
this->Stop();
break;
}
int nPosX, nPosY;
this->GetPos(nPosX, nPosY);
/*
if (this->IsMoving())
nPosX = nPosY = 0;
*/
if(pMagic->m_infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_HP ||
pMagic->m_infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_STATUS ||
pMagic->m_infoMagicType.dwActionSort == MAGICSORT_LINE_PENETRABLE)
{
nPosX = posTarget.x;
nPosY = posTarget.y;
}
int nLevel = pMagic->m_infoMagicType.dwLevel;
CMsgInteract msg;
OBJID idUser = this->GetID();
unsigned short usMagicType = (unsigned short)idMagicType;
OBJID idTarget = idPlayer;
int nMyPosX = nPosX;
int nMyPosY = nPosY;
ENCODE_MAGICATTACK(idUser, usMagicType, idTarget, nMyPosX, nMyPosY)
if (msg.Create( INTERACT_MAGICATTACK,
idUser, idTarget,
nMyPosX, nMyPosY,
usMagicType, (unsigned short)nLevel, idPlayer))
msg.Send();
m_objEffect.Add(pMagic->m_infoMagicType.szIntoneEffect,false,0,this->GetLook());
this->StartMagicBusy(pMagic->m_infoMagicType.dwIntoneDuration+pMagic->m_infoMagicType.dwMagicBreak + 3000);
if(pMagic->m_infoMagicType.dwSenderAction == _ACTION_INTONE_DURATION )
{
CCommand cmd;
cmd.iType =_COMMAND_EMOTION;
cmd.iStatus =_CMDSTATUS_BEGIN;
cmd.nData =_ACTION_INTONE;
cmd.bHeroSendMsg=false;
if(pTarget)
{
CMyPos posSender, posTarget;
g_objHero.GetPos(posSender);
pTarget->GetPos(posTarget);
cmd.nDir = (g_objGameMap.GetDirection(posSender.x, posSender.y, posTarget.x, posTarget.y)+1)%7;
}
g_objHero.SetCommand(&cmd);
}
}
//------------------------------------------------------------------
void CHero::ProcessMagicBusy()
{
if(!m_bMagicAttackBusy)
return;
if(::TimeGet() >= m_dwMagicAttackBegin + m_dwMagicAttackBusy)
this->EndMagicBusy();
}
//------------------------------------------------------------------
CMagic* CHero::GetMagic(OBJID idType)
{
int nAmount = m_setMagic.size();
for(int i = 0; i < nAmount; i ++)
{
CMagic* pMagic = m_setMagic[i];
if(pMagic && (pMagic->m_infoMagicType.idMagicType == idType))
{
return pMagic;
}
}
return NULL;
}
//------------------------------------------------------------------
int CHero::GetXpSkillAmount()
{
int nMagicAmount = 0;
int nAmount = m_setMagic.size();
for(int i = 0; i < nAmount; i ++)
{
CMagic* pMagic = m_setMagic[i];
if(pMagic && pMagic->m_infoMagicType.dwXp == TYPE_XPSKILL)
{
nMagicAmount ++;
}
}
return nMagicAmount;
}
//------------------------------------------------------------------
CMagic* CHero::GetXpSkillByIndex(int nIndex)
{
if(nIndex < 0)
return NULL;
int nXpAmount = 0;
int nAmount = m_setMagic.size();
for(int i = 0; i < nAmount; i ++)
{
CMagic* pMagic = m_setMagic[i];
if(pMagic && pMagic->m_infoMagicType.dwXp == TYPE_XPSKILL)
{
if(nXpAmount == nIndex)
return pMagic;
nXpAmount ++;
}
}
return NULL;
}
//------------------------------------------------------------------
int CHero::GetKongfuAmount()
{
int nMagicAmount = 0;
int nAmount = m_setMagic.size();
for(int i = 0; i < nAmount; i ++)
{
CMagic* pMagic = m_setMagic[i];
if(pMagic && pMagic->m_infoMagicType.dwXp == TYPE_KONGFU)
{
nMagicAmount ++;
}
}
return nMagicAmount;
}
//------------------------------------------------------------------
CMagic* CHero::GetKongfuByIndex(int nIndex)
{
if(nIndex < 0)
return NULL;
int nKongfuAmount = 0;
int nAmount = m_setMagic.size();
for(int i = 0; i < nAmount; i ++)
{
CMagic* pMagic = m_setMagic[i];
if(pMagic && pMagic->m_infoMagicType.dwXp == TYPE_KONGFU)
{
if (nKongfuAmount == nIndex)
return pMagic;
nKongfuAmount++;
}
}
return NULL;
}
//------------------------------------------------------------------
void CHero::ProcessMagic()
{
BOOL bFlash = false;
const _SHIELD_SUBTYPE = 900;
int nAmount, i;
nAmount = this->GetMagicAmount();
for(i = 0; i < nAmount; i ++)
{
CMagic* pMagic = this->GetMagicByIndex(i);
if(!pMagic)
continue;
if(pMagic->Process())
{
bFlash = true;
}
}
nAmount = this->GetXpSkillAmount();
for(i = 0; i < nAmount; i ++)
{
CMagic* pMagic = this->GetXpSkillByIndex(i);
if(!pMagic)
continue;
if(pMagic->Process())
{
bFlash = true;
}
}
nAmount = this->GetKongfuAmount();
for(i = 0; i < nAmount; i ++)
{
CMagic* pMagic = this->GetKongfuByIndex(i);
if(!pMagic)
continue;
if(pMagic->Process())
{
bFlash = true;
}
}
if(bFlash)
::PostCmd(CMD_FLASH_MAGIC_STATUS);
}
//------------------------------------------------------------------
void CHero::AbortTransform()
{
CMsgAction msg;
if(msg.Create(this->GetID(), 0, 0, 0, actionAbortTransform))
msg.Send();
}
//------------------------------------------------------------------
void CHero::BeginChangeUp(OBJID idMagicType, DWORD dwDelay)
{
// todo ...
// MagicTypeInfo info;
// if(!CMagic::s_objMagicData.GetMagicTypeInfo(idMagicType, dwDelay, info))
// {
// m_bChargeUp = false;
// return;
// }
// if(!(info.dwStatus & USERSTATUS_CHARGEUP))
//// {
//// m_bChargeUp = false;
//// return;
//// }
// m_bChargeUp = true;
// m_dwTimeChargeUp = ::TimeGet();
// const DWORD dwNatworkDelay = 500;
// m_dwChargeUpTotalTime = info.dwIntoneDuration+dwNatworkDelay;
}
//------------------------------------------------------------------
void CHero::AbortChargeUp()
{
CMsgAction msg;
if(msg.Create(g_objHero.GetID(), 0, 0, this->GetDir(), actionDischarge))
msg.Send();
}
//------------------------------------------------------------------
void CHero::ShowChargeUp()
{
const int nBgSize = 64;
const int nBarLength = 49;
const int nBarHeight = 9;
const int nBarOffsetX = 7;
const int nBarOffsetY = 27;
const DWORD dwBarColor = 0xff31A2FF;
if(m_bChargeUp)
{
// get ani
CAni* pAni = g_objGameDataSet.GetDataAni("ani/common.ani", "ChargeUp");
if(!pAni)
return;
// get the current length of bar
if(m_dwChargeUpTotalTime == 0)
m_dwChargeUpTotalTime = 1;
int nCurrentLength = nBarLength * (::TimeGet() - m_dwTimeChargeUp)/m_dwChargeUpTotalTime;
if(nCurrentLength > nBarLength)
nCurrentLength = nBarLength;
// get ani show pos
CMyPos posShow;
int nNameShowOffset = (OFFSET_NAMESHOW+80)*g_objGameMap.GetScale()/_NORMAL_SCALE;
int nShowX =m_Info.posScr.x-nBgSize/2;
int nShowY =m_Info.posScr.y-nNameShowOffset;
posShow.x = nShowX;
posShow.y = nShowY-this->GetOffsetY();
// set frame
int nFrame = 0;
// if(this->TestStatus(USERSTATUS_CHARGEUP))
// {
// nFrame = 1;
// nCurrentLength = nBarLength;
// }
pAni->Show(nFrame, posShow.x, posShow.y);
CMyBitmap::ShowBlock(posShow.x+nBarOffsetX, posShow.y+nBarOffsetY,
posShow.x+nBarOffsetX+nCurrentLength, posShow.y+nBarOffsetY+nBarHeight, dwBarColor);
}
}
//------------------------------------------------------------------
void CHero::StopChargeUp()
{
m_bChargeUp = false;
}
//--------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -