diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 2723e50..b9c2121 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -207,6 +207,7 @@ void Bullet::ProcSmokeBomb() task->room = room; task->bomb_pos = GetPos(); task->buff_meta = buff_meta; + task->gun_meta = gun_meta; room->xtimer.AddRepeatTimerAndAttach (SERVER_FRAME_RATE / 2, a8::XParams() @@ -229,6 +230,7 @@ void Bullet::ProcSmokeBomb() [] (const a8::XParams& param) { SmokeMiTask* task = (SmokeMiTask*)param.sender.GetUserData(); + task->Done(); delete task; } ); @@ -237,6 +239,9 @@ void Bullet::ProcSmokeBomb() bool Bullet::IsBomb() { + #if 0 + ((metatable::Equip*)meta->i)->set__inventory_slot(6); + #endif return meta->i->_inventory_slot() == 4 || meta->i->_inventory_slot() == 5 || diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 0604b0a..4bd33f8 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3032,6 +3032,13 @@ void Human::AddBuff(Human* caster, ); } ProcBuffEffect(caster, buff); + #ifdef DEBUG + SendDebugMsg(a8::Format("添加buff_id:%d buff_effect:%d", + { + buff_meta->i->buff_id(), + buff_meta->i->buff_effect() + })); + #endif } bool Human::IsImmuneBuffEffect(int buff_effect) @@ -3057,6 +3064,12 @@ void Human::RemoveBuffById(int buff_id) } } RecalcBuffAttr(); + #ifdef DEBUG + SendDebugMsg(a8::Format("移除buff_id:%d", + { + buff_id + })); + #endif } void Human::RemoveBuffByEffectId(int buff_effect_id) diff --git a/server/gameserver/smoke_mitask.cc b/server/gameserver/smoke_mitask.cc index d14a5b1..0d60f4b 100644 --- a/server/gameserver/smoke_mitask.cc +++ b/server/gameserver/smoke_mitask.cc @@ -3,13 +3,14 @@ #include "smoke_mitask.h" #include "room.h" #include "player.h" +#include "metadata.h" void SmokeMiTask::Check() { { std::list deleted_hums; for (auto& hum : player_set) { - if (bomb_pos.Distance(hum->GetPos()) > 0.0001) { + if (bomb_pos.Distance(hum->GetPos()) > gun_meta->i->bullet_rad() + hum->meta->i->radius()) { hum->RemoveBuffByEffectId(kBET_HunLuan); deleted_hums.push_back(hum); } @@ -22,11 +23,19 @@ void SmokeMiTask::Check() (a8::XParams(), [this] (Player* hum, a8::XParams&) -> bool { - if (bomb_pos.Distance(hum->GetPos()) < 0.0001) { + 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 SmokeMiTask::Done() +{ + for (auto& hum : player_set) { + hum->RemoveBuffByEffectId(kBET_HunLuan); + } +} diff --git a/server/gameserver/smoke_mitask.h b/server/gameserver/smoke_mitask.h index c36dd0b..5c611f2 100644 --- a/server/gameserver/smoke_mitask.h +++ b/server/gameserver/smoke_mitask.h @@ -6,6 +6,7 @@ const int HUNLUAN_BUFFID = 6001; namespace MetaData { struct Buff; + struct Equip; } class Room; @@ -17,6 +18,8 @@ class SmokeMiTask : public MicroTask a8::Vec2 bomb_pos; std::set player_set; MetaData::Buff* buff_meta = nullptr; + MetaData::Equip* gun_meta = nullptr; void Check(); + void Done(); };