From 2737a2fc17e6a15ac750903f26d1c682c71b10f9 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 11 Jul 2019 14:15:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9C=B0=E9=9B=B7=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 25 ++++++++++++++++++++++++- server/gameserver/obstacle.cc | 4 ++-- server/gameserver/obstacle.h | 2 +- server/gameserver/room.h | 1 - 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 782cd69..b36ea0b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1717,6 +1717,24 @@ Buff* Human::GetBuffByEffectId(int effect_id) void Human::ProcSkillPhase(MetaData::SkillPhase* phase) { + auto frame_check_func = + [] (const a8::XParams& param) + { + Obstacle* obstacle = (Obstacle*)param.sender.GetUserData(); + if (!obstacle->dead) { + obstacle->room->TouchHumanList(a8::XParams(), + [obstacle] (Human* hum, a8::XParams&) -> bool + { + if (obstacle->master->team_id != hum->team_id) { + obstacle->dead = true; + obstacle->Explosion(); + return false; + } + return true; + }); + } + }; + switch (phase->func_id) { case Skill_Jump: { @@ -1732,7 +1750,12 @@ void Human::ProcSkillPhase(MetaData::SkillPhase* phase) { Obstacle* obstacle = room->CreateObstacle(phase->param1.GetInt(), pos.x, pos.y); if (obstacle) { - obstacle->master_id = entity_uniid; + obstacle->master = this; + room->xtimer.AddRepeatTimerAndAttach(2, + a8::XParams() + .SetSender(obstacle), + frame_check_func, + &obstacle->xtimer_attacher.timer_list_); room->xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE * 5, a8::XParams() .SetSender(obstacle), diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 9fc6f74..b8daa45 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -114,8 +114,8 @@ void Obstacle::FillMFObjectFull(cs::MFObjectFull* full_data) p->set_health(health); p->set_dead(dead); p->set_dead_at_thisframe(dead ? dead_frameno <= room->frame_no : false); - if (master_id != 0) { - p->set_master_id(master_id); + if (master) { + p->set_master_id(master->entity_uniid); } p->set_is_door(is_door); diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 3bdfe43..a1583e5 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -32,7 +32,7 @@ class Obstacle : public Entity DoorState_e door_state = DoorStateClose; Building* building = nullptr; int door_house_uniid = 0; - int master_id = 0; + Human* master = nullptr; bool explosioned = false; const metatable::DoorObjJson* door_state0 = nullptr; const metatable::DoorObjJson* door_state1 = nullptr; diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 6c19f71..9448e4e 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -44,7 +44,6 @@ public: MapService map_service; long long battle_start_frameno_ = 0; long long pending_request = 0; - std::set mines_; ~Room(); void Init();