⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 user.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 5 页
字号:

//////////////////////////////////////////////////////////////////////
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 + -