game2006/server/gameserver/buff/hold_shield.cc
aozhiwei dbc90afc57 1
2023-04-04 15:39:38 +08:00

110 lines
3.6 KiB
C++

#include "precompile.h"
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/vec2.hpp>
#include "buff/hold_shield.h"
#include "skill.h"
#include "creature.h"
#include "human.h"
#include "room.h"
#include "skillhelper.h"
#include "trigger.h"
#include "entityfactory.h"
#include "explosion.h"
#include "mt/Skill.h"
#include "mt/Buff.h"
#include "mt/SkillNumber.h"
void HoldShieldBuff::Activate()
{
#if 1
//999
owner->shield_max_hp_ = skill_meta->_number_meta->shield() +
skill_meta->_number_meta->shield_addition() * owner->GetMaxHP();
#else
owner->shield_max_hp_ = owner->GetMaxHP();
#endif
owner->shield_hp_ = owner->shield_max_hp_;
owner->room->frame_event.AddPropChg(owner->GetWeakPtrRef(),
kPropShieldHp,
owner->shield_max_hp_,
owner->shield_hp_);
check_interval_time_ = meta->GetBuffParam3(this);
check_distance_ = meta->GetBuffParam5(this);
if (meta->_buff_param1_int_list.size() > 1) {
std::map<int, long long> hited_objects = std::map<int, long long>();
owner->room->xtimer.SetIntervalEx
(
SERVER_FRAME_RATE,
[this, hited_objects] (int event, const a8::Args* args) mutable
{
if (a8::TIMER_EXEC_EVENT == event) {
std::set<Creature*> enemys;
owner->GetHitEnemys(enemys, owner->GetPos().ToGlmVec3(), check_distance_);
for (auto& enemy : enemys) {
float distance = owner->GetPos().Distance2D2(enemy->GetPos());
float angle = 0.0f;
if (distance > 0.0001f) {
angle = GlmHelper::CalcAngle
(owner->GetAttackDir(),
enemy->GetPos().ToGlmVec3() - owner->GetPos().ToGlmVec3());
}
float angle2 = glm::radians(180.0f) / 2.0f / A8_PI;
if (std::abs(angle) > angle2) {
continue;
}
auto itr = hited_objects.find(enemy->GetUniId());
if (itr != hited_objects.end()) {
if (owner->room->GetFrameNo() - itr->second <
check_interval_time_ * SERVER_FRAME_RATE) {
continue;
}
}
if (enemy->IsEntityType(ET_Car)) {
continue;
}
hited_objects[enemy->GetUniId()] = owner->room->GetFrameNo();
OnEnemyHit(enemy);
}
}
},
&xtimer_attacher);
}
event_handlers_.push_back(owner->GetTrigger()->AddListener
(
kDownedEvent,
[this] (const a8::Args& args)
{
if (owner->IsHuman()) {
owner->AsHuman()->ShiledBreak();
}
}));
event_handlers_.push_back(owner->GetTrigger()->AddListener
(
kDieEvent,
[this] (const a8::Args& args)
{
if (owner->IsHuman()) {
owner->AsHuman()->ShiledBreak();
}
}));
}
void HoldShieldBuff::Deactivate()
{
}
void HoldShieldBuff::OnEnemyHit(Creature* enemy)
{
if (meta->_buff_param1_int_list.size() > 1) {
enemy->TryAddBuff(GetCaster().Get(), meta->_buff_param1_int_list[1], skill_meta);
}
}