110 lines
3.6 KiB
C++
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);
|
|
}
|
|
}
|