📄 user.cpp
字号:
// 等级在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 + -