diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 613edf8e..a7258a5b 100644 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -482,16 +482,18 @@ A8_DECLARE_ENUM(TimerUserEvent_e, kDeactiveDjsSkillTimerEvent ); -A8_DECLARE_CLASS_ENUM(GraspBuffTrigger, int, +A8_DECLARE_CLASS_ENUM(GraspBuffTrigger_e, int, kHit = 1, kKill = 2, kTakeOn = 3, kCond = 4, - kHitAndEnd = 5 + kHitAndEnd = 5, + kEnd ); -A8_DECLARE_CLASS_ENUM(GraspBuffTriggerCond, int, - kImprint = 1 +A8_DECLARE_CLASS_ENUM(GraspBuffTriggerCond_e, int, + kImprint = 1, + kEnd ); const char* const PROJ_NAME_FMT = "game%d_gameserver"; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 049dfdac..af42c006 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -20,6 +20,7 @@ #include "buff.h" #include "mapinstance.h" #include "collision.h" +#include "gungrasp.h" #include "mt/Param.h" #include "mt/Hero.h" @@ -59,6 +60,7 @@ Creature::Creature():MoveableEntity() inventory_[IS_1XSCOPE].num = 1; movement_ = std::make_shared(this); + gun_grasp_ = std::make_shared(this); } Creature::~Creature() @@ -1601,7 +1603,6 @@ void Creature::SetCurrWeapon(Weapon* weapon) room->xtimer.Delete(auto_switch_weapon_timer_); } if (curr_weapon_ != weapon) { - GetCurrWeapon()->CalcGraspBuffList(this); GetTrigger()->TakeonWeapon(curr_weapon_, weapon); } curr_weapon_ = weapon; diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index c7a4cedc..51d2b042 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -62,6 +62,7 @@ class Trigger; class DelayAddBuffHandle; class Movement; class Player; +class GunGrasp; class Creature : public MoveableEntity { public: @@ -378,6 +379,8 @@ private: std::map buff_interval_hash_; std::array inventory_ = {}; + std::shared_ptr gun_grasp_; + friend class Buff; friend class AddInventoryBuff; friend class BePullBuff; @@ -390,4 +393,5 @@ private: friend class Skill; friend class Trigger; friend class PBUtils; + friend class GunGrasp; }; diff --git a/server/gameserver/gungrasp.cc b/server/gameserver/gungrasp.cc new file mode 100644 index 00000000..df05646d --- /dev/null +++ b/server/gameserver/gungrasp.cc @@ -0,0 +1,11 @@ +#include "precompile.h" + +#include "gungrasp.h" + +GunGrasp::GunGrasp(Creature* owner) +{ + owner_ = owner; + for (auto& node : grasp_triggers_) { + INIT_LIST_HEAD(&node); + } +} diff --git a/server/gameserver/gungrasp.h b/server/gameserver/gungrasp.h new file mode 100644 index 00000000..901ad930 --- /dev/null +++ b/server/gameserver/gungrasp.h @@ -0,0 +1,12 @@ +#pragma once + +class Creature; +class GunGrasp +{ + public: + GunGrasp(Creature* owner); + + private: + Creature* owner_ = nullptr; + std::array grasp_triggers_ = {}; +}; diff --git a/server/gameserver/weapon.cc b/server/gameserver/weapon.cc index 8650a4d5..43d683c3 100644 --- a/server/gameserver/weapon.cc +++ b/server/gameserver/weapon.cc @@ -15,7 +15,6 @@ void Weapon::Clear() meta = nullptr; bullet_meta = nullptr; skill_meta = nullptr; - grasp_buff_list.clear(); } void Weapon::Recalc() @@ -49,8 +48,3 @@ int Weapon::GetReloadTime(Creature* c) return meta ? meta->reload_time() :0; } } - -void Weapon::CalcGraspBuffList(Creature* c) -{ - grasp_buff_list.clear(); -} diff --git a/server/gameserver/weapon.h b/server/gameserver/weapon.h index 32211a4a..1b9656ae 100644 --- a/server/gameserver/weapon.h +++ b/server/gameserver/weapon.h @@ -17,7 +17,6 @@ class Weapon const mt::Equip* meta = nullptr; const mt::Equip* bullet_meta = nullptr; const mt::Skill* skill_meta = nullptr; - std::vector grasp_buff_list; void Clear(); void ToPB(Creature* c, cs::MFWeapon* pb_obj); @@ -25,7 +24,8 @@ class Weapon int GetClipVolume(Creature* c); int GetFireRate(Creature* c); int GetReloadTime(Creature* c); - void CalcGraspBuffList(Creature* c); + +private: friend class PBUtils; };