diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 06cc400..5714516 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -382,34 +382,12 @@ void Bullet::ProcFragBomb(int delay_time) void Bullet::ProcPosionGasBomb(int delay_time) { - if (sender.Get()) { - a8::Vec2 old_buff_vec2_param1 = sender.Get()->buff_vec2_param1; - sender.Get()->buff_vec2_param1 = GetPos(); - MetaData::Buff * buff_meta = MetaMgr::Instance()->GetBuff(gun_meta->i->buffid()); - if (buff_meta) { - sender.Get()->AddBuff(sender.Get(), - buff_meta, - 1 - ); - } - sender.Get()->buff_vec2_param1 = old_buff_vec2_param1; - } + AddGunBuff(); } void Bullet::ProcMolotorCocktailBomb(int delay_time) { - if (sender.Get()) { - a8::Vec2 old_buff_vec2_param1 = sender.Get()->buff_vec2_param1; - sender.Get()->buff_vec2_param1 = GetPos(); - MetaData::Buff * buff_meta = MetaMgr::Instance()->GetBuff(gun_meta->i->buffid()); - if (buff_meta) { - sender.Get()->AddBuff(sender.Get(), - buff_meta, - 1 - ); - } - sender.Get()->buff_vec2_param1 = old_buff_vec2_param1; - } + AddGunBuff(); } void Bullet::ProcC4Bomb(Car* target, int delay_time) @@ -446,34 +424,12 @@ void Bullet::ProcC4Bomb(Car* target, int delay_time) void Bullet::ProcSignalGunBomb(int delay_time) { - if (sender.Get()) { - a8::Vec2 old_buff_vec2_param1 = sender.Get()->buff_vec2_param1; - sender.Get()->buff_vec2_param1 = GetPos(); - MetaData::Buff * buff_meta = MetaMgr::Instance()->GetBuff(gun_meta->i->buffid()); - if (buff_meta) { - sender.Get()->AddBuff(sender.Get(), - buff_meta, - 1 - ); - } - sender.Get()->buff_vec2_param1 = old_buff_vec2_param1; - } + AddGunBuff(); } void Bullet::ProcShieldWallBomb(int delay_time) { - if (sender.Get()) { - a8::Vec2 old_buff_vec2_param1 = sender.Get()->buff_vec2_param1; - sender.Get()->buff_vec2_param1 = GetPos(); - MetaData::Buff * buff_meta = MetaMgr::Instance()->GetBuff(gun_meta->i->buffid()); - if (buff_meta) { - sender.Get()->AddBuff(sender.Get(), - buff_meta, - 1 - ); - } - sender.Get()->buff_vec2_param1 = old_buff_vec2_param1; - } + AddGunBuff(); } void Bullet::ProcOilBucketBomb(int delay_time) @@ -487,3 +443,21 @@ bool Bullet::IsCurrWeapon() { return sender.Get()->GetCurrWeapon()->meta == gun_meta; } + +void Bullet::AddGunBuff() +{ + if (sender.Get()) { + std::shared_ptr old_context_ability = sender.Get()->context_ability; + a8::Vec2 old_buff_vec2_param1 = sender.Get()->buff_vec2_param1; + sender.Get()->buff_vec2_param1 = GetPos(); + MetaData::Buff * buff_meta = MetaMgr::Instance()->GetBuff(gun_meta->i->buffid()); + if (buff_meta) { + sender.Get()->AddBuff(sender.Get(), + buff_meta, + 1 + ); + } + sender.Get()->buff_vec2_param1 = old_buff_vec2_param1; + sender.Get()->context_ability = old_context_ability; + } +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 6544e7c..eb0b52e 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -58,6 +58,7 @@ protected: void ProcOilBucketBomb(int delay_time); inline void MapServiceUpdate(); void Check(float distance); + void AddGunBuff(); private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 4d897ad..e7ac828 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1585,6 +1585,7 @@ void Creature::SummonObstacle(Buff* buff, int id, const a8::Vec2& pos) obstacle->SetTeamId(room, team_id); obstacle->SetMasterId(room, GetUniId()); obstacle->Active(); + obstacle->context_ability = context_ability; slave_things_.push_back(std::make_tuple(buff->meta->i->buff_id(), obstacle)); } else { abort(); diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index e273c89..d1031a6 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -70,6 +70,7 @@ class Creature : public MoveableEntity Weapon second_weapon; a8::Vec2 buff_vec2_param1; + std::shared_ptr context_ability; bool need_sync_active_player = false; std::function on_loading_bullet; diff --git a/server/gameserver/roomobstacle.h b/server/gameserver/roomobstacle.h index ae4b877..90bdbff 100644 --- a/server/gameserver/roomobstacle.h +++ b/server/gameserver/roomobstacle.h @@ -4,6 +4,7 @@ #include "obstacle.h" #include "weakptr.h" +class Ability; class RoomObstacle : public Obstacle { public: @@ -13,6 +14,7 @@ class RoomObstacle : public Obstacle bool is_terminator_airdrop_box = false; CreatureWeakPtr master; int real_object_uniid = 0; + std::shared_ptr context_ability; virtual ~RoomObstacle() override; virtual void Initialize() override;