diff --git a/server/gameserver/gungrasp.cc b/server/gameserver/gungrasp.cc index 1bef24f2..4eb87931 100644 --- a/server/gameserver/gungrasp.cc +++ b/server/gameserver/gungrasp.cc @@ -14,6 +14,16 @@ struct GraspBuff list_head entry; std::tuple buffs; std::function on_remove; + + void ProcSignet(GunGrasp* gun_grasp, int count) + { + const mt::GraspBuff* buff1_meta = std::get<0>(buffs); + const mt::GraspBuff* buff2_meta = std::get<1>(buffs); + if (buff1_meta && buff2_meta) { + gun_grasp->AddSignet(buff1_meta->graspbuff_id(), count); + } + } + }; GunGrasp::GunGrasp(Creature* owner) @@ -92,9 +102,9 @@ void GunGrasp::ProcHit(GraspBuff* buff) owner_->GetTrigger()->AddListener ( kBulletHitEvent, - [] (const a8::Args& args) + [this, buff] (const a8::Args& args) { - + buff->ProcSignet(this, 1); }); } @@ -103,15 +113,15 @@ void GunGrasp::ProcKill(GraspBuff* buff) owner_->GetTrigger()->AddListener ( kKillEvent, - [] (const a8::Args& args) + [this, buff] (const a8::Args& args) { - + buff->ProcSignet(this, 1); }); } void GunGrasp::ProcTakeOn(GraspBuff* buff) { - + buff->ProcSignet(this, 1); } void GunGrasp::ProcCond(GraspBuff* buff) @@ -124,8 +134,29 @@ void GunGrasp::ProcHitAndEnd(GraspBuff* buff) owner_->GetTrigger()->AddListener ( kBulletHitEvent, - [] (const a8::Args& args) + [this, buff] (const a8::Args& args) { - + buff->ProcSignet(this, 1); }); } + +void GunGrasp::AddSignet(int id, int count) +{ + auto itr = signet_hash_.find(id); + if (itr != signet_hash_.end()) { + itr->second += count; + } else { + signet_hash_[id] = count; + } +} + +int GunGrasp::GetSignetCount(int id) +{ + auto itr = signet_hash_.find(id); + return itr != signet_hash_.end() ? itr->second : 0; +} + +bool GunGrasp::HasBulletBlockBuff() +{ + return !list_empty(&grasp_triggers_[(int)GraspBuffTrigger_e::kHitAndEnd]); +} diff --git a/server/gameserver/gungrasp.h b/server/gameserver/gungrasp.h index b08f3280..302e5d28 100644 --- a/server/gameserver/gungrasp.h +++ b/server/gameserver/gungrasp.h @@ -10,6 +10,8 @@ class GunGrasp void Clear(); void InstallTriggers(); + void AddSignet(int id, int count); + bool HasBulletBlockBuff(); private: void ProcHit(GraspBuff* buff); @@ -18,7 +20,10 @@ class GunGrasp void ProcCond(GraspBuff* buff); void ProcHitAndEnd(GraspBuff* buff); + int GetSignetCount(int id); + private: Creature* owner_ = nullptr; + std::map signet_hash_; std::array grasp_triggers_ = {}; }; diff --git a/server/gameserver/mt/GraspBuff.cc b/server/gameserver/mt/GraspBuff.cc index 8ab06d3f..9240c911 100644 --- a/server/gameserver/mt/GraspBuff.cc +++ b/server/gameserver/mt/GraspBuff.cc @@ -67,4 +67,24 @@ namespace mt } + int GraspBuff::GetBuffTime(int hero_lv) + { + switch (hero_lv) { + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + { + return _buff_times.size() > 1 ? _buff_times.at(1) :_buff_times.at(0); + } + default: + { + return _buff_times.at(0); + } + break; + } + } + } diff --git a/server/gameserver/mt/GraspBuff.h b/server/gameserver/mt/GraspBuff.h index 9c468b36..833a40f2 100644 --- a/server/gameserver/mt/GraspBuff.h +++ b/server/gameserver/mt/GraspBuff.h @@ -17,6 +17,11 @@ namespace mt int _trigger_type = 0; int _trigger_subtype = 0; std::vector _trigger_cond; + int GetBuffTime(int hero_lv); + + private: + std::vector _buff_times; + }; } diff --git a/server/gameserver/trigger.cc b/server/gameserver/trigger.cc index 7612d044..ec8d2423 100644 --- a/server/gameserver/trigger.cc +++ b/server/gameserver/trigger.cc @@ -491,3 +491,8 @@ void Trigger::DmgOut(Creature* target, float dmg) { DispatchEvent(kDmgOutEvent, {target, dmg}); } + +void Trigger::BulletBlock(IBullet* bullet, const glm::vec3& pos) +{ + DispatchEvent(kBulletBlockEvent, {bullet, pos}); +} diff --git a/server/gameserver/trigger.h b/server/gameserver/trigger.h index 50b12378..f46c490b 100644 --- a/server/gameserver/trigger.h +++ b/server/gameserver/trigger.h @@ -24,6 +24,7 @@ enum EventId_e kShieldDestoryEvent, kFlyHookPullEvent, kBulletHitEvent, + kBulletBlockEvent, kYsRemoveEvent, kStartRescueEvent, kEndRescueEvent, @@ -75,6 +76,7 @@ public: void BulletHitBuff(Bullet* bullet); void Attacked(Creature* sender); void DmgOut(Creature* target, float dmg); + void BulletBlock(IBullet* bullet, const glm::vec3& pos); std::weak_ptr AddListener(int event_id, a8::CommonCbProc cb); void RemoveEventHandler(std::weak_ptr handler_ptr);