diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index b4a83c9..2723e50 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -10,6 +10,7 @@ #include "android.ai.h" #include "app.h" #include "perfmonitor.h" +#include "smoke_mitask.h" Bullet::Bullet():MoveableEntity() { @@ -191,12 +192,49 @@ void Bullet::ProcBomb() //烟雾弹 a8::Vec2 bomb_pos = GetPos(); room->frame_event.AddSmoke(this, meta->i->id(), bomb_pos); + ProcSmokeBomb(); } break; } room->RemoveObjectLater(this); } +void Bullet::ProcSmokeBomb() +{ + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(HUNLUAN_BUFFID); + if (buff_meta) { + SmokeMiTask* task = new SmokeMiTask(); + task->room = room; + task->bomb_pos = GetPos(); + task->buff_meta = buff_meta; + room->xtimer.AddRepeatTimerAndAttach + (SERVER_FRAME_RATE / 2, + a8::XParams() + .SetSender(task), + [] (const a8::XParams& param) + { + SmokeMiTask* task = (SmokeMiTask*)param.sender.GetUserData(); + task->Check(); + }, + &task->timer_attacher.timer_list_); + + room->xtimer.AddDeadLineTimerAndAttach + (SERVER_FRAME_RATE * MetaMgr::Instance()->GetSysParamAsInt("smoke_duration", 10), + a8::XParams() + .SetSender(task), + [] (const a8::XParams& param) + { + }, + &room->timer_attacher.timer_list_, + [] (const a8::XParams& param) + { + SmokeMiTask* task = (SmokeMiTask*)param.sender.GetUserData(); + delete task; + } + ); + } +} + bool Bullet::IsBomb() { return diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index a922c59..c3605c7 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -40,6 +40,7 @@ protected: void OnHit(std::set& objects); void ProcBomb(); + void ProcSmokeBomb(); bool IsBomb(); inline void MapServiceUpdate(); float GetAtk(); diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index a15e9ac..e2c8330 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -138,7 +138,8 @@ enum BuffEffectType_e kBET_CliEffect1 = 19, //僵尸被动光环减速(客户端表现用) kBET_CliEffect2 = 20, //僵尸被动光环毒物(客户端表现用) kBET_CliEffect3 = 21, //僵尸被动光环地震(客户端表现用) - kBET_CliEffect4 = 22, //被拖拽(客户端表现用) + kBET_CliEffect4 = 22, //被拖拽(客户端表现用) + kBET_HunLuan = 23, //混乱,在烟雾弹中不自动瞄准 kBET_End }; diff --git a/server/gameserver/microtask.cc b/server/gameserver/microtask.cc new file mode 100644 index 0000000..b8b6737 --- /dev/null +++ b/server/gameserver/microtask.cc @@ -0,0 +1,3 @@ +#include "precompile.h" + +#include "microtask.h" diff --git a/server/gameserver/microtask.h b/server/gameserver/microtask.h new file mode 100644 index 0000000..71d0266 --- /dev/null +++ b/server/gameserver/microtask.h @@ -0,0 +1,7 @@ +#pragma once + +class MicroTask +{ + public: + a8::TimerAttacher timer_attacher; +}; diff --git a/server/gameserver/smoke_mitask.cc b/server/gameserver/smoke_mitask.cc new file mode 100644 index 0000000..d14a5b1 --- /dev/null +++ b/server/gameserver/smoke_mitask.cc @@ -0,0 +1,32 @@ +#include "precompile.h" + +#include "smoke_mitask.h" +#include "room.h" +#include "player.h" + +void SmokeMiTask::Check() +{ + { + std::list deleted_hums; + for (auto& hum : player_set) { + if (bomb_pos.Distance(hum->GetPos()) > 0.0001) { + 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()) < 0.0001) { + if (!hum->HasBuffEffect(kBET_HunLuan)) { + hum->AddBuff(nullptr, buff_meta, 1, nullptr); + } + } + return true; + }); +} diff --git a/server/gameserver/smoke_mitask.h b/server/gameserver/smoke_mitask.h new file mode 100644 index 0000000..c36dd0b --- /dev/null +++ b/server/gameserver/smoke_mitask.h @@ -0,0 +1,22 @@ +#pragma once + +#include "microtask.h" + +const int HUNLUAN_BUFFID = 6001; +namespace MetaData +{ + struct Buff; +} + +class Room; +class Player; +class SmokeMiTask : public MicroTask +{ + public: + Room* room = nullptr; + a8::Vec2 bomb_pos; + std::set player_set; + MetaData::Buff* buff_meta = nullptr; + + void Check(); +};