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

📄 user.cpp

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

				// 等级在70级上下发生变化,需要调整经验值存储格式
				if (nNewLev > ADJUST_EXPFORMAT_LEVEL && nOldLev <= ADJUST_EXPFORMAT_LEVEL)
					this->SetAttrib(_USERATTRIB_EXP, this->GetExp()/10, nSynchro);
				else if (nNewLev <= ADJUST_EXPFORMAT_LEVEL && nOldLev > ADJUST_EXPFORMAT_LEVEL)
					this->SetAttrib(_USERATTRIB_EXP, this->GetExp()*10, nSynchro);
			}
			break;

		case	_USERATTRIB_LIFE:
			{
				if ((int)this->GetLife() + i64Data <= 0)
				{
					//this->SetStatus(STATUS_DIE);
					SetLife(0);
				}
				else
				{
					SetLife(__min(this->GetMaxLife(), this->GetLife() + i64Data));
				}

				// 血超过70%的时候解除狂暴状态
				if (GetLife()*100/GetMaxLife() > MAX_FRENZY_LIFE_PERCENT)
				{
					CRole::DetachStatus(this->QueryRole(), STATUS_FRENZY);
				}
				
				IF_NOT (msg.Append(_USERATTRIB_LIFE, this->GetLife()))
					return false;
			}
			break;
		case	_USERATTRIB_MANA:
			{
				if ((int)this->GetMana() + i64Data <= 0)
					m_data.SetMana(0);
				else
					m_data.SetMana(__min(this->GetMaxMana(), this->GetMana() + i64Data));

				IF_NOT (msg.Append(_USERATTRIB_MANA, this->GetMana()))
					return false;
			}
			break;
		case	_USERATTRIB_EXP:
			{
				// exp allow negative
				m_data.SetExp(this->GetExp() + i64Data);
				IF_NOT (msg.Append(_USERATTRIB_EXP, this->GetExp()))
					return false;
			}
			break;
		case	_USERATTRIB_PK:
			{
				// pk allow negative
				m_data.SetPk(this->GetPk() + i64Data);
				IF_NOT (msg.Append(_USERATTRIB_PK, this->GetPk()))
					return false;
			}
			break;			
		case	_USERATTRIB_MONEY:
			{
				if (i64Data < 0 && (int)this->GetMoney() + i64Data < 0)
				{
					// if not enough money, return false only
					return false;
				}
				else
					m_data.SetMoney(GetMoney() + i64Data);

				IF_NOT (msg.Append(_USERATTRIB_MONEY, this->GetMoney()))
					return false;
			}
			break;
		case _USERATTRIB_ADDPOINT:
			{
				if (i64Data < 0)
				{
					return false;	// 断言错。
				}
				m_data.SetAddPoint(m_data.GetAddPoint()+i64Data);
				IF_NOT (msg.Append(_USERATTRIB_ADDPOINT, this->GetAddPoint()))
					return false;
			}
			break;
		case _USERATTRIB_SOUL:
			{
				m_data.SetSoul(__max(0, m_data.GetSoul()+i64Data));
				IF_NOT (msg.Append(_USERATTRIB_SOUL, this->GetSoul()))
					return false;
			}
			break;
		case _USERATTRIB_HEALTH:
			{
				m_data.SetHealth(__max(0, m_data.GetHealth()+i64Data));
				IF_NOT (msg.Append(_USERATTRIB_HEALTH, this->GetHealth()))
					return false;
			}
			break;
		case _USERATTRIB_FORCE:
			{
				m_data.SetForce(__max(0, m_data.GetForce()+i64Data));
				IF_NOT (msg.Append(_USERATTRIB_FORCE, this->GetForce()))
					return false;
			}
			break;
		case _USERATTRIB_SPEED:
			{
				m_data.SetSpeed(__max(0, m_data.GetSpeed()+i64Data));
				IF_NOT (msg.Append(_USERATTRIB_SPEED, AdjustSpeed(this->GetSpeed())))
					return false;
			}
			break;
		case _USERATTRIB_DEX:
			{
				m_data.SetDexterity(__max(0, (int)m_data.GetDexterity()+i64Data));
				IF_NOT (msg.Append(_USERATTRIB_DEX, this->GetDex()))
					return false;
			}
			break;
		case _USERATTRIB_POTENTIAL:
			{
				m_data.SetPotential(__max(0, (int)this->GetPotential()+i64Data));
				IF_NOT (msg.Append(_USERATTRIB_POTENTIAL, this->GetPotential()))
					return false;
			}
			break;
		case _USERATTRIB_XP:
			{
				if((int)i64Data != 0)
				{
					m_dwXP = ::CutRange(m_dwXP+(int)i64Data, 0, MAX_USER_XP);
					if(m_dwXP == MAX_USER_XP)
					{
						if(m_pMagic && m_pMagic->HaveXpMagic())
						{
							CMsgAction msgAction;
							const XPFULLSOUNDEFFECT=1000000;
							if(msgAction.Create(GetID(), GetPosX(), GetPosY(), GetDir(), actionSoundEffect, 1000000))
							{
								this->BroadcastRoomMsg(&msgAction, INCLUDE_SELF);
							}
						}
					}
					IF_NOT (msg.Append(_USERATTRIB_XP, m_dwXP))
						return false;
				}
			}
			break;
		case _USERATTRIB_ENERGY:
			{
				AddEnergy(i64Data);
				IF_NOT (msg.Append(_USERATTRIB_ENERGY, this->GetEnergy()))
					return false;
#ifdef	PALED_DEBUG
				SendSysMsg("ENERGY: [%d]", GetEnergy());
#endif
			}
			break;
		case _USERATTRIB_MAXENERGY:
			{
				// no operation
				IF_NOT (msg.Append(_USERATTRIB_MAXENERGY, this->GetMaxEnergy()))
					return false;
			}
			break;
		case _USERATTRIB_MERCENARYEXP:
			{
				m_data.SetMercenaryExp(__max(0, (int)m_data.m_Info.dwMercenaryExp+i64Data));
				IF_NOT (msg.Append(_USERATTRIB_MERCENARYEXP, this->GetMercenaryExp()))
					return false;
			}
			break;
		case _USERATTRIB_MERCENARYRANK:
			{
				m_data.SetMercenaryRank(__max(0, (int)m_data.m_Info.ucMercenaryRank + i64Data));
				IF_NOT (msg.Append(_USERATTRIB_MERCENARYRANK, this->GetMercenaryRank()))
					return false;
			}
			break;
		case _USERATTRIB_NOBILITYRANK:
			{
				m_data.SetNobilityRank(__max(0, (int)m_data.GetNobilityRank() + i64Data));
				IF_NOT (msg.Append(_USERATTRIB_NOBILITYRANK, this->GetNobilityRank()))
					return false;
			}
			break;
		case _USERATTRIB_EXPLOIT:
			{
				m_data.SetExploit(__max(0, (int)m_data.GetExploit()+i64Data));
				IF_NOT (msg.Append(_USERATTRIB_EXPLOIT, this->GetExploit()))
					return false;
			}
			break;
		case _USERATTRIB_TUTOR_EXP:
			{
				m_data.SetTutorExp(this->GetTutorExp()+i64Data);
				IF_NOT (msg.Append(_USERATTRIB_TUTOR_EXP, this->GetTutorExp()))
					return false;
			}
			break;
		case _USERATTRIB_TUTOR_LEVEL:
			{
				m_data.SetTutorLevel(__max(0, (int)this->GetTutorLevel()+i64Data));
				IF_NOT (msg.Append(_USERATTRIB_TUTOR_LEVEL, this->GetTutorLevel()))
					return false;
			}
			break;
		case _USERATTRIB_MAXEUDEMON:
			{
				m_data.SetMedalSelect(__max(0, (int)this->GetMedalSelect()+i64Data));
				IF_NOT (msg.Append(_USERATTRIB_MAXEUDEMON, this->GetMedalSelect()))
					return false;
			}
			break;
		default:
			return false;
		}
	}

	if(nSynchro != SYNCHRO_FALSE)
	{
		switch(nSynchro)
		{
		case SYNCHRO_TRUE:
			this->SendMsg(&msg);
			break;

		case SYNCHRO_BROADCAST:
			this->BroadcastRoomMsg(&msg, INCLUDE_SELF);
			break;

		default:
			break;
		}
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
void CUser::SetAttrib(int idxAttr, __int64 i64Data, int nSynchro)
{
	CMsgUserAttrib	msg;
	if(!msg.Create(GetID(), _USERATTRIB_NONE, 0))			// _USERATTRIB_NONE : 不添加
		return;
	
	switch(idxAttr)
	{
	case	_USERATTRIB_ENERGY:
		{
			this->SetEnergy(i64Data);
			if(!msg.Append(_USERATTRIB_ENERGY, this->GetEnergy()))
				return;
		}
		break;
	case	_USERATTRIB_MAXENERGY:
		{
			// no operation
			if (!msg.Append(_USERATTRIB_MAXENERGY, this->GetMaxEnergy()))
				return;
		}
		break;

	case	_USERATTRIB_PK:
		{
			m_data.SetPk(i64Data, true);
			if(!msg.Append(_USERATTRIB_PK, this->GetPk()))
				return;
		}
		break;
	case	_USERATTRIB_LIFE:
		{
			i64Data = __max(0, __min(this->GetMaxLife(), i64Data));

			SetLife(i64Data);

			// 血超过70%的时候解除狂暴状态
			if (GetLife()*100/GetMaxLife() > MAX_FRENZY_LIFE_PERCENT)
			{
				CRole::DetachStatus(this->QueryRole(), STATUS_FRENZY);
			}
			
			if(!msg.Append(_USERATTRIB_LIFE, GetLife()))
				return;
		}
		break;
	case _USERATTRIB_LEV:
		{
			int nOldLev = this->GetLev();
			int nNewLev = __max(0, __min(MAX_USERLEV, i64Data));

			m_data.SetLev(nNewLev);
			if(!msg.Append(_USERATTRIB_LEV, GetLev()))
				return;

			// 等级在70级上下发生变化,需要调整经验值存储格式
			if (nNewLev > ADJUST_EXPFORMAT_LEVEL && nOldLev <= ADJUST_EXPFORMAT_LEVEL)
				this->SetAttrib(_USERATTRIB_EXP, this->GetExp()/10, nSynchro);
			else if (nNewLev <= ADJUST_EXPFORMAT_LEVEL && nOldLev > ADJUST_EXPFORMAT_LEVEL)
				this->SetAttrib(_USERATTRIB_EXP, this->GetExp()*10, nSynchro);
		}
		break;
	case _USERATTRIB_ADDPOINT:
		{
			i64Data = __max(0, i64Data);

			m_data.SetAddPoint(i64Data);
			if(!msg.Append(_USERATTRIB_ADDPOINT, GetAddPoint()))
				return;
		}
		break;
	case	_USERATTRIB_MANA:
		{
			i64Data = __max(0, __min(this->GetMaxMana(), i64Data));

			m_data.SetMana(i64Data);
			if(!msg.Append(_USERATTRIB_MANA, GetMana()))
				return;
		}
		break;
	case _USERATTRIB_FORCE:
		{
			m_data.SetForce(__max(0, i64Data));
			if(!msg.Append(_USERATTRIB_FORCE, GetForce()))
				return;
		}
		break;
	case _USERATTRIB_SOUL:
		{
			m_data.SetSoul(__max(0, i64Data));
			if(!msg.Append(_USERATTRIB_SOUL, GetSoul()))
				return;
		}
		break;
	case _USERATTRIB_HEALTH:
		{
			m_data.SetHealth(__max(0, i64Data));
			if(!msg.Append(_USERATTRIB_HEALTH, GetHealth()))
				return;
		}
		break;
	case _USERATTRIB_SPEED:
		{
			m_data.SetSpeed(__max(0, i64Data));
			if(!msg.Append(_USERATTRIB_SPEED, AdjustSpeed(GetSpeed())))
				return;
		}
		break;
	case _USERATTRIB_DEX:
		{
			m_data.SetDexterity(__max(0, i64Data));
			if(!msg.Append(_USERATTRIB_DEX, GetDex()))
				return;
		}
		break;
	case _USERATTRIB_POTENTIAL:
		{
			m_data.SetPotential(__max(0, i64Data));
			if (!msg.Append(_USERATTRIB_POTENTIAL, GetPotential()))
				return;
		}
		break;
	case _USERATTRIB_XP:
		{
			m_dwXP = ::CutRange((int)i64Data, 0, MAX_USER_XP);
			IF_NOT (msg.Append(_USERATTRIB_XP, m_dwXP))
				return;
		}
		break;
	case	_USERATTRIB_EXP:
		{
			// exp allow negative
			m_data.SetExp(i64Data);
			if(!msg.Append(_USERATTRIB_EXP, GetExp()))
				return;
		}
		break;
	case	_USERATTRIB_MONEY:
		{
			m_data.SetMoney(__max(0, i64Data));
			if(!msg.Append(_USERATTRIB_MONEY, GetMoney()))
				return;
		}
		break;
	case	_USERATTRIB_KEEPEFFECT:
		{
			ResetEffect();		// reset all
			this->SetEffect(i64Data);
			if(!msg.Append(idxAttr, this->GetEffect()))
				return;
		}
		break;
	case	_USERATTRIB_HAIR:
		{
			m_data.SetHair(__max(0, i64Data));

			if(!msg.Append(idxAttr, m_data.GetHair()))			
				return;

			// brocast any way
			if (nSynchro != SYNCHRO_FALSE)
				nSynchro = SYNCHRO_BROADCAST;
		}
		break;
	case	_USERATTRIB_PORFESSION:
		{
			m_data.SetProfession(i64Data, true);
			if(!msg.Append(idxAttr, m_data.GetProfession()))
				return;
		}
		break;
	case	_USERATTRIB_LOOKFACE:
		{
			// 不支持修改LOOKFACE属性
			if(!msg.Append(idxAttr, i64Data))
				return;
		}
		break;
	case	_USERATTRIB_SIZEADD:
		{
			// 不支持修改SIZEADD属性
			if(!msg.Append(idxAttr, i64Data))
				return;
		}
		break;
	case	_USERATTRIB_SUPERMAP_ORDER:
		{
			// 不支持修改SIZEADD属性
			if(!msg.Append(idxAttr, i64Data))
				return;
		}
		break;
	case	_USERATTRIB_MERCENARYEXP:
		{
			m_data.SetMercenaryExp(i64Data, true);
			if(!msg.Append(idxAttr, m_data.m_Info.dwMercenaryExp))
				return;
		}
		break;
	case	_USERATTRIB_MERCENARYRANK:
		{
			m_data.SetMercenaryRank(i64Data, true);
			if (!msg.Append(idxAttr, m_data.m_Info.ucMercenaryRank))
				return;
		}
		break;
	case _USERATTRIB_NOBILITYRANK:
		{
			m_data.SetNobilityRank(__max(0, i64Data));
			if (!msg.Append(idxAttr, m_data.GetNobilityRank()))
				return;
		}
		break;
	case	_USERATTRIB_EXPLOIT:
		{
			m_data.SetExploit(__max(0, i64Data), true);
			if (!msg.Append(idxAttr, m_data.GetExploit()))
				return;
		}
		break;
	case	_USERATTRIB_ACTIONSPEED:
		{
			// TODO: 
		}
		break;
	case	_USERATTRIB_TUTOR_EXP:
		{
			m_data.SetTutorExp(i64Data);
			IF_NOT (msg.Append(_USERATTRIB_TUTOR_EXP, this->GetTutorExp()))
				return ;
		}
		break;
	case	_USERATTRIB_TUTOR_LEVEL:
		{
			m_data.SetTutorLevel(__max(0, i64Data));
			IF_NOT (msg.Append(_USERATTRIB_TUTOR_LEVEL, this->GetTutorLevel()))
				return ;
		}
		break;
	case _USERATTRIB_MAXEUDEMON:
		{
			m_data.SetMedalSelect(__max(0, i64Data));
			IF_NOT (msg.Append(_USERATTRIB_MAXEUDEMON, this->GetMedalSelect()))
				return ;
		}
		break;
		
	default:
		return;
	}

	switch(nSynchro)
	{
	case SYNCHRO_TRUE:
		this->SendMsg(&msg);
		break;

	case SYNCHRO_BROADCAST:
		this->BroadcastRoomMsg(&msg, INCLUDE_SELF);
		break;

	default:
		break;
	}
}

//////////////////////////////////////////////////////////////////////
// return false mean fatal syn error.
bool CUser::SynPosition(int nPosX, int nPosY, int nMaxDislocation/* = 8*/)
{
	if (nMaxDislocation <= 0 || (nPosX == 0 && nPosY == 0))	// ignore in this condition

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -