diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index f9544a2..0f5cac0 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -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; diff --git a/server/gameserver/constant_export.h b/server/gameserver/constant_export.h index b2dc5b4..71cfe37 100644 --- a/server/gameserver/constant_export.h +++ b/server/gameserver/constant_export.h @@ -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 { diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 84e7861..c7f12fd 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -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) diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 11051e9..50046ae 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -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_; + int buff_uniid_ = 1000; std::array buff_effect_ = {}; std::array depend_effect_ = {}; std::array cond_buffs_ = {}; diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index e554a7e..b78103c 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -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; } } { diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index d9a7e49..4a7ed6e 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -72,6 +72,7 @@ namespace MetaData { const metatable::Equip* i = nullptr; + int lock_time = 0; std::vector> bullet_born_offset; std::vector> shoot_offsets; std::array volume = {}; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index ea2a748..2b18247 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -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; //库存槽位