From 9b633fd1259cc79d5adb967d27e8a99c58c08f64 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 8 Nov 2023 13:24:12 +0800 Subject: [PATCH] 1 --- server/gameserver/buff/bufffactory.cc | 3 + .../buff/select_target_with_spec_pos.cc | 93 +++++++++++++++++++ .../buff/select_target_with_spec_pos.h | 16 ++++ server/gameserver/constant_export.h | 2 +- server/gameserver/creature.cc | 21 ++++- server/gameserver/creature.h | 4 + 6 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 server/gameserver/buff/select_target_with_spec_pos.cc create mode 100644 server/gameserver/buff/select_target_with_spec_pos.h diff --git a/server/gameserver/buff/bufffactory.cc b/server/gameserver/buff/bufffactory.cc index 9558fd59..06a70a55 100644 --- a/server/gameserver/buff/bufffactory.cc +++ b/server/gameserver/buff/bufffactory.cc @@ -34,6 +34,7 @@ #include "buff/rescuer.h" #include "buff/reverse.h" #include "buff/select_target_with_self_pos.h" +#include "buff/select_target_with_spec_pos.h" #include "buff/sprint.h" #include "buff/summon_loot.h" #include "buff/summon_obstacle.h" @@ -121,6 +122,8 @@ std::shared_ptr BuffFactory::MakeBuff(const mt::Buff* buff_meta) return std::make_shared(); case kBET_SelectTargetWithSelfPos: return std::make_shared(); + case kBET_SelectTargetWithSpecPos: + return std::make_shared(); case kBET_Sprint: return std::make_shared(); case kBET_SummonObstacle: diff --git a/server/gameserver/buff/select_target_with_spec_pos.cc b/server/gameserver/buff/select_target_with_spec_pos.cc new file mode 100644 index 00000000..e67085af --- /dev/null +++ b/server/gameserver/buff/select_target_with_spec_pos.cc @@ -0,0 +1,93 @@ +#include "precompile.h" + +#include +#include +#include + +#include "buff/select_target_with_spec_pos.h" + +#include "creature.h" + +#include "mt/Buff.h" + +void SelectTargetWithSpecPosBuff::Activate() +{ + hold_param3_ = meta->GetBuffParam3(this); + hold_param4_ = meta->GetBuffParam4(this); + std::vector targets; + owner->TraverseCreatures + ( + [this, &targets] (Creature* c, bool& stop) + { + float distance = owner->GetPos().Distance2D2(c->GetPos()); + float angle = 0.0f; + if (distance > 0.0001f) { + glm::vec3 dir = owner->GetAttackDir(); + if (GlmHelper::IsZero(dir)){ + dir = c->GetPos().ToGlmVec3() - owner->GetPos().ToGlmVec3(); + GlmHelper::Normalize(dir); + } + angle = GlmHelper::CalcAngle(dir, + c->GetPos().ToGlmVec3() - owner->GetPos().ToGlmVec3()); + } + if (distance < hold_param3_ && std::abs(angle) <= glm::radians(hold_param4_) / 2.0f / A8_PI) { + switch (meta->_int_buff_param1) { + case kBST_All: + { + targets.push_back(c); + } + break; + case kBST_Self: + { + if (c == owner) { + targets.push_back(c); + } + } + break; + case kBST_FriendlyIncludeSelf: + { + if (c->team_id == owner->team_id) { + targets.push_back(c); + } + } + break; + case kBST_FriendlyExcludeSelf: + { + if (c->team_id == owner->team_id && c != owner) { + targets.push_back(c); + } + } + break; + case kBST_Enemy: + { + if (c->team_id != owner->team_id) { + targets.push_back(c); + } + } + break; + case kBST_EnemyAndSelf: + { + if (c->team_id != owner->team_id || c == owner) { + targets.push_back(c); + } + } + break; + default: + { + } + break; + } + } + } + ); + for (auto& target : targets) { + for (int buff_id : meta->_buff_param2_int_list) { + target->TryAddBuff(caster_.Get(), buff_id, skill_meta); + } + } +} + +void SelectTargetWithSpecPosBuff::Deactivate() +{ + +} diff --git a/server/gameserver/buff/select_target_with_spec_pos.h b/server/gameserver/buff/select_target_with_spec_pos.h new file mode 100644 index 00000000..f1122139 --- /dev/null +++ b/server/gameserver/buff/select_target_with_spec_pos.h @@ -0,0 +1,16 @@ +#pragma once + +#include "buff.h" + +class SelectTargetWithSpecPosBuff : public Buff +{ + public: + + virtual void Activate() override; + virtual void Deactivate() override; + + private: + + float hold_param3_ = 0.0f; + float hold_param4_ = 0.0f; +}; diff --git a/server/gameserver/constant_export.h b/server/gameserver/constant_export.h index 28ab1339..c14e0444 100644 --- a/server/gameserver/constant_export.h +++ b/server/gameserver/constant_export.h @@ -70,7 +70,7 @@ A8_DECLARE_ENUM(BuffEffectType_e, kBET_Sprint = 35, //冲刺 kBET_SummonObstacle = 36, //召唤物件 kBET_FlashMove = 37, //瞬间移动 - kBET_UnUse38 = 38, + kBET_SelectTargetWithSpecPos = 38, //指定中心范围内选取目标,并且批量添加buff kBET_ShotCharge = 39, //射击蓄力 kBET_SelectTargetWithSelfPos = 40, //已自己坐标为中心范围内选取目标,并且批量添加buff kBET_EventAdd = 41, //even添加buff diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index cc9aff3a..e28d5bc6 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -3421,9 +3421,9 @@ Obstacle* Creature::InternalSummonObstacle(Buff* buff, const mt::MapThing* thing bool Creature::CanShot(bool try_reload) { - if (!GetCurrWeapon()) { - return false; - } + if (!GetCurrWeapon()) { + return false; + } if (!GetCurrWeapon()->meta) { return false; } @@ -3673,3 +3673,18 @@ void Creature::InitMobaRoad() path_dir = side == 2 ? 1 : 0; } } + +void Creature::ClearSkillLocalVars(int skill_id) +{ + +} + +float Creature::GetSkillLocalVar(int skill_id, int idx) +{ + +} + +void Creature::SetSkillLocalVar(int skill_id, int idx, float val) +{ + +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index fd758b2b..3621e544 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -389,6 +389,9 @@ class Creature : public MoveableEntity void ActivateTargetValidPos(); void RemoveHideEffect(int reason); void InitMobaRoad(); + void ClearSkillLocalVars(int skill_id); + float GetSkillLocalVar(int skill_id, int idx); + void SetSkillLocalVar(int skill_id, int idx, float val); protected: virtual void OnBuffRemove(Buff& buff); @@ -475,6 +478,7 @@ private: std::shared_ptr compose_; std::map ignore_target_hash_; + std::map> skill_local_vars_; CreatureWeakPtr last_attacker_; int last_attacker_revive_times_ = 0;