1
This commit is contained in:
parent
5964026268
commit
615411eea6
@ -63,8 +63,6 @@ void Creature::AddBuff(Creature* caster,
|
||||
buff->add_frameno = room->GetFrameNo();
|
||||
buff->xtimer_attacher.xtimer = &room->xtimer;
|
||||
buff_effect_[buff->meta->i->buff_effect()] = buff;
|
||||
#if 0
|
||||
room->frame_event.AddBuff(this, buff);
|
||||
{
|
||||
room->xtimer.AddDeadLineTimerAndAttach
|
||||
(
|
||||
@ -74,15 +72,14 @@ void Creature::AddBuff(Creature* caster,
|
||||
.SetParam1(buff_meta->i->buff_id()),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
hum->RemoveBuffById(param.param1);
|
||||
Creature* c = (Creature*)param.sender.GetUserData();
|
||||
c->RemoveBuffById(param.param1);
|
||||
},
|
||||
&buff->xtimer_attacher.timer_list_
|
||||
);
|
||||
}
|
||||
ProcBuffEffect(caster, buff);
|
||||
#endif
|
||||
#ifdef DEBUG1
|
||||
AddBuffPostProc(caster, buff);
|
||||
#ifdef DEBUG
|
||||
SendDebugMsg(a8::Format("添加buff_id:%d buff_effect:%d",
|
||||
{
|
||||
buff_meta->i->buff_id(),
|
||||
@ -111,6 +108,58 @@ void Creature::MustBeAddBuff(Creature* caster, int buff_id)
|
||||
}
|
||||
|
||||
void Creature::RemoveBuffById(int buff_id)
|
||||
{
|
||||
for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) {
|
||||
const Buff& buff = *itr;
|
||||
if (buff.meta->i->buff_id() == buff_id) {
|
||||
if (buff_effect_[buff.meta->i->buff_effect()] == &(*itr)) {
|
||||
buff_effect_[buff.meta->i->buff_effect()] = nullptr;
|
||||
}
|
||||
OnBuffRemove(buff);
|
||||
buff_list_.erase(itr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
RecalcBuffAttr();
|
||||
#ifdef DEBUG
|
||||
SendDebugMsg(a8::Format("移除buff_id:%d",
|
||||
{
|
||||
buff_id
|
||||
}));
|
||||
#endif
|
||||
}
|
||||
|
||||
void Creature::SendDebugMsg(const std::string& debug_msg)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Creature::AddBuffPostProc(Creature* caster, Buff* buff)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Creature::RecalcBuffAttr()
|
||||
{
|
||||
buff_attr_abs_ = {};
|
||||
buff_attr_rate_ = {};
|
||||
for (auto& buff : buff_list_) {
|
||||
if (buff.meta->i->buff_effect() == kBET_ChgAttr ||
|
||||
buff.meta->i->buff_effect() == kBET_Car) {
|
||||
int attr_type = (int)buff.meta->param1;
|
||||
int calc_type = (int)buff.meta->param2;
|
||||
if (IsValidHumanAttr(attr_type)) {
|
||||
if (calc_type == 1) {
|
||||
buff_attr_abs_[attr_type] += buff.meta->param3;
|
||||
} else if (calc_type == 2) {
|
||||
buff_attr_rate_[attr_type] += buff.meta->param3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Creature::OnBuffRemove(const Buff& buff)
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -19,7 +19,14 @@ class Creature : public MoveableEntity
|
||||
MetaData::Skill* buff_skill_meta = nullptr);
|
||||
bool IsImmuneBuffEffect(int buff_effect);
|
||||
void MustBeAddBuff(Creature* caster, int buff_id);
|
||||
virtual void RemoveBuffById(int buff_id);
|
||||
void RemoveBuffById(int buff_id);
|
||||
virtual void SendDebugMsg(const std::string& debug_msg);
|
||||
void RecalcBuffAttr();
|
||||
|
||||
private:
|
||||
|
||||
virtual void AddBuffPostProc(Creature* caster, Buff* buff);
|
||||
virtual void OnBuffRemove(const Buff& buff);
|
||||
|
||||
protected:
|
||||
std::array<float, kHAT_End> buff_attr_abs_ = {};
|
||||
|
@ -3076,29 +3076,6 @@ void Human::TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigge
|
||||
}
|
||||
}
|
||||
|
||||
void Human::RemoveBuffById(int buff_id)
|
||||
{
|
||||
for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) {
|
||||
const Buff& buff = *itr;
|
||||
if (buff.meta->i->buff_id() == buff_id) {
|
||||
if (buff_effect_[buff.meta->i->buff_effect()] == &(*itr)) {
|
||||
buff_effect_[buff.meta->i->buff_effect()] = nullptr;
|
||||
}
|
||||
OnBuffRemove(buff);
|
||||
buff_list_.erase(itr);
|
||||
room->frame_event.RemoveBuff(this, buff_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
RecalcBuffAttr();
|
||||
#ifdef DEBUG
|
||||
SendDebugMsg(a8::Format("移除buff_id:%d",
|
||||
{
|
||||
buff_id
|
||||
}));
|
||||
#endif
|
||||
}
|
||||
|
||||
void Human::RemoveBuffByEffectId(int buff_effect_id)
|
||||
{
|
||||
Buff* buff = GetBuffByEffectId(buff_effect_id);
|
||||
@ -3113,13 +3090,7 @@ void Human::ClearBuffList()
|
||||
if (buff_effect_[itr->meta->i->buff_effect()] == &(*itr)) {
|
||||
buff_effect_[itr->meta->i->buff_effect()] = nullptr;
|
||||
}
|
||||
#if 0
|
||||
switch (itr->meta->i->buff_effect()) {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
room->frame_event.RemoveBuff(this, itr->meta->i->buff_id());
|
||||
OnBuffRemove(*itr);
|
||||
}
|
||||
buff_list_.clear();
|
||||
buff_effect_ = {};
|
||||
@ -3128,8 +3099,9 @@ void Human::ClearBuffList()
|
||||
RecalcBuffAttr();
|
||||
}
|
||||
|
||||
void Human::ProcBuffEffect(Human* caster, Buff* buff)
|
||||
void Human::AddBuffPostProc(Creature* caster, Buff* buff)
|
||||
{
|
||||
room->frame_event.AddBuff(this, buff);
|
||||
switch (buff->meta->i->buff_effect()) {
|
||||
case kBET_ChgAttr:
|
||||
case kBET_Car:
|
||||
@ -3255,34 +3227,38 @@ void Human::ProcBuffEffect(Human* caster, Buff* buff)
|
||||
float def = hum->ability.def * (1 + hum->GetBuffAttrRate(kHAT_Def)) +
|
||||
hum->GetBuffAttrAbs(kHAT_Def);
|
||||
#endif
|
||||
DecHP(buff->meta->param1,
|
||||
caster->GetEntityUniId(),
|
||||
caster->name,
|
||||
0);
|
||||
if (caster->GetEntityType() == ET_Player) {
|
||||
DecHP(buff->meta->param1,
|
||||
caster->GetEntityUniId(),
|
||||
((Human*)caster)->name,
|
||||
0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case kBET_DelayAddBuff:
|
||||
{
|
||||
room->xtimer.AddDeadLineTimerAndAttach
|
||||
(
|
||||
SERVER_FRAME_RATE * buff->meta->param1,
|
||||
a8::XParams()
|
||||
.SetSender(this)
|
||||
.SetParam1(caster)
|
||||
.SetParam2(buff->meta->param2)
|
||||
.SetParam3(caster->skill_meta_),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
Human* caster = (Human*)param.param1.GetUserData();
|
||||
int buff_id = param.param2;
|
||||
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
|
||||
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
|
||||
if (buff_meta && skill == caster->skill_meta_ && caster) {
|
||||
hum->AddBuff(caster, buff_meta, caster->GetSkillLv(), skill);
|
||||
}
|
||||
},
|
||||
&buff->xtimer_attacher.timer_list_);
|
||||
if (caster->GetEntityType() == ET_Player) {
|
||||
room->xtimer.AddDeadLineTimerAndAttach
|
||||
(
|
||||
SERVER_FRAME_RATE * buff->meta->param1,
|
||||
a8::XParams()
|
||||
.SetSender(this)
|
||||
.SetParam1(caster)
|
||||
.SetParam2(buff->meta->param2)
|
||||
.SetParam3(((Human*)caster)->skill_meta_),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
Human* caster = (Human*)param.param1.GetUserData();
|
||||
int buff_id = param.param2;
|
||||
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
|
||||
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
|
||||
if (buff_meta && skill == caster->skill_meta_ && caster) {
|
||||
hum->AddBuff(caster, buff_meta, caster->GetSkillLv(), skill);
|
||||
}
|
||||
},
|
||||
&buff->xtimer_attacher.timer_list_);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -3438,26 +3414,6 @@ void Human::DropItems(Obstacle* obstacle)
|
||||
#endif
|
||||
}
|
||||
|
||||
void Human::RecalcBuffAttr()
|
||||
{
|
||||
buff_attr_abs_ = {};
|
||||
buff_attr_rate_ = {};
|
||||
for (auto& buff : buff_list_) {
|
||||
if (buff.meta->i->buff_effect() == kBET_ChgAttr ||
|
||||
buff.meta->i->buff_effect() == kBET_Car) {
|
||||
int attr_type = (int)buff.meta->param1;
|
||||
int calc_type = (int)buff.meta->param2;
|
||||
if (IsValidHumanAttr(attr_type)) {
|
||||
if (calc_type == 1) {
|
||||
buff_attr_abs_[attr_type] += buff.meta->param3;
|
||||
} else if (calc_type == 2) {
|
||||
buff_attr_rate_[attr_type] += buff.meta->param3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Human::Revive()
|
||||
{
|
||||
if (room->GetRoomMode() == kZombieMode) {
|
||||
@ -4208,6 +4164,7 @@ void Human::OnBuffRemove(const Buff& buff)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
room->frame_event.RemoveBuff(this, buff.meta->i->buff_id());
|
||||
}
|
||||
|
||||
void Human::OnLand()
|
||||
|
@ -237,7 +237,7 @@ class Human : public Creature
|
||||
}
|
||||
void SendGameOver();
|
||||
void FollowTarget(Human* target);
|
||||
void SendDebugMsg(const std::string& debug_msg);
|
||||
virtual void SendDebugMsg(const std::string& debug_msg) override;
|
||||
void SendRollMsg(const std::string& roll_msg);
|
||||
void UpdateAction();
|
||||
void SendUIUpdate();
|
||||
@ -260,10 +260,8 @@ class Human : public Creature
|
||||
void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type);
|
||||
void TriggerBuff(std::set<Entity*>& target_list, BuffTriggerType_e trigger_type);
|
||||
void RemoveBuffByEffectId(int buff_effect_id);
|
||||
virtual void RemoveBuffById(int buff_id) override;
|
||||
void ClearBuffList();
|
||||
void RecalcBuffAttr();
|
||||
void ProcBuffEffect(Human* caster, Buff* buff);
|
||||
virtual void AddBuffPostProc(Creature* caster, Buff* buff) override;
|
||||
int GetLevel() {return level_;};
|
||||
int GetExp() {return exp_;};
|
||||
void OnAttack() {};
|
||||
@ -339,11 +337,11 @@ private:
|
||||
void OnMetaChange();
|
||||
void OnChgToTerminator();
|
||||
void ProcReloadAction();
|
||||
void OnBuffRemove(const Buff& buff);
|
||||
void OnLand();
|
||||
void NextReload(int prev_weapon_id, int prev_weapon_idx);
|
||||
void DoGetOnWithLoot(Loot* loot_entity);
|
||||
void DoGetOnWithCar(Car* car);
|
||||
virtual void OnBuffRemove(const Buff& buff) override;
|
||||
|
||||
protected:
|
||||
int level_ = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user