This commit is contained in:
aozhiwei 2022-12-29 12:16:07 +08:00
parent 8888385186
commit f46ba84fd7
27 changed files with 462 additions and 458 deletions

View File

@ -343,7 +343,6 @@ void Buff::ProcSputteringFunc(Bullet* bullet)
void Buff::Activate()
{
#if 0
const mt::Buff* buff_meta = meta;
switch (meta->buff_effect()) {
case kBET_ChgAttr:
@ -370,470 +369,13 @@ void Buff::Activate()
}
}
break;
case kBET_TurnOver:
{
ProcTurnOver();
}
break;
case kBET_Camouflage:
{
if (owner->aiming) {
owner->aiming = false;
}
if (owner->action_type != AT_None) {
owner->CancelAction();
}
if (owner->IsHuman()) {
++owner->AsHuman()->stats.use_camouflage_times;
}
}
break;
case kBET_BePull:
{
if (caster_.Get() == owner) {
A8_ABORT();
}
if (caster_.Get()->GetEntitySubType() == EST_Android) {
float target_distance = caster_.Get()->GetPos().Distance2D2(owner->GetPos());
if (target_distance <= 0.000001f) {
owner->SetPos(caster_.Get()->GetPos());
owner->target_pos = caster_.Get()->GetPos();
} else {
if (target_distance <= meta->_param3) {
owner->SetPos(caster_.Get()->GetPos());
owner->target_pos = caster_.Get()->GetPos();
} else {
glm::vec3 move_dir = owner->GetPos().CalcDir(caster_.Get()->GetPos());
GlmHelper::Normalize(move_dir);
owner->SetMoveDir(move_dir);
// 999
#if 1
#else
owner->target_pos = owner->GetPos() + owner->GetMoveDir() * (target_distance - meta->param3);
#endif
}
}
} else {
GlmHelper::Normalize(caster_.Get()->skill_dir_);
// 999
#if 1
#else
target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_;
#endif
glm::vec3 move_dir = owner->GetPos().CalcDir(owner->target_pos);
GlmHelper::Normalize(move_dir);
owner->SetMoveDir(move_dir);
}
}
break;
case kBET_JumpTo:
{
Entity* entity = owner->room->GetEntityByUniId(owner->skill_target_id_);
if (entity) {
float target_distance = entity->GetPos().Distance2D2(owner->GetPos());
if (target_distance <= 0.000001f) {
owner->SetPos(entity->GetPos());
owner->skill_target_pos_ = entity->GetPos();
} else {
if (target_distance <= meta->_param3) {
owner->SetPos(entity->GetPos());
owner->skill_target_pos_ = entity->GetPos();
} else {
glm::vec3 move_dir = owner->GetPos().CalcDir(entity->GetPos());
GlmHelper::Normalize(move_dir);
owner->SetMoveDir(move_dir);
owner->skill_dir_ = owner->GetMoveDir();
// 999
#if 1
#else
owner->skill_target_pos_ = owner->GetPos() + owner->GetMoveDir() * (owner->target_distance - meta->param3);
#endif
}
}
}
owner->target_pos = owner->skill_target_pos_;
}
break;
case kBET_Pull:
{
int i = 0;
}
break;
case kBET_PlayShotAni:
{
}
break;
case kBET_Vertigo:
{
int i = 0;
}
break;
case kBET_DecHp:
{
#if 0
float def = hum->ability.def * (1 + hum->GetBuffAttrRate(kHAT_Def)) +
hum->GetBuffAttrAbs(kHAT_Def);
#endif
#if 0
if (caster->GetEntityType() == ET_Player) {
DecHP(meta->param1,
caster->GetUniId(),
((Human*)caster)->name,
0);
}
#endif
}
break;
case kBET_DelayAddBuff:
{
ProcDelayAddBuff();
}
break;
case kBET_IntervalAddBuff:
{
ProcIntervalAddBuff();
}
break;
case kBET_OnceChgAttr:
{
ProcOnceChgAttr();
}
break;
case kBET_OnceAddHp:
{
owner->AddHp(meta->_param1);
}
break;
case kBET_SummonHero:
{
if (!owner->dead || meta->dead_valid() != 0) {
owner->SummonHero(this, owner->GetPos(), owner->GetMoveDir());
}
}
break;
case kBET_Shield:
{
}
break;
case kBET_Hide:
{
ProcHide();
}
break;
case kBET_Rescuer:
{
ProcRescuer();
}
break;
case kBET_Immune:
{
ProcImmune();
}
break;
case kBET_SummonObstacle:
{
if (!owner->dead || meta->dead_valid() != 0) {
owner->SummonObstacle(this, meta->_param1, owner->context_pos);
}
}
break;
case kBET_Sprint:
{
ProcSprint();
}
break;
case kBET_FlashMove:
{
if (meta->_int_param1 == 0) {
owner->SpecDirMove(owner->skill_dir_, std::max(owner->skill_distance_, 300.0f));
}
}
break;
case kBET_BatchAddBuff:
{
ProcBatchAddBuff();
}
break;
case kBET_BeRecycle:
{
ProcBeRecycle();
}
break;
case kBET_Become:
{
ProcBecome();
}
break;
case kBET_SelectTargetWithSelfPos:
{
ProcSeletTargetWithSelfPos();
}
break;
case kBET_Driver:
{
ProcDriver();
}
break;
case kBET_Passenger:
{
ProcPassenger();
}
break;
case kBET_PullToWalkable:
{
ProcPullToWalkable();
}
break;
case kBET_CondAddBuff:
{
if (!IsValidCondBuff(meta->_int_param1)) {
A8_ABORT();
}
list_add_tail(&cond_entry, &owner->cond_buffs_[meta->_int_param1]);
}
break;
case kBET_AddInventory:
{
for (int slot : meta->_param2_int_list) {
if (IsValidSlotId(slot)) {
owner->buff_inventory_[slot].num += meta->_int_param1;
}
}
if (owner->IsHuman()) {
owner->AsHuman()->RecalcVolume();
}
owner->MarkSyncActivePlayer(__FILE__, __LINE__, __func__);
}
break;
case kBET_AddCarBuff:
{
if (owner->IsHuman() && owner->AsHuman()->GetCar()) {
owner->AsHuman()->GetCar()->TryAddBuff(owner, meta->_int_param1);
}
}
break;
case kBET_RemoveCarBuff:
{
if (owner->IsHuman() && owner->AsHuman()->GetCar()) {
owner->AsHuman()->GetCar()->RemoveBuffById(meta->_int_param1);
}
}
break;
case kBET_UseSkill:
{
Skill* skill = owner->GetSkill(meta->_int_param1);
if (skill) {
++skill->force_use_times;
Position target_pos = owner->GetPos();
owner->DoSkill(
skill->meta->skill_id(),
owner->GetUniId(),
owner->GetAttackDir(),
0,
owner->target_pos
);
}
}
break;
case kBET_CamouflageAddition:
{
Buff* camouflage_buff = owner->GetBuffByEffectId(kBET_Camouflage);
if (camouflage_buff && !camouflage_buff->remover_timer.expired() && meta->_int_param1 > 0) {
int remain_time = owner->room->xtimer.GetRemainTime(camouflage_buff->remover_timer) * FRAME_RATE_MS;
remain_time += meta->_int_param1;
owner->room->xtimer.ModifyTime(camouflage_buff->remover_timer, remain_time / FRAME_RATE_MS);
}
if (meta->_int_param2 != 0) {
++owner->camouflage_move_addition_;
}
if (meta->_int_param3 != 0) {
++owner->camouflage_aiming_addition_;
}
}
break;
case kBET_AutoShot:
{
ProcAutoShot();
}
break;
case kBET_BeatBack:
{
ProcBeatBack();
}
break;
case kBET_Disperse:
{
ProcDisperse();
}
break;
case kBET_PeaceMode:
{
}
break;
case kBET_Dive:
{
ProcDive();
}
break;
case kBET_InWater:
{
ProcInWater();
}
break;
case kBET_Reverse:
{
ProcReserve();
}
break;
case kBET_ReverseMove:
{
ProcReserveMove();
}
break;
case kBET_MachineGun:
{
ProcMachineGun();
}
break;
case kBET_HoldShield:
{
ProcHoldShield();
}
break;
case kBET_CallFunc:
{
ProcCallFunc();
}
break;
default:
{
}
break;
}
#endif
}
void Buff::Deactivate()
{
#if 0
switch (meta->buff_effect()) {
case kBET_OnceChgAttr:
{
ProcRemoveOnceChgAttr();
}
break;
case kBET_Sprint:
{
}
break;
case kBET_HoldShield:
{
ProcRemoveHoldShield();
}
break;
case kBET_Hide:
{
ProcRemoveHide();
}
break;
case kBET_BePull:
{
int i = 0;
}
break;
case kBET_Rescuer:
{
ProcRemoveRescuer();
}
break;
case kBET_Immune:
{
ProcRemoveImmune();
}
break;
case kBET_CallFunc:
{
ProcRemoveCallFunc();
}
break;
case kBET_Jump:
{
//跳伞结束
owner->room->xtimer.SetTimeoutEx
(1,
[this] (int event, const a8::Args* args)
{
if (owner->IsHuman()) {
owner->AsHuman()->OnLand();
}
},
&xtimer_attacher);
}
break;
case kBET_Become:
{
ProcRemoveBecome();
}
break;
case kBET_Driver:
{
ProcRemoveDriver();
}
break;
case kBET_Passenger:
{
ProcRemovePassenger();
}
break;
case kBET_Dive:
{
ProcRemoveDive();
}
break;
case kBET_InWater:
{
ProcRemoveInWater();
}
break;
case kBET_AddInventory:
{
if (owner->IsHuman()) {
for (int slot : meta->_param2_int_list) {
if (IsValidSlotId(slot)) {
owner->AsHuman()->buff_inventory_[slot].num -= meta->_int_param1;
owner->AsHuman()->buff_inventory_[slot].num =
std::max(0, owner->AsHuman()->buff_inventory_[slot].num);
}
}
owner->AsHuman()->RecalcVolume();
owner->AsHuman()->MarkSyncActivePlayer(__FILE__, __LINE__, __func__);
}
}
break;
case kBET_CamouflageAddition:
{
if (owner->AsHuman()) {
if (meta->_int_param2 != 0) {
--owner->AsHuman()->camouflage_move_addition_;
}
if (meta->_int_param3 != 0) {
--owner->AsHuman()->camouflage_aiming_addition_;
}
owner->AsHuman()->camouflage_move_addition_ = std::max(owner->AsHuman()->camouflage_move_addition_, 0);
owner->AsHuman()->camouflage_aiming_addition_ = std::max(owner->AsHuman()->camouflage_aiming_addition_, 0);
}
}
break;
case kBET_MachineGun:
{
ProcRemoveMachineGun();
};
default:
{
}
break;
}
#endif
}

View File

@ -0,0 +1,15 @@
#include "precompile.h"
#include "buff/add_car.h"
void AddCarBuff::Activate()
{
if (owner->IsHuman() && owner->AsHuman()->GetCar()) {
owner->AsHuman()->GetCar()->TryAddBuff(owner, meta->_int_param1);
}
}
void AddCarBuff::Deactivate()
{
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class AddCarBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,31 @@
#include "precompile.h"
#include "buff/add_inventory.h"
void AddInventoryBuff::Activate()
{
for (int slot : meta->_param2_int_list) {
if (IsValidSlotId(slot)) {
owner->buff_inventory_[slot].num += meta->_int_param1;
}
}
if (owner->IsHuman()) {
owner->AsHuman()->RecalcVolume();
}
owner->MarkSyncActivePlayer(__FILE__, __LINE__, __func__);
}
void AddInventoryBuff::Deactivate()
{
if (owner->IsHuman()) {
for (int slot : meta->_param2_int_list) {
if (IsValidSlotId(slot)) {
owner->AsHuman()->buff_inventory_[slot].num -= meta->_int_param1;
owner->AsHuman()->buff_inventory_[slot].num =
std::max(0, owner->AsHuman()->buff_inventory_[slot].num);
}
}
owner->AsHuman()->RecalcVolume();
owner->AsHuman()->MarkSyncActivePlayer(__FILE__, __LINE__, __func__);
}
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class AddInventoryBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,46 @@
#include "precompile.h"
#include "buff/bepull.h"
void BePullBuff::Activate()
{
if (caster_.Get() == owner) {
A8_ABORT();
}
if (caster_.Get()->GetEntitySubType() == EST_Android) {
float target_distance = caster_.Get()->GetPos().Distance2D2(owner->GetPos());
if (target_distance <= 0.000001f) {
owner->SetPos(caster_.Get()->GetPos());
owner->target_pos = caster_.Get()->GetPos();
} else {
if (target_distance <= meta->_param3) {
owner->SetPos(caster_.Get()->GetPos());
owner->target_pos = caster_.Get()->GetPos();
} else {
glm::vec3 move_dir = owner->GetPos().CalcDir(caster_.Get()->GetPos());
GlmHelper::Normalize(move_dir);
owner->SetMoveDir(move_dir);
// 999
#if 1
#else
owner->target_pos = owner->GetPos() + owner->GetMoveDir() * (target_distance - meta->param3);
#endif
}
}
} else {
GlmHelper::Normalize(caster_.Get()->skill_dir_);
// 999
#if 1
#else
target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_;
#endif
glm::vec3 move_dir = owner->GetPos().CalcDir(owner->target_pos);
GlmHelper::Normalize(move_dir);
owner->SetMoveDir(move_dir);
}
}
void BePullBuff::Deactivate()
{
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class BePullBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,25 @@
#include "precompile.h"
#include "buff/camouflage.h"
#include "creature.h"
#include "human.h"
void CamouflageBuff::Activate()
{
if (owner->aiming) {
owner->aiming = false;
}
if (owner->action_type != AT_None) {
owner->CancelAction();
}
if (owner->IsHuman()) {
++owner->AsHuman()->stats.use_camouflage_times;
}
}
void CamouflageBuff::Deactivate()
{
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class CamouflageBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,33 @@
#include "precompile.h"
#include "buff/camouflage_addition.h"
void CamouflageAdditionBuff::Activate()
{
Buff* camouflage_buff = owner->GetBuffByEffectId(kBET_Camouflage);
if (camouflage_buff && !camouflage_buff->remover_timer.expired() && meta->_int_param1 > 0) {
int remain_time = owner->room->xtimer.GetRemainTime(camouflage_buff->remover_timer) * FRAME_RATE_MS;
remain_time += meta->_int_param1;
owner->room->xtimer.ModifyTime(camouflage_buff->remover_timer, remain_time / FRAME_RATE_MS);
}
if (meta->_int_param2 != 0) {
++owner->camouflage_move_addition_;
}
if (meta->_int_param3 != 0) {
++owner->camouflage_aiming_addition_;
}
}
void CamouflageAdditionBuff::Deactivate()
{
if (owner->AsHuman()) {
if (meta->_int_param2 != 0) {
--owner->AsHuman()->camouflage_move_addition_;
}
if (meta->_int_param3 != 0) {
--owner->AsHuman()->camouflage_aiming_addition_;
}
owner->AsHuman()->camouflage_move_addition_ = std::max(owner->AsHuman()->camouflage_move_addition_, 0);
owner->AsHuman()->camouflage_aiming_addition_ = std::max(owner->AsHuman()->camouflage_aiming_addition_, 0);
}
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class CamouflageAdditionBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,16 @@
#include "precompile.h"
#include "buff/cond_add.h"
void CondAddBuff::Activate()
{
if (!IsValidCondBuff(meta->_int_param1)) {
A8_ABORT();
}
list_add_tail(&cond_entry, &owner->cond_buffs_[meta->_int_param1]);
}
void CondAddBuff::Deactivate()
{
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class CondAddBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,15 @@
#include "precompile.h"
#include "buff/flashmove.h"
void FlashMoveBuff::Activate()
{
if (meta->_int_param1 == 0) {
owner->SpecDirMove(owner->skill_dir_, std::max(owner->skill_distance_, 300.0f));
}
}
void FlashMoveBuff::Deactivate()
{
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class FlashMoveBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,22 @@
#include "precompile.h"
#include "buff/jump.h"
void JumpBuff::Activate()
{
}
void JumpBuff::Deactivate()
{
//跳伞结束
owner->room->xtimer.SetTimeoutEx
(1,
[this] (int event, const a8::Args* args)
{
if (owner->IsHuman()) {
owner->AsHuman()->OnLand();
}
},
&xtimer_attacher);
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class JumpBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,36 @@
#include "precompile.h"
#include "buff/jumpto.h"
void JumpToBuff::Activate()
{
Entity* entity = owner->room->GetEntityByUniId(owner->skill_target_id_);
if (entity) {
float target_distance = entity->GetPos().Distance2D2(owner->GetPos());
if (target_distance <= 0.000001f) {
owner->SetPos(entity->GetPos());
owner->skill_target_pos_ = entity->GetPos();
} else {
if (target_distance <= meta->_param3) {
owner->SetPos(entity->GetPos());
owner->skill_target_pos_ = entity->GetPos();
} else {
glm::vec3 move_dir = owner->GetPos().CalcDir(entity->GetPos());
GlmHelper::Normalize(move_dir);
owner->SetMoveDir(move_dir);
owner->skill_dir_ = owner->GetMoveDir();
// 999
#if 1
#else
owner->skill_target_pos_ = owner->GetPos() + owner->GetMoveDir() * (owner->target_distance - meta->param3);
#endif
}
}
}
owner->target_pos = owner->skill_target_pos_;
}
void JumpToBuff::Deactivate()
{
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class JumpToBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,13 @@
#include "precompile.h"
#include "buff/pull.h"
void PullBuff::Activate()
{
InternalTimerAddBuff();
}
void PullBuff::Deactivate()
{
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class PullBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,15 @@
#include "precompile.h"
#include "buff/remove_car.h"
void removeCarBuff::Activate()
{
if (owner->IsHuman() && owner->AsHuman()->GetCar()) {
owner->AsHuman()->GetCar()->RemoveBuffById(meta->_int_param1);
}
}
void RemoveCarBuff::Deactivate()
{
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class RemoveCarBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,15 @@
#include "precompile.h"
#include "buff/summon_obstacle.h"
void SummonObstacleBuff::Activate()
{
if (!owner->dead || meta->dead_valid() != 0) {
owner->SummonObstacle(this, meta->_param1, owner->context_pos);
}
}
void SummonObstacleBuff::Deactivate()
{
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class SummonObstacleBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};

View File

@ -0,0 +1,24 @@
#include "precompile.h"
#include "buff/use_skill.h"
void UseSkillBuff::Activate()
{
Skill* skill = owner->GetSkill(meta->_int_param1);
if (skill) {
++skill->force_use_times;
Position target_pos = owner->GetPos();
owner->DoSkill(
skill->meta->skill_id(),
owner->GetUniId(),
owner->GetAttackDir(),
0,
owner->target_pos
);
}
}
void UseSkillBuff::Deactivate()
{
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "buff.h"
class UseSkillBuff : Buff
{
public:
virtual void Activate() override;
virtual void Deactivate() override;
};