diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 19b6f21..91aa774 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1392,35 +1392,7 @@ RoomObstacle* Creature::SummonObstacle(int id, const a8::Vec2& pos) RoomObstacle* obstacle = room->CreateObstacle(id, pos.x, pos.y); if (obstacle) { obstacle->master.Attach(this); - if (obstacle->meta->i->thing_type() == kObstacleSelfExplosion) { - obstacle->Active(); - } else { - room->xtimer.AddRepeatTimerAndAttach - ( - SERVER_FRAME_RATE, - a8::XParams() - .SetSender(obstacle), - [] (const a8::XParams& param) - { - RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); - obstacle->ActiveTimerFunc(); - }, - &obstacle->xtimer_attacher.timer_list_ - ); - - room->xtimer.AddRepeatTimerAndAttach - ( - SERVER_FRAME_RATE, - a8::XParams() - .SetSender(obstacle), - [] (const a8::XParams& param) - { - RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); - obstacle->UpdateTimerFunc(); - }, - &obstacle->xtimer_attacher.timer_list_ - ); - } + obstacle->Active(); } else { abort(); } diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index 6e90d8d..3e9c390 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -325,32 +325,105 @@ void RoomObstacle::Active() switch (meta->i->thing_type()) { case kObstacleSelfExplosion: { - room->xtimer.AddDeadLineTimerAndAttach - ( - meta->i->time() / FRAME_RATE_MS, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); - obstacle->room->xtimer.AddRepeatTimerAndAttach - ( - obstacle->meta->i->explosion_interval() / FRAME_RATE_MS, - a8::XParams() - .SetSender(obstacle), - [] (const a8::XParams& param) - { - RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); - obstacle->SpecExplosion(); - }, - &obstacle->xtimer_attacher.timer_list_ - ); - }, - &xtimer_attacher.timer_list_ - ); + ActiveSelfExplosion(); + } + break; + case kObstacleMine: + { + ActiveMine(); + } + break; + case kObstacleTrap: + { + ActiveTrap(); } break; default: break; } } + +void RoomObstacle::ActiveSelfExplosion() +{ + room->xtimer.AddDeadLineTimerAndAttach + ( + meta->i->time() / FRAME_RATE_MS, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + obstacle->room->xtimer.AddRepeatTimerAndAttach + ( + obstacle->meta->i->explosion_interval() / FRAME_RATE_MS, + a8::XParams() + .SetSender(obstacle), + [] (const a8::XParams& param) + { + RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + obstacle->SpecExplosion(); + }, + &obstacle->xtimer_attacher.timer_list_ + ); + }, + &xtimer_attacher.timer_list_ + ); +} + +void RoomObstacle::ActiveMine() +{ + room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + obstacle->ActiveTimerFunc(); + }, + &xtimer_attacher.timer_list_ + ); + + room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + obstacle->UpdateTimerFunc(); + }, + &xtimer_attacher.timer_list_ + ); +} + +void RoomObstacle::ActiveTrap() +{ + room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + obstacle->ActiveTimerFunc(); + }, + &xtimer_attacher.timer_list_ + ); + + room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + obstacle->UpdateTimerFunc(); + }, + &xtimer_attacher.timer_list_ + ); +} diff --git a/server/gameserver/roomobstacle.h b/server/gameserver/roomobstacle.h index 7413810..613100a 100644 --- a/server/gameserver/roomobstacle.h +++ b/server/gameserver/roomobstacle.h @@ -25,6 +25,9 @@ class RoomObstacle : public Obstacle private: void Explosion(); void SpecExplosion(); + void ActiveSelfExplosion(); + void ActiveMine(); + void ActiveTrap(); protected: bool temp_through_ = false;