diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 2fb35b3..6ec1f08 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -204,16 +204,12 @@ void Bullet::ProcBomb() case IS_POSION_GAS_BOMB: { //毒气弹 - a8::Vec2 bomb_pos = GetPos(); - room->frame_event.AddSmoke(this, meta->i->id(), bomb_pos); ProcPosionGasBomb(delay_time); } break; case IS_MOLOTOR_COCKTAIL: { //燃烧瓶 - a8::Vec2 bomb_pos = GetPos(); - room->frame_event.AddSmoke(this, meta->i->id(), bomb_pos); ProcMolotorCocktailBomb(delay_time); } break; @@ -374,10 +370,56 @@ void Bullet::ProcFragBomb(int delay_time) void Bullet::ProcPosionGasBomb(int delay_time) { - + if (sender.Get()) { + PosionGasMiTask* task = new PosionGasMiTask(); + task->room = room; + task->sender.Attach(sender.Get()); + task->bomb_pos = GetPos(); + task->gun_meta = gun_meta; + task->meta = meta; + room->xtimer.AddDeadLineTimerAndAttach + (std::max(1, (int)(delay_time / FRAME_RATE_MS)), + a8::XParams() + .SetSender(task), + [] (const a8::XParams& param) + { + PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData(); + task->Done(); + }, + &task->timer_attacher.timer_list_, + [] (const a8::XParams& param) + { + PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData(); + delete task; + } + ); + } } void Bullet::ProcMolotorCocktailBomb(int delay_time) { - + if (sender.Get()) { + MolotorCocktailMiTask* task = new MolotorCocktailMiTask(); + task->room = room; + task->sender.Attach(sender.Get()); + task->bomb_pos = GetPos(); + task->gun_meta = gun_meta; + task->meta = meta; + room->xtimer.AddDeadLineTimerAndAttach + (std::max(1, (int)(delay_time / FRAME_RATE_MS)), + a8::XParams() + .SetSender(task), + [] (const a8::XParams& param) + { + MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData(); + task->Done(); + }, + &task->timer_attacher.timer_list_, + [] (const a8::XParams& param) + { + MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData(); + delete task; + } + ); + } } diff --git a/server/gameserver/molotor_cocktail_mitask.cc b/server/gameserver/molotor_cocktail_mitask.cc index b684270..b79cde4 100644 --- a/server/gameserver/molotor_cocktail_mitask.cc +++ b/server/gameserver/molotor_cocktail_mitask.cc @@ -5,37 +5,6 @@ #include "player.h" #include "metadata.h" -void MolotorCocktailMiTask::Check() -{ - { - std::list deleted_hums; - for (auto& hum : player_set) { - if (bomb_pos.Distance(hum->GetPos()) > gun_meta->i->bullet_rad() + hum->meta->i->radius()) { - hum->RemoveBuffByEffectId(kBET_HunLuan); - deleted_hums.push_back(hum); - } - } - for (auto& hum : deleted_hums) { - player_set.erase(hum); - } - } - room->TouchPlayerList - (a8::XParams(), - [this] (Player* hum, a8::XParams&) -> bool - { - if (bomb_pos.Distance(hum->GetPos()) < gun_meta->i->bullet_rad() + hum->meta->i->radius()) { - if (!hum->HasBuffEffect(kBET_HunLuan)) { - hum->AddBuff(nullptr, buff_meta, 1, nullptr); - player_set.insert(hum); - } - } - return true; - }); -} - void MolotorCocktailMiTask::Done() { - for (auto& hum : player_set) { - hum->RemoveBuffByEffectId(kBET_HunLuan); - } } diff --git a/server/gameserver/molotor_cocktail_mitask.h b/server/gameserver/molotor_cocktail_mitask.h index a4ecdc1..526cbdc 100644 --- a/server/gameserver/molotor_cocktail_mitask.h +++ b/server/gameserver/molotor_cocktail_mitask.h @@ -15,10 +15,9 @@ class MolotorCocktailMiTask : public MicroTask public: Room* room = nullptr; a8::Vec2 bomb_pos; - std::set player_set; - MetaData::Buff* buff_meta = nullptr; + CreatureWeakPtr sender; MetaData::Equip* gun_meta = nullptr; + MetaData::Equip* meta = nullptr; - void Check(); void Done(); }; diff --git a/server/gameserver/posiongas_mitask.cc b/server/gameserver/posiongas_mitask.cc index 7e69042..eeb4f9b 100644 --- a/server/gameserver/posiongas_mitask.cc +++ b/server/gameserver/posiongas_mitask.cc @@ -5,37 +5,7 @@ #include "player.h" #include "metadata.h" -void PosionGasMiTask::Check() -{ - { - std::list deleted_hums; - for (auto& hum : player_set) { - if (bomb_pos.Distance(hum->GetPos()) > gun_meta->i->bullet_rad() + hum->meta->i->radius()) { - hum->RemoveBuffByEffectId(kBET_HunLuan); - deleted_hums.push_back(hum); - } - } - for (auto& hum : deleted_hums) { - player_set.erase(hum); - } - } - room->TouchPlayerList - (a8::XParams(), - [this] (Player* hum, a8::XParams&) -> bool - { - if (bomb_pos.Distance(hum->GetPos()) < gun_meta->i->bullet_rad() + hum->meta->i->radius()) { - if (!hum->HasBuffEffect(kBET_HunLuan)) { - hum->AddBuff(nullptr, buff_meta, 1, nullptr); - player_set.insert(hum); - } - } - return true; - }); -} - void PosionGasMiTask::Done() { - for (auto& hum : player_set) { - hum->RemoveBuffByEffectId(kBET_HunLuan); - } + } diff --git a/server/gameserver/posiongas_mitask.h b/server/gameserver/posiongas_mitask.h index e771abe..705bc68 100644 --- a/server/gameserver/posiongas_mitask.h +++ b/server/gameserver/posiongas_mitask.h @@ -15,10 +15,9 @@ class PosionGasMiTask : public MicroTask public: Room* room = nullptr; a8::Vec2 bomb_pos; - std::set player_set; - MetaData::Buff* buff_meta = nullptr; + CreatureWeakPtr sender; MetaData::Equip* gun_meta = nullptr; + MetaData::Equip* meta = nullptr; - void Check(); void Done(); };