1
This commit is contained in:
parent
e1ba7d045c
commit
5d2039cb28
@ -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;
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user