📄 heroitem.cpp
字号:
case ITEMSORT_RING:
nPosition = ITEMPOSITION_RINGR;
break;
case ITEMSORT_SHOES:
nPosition = ITEMPOSITION_SHOES;
break;
case ITEMSORT_MOUNT:
nPosition = ITEMPOSITION_MOUNT;
break;
default:
break;
}
/* if (nPosition != 0)
{
CCommand cmd;
cmd.iType =_COMMAND_STANDBY;
cmd.iStatus =_CMDSTATUS_BEGIN;
g_objHero.SetCommand(&cmd);
g_objHero.ResetActionData();
}*/
CMsgItem msg;
if(msg.CreateForUseItem(id, nPosition, ITEMACT_USE, idTarget))
msg.Send();
}
//--------------------------------------------------------------
BOOL CHero::TryItemTarget(CItem* pItem, OBJID idTarget)
{
if (!pItem)
return false;
if (pItem->TestTarget(TARGET_NONE)) // 不限定条件
return true;
if (pItem->TestTarget(TARGET_FORBIDDEN)) // 禁止对任何目标使用
return false;
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(idTarget,true);
if (!pPlayer)
return false;
else
{
if (pItem->TestTarget(TARGET_SELF)) //对自己使用
{
if (pPlayer->GetID() != g_objHero.GetID()
&& !pPlayer->IsMyPet())
return false;
}
if (pItem->TestTarget(TARGET_OTHERS)) //对他人使用
{
if (pPlayer->GetID() == g_objHero.GetID()
|| pPlayer->IsMyPet())
return false;
}
if (pItem->TestTarget(TARGET_BODY)) //对尸体使用
{
if (!pPlayer->IsDead())
return false;
}
if (pItem->TestTarget(TARGET_CHK_PKMODE)) //PK模式检查
{
if (pPlayer->GetID() == g_objHero.GetID()
&& pPlayer->IsMyPet())
return false;
if (g_objHero.GetPkMode() == PKMODE_MONSTERONLY) //安全
{
if (pPlayer->IsPlayer() || pPlayer->IsPet())
return false;
}
else if (g_objHero.GetPkMode() == PKMODE_TMEXCLUDE) //组队
{
if(pPlayer->IsPlayer())
{
if(g_objHero.GetTeamMemberInfoByID(pPlayer->GetID()))
return false;
if(g_objHero.GetFriend(pPlayer->GetID()))
return false;
if (strcmp(pPlayer->GetName(),g_objHero.GetMate()) == 0)
return false;
if (pPlayer->GetSydicateID() == g_objHero.GetSydicateID())
return false;
}
else if (pPlayer->IsPet())
{
if(g_objHero.GetTeamMemberInfoByID(pPlayer->GetPetOwnerId()))
return false;
if(g_objHero.GetFriend(pPlayer->GetPetOwnerId()))
return false;
CPlayer* pOwnerPlayer = g_objPlayerSet.GetPlayer(pPlayer->GetPetOwnerId());
if (pOwnerPlayer && pOwnerPlayer->GetSydicateID() == g_objHero.GetSydicateID())
return false;
if (pOwnerPlayer && strcmp(pPlayer->GetName(),g_objHero.GetMate()) == 0)
return false;
}
}
else if (g_objHero.GetPkMode() == PKMODE_ARRESTMENT) //捕杀
{
if (pPlayer->IsPlayer())
{
if (!pPlayer->TestStatus(USERSTATUS_CRIME)
&& !pPlayer->TestStatus(USERSTATUS_DARKRED))
return false;
}
else if (pPlayer->IsPet())
{
CPlayer* pOwnerPlayer = g_objPlayerSet.GetPlayer(pPlayer->GetPetOwnerId());
if (pOwnerPlayer
&& !pOwnerPlayer->TestStatus(USERSTATUS_CRIME)
&& !pOwnerPlayer->TestStatus(USERSTATUS_DARKRED))
return false;
}
}
// else if (g_objHero.GetPkMode() == PKMODE_FREE) //自由pk 无限制
}
//目标类型检测
if (!pItem->TestTarget(TARGET_USER) //不可以用于玩家
&& pPlayer->IsPlayer())
return false;
if (!pItem->TestTarget(TARGET_MONSTER) //不可以用于怪物
&& pPlayer->IsMonster())
return false;
if (!pItem->TestTarget(TARGET_EUDEMON) //不可以用于幻兽
&& pPlayer->IsPet())
return false;
}
return true;
}
//--------------------------------------------------------------
BOOL CHero::TryItem(CItem* pItem)
{
if (!pItem)
return false;
// task item
if (pItem->IsTaskItem())
return false;
// level check
if (pItem->GetLevelRequired() != 0 &&
this->GetLev() < pItem->GetLevelRequired())
return false;
// attribute check
if (pItem->GetForceRequired() != 0 &&
this->GetForce() < pItem->GetForceRequired())
return false;
if (pItem->GetSpeedRequired() != 0 &&
this->GetSpeed() < pItem->GetSpeedRequired())
return false;
if (pItem->GetHealthRequired() != 0 &&
this->GetHealth() < pItem->GetHealthRequired())
return false;
if (pItem->GetSoulRequired() != 0 &&
this->GetOriginalSoul() < pItem->GetSoulRequired())
return false;
if(pItem->GetSexRequried() == SEX_MALE || pItem->GetSexRequried() == SEX_FEMALE)
if(this->GetSex() != pItem->GetSexRequried())
return false;
if(pItem->TestStatus(_ITEM_STATUS_NOT_IDENT))
return false;
// profession check
int nReqProfession = pItem->GetProfessionRequired ();
int nProfession = this->GetProfession();
if ( nReqProfession != 0 )
{
int nRequireProfSort = nReqProfession/10;
int nRequireProfLevel = nReqProfession%10;
if (nRequireProfSort != (nProfession%1000)/10)
return false;
if (nProfession%10 < nRequireProfLevel)
return false;
}
return true;
}
//--------------------------------------------------------------
BOOL CHero::TryItem(OBJID idItem, int nPosition)
{
CItem* pItem = g_objHero.GetItem(idItem);
if(!pItem)
return false;
if(!this->TryItem(pItem))
return false;
if(pItem->GetTypeID() == _ARROW)
{
if(this->GetRWeapon()/1000%1000 == 500 && nPosition == ITEMPOSITION_WEAPONL)
return true;
else
return false;
}
if(pItem->GetTypeID() == _DART)
{
if(this->GetRWeapon()/1000%1000 == 501 && nPosition == ITEMPOSITION_WEAPONL)
return true;
else
return false;
}
switch(pItem->GetSort())
{
case ITEMSORT_EXPEND:
return false;
break;
case ITEMSORT_TREASURE:
return (nPosition == ITEMPOSITION_TREASURE);
case ITEMSORT_HELMET:
return (nPosition == ITEMPOSITION_HELMET);
case ITEMSORT_NECKLACE:
return (nPosition == ITEMPOSITION_NECKLACE);
case ITEMSORT_ARMOR:
return (nPosition == ITEMPOSITION_ARMOR);
case ITEMSORT_WEAPON_SINGLE_HAND:
return (nPosition == ITEMPOSITION_WEAPONR);
case ITEMSORT_WEAPON_DOUBLE_HAND:
{
if (this->GetEquipment(ITEMPOSITION_WEAPONL))
return false;
else
return true;
}
case ITEMSORT_SHIELD:
{
CItem* pItem = this->GetEquipment(ITEMPOSITION_WEAPONR);
if(!pItem)
return false;
if (pItem && ITEMSORT_WEAPON_DOUBLE_HAND == pItem->GetSort())
return false;
else
return true;
}
case ITEMSORT_RING:
return (nPosition == ITEMPOSITION_RINGR);
case ITEMSORT_SHOES:
return (nPosition == ITEMPOSITION_SHOES);
default:
return false;
}
}
//--------------------------------------------------------------
void CHero::SetEquipment (int nPosition, CItem* pItem)
{
//if (!pItem)
// return;
MYASSERT(nPosition-1>=0 && nPosition-1<_MAX_EQUIPMENT);
int nType = nPosition-1;
switch(nPosition)
{
case ITEMPOSITION_HELMET:
m_pEquipment[nType] = pItem;
/*
if (pItem)
this->SetArmet(pItem->GetTypeID());
else
this->SetArmet(ID_NONE);
*/
break;
case ITEMPOSITION_NECKLACE:
m_pEquipment[nType] = pItem;
break;
case ITEMPOSITION_ARMOR:
m_pEquipment[nType] = pItem;
if (pItem)
this->SetArmor(pItem->GetTypeID());
else
this->SetArmor(ID_NONE);
break;
case ITEMPOSITION_WEAPONR:
m_pEquipment[nType] = pItem;
if (pItem)
{
this->SetRWeapon(pItem->GetTypeID());
/*if(pItem->GetSort() == ITEMSORT_WEAPON_DOUBLE_HAND || ITEMSORT_WEAPON_SINGLE_HAND == pItem->GetSort())
{
CItem* pLItem = g_objHero.GetEquipment(ITEMPOSITION_WEAPONL);
if(pItem->IsBow() && pLItem && pLItem->IsArrow())
{
}
else
{
this->AddItem(m_pEquipment[nPosition]);
m_pEquipment[nPosition] = NULL;
this->SetLWeapon(ID_NONE);
}
}*/
}
else
{
this->SetRWeapon(ID_NONE);
}
break;
case ITEMPOSITION_WEAPONL:
m_pEquipment[nType] = pItem;
if (pItem)
this->SetLWeapon(pItem->GetTypeID());
else
this->SetLWeapon(ID_NONE);
break;
case ITEMPOSITION_RINGR:
m_pEquipment[nType] = pItem;
break;
case ITEMPOSITION_TREASURE:
m_pEquipment[nType] = pItem;
break;
case ITEMPOSITION_SHOES:
m_pEquipment[nType] = pItem;
break;
case ITEMPOSITION_MOUNT:
m_pEquipment[nType] = pItem;
this->SetMount(pItem->GetTypeID());
break;
case ITEMPOSITION_SPRITE:
m_pEquipment[nType] = pItem;
break;
}
::PostCmd(CMD_FLASHEQUIPMENT);
}
//--------------------------------------------------------------
BOOL CHero::EquipItem (int nPosition, OBJID id)
{
if (this->IsDead())
return false;
CCommand* pCommand = this->GetCommand();
if (pCommand
&& pCommand->iType != _COMMAND_STANDBY
&& pCommand->iType != _COMMAND_WALK
&& pCommand->iType != _COMMAND_RUN)
{
return false;
}
CItem* pItem =this->GetItem(id);
if (!pItem)
return false;
if (!this->TryItem(pItem))
return false;
if(pItem->GetTypeID() == _ARROW && pItem->GetTypeID() == _DART)
{
if(pItem->GetTypeID() == _ARROW && this->GetRWeapon()/1000%1000 != 500)
return false;
else if(pItem->GetTypeID() == _ARROW && nPosition == ITEMPOSITION_WEAPONL)
{
CMsgItem msg;
if (msg.Create(id, nPosition, ITEMACT_USE))
msg.Send();
return true;
}
if(pItem->GetTypeID() == _DART && this->GetRWeapon()/1000%1000 != 501)
return false;
else if(pItem->GetTypeID() == _DART && nPosition == ITEMPOSITION_WEAPONL)
{
CMsgItem msg;
if (msg.Create(id, nPosition, ITEMACT_USE))
msg.Send();
return true;
}
return false;
}
switch(pItem->GetSort())
{
case ITEMSORT_HELMET:
if (nPosition != ITEMPOSITION_HELMET)
return false;
break;
case ITEMSORT_NECKLACE:
if (nPosition != ITEMPOSITION_NECKLACE)
return false;
break;
case ITEMSORT_ARMOR:
if (nPosition != ITEMPOSITION_ARMOR)
return false;
break;
case ITEMSORT_WEAPON_SINGLE_HAND:
{
if (nPosition != ITEMPOSITION_WEAPONR)
{
return false;
}
}
break;
case ITEMSORT_WEAPON_DOUBLE_HAND:
{
if (nPosition != ITEMPOSITION_WEAPONR)
{
const OBJID idEqumipError = 100049;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idEqumipError));
return false;
}
if (this->GetEquipment(ITEMPOSITION_WEAPONL))
{
const OBJID idEqumipError = 100047;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idEqumipError));
return false;
}
}
break;
case ITEMSORT_SHIELD:
{
if (nPosition != ITEMPOSITION_WEAPONL)
return false;
CItem* pEquipment = this->GetEquipment(ITEMPOSITION_WEAPONR);
if(!pEquipment)
return false;
if (pEquipment && ITEMSORT_WEAPON_DOUBLE_HAND == pEquipment->GetSort())
{
const OBJID idEqumipError = 100048;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idEqumipError));
return false;
}
}
break;
case ITEMSORT_RING:
if (nPosition != ITEMPOSITION_RINGR)
return false;
break;
case ITEMSORT_SHOES:
if (nPosition != ITEMPOSITION_SHOES)
return false;
break;
}
CMsgItem msg;
if (msg.Create(id, nPosition, ITEMACT_USE))
msg.Send();
return true;
}
//--------------------------------------------------------------
BOOL CHero::UnequipItem(int nPosition)
{
if (this->IsDead())
return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -