diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index d7ee0a5..08e4457 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -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) { } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index e917158..9a523d8 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -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 buff_attr_abs_ = {}; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 7568862..3809c33 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3076,29 +3076,6 @@ void Human::TriggerBuff(std::set& 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() diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 431bbf2..af89a5d 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -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& 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;