This commit is contained in:
aozhiwei 2021-04-06 14:35:36 +08:00
parent 3493a60a5e
commit 1dec9d2c26
5 changed files with 110 additions and 51 deletions

View File

@ -379,33 +379,23 @@ void Bullet::ProcPosionGasBomb(int delay_time)
task->meta = meta;
task->Initialzie();
room->xtimer.AddRepeatTimerAndAttach
(SERVER_FRAME_RATE / 2,
a8::XParams()
.SetSender(task),
[] (const a8::XParams& param)
{
PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData();
task->Check();
},
&task->timer_attacher.timer_list_);
room->xtimer.AddDeadLineTimerAndAttach
(SERVER_FRAME_RATE * MetaMgr::Instance()->GetSysParamAsInt("smoke_duration", 10),
(delay_time / FRAME_RATE_MS,
a8::XParams()
.SetSender(task),
[] (const a8::XParams& param)
{
},
&room->timer_attacher.timer_list_,
[] (const a8::XParams& param)
{
PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData();
task->Done();
delete task;
}
);
task->room->frame_event.AddExplosionEx
(task->sender,
task->meta->i->id(),
task->bomb_pos,
task->gun_meta->i->explosion_effect());
task->Active();
},
&room->timer_attacher.timer_list_
);
}
}
@ -420,31 +410,22 @@ void Bullet::ProcMolotorCocktailBomb(int delay_time)
task->meta = meta;
task->Initialzie();
room->xtimer.AddRepeatTimerAndAttach
(SERVER_FRAME_RATE / 2,
a8::XParams()
.SetSender(task),
[] (const a8::XParams& param)
{
MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData();
task->Check();
},
&task->timer_attacher.timer_list_);
room->xtimer.AddDeadLineTimerAndAttach
(SERVER_FRAME_RATE * MetaMgr::Instance()->GetSysParamAsInt("smoke_duration", 10),
(delay_time / FRAME_RATE_MS,
a8::XParams()
.SetSender(task),
[] (const a8::XParams& param)
{
},
&room->timer_attacher.timer_list_,
[] (const a8::XParams& param)
{
MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData();
task->Done();
delete task;
}
task->room->frame_event.AddExplosionEx
(task->sender,
task->meta->i->id(),
task->bomb_pos,
task->gun_meta->i->explosion_effect());
task->Active();
},
&room->timer_attacher.timer_list_
);
}
}

View File

@ -16,15 +16,62 @@ void MolotorCocktailMiTask::Initialzie()
);
}
void MolotorCocktailMiTask::Active()
{
room->xtimer.AddRepeatTimerAndAttach
(SERVER_FRAME_RATE / 2,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
{
MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData();
task->Check();
},
&timer_attacher.timer_list_);
room->xtimer.AddDeadLineTimerAndAttach
(SERVER_FRAME_RATE * meta->i->time(),
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
{
},
&timer_attacher.timer_list_,
[] (const a8::XParams& param)
{
MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData();
task->Done();
delete task;
}
);
}
void MolotorCocktailMiTask::Check()
{
if (sender.Get()) {
std::set<Creature*> objects;
sender.Get()->room->grid_service->TouchCreatures
(
sender.Get()->room->GetRoomIdx(),
grid_list,
[this, &objects] (Creature* c, bool& stop)
{
if (sender.Get()->IsProperTarget(c)) {
if (bomb_pos.Distance(c->GetPos()) < meta->i->explosion_range()) {
objects.insert(c);
}
}
}
);
for (Creature* target : objects) {
if (!target->GetBuffById(meta->i->buffid())) {
target->MustBeAddBuff(sender.Get(), meta->i->buffid());
}
}
}
}
void MolotorCocktailMiTask::Done()
{
for (auto& pair : targets) {
if (pair.second.Get()) {
}
}
}

View File

@ -19,10 +19,10 @@ class MolotorCocktailMiTask : public MicroTask
CreatureWeakPtr sender;
MetaData::Equip* gun_meta = nullptr;
MetaData::Equip* meta = nullptr;
std::map<int, CreatureWeakPtr> targets;
std::set<GridCell*> grid_list;
void Initialzie();
void Active();
void Check();
void Done();
};

View File

@ -16,6 +16,37 @@ void PosionGasMiTask::Initialzie()
);
}
void PosionGasMiTask::Active()
{
room->xtimer.AddRepeatTimerAndAttach
(SERVER_FRAME_RATE / 2,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
{
PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData();
task->Check();
},
&timer_attacher.timer_list_);
room->xtimer.AddDeadLineTimerAndAttach
(SERVER_FRAME_RATE * meta->i->time(),
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
{
},
&timer_attacher.timer_list_,
[] (const a8::XParams& param)
{
PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData();
task->Done();
delete task;
}
);
}
void PosionGasMiTask::Check()
{
if (sender.Get()) {
@ -33,14 +64,14 @@ void PosionGasMiTask::Check()
}
}
);
for (Creature* target : objects) {
if (!target->GetBuffById(meta->i->buffid())) {
target->MustBeAddBuff(sender.Get(), meta->i->buffid());
}
}
}
}
void PosionGasMiTask::Done()
{
for (auto& pair : targets) {
if (pair.second.Get()) {
}
}
}

View File

@ -19,10 +19,10 @@ class PosionGasMiTask : public MicroTask
CreatureWeakPtr sender;
MetaData::Equip* gun_meta = nullptr;
MetaData::Equip* meta = nullptr;
std::map<int, CreatureWeakPtr> targets;
std::set<GridCell*> grid_list;
void Initialzie();
void Active();
void Check();
void Done();
};