This commit is contained in:
aozhiwei 2021-04-02 19:35:23 +08:00
parent e1ba7d045c
commit 5d2039cb28
5 changed files with 53 additions and 74 deletions

View File

@ -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;
}
);
}
}

View File

@ -5,37 +5,6 @@
#include "player.h"
#include "metadata.h"
void MolotorCocktailMiTask::Check()
{
{
std::list<Player*> 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);
}
}

View File

@ -15,10 +15,9 @@ class MolotorCocktailMiTask : public MicroTask
public:
Room* room = nullptr;
a8::Vec2 bomb_pos;
std::set<Player*> player_set;
MetaData::Buff* buff_meta = nullptr;
CreatureWeakPtr sender;
MetaData::Equip* gun_meta = nullptr;
MetaData::Equip* meta = nullptr;
void Check();
void Done();
};

View File

@ -5,37 +5,7 @@
#include "player.h"
#include "metadata.h"
void PosionGasMiTask::Check()
{
{
std::list<Player*> 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);
}
}

View File

@ -15,10 +15,9 @@ class PosionGasMiTask : public MicroTask
public:
Room* room = nullptr;
a8::Vec2 bomb_pos;
std::set<Player*> player_set;
MetaData::Buff* buff_meta = nullptr;
CreatureWeakPtr sender;
MetaData::Equip* gun_meta = nullptr;
MetaData::Equip* meta = nullptr;
void Check();
void Done();
};