添加射击锁定buff

This commit is contained in:
aozhiwei 2021-07-16 15:22:47 +08:00
parent 72e0139859
commit 22ef2e0301
7 changed files with 45 additions and 12 deletions

View File

@ -29,6 +29,7 @@ struct xtimer_list;
class Buff
{
public:
int buff_uniid = 0;
Creature* owner = nullptr;
MetaData::Buff* meta = nullptr;
MetaData::Skill* skill_meta = nullptr;

View File

@ -15,6 +15,7 @@ const int kInMountainTopBuffId = 7014;
const int kDownBuffId = 7015;
const int kPoisioningBuffId = 7016;
const int kRescueBuffId = 7017;
const int kVertigoBuffId = 7018;
enum BuffEffectType_e
{

View File

@ -25,6 +25,7 @@ struct BulletInfo
bool is_tank_skin = false;
int weapon_lv = 0;
int delay_time = 0;
int invincible_buff_uniid = 0;
};
static void InternalCreateBullet(BulletInfo& bullet_info)
@ -124,6 +125,14 @@ void InternalShot(Creature* c,
if (skill_id == 0) {
c->room->frame_event.AddShot(c->GetWeakPtrRef());
}
int invincible_buff_uniid = 0;
if (weapon_meta->lock_time > 0) {
int buff_uniid = c->TryAddBuff(c, kVertigoBuffId);
Buff* buff = c->GetBuffByUniId(buff_uniid);
if (buff && buff->remover_timer) {
c->room->xtimer.ModifyTimer(buff->remover_timer, weapon_meta->lock_time / FRAME_RATE_MS);
}
}
for (auto& tuple : weapon_meta->bullet_born_offset) {
a8::Vec2 bullet_born_offset = a8::Vec2(std::get<0>(tuple), std::get<1>(tuple));
bullet_born_offset.Rotate(c->GetAttackDir().CalcAngle(a8::Vec2::UP));
@ -149,6 +158,7 @@ void InternalShot(Creature* c,
bullet_info.is_tank_skin = is_tank_skin;
bullet_info.weapon_lv = weapon_lv;
bullet_info.delay_time = std::get<3>(tuple);
bullet_info.invincible_buff_uniid = invincible_buff_uniid;
InternalCreateBullet(bullet_info);
}
}
@ -236,6 +246,16 @@ Buff* Creature::GetBuffById(int buff_id)
return nullptr;
}
Buff* Creature::GetBuffByUniId(int buff_uniid)
{
for (Buff& buff : buff_list_) {
if (buff.buff_uniid == buff_uniid) {
return &buff;
}
}
return nullptr;
}
int Creature::GetBuffNum(int buff_id)
{
int num = 0;
@ -247,14 +267,14 @@ int Creature::GetBuffNum(int buff_id)
return num;
}
void Creature::AddBuff(Creature* caster,
int Creature::AddBuff(Creature* caster,
MetaData::Buff* buff_meta,
int skill_lv,
MetaData::Skill* buff_skill_meta)
{
if (buff_meta->i->buff_interval() > 0) {
if (buff_interval_hash_.find(buff_meta->i->buff_id()) != buff_interval_hash_.end()) {
return;
return 0;
}
buff_interval_hash_[buff_meta->i->buff_id()] = room->GetFrameNo();
room->xtimer.AddDeadLineTimerAndAttach
@ -272,14 +292,14 @@ void Creature::AddBuff(Creature* caster,
}
if (buff_meta->i->coexist_num() > 0){
if (GetBuffNum(buff_meta->i->buff_id()) >= buff_meta->i->coexist_num()) {
return;
return 0;
}
}
if (IsImmuneBuffEffect(buff_meta->i->buff_effect())) {
return;
return 0;
}
if (buff_meta->i->depend_effect() != 0 && !HasBuffEffect(buff_meta->i->depend_effect())) {
return;
return 0;
}
if (!buff_meta->EffectCanStack()) {
Buff* buff = GetBuffByEffectId(buff_meta->i->buff_effect());
@ -290,7 +310,10 @@ void Creature::AddBuff(Creature* caster,
if (buff_meta->i->buff_effect() == kBET_OnceChgAttr) {
ProcOnceChgAttrBuff(buff_meta);
}
++buff_uniid_;
int new_buff_uniid = buff_uniid_;
Buff* buff = &a8::FastAppend(buff_list_);
buff->buff_uniid = new_buff_uniid;
buff->SetCaster(caster);
buff->skill_lv = skill_lv;
buff->owner = this;
@ -340,6 +363,7 @@ void Creature::AddBuff(Creature* caster,
}
}
}
return new_buff_uniid;
#ifdef DEBUG
SendDebugMsg(a8::Format("添加buff_id:%d effect:%d %s params:%d,%d,%d,%d,%d",
{
@ -365,21 +389,22 @@ bool Creature::IsImmuneBuffEffect(int buff_effect)
return false;
}
void Creature::MustBeAddBuff(Creature* caster, int buff_id)
int Creature::MustBeAddBuff(Creature* caster, int buff_id)
{
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
if (!buff_meta) {
abort();
}
AddBuff(caster, buff_meta, 1);
return AddBuff(caster, buff_meta, 1);
}
void Creature::TryAddBuff(Creature* caster, int buff_id)
int Creature::TryAddBuff(Creature* caster, int buff_id)
{
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
if (buff_meta) {
AddBuff(caster, buff_meta, 1);
return AddBuff(caster, buff_meta, 1);
}
return -1;
}
void Creature::RemoveBuffById(int buff_id)

View File

@ -92,14 +92,15 @@ class Creature : public MoveableEntity
bool HasBuffEffect(int buff_effect_id);
Buff* GetBuffByEffectId(int effect_id);
Buff* GetBuffById(int buff_id);
Buff* GetBuffByUniId(int buff_uniid);
int GetBuffNum(int buff_id);
void AddBuff(Creature* caster,
int AddBuff(Creature* caster,
MetaData::Buff* buff_meta,
int skill_lv,
MetaData::Skill* buff_skill_meta = nullptr);
bool IsImmuneBuffEffect(int buff_effect);
void MustBeAddBuff(Creature* caster, int buff_id);
void TryAddBuff(Creature* caster, int buff_id);
int MustBeAddBuff(Creature* caster, int buff_id);
int TryAddBuff(Creature* caster, int buff_id);
void RemoveBuffById(int buff_id);
void ClearBuffById(int buff_id);
void RecalcBuffAttr();
@ -252,6 +253,7 @@ private:
CreatureWeakPtrChunk weak_ptr_chunk_;
HumanAbility ability;
std::shared_ptr<Ability> ability_;
int buff_uniid_ = 1000;
std::array<list_head, kBET_End> buff_effect_ = {};
std::array<list_head, kBET_End> depend_effect_ = {};
std::array<list_head, kCondBuffEnd> cond_buffs_ = {};

View File

@ -197,6 +197,7 @@ namespace MetaData
strings2.size() > 3 ? a8::XValue(strings2[3]).GetInt() : 0
)
);
lock_time += strings2.size() > 3 ? a8::XValue(strings2[3]).GetInt() : 0;
}
}
{

View File

@ -72,6 +72,7 @@ namespace MetaData
{
const metatable::Equip* i = nullptr;
int lock_time = 0;
std::vector<std::tuple<float, float, float, int>> bullet_born_offset;
std::vector<std::tuple<int, a8::Vec2>> shoot_offsets;
std::array<int, IS_END> volume = {};

View File

@ -137,6 +137,8 @@ message Equip
optional float average_oil = 58;
optional float atk_mech = 59;
optional int32 use_scene = 60;
optional int32 ispenetrate = 61;
optional int32 is_penetrate_thing = 62;
optional string inventory_slot = 31; //
optional int32 _inventory_slot = 32; //