This commit is contained in:
aozhiwei 2023-02-25 09:12:59 +08:00
parent e7ca5aad51
commit 1c94dc6148
3 changed files with 29 additions and 2 deletions

View File

@ -2733,13 +2733,14 @@ void Creature::ClearEnergyShield()
true); true);
} }
int Creature::AddEffect(int effect_id) std::weak_ptr<Effect> Creature::AddEffect(int effect_id)
{ {
auto effect = std::make_shared<Effect>(); auto effect = std::make_shared<Effect>();
effect->effect_uniid = ++buff_uniid_; effect->effect_uniid = ++buff_uniid_;
effect->owner = this; effect->owner = this;
effect->effect_id = effect_id; effect->effect_id = effect_id;
effect_hash_[effect->effect_uniid] = effect; effect_hash_[effect->effect_uniid] = effect;
return effect;
} }
void Creature::RemoveEffect(int effect_uniid) void Creature::RemoveEffect(int effect_uniid)
@ -2747,6 +2748,13 @@ void Creature::RemoveEffect(int effect_uniid)
effect_hash_.erase(effect_uniid); effect_hash_.erase(effect_uniid);
} }
void Creature::RemoveEffect(std::weak_ptr<Effect> effect)
{
if (!effect.expired()) {
RemoveEffect(effect.lock()->effect_uniid);
}
}
void Creature::RemoveEffects(std::vector<int> effect_uniids) void Creature::RemoveEffects(std::vector<int> effect_uniids)
{ {
for (int effect_uniid : effect_uniids) { for (int effect_uniid : effect_uniids) {

View File

@ -181,7 +181,8 @@ class Creature : public MoveableEntity
void UpdatePoisoning(); void UpdatePoisoning();
Team* GetTeam() { return team_; } Team* GetTeam() { return team_; }
void SetTeam(Team* team) { team_ = team; } void SetTeam(Team* team) { team_ = team; }
int AddEffect(int effect_id); std::weak_ptr<Effect> AddEffect(int effect_id);
void RemoveEffect(std::weak_ptr<Effect> effect);
void RemoveEffect(int effect_uniid); void RemoveEffect(int effect_uniid);
void RemoveEffects(std::vector<int> effect_uniids); void RemoveEffects(std::vector<int> effect_uniids);
void ClearEffect(); void ClearEffect();

View File

@ -21,6 +21,7 @@ struct GraspBuff
std::tuple<const mt::GraspBuff*, const mt::GraspBuff*> buffs; std::tuple<const mt::GraspBuff*, const mt::GraspBuff*> buffs;
std::function<void()> on_remove; std::function<void()> on_remove;
a8::Attacher xtimer_attacher; a8::Attacher xtimer_attacher;
std::vector<std::tuple<CreatureWeakPtr, std::weak_ptr<Effect>>> effect_list;
void ProcSignet(GunGrasp* gun_grasp, int count, Creature* enemy) void ProcSignet(GunGrasp* gun_grasp, int count, Creature* enemy)
{ {
@ -88,6 +89,23 @@ private:
} }
} }
void ProcEffectList(Creature* target, const mt::GraspBuff* buff, int buff_time, int attr_num)
{
for (int effect_id : buff->_effect_list) {
effect_list.push_back(std::make_tuple(target->GetWeakPtrRef(), target->AddEffect(effect_id)));
}
}
void ClearEffectList()
{
for (auto& tuple : effect_list) {
if (std::get<0>(tuple).Get()) {
std::get<0>(tuple).Get()->RemoveEffect(std::get<1>(tuple));
}
}
effect_list.clear();
}
}; };
GunGrasp::GunGrasp(Creature* owner) GunGrasp::GunGrasp(Creature* owner)