📄 heromagic.cpp
字号:
//------------------------------------------------------------------
// HeroMagic.cpp
//------------------------------------------------------------------
#include "Hero.h"
#include "MsgInteract.h"
#include "GamePlayerSet.h"
#include "GameMsg.h"
#include "GameDataSet.h"
#include "3dGameMap.h"
#include "AllMsg.h"
//------------------------------------------------------------------
void CHero::DestroyMagicSet()
{
int nAmount = m_setMagic.size();
for(int i = 0; i < nAmount; i ++)
{
CMagic* pMagic = m_setMagic[i];
SAFE_DELETE(pMagic);
}
m_setMagic.clear();
}
//------------------------------------------------------------------
void CHero::AddMagic(OBJID idMagic, DWORD dwLevel, DWORD dwExp)
{
int nAmount = m_setMagic.size();
int nInsertIndexAt = 0; //主动
int nInsertIndexPs = 0; //被动
int nInsertIndexXp = 0; //XP
int nInsertIndexTm = 0; //TEAM
for(int i = 0; i < nAmount; i ++)
{
CMagic* pMagic = m_setMagic[i];
if(pMagic && (pMagic->m_infoMagicType.idMagicType == idMagic))
{
MagicTypeInfo infoMagicType;
if(CMagic::s_objMagicData.GetMagicTypeInfo(idMagic, dwLevel, infoMagicType))
{
if (pMagic->m_infoMagicType.dwLevel < infoMagicType.dwLevel )
{
char szMsg[128] ="";
sprintf(szMsg, g_objGameDataSet.GetStr(100203), infoMagicType.szName);
g_objGameMsg.AddMsg(szMsg); //恭喜阁下***技能升级
m_objEffect.Add("magicup",false,0,this->GetLook()); //技能升级!
}
pMagic->m_infoMagicType = infoMagicType;
pMagic->m_dwExp = dwExp;
pMagic->m_idOwner = this->GetID();
}
return;
}
else
{
if (pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC)
{
nInsertIndexTm++;
}
else if (pMagic->TestTarget(MAGIC_PASSIVE))
{
nInsertIndexPs++;
}
else if (pMagic->m_infoMagicType.dwXp == TYPE_XPSKILL)
{
nInsertIndexXp++;
}
else
nInsertIndexAt++;
// nInsertIndex++;
}
}
CMagic* pMagic = CMagic::CreateNew(idMagic, dwLevel, dwExp);
// Magic 依照type排序
if(pMagic)
{
pMagic->m_idOwner = this->GetID();
if (pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC)
{
m_setMagic.insert(m_setMagic.begin() + nInsertIndexTm, pMagic);
}
else if (pMagic->TestTarget(MAGIC_PASSIVE))
{
m_setMagic.insert(m_setMagic.begin() + nInsertIndexTm+nInsertIndexAt+nInsertIndexPs, pMagic);
}
else if (pMagic->m_infoMagicType.dwXp == TYPE_XPSKILL)
{
if (!this->m_bXpSkillEnable)
m_bXpSkillEnable = TRUE;
m_setMagic.insert(m_setMagic.begin() + nInsertIndexTm+nInsertIndexAt+nInsertIndexPs+nInsertIndexXp, pMagic);
}
else
m_setMagic.insert(m_setMagic.begin() + nInsertIndexTm+nInsertIndexAt, pMagic);
// m_setMagic.insert(m_setMagic.begin() + nInsertIndex, pMagic);
}
else
{
char szTemp[256];
sprintf(szTemp, "Not found magic: id=%d, Lev=%d", idMagic, dwLevel);
g_objGameMsg.AddMsg(szTemp);
}
}
//------------------------------------------------------------------
int CHero::GetMagicAmount()
{
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_MAGIC
&& pMagic->m_infoMagicType.dwActionSort != MAGICSORT_TEAM_MAGIC)
{
nMagicAmount ++;
}
}
return nMagicAmount;
}
//------------------------------------------------------------------
int CHero::GetTeamMagicAmount()
{
int nTMagicAmount = 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_MAGIC
&& pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC)
{
nTMagicAmount ++;
}
}
return nTMagicAmount;
}
//------------------------------------------------------------------
CMagic* CHero::GetTeamMagicByIndex(int nIndex)
{
if(nIndex < 0)
return NULL;
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_MAGIC
&& pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC)
{
if(nMagicAmount == nIndex)
return pMagic;
nMagicAmount ++;
}
}
return NULL;
}
//------------------------------------------------------------------
CMagic* CHero::GetMagicByIndex(int nIndex)
{
if(nIndex < 0)
return NULL;
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_MAGIC
&& pMagic->m_infoMagicType.dwActionSort != MAGICSORT_TEAM_MAGIC)
{
if(nMagicAmount == nIndex)
return pMagic;
nMagicAmount ++;
}
}
return NULL;
}
//------------------------------------------------------------------
void CHero::MagicAttack(OBJID idMagicType, CMyPos posTarget)
{
if(idMagicType >= 30000)
return;
if(this->IsMagicLock())
return;
if(this->TestStatus(USERSTATUS_CANNOTMOVE))
return;
this->Direction(posTarget.x, posTarget.y);
CONST MAGIC_CIRCLEATK = 1115;
if (MAGIC_CIRCLEATK == idMagicType)
{
CItem* pWeaponR = this->GetEquipment(ITEMPOSITION_WEAPONR);
CItem* pWeaponL = this->GetEquipment(ITEMPOSITION_WEAPONL);
if (!(pWeaponR && pWeaponL
&& (pWeaponR->GetWeaponSkillType() == pWeaponL->GetWeaponSkillType())))
{
const OBJID idStr = 100117;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idStr));//"此技能必须双手相同类型武器才能使用。"
return;
}
}
if(m_bMagicAttackBusy)
{
OBJID idMagicAttackToFast = 100055;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicAttackToFast));
return;
}
CMagic* pMagic = this->GetMagic(idMagicType);
if (!pMagic)
{
const OBJID idMagicTypeError = 100056;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicTypeError));
return;
}
if(g_objGameMap.GetType() & MAPTYPE_BOOTH_ENABLE)
{
if(!pMagic->m_infoMagicType.dwCanBeusedInMarket)
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;
}
CMyPos posHero;
this->GetPos(posHero);
if(!g_objGameMap.IsPkRegion(posHero) && pMagic->m_infoMagicType.dwCrime)//禁止pk区域检测
{
const OBJID idStr = 100157;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(100157));
return;
}
this->BeginChangeUp(pMagic->GetIDType(), pMagic->GetLevel());
if (g_objGameMap.GetType() & MAPTYPE_BOOTH_ENABLE)
{
if(pMagic->m_infoMagicType.dwCrime)
return;
}
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;
}
if(pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TRANSFORM)
{
m_dwBeginUseTransformMagicTime = ::TimeGet();
}
int nPhysicalForceCost = pMagic->m_infoMagicType.dwUsePP;
if (this->GetPhysicalForce() < nPhysicalForceCost)
{
OBJID idLowPP = 100118;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idLowPP));
return;
}
int nRange = pMagic->m_infoMagicType.dwDistance;
//nRange += g_objHero.GetAddSize() + g_objHero.GetAtkRange();
posHero = this->GetAlignPos();
if (abs(posTarget.x - posHero.x) > nRange || abs(posTarget.y - posHero.y) > nRange)
{
OBJID idNoTarget = 100058;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idNoTarget));
return;
}
if(!pMagic->IsEnable())
{
OBJID idMagicAttackToFast = 100055;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicAttackToFast));
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;
}
int nLevel = pMagic->m_infoMagicType.dwLevel;
CMsgInteract msg;
OBJID idUser = this->GetID();
unsigned short usMagicType = (unsigned short)idMagicType;
OBJID idTarget = ID_NONE;
int nPosX = posTarget.x;
int nPosY = posTarget.y;
ENCODE_MAGICATTACK(idUser, usMagicType, idTarget, nPosX, nPosY)
if(msg.Create(INTERACT_MAGICATTACK, idUser, idTarget, nPosX, nPosY, usMagicType, (unsigned short)nLevel, ID_NONE))
msg.Send();
m_objEffect.Add(pMagic->m_infoMagicType.szIntoneEffect,false,0,this->GetLook());
this->StartMagicBusy(pMagic->m_infoMagicType.dwIntoneDuration+pMagic->m_infoMagicType.dwMagicBreak + 3000);
this->SetDir(this->GetDir(posTarget));
this->Stop();
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;
CMyPos posSender;
this->GetPos(posSender);
cmd.nDir = (g_objGameMap.GetDirection(posSender.x, posSender.y, posTarget.x, posTarget.y)+1)%7;
g_objHero.SetCommand(&cmd);
}
}
//------------------------------------------------------------------
void CHero::StartMagicBusy(DWORD dwDuration)
{
if (m_bMagicAttackBusy)
return;
m_dwMagicAttackBegin = ::TimeGet();
m_dwMagicAttackBusy = dwDuration;
m_bMagicAttackBusy = true;
::PostCmd(CMD_START_MAGIC_BUSY);
::DebugMsg("magic begin at:%06u --- end at:%06u\n", m_dwMagicAttackBegin, m_dwMagicAttackBegin+m_dwMagicAttackBusy);
}
//------------------------------------------------------------------
void CHero::EndMagicBusy()
{
if(m_bMagicAttackBusy && !this->IsMoving() && !this->IsMagicLock())
this->StandBy();
m_bMagicAttackBusy = false;
::PostCmd(CMD_END_MAGIC_BUSY);
}
//------------------------------------------------------------------
void CHero::MagicAttack(OBJID idMagicType, OBJID idPlayer, BOOL bForce)
{
if(idMagicType >= 30000)
return;
if(this->TestStatus(USERSTATUS_CANNOTMOVE))
return;
if(this->IsMagicLock())
return;
CONST MAGIC_BUMP = 1051;
if (MAGIC_BUMP == idMagicType)
{
// in bumping
if (_COMMAND_BUMP == this->GetCommandType())
return;
CMagic* pMagic = this->GetMagic(idMagicType);
if (!pMagic)
{
const OBJID idMagicTypeError = 100056;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicTypeError));
return;
}
// interval check
DWORD dwTimeNow = ::TimeGet();
if (dwTimeNow-m_dwLastBump < 1000)//pMagic->m_infoMagicType.dwIntoneDuration)
return;
else
m_dwLastBump = dwTimeNow;
CPlayer* pTarget = g_objPlayerSet.GetPlayer(idPlayer);
if (!pTarget)
return;
if (!this->CanPk(pTarget))
return;
const OBJID idGuard = 100028;
if(pTarget->GetRoleType() == _ROLE_TASK_NPC)
return;
CMyPos posTarget;
pTarget->GetPos(posTarget.x, posTarget.y);
CMyPos posHero; ////禁止pk区域检测
this->GetPos(posHero);
if(!g_objGameMap.IsPkRegion(posHero) && pMagic->m_infoMagicType.dwCrime && pTarget->IsPlayer())
{
const OBJID idStr = 100157;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(100157));
return;
}
if (pTarget->IsNpc() && strstr(pTarget->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;
}
}
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;
}
CCommand cmd;
cmd.iType =_COMMAND_BUMP;
cmd.iStatus =_CMDSTATUS_BEGIN;
cmd.idTarget =pTarget->GetID();
this->SetCommand(&cmd);
return; // do not send msg here.
}
CONST MAGIC_CIRCLEATK = 1115;
if (MAGIC_CIRCLEATK == idMagicType)
{
CItem* pWeaponR = this->GetEquipment(ITEMPOSITION_WEAPONR);
CItem* pWeaponL = this->GetEquipment(ITEMPOSITION_WEAPONL);
if (!(pWeaponR && pWeaponL
&& pWeaponR->GetWeaponSkillType() == pWeaponL->GetWeaponSkillType()))
{
const OBJID idStr = 100117;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idStr));//"此技能必须双手相同类型武器才能使用。"
return;
}
}
if (m_bMagicAttackBusy)
{
OBJID idMagicAttackToFast = 100055;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicAttackToFast));
return;
}
CMagic* pMagic = this->GetMagic(idMagicType);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -