📄 user.cpp
字号:
//////////////////////////////////////////////////////////////////////
DWORD CUser::GetDefence2()
{
if(QueryTransformation())
return QueryTransformation()->GetDefence2();
return (GetMetempsychosis() && this->GetProfessionLevel() >= 3) ? 7000 : DEFAULT_DEFENCE2; // 3: 70级
}
//////////////////////////////////////////////////////////////////////
DWORD CUser::GetDexterity()
{
if(QueryTransformation())
return QueryTransformation()->GetDexterity();
return m_data.GetDexterity();
}
//////////////////////////////////////////////////////////////////////
DWORD CUser::GetDex()
{
if(QueryTransformation())
return QueryTransformation()->GetDex();
int nDex = this->GetDexterity();
for(int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
CItem* pEquip = this->GetEquipItemByPos(i);
if(pEquip)
nDex += pEquip->GetDexteriy();
}
return nDex;
}
//////////////////////////////////////////////////////////////////////
DWORD CUser::GetDodge()
{
if(QueryTransformation())
return QueryTransformation()->GetDodge();
//return 0;
return GetDexterity();
}
//////////////////////////////////////////////////////////////////////
DWORD CUser::GetDdg()
{
if(QueryTransformation())
return QueryTransformation()->GetDdg();
int nDge = this->GetDodge();
for(int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
CItemPtr* ppEquip = GetEquipItemPtr(i);
CHECKF(ppEquip);
CItemPtr& pEquip = *ppEquip;
if(pEquip)
nDge += pEquip->GetDodge(); //pEquip->GetInt(ITEMDATA_DODGE);
}
//---jinggy---begin
//玩家特殊状态调节 dodge 值
IStatus * pStatus = QueryStatus(STATUS_ADJUST_DODGE);
if (pStatus)
{
nDge = ::CutTrail(0, AdjustData(nDge, pStatus->GetPower()));
}
//---jinggy---end
// 与附身型幻兽合体提高躲避率
if (m_idLinkEudemonType == ITEMTYPE_EUDEMON_ATTACH)
nDge += m_nLinkValue;
return __max(0, nDge);
}
//////////////////////////////////////////////////////////////////////
int CUser::GetLuck()
{
// if(QueryTransformation())
// return QueryTransformation()->GetDdg();
int nLuck = 0;
for(int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
CItem* pEquip = GetEquipItemByPos(i);
if(pEquip)
nLuck += pEquip->GetInt(ITEMDATA_LUCK);
}
ASSERT(nLuck <= 35);
return __max(0, nLuck);
}
//////////////////////////////////////////////////////////////////////
/*DWORD CUser::GetMagicAtk() //? 可优化
{
if(QueryTransformation())
return QueryTransformation()->GetMagicAtk();
float fAtk = 0.0f;
switch(this->GetProfessionSort())
{
case PROFSORT_SOLDIER:
break;
case PROFSORT_ARCHER:
break;
case PROFSORT_WIZARD:
fAtk += m_data.GetSoul()*0.5f;
break;
case PROFSORT_MAGICIAN:
fAtk += m_data.GetSoul()*0.5f;
break;
}
for(int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
CItemPtr* ppEquip = GetEquipItemPtr(i);
CHECKF(ppEquip);
CItemPtr& pEquip = *ppEquip;
if(pEquip)
{
fAtk += pEquip->GetInt(ITEMDATA_MAGICATK);
}
}
return __max(0, fAtk+0.5);
}*/
//////////////////////////////////////////////////////////////////////
DWORD CUser::GetMagicDef() //? 可优化
{
if(QueryTransformation())
return QueryTransformation()->GetMagicDef();
float fDef = 0.0f;
/*switch(this->GetProfessionSort())
{
case PROFSORT_SOLDIER:
fDef += m_data.GetHealth()*0.5f;
break;
case PROFSORT_ARCHER:
fDef += GetSoulSum()*0.5f;
break;
case PROFSORT_MAGICIAN:
fDef += GetSoulSum()*0.5f;
break;
}*/
for(int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
CItemPtr* ppEquip = GetEquipItemPtr(i);
CHECKF(ppEquip);
CItemPtr& pEquip = *ppEquip;
if(pEquip)
{
int nEquipDef = pEquip->GetMgcDef();
if (ITEMPOSITION_SPRITE == i)
nEquipDef = nEquipDef / 100; // 精灵存储的附加属性是*100以后的值
fDef += nEquipDef;
}
}
fDef += 0.5f;
// fDef = __min(90.0f, fDef);
// fDef = __max(0.0f, fDef);
return fDef;
}
//////////////////////////////////////////////////////////////////////
int CUser::GetAddPoint()
{
return m_data.GetAddPoint();
}
//////////////////////////////////////////////////////////////////////
DWORD CUser::GetLev()
{
return m_data.GetLev();
}
//////////////////////////////////////////////////////////////////////
void CUser::IncLev(int nLev)
{
int nOldLev = this->GetLev();
int nNewLev = nOldLev + nLev;
this->SetAttrib(_USERATTRIB_LEV, nNewLev, SYNCHRO_TRUE);
// start pay point fee?
if(nOldLev < LOGIN_FREE_LEVEL && nNewLev >= LOGIN_FREE_LEVEL)
MapGroup(PID)->QueryIntraMsg()->LevelUp(GetID(), nNewLev);
if (QueryMagic())
QueryMagic()->OwnerUpLevel(nNewLev);
if(GetSynID() != ID_NONE)
{
QuerySynAttr()->UpLevel(nNewLev);
if (QuerySynAttr()->GetSynRank() == RANK_RESERVED && GetLev() >= SYN_CONDITION_NEWBIE)
QuerySynAttr()->SetRank(RANK_NEWBIE);
}
// tutor exp record
if (this->GetLev() >= _MIN_TUTOR_LEVEL)
{
CTutorexpData* pExpData;
pExpData = CTutorexpData::CreateNew();
if (pExpData && pExpData->Create(GetID(), Database()))
{
if (pExpData->GetID() == ID_NONE)
{
pExpData->SetInt(TUTOREXPDATA_ID, this->GetID());
pExpData->SetInt(TUTOREXPDATA_TUTOR_LEV, this->GetLev());
pExpData->InsertRecord();
}
else
{
if (pExpData->GetInt(TUTOREXPDATA_TUTOR_LEV) != this->GetLev())
{
pExpData->SetInt(TUTOREXPDATA_TUTOR_LEV, this->GetLev());
pExpData->Update();
}
}
}
SAFE_RELEASE (pExpData);
}
}
//////////////////////////////////////////////////////////////////////
void CUser::AllotPoint()
{
int nProf = this->GetProfessionSort();
if (nProf > 10)
nProf = (nProf/10)*10;
int nAmount = AddPointSet()->GetAmount();
for(int i = 0; i < nAmount; i++)
{
CAddPointData* pData = AddPointSet()->GetObjByIndex(i);
if(pData
&& pData->GetInt(ADDPOINTDATA_PROF) == nProf
&& pData->GetInt(ADDPOINTDATA_LEVEL) == this->GetLev())
{
m_data.SetForce(pData->GetInt(ADDPOINTDATA_FORCE));
m_data.SetHealth(pData->GetInt(ADDPOINTDATA_HEALTH));
m_data.SetSoul(pData->GetInt(ADDPOINTDATA_SOUL));
m_data.SetDexterity(pData->GetInt(ADDPOINTDATA_DEX), UPDATE_TRUE);
{
CMsgUserAttrib msg;
if(msg.Create(GetID(), _USERATTRIB_FORCE, GetForce())
&& msg.Append(_USERATTRIB_DEX, GetDex())
&& msg.Append(_USERATTRIB_HEALTH, GetHealth())
&& msg.Append(_USERATTRIB_SOUL, GetSoul()) )
SendMsg(&msg);
}
return ;
}
}
// lev data not found
this->AddAttrib(_USERATTRIB_ADDPOINT, _ADDITIONALPOINT_NUM, SYNCHRO_TRUE);
return;
}
//////////////////////////////////////////////////////////////////////
int CUser::GetPose()
{
return m_nPose;
}
//////////////////////////////////////////////////////////////////////
bool CUser::IsAllNonsuchEquip (void)
{
CItemPtr pWeaponR = NULL;
for(int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
if (i == ITEMPOSITION_RINGL)
continue;
CItem* pEquip = GetEquipItemByPos(i);
if (i == ITEMPOSITION_WEAPONR)
pWeaponR = pEquip;
if (!pEquip)
{
if (i == ITEMPOSITION_WEAPONL)
{
switch(this->GetProfessionSort())
{
case PROFSORT_SOLDIER:
{
if (this->GetLev() >= 40)
{
if (pWeaponR && !pWeaponR->IsWeapon2())
return false;
}
}
break;
default:
break;
}
continue;
}
else
return false;
}
if (!pEquip->IsNonsuch())
return false;
}
return true;
}
//////////////////////////////////////////////////////////////////////
I64 CUser::GetEffect()
{
return m_data.m_Info.i64Effect;
}
//////////////////////////////////////////////////////////////////////
int CUser::GetDir()
{
return m_nDir;
}
//////////////////////////////////////////////////////////////////////
DWORD CUser::GetLookFace()
{
enum {LOOK_MALEGHOST=98, LOOK_FEMALEGHOST};
if (IsGhost())
{
if (SEX_MAN == this->GetSex())
return m_data.GetLookFace() + MASK_CHANGELOOK*LOOK_MALEGHOST;
else
return m_data.GetLookFace() + MASK_CHANGELOOK*LOOK_FEMALEGHOST;
}
else if(QueryTransformation())
{
return m_data.GetLookFace()
+ MASK_CHANGELOOK * QueryTransformation()->GetLook();
}
else
return m_data.GetLookFace();
}
//////////////////////////////////////////////////////////////////////
DWORD CUser::GetWeightLimit()
{
if(this->GetProfessionSort() == PROFSORT_SOLDIER)
return 30 - 3 + 3*GetLev();
else
return 20 - 2 + 2*GetLev();
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
bool CUser::LeaveMap()
{
if(m_nStep != STEP_ENTERMAP)
return false;
StopMine();
DestroyBooth();
KillCallPet();
CallBackAllEudemon();
CMapPtr pMap = GetMap();
if(pMap)
{
// BeKill的时候调用了DecRole,因此这里需要判断是否为死亡状态,以免LeaveRoom的时候多减一次角色数
pMap->LeaveRoom(QueryMapThing(), this->IsAlive()); //WITH_BLOCK);
StandTurnoff();
pMap->ClearRegionInfo(this);
// brocast my info
CMsgAction msg;
if (msg.Create(GetID(), 0,0,0, actionLeaveMap))
this->BroadcastRoomMsg(&msg, EXCLUDE_SELF);
ClrBroadcastSet();
}
m_nStep = STEP_LOGIN;
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::SendItemSet()
{
SendAllItemInfo();
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::SendGoodFriend()
{
SendFriendInfo();
return true;
}
//////////////////////////////////////////////////////////////////////
// fight
//////////////////////////////////////////////////////////////////////
bool CUser::SetAttackTarget(IRole* pTarget /*= NULL*/)
{
if (!m_pBattleSystem)
return false;
if(pTarget == NULL)
{
m_pBattleSystem->ResetBattle();
return true;
}
if(pTarget->QueryOwnerUser() && GetMap()->IsInRegionType(REGION_PK_PROTECTED, GetPosX(), GetPosY()))
return false;
if (!this->IsAtkable(pTarget, true))
return false;
if(pTarget->IsWing() && !this->IsWing() && !(this->IsBowman() || this->IsSimpleMagicAtk()))
return false;
// goal
CNpc* pNpc;
pTarget->QueryObj(OBJ_NPC, IPP_OF(pNpc));
if(pNpc && pNpc->IsGoal() && (GetLev() < pNpc->GetLev() || pNpc->GetType()!=_WEAPONGOAL_NPC))
return false;
if(this->GetDistance(pTarget->QueryMapThing()) > GetAttackRange(pTarget->GetSizeAdd()))
{
m_pBattleSystem->ResetBattle();
return false;
}
CheckCrime(pTarget);
if(IsBowman() && !IsArrowPass(pTarget->GetPosX(), pTarget->GetPosY()))
return false;
m_pBattleSystem->CreateBattle(pTarget->GetID());
CalcFightRate();
if (QueryMagic())
QueryMagic()->AbortMagic(true);
// unequip magic arrow, hard code@@@
CItem* pEquipL = GetEquipItemByPos(ITEMPOSITION_WEAPONL);
if(!pEquipL || pEquipL->GetInt(ITEMDATA_MAGIC1) == MAGIC_NONE)
UnequipMagicItem(ITEMPOSITION_WEAPONL);
return true;
}
//////////////////////////////////////////////////////////////////////
int CUser::GetGemMgcExpEffect()
{
int nAddPercent = 0;
for (int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
CItem* pEquip = GetEquipItemByPos(i);
if (pEquip)
nAddPercent += pEquip->GetGemMgcExpEffect();
}
return nAddPercent;
}
//////////////////////////////////////////////////////////////////////
int CUser::GetGemWpnExpEffect()
{
int nAddPercent = 0;
for (int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
CItem* pEquip = GetEquipItemByPos(i);
if (pEquip)
nAddPercent += pEquip->GetGemWpnExpEffect();
}
return nAddPercent;
}
//////////////////////////////////////////////////////////////////////
int CUser::GetGemExpEffect()
{
int nAddPercent = 0;
for (int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
CItem* pEquip = GetEquipItemByPos(i);
if (pEquip)
nAddPercent += pEquip->GetGemExpEffect();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -