From d4c8ce19395d44c52abe70916cb32bc3bcce2155 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 28 Mar 2023 14:48:13 +0800 Subject: [PATCH] 1 --- server/gameserver/attrdefine.h | 1 + server/gameserver/battledatacontext.cc | 10 ++++++++++ server/gameserver/battledatacontext.h | 2 ++ server/gameserver/creature.cc | 6 +++++- server/gameserver/lispenv.cc | 11 +++++++++++ server/gameserver/mtb/Buff.h | 5 ++++- server/gameserver/mtb/mtb.all.cc | 3 ++- server/tools/protobuild/mt.proto | 1 + 8 files changed, 36 insertions(+), 3 deletions(-) diff --git a/server/gameserver/attrdefine.h b/server/gameserver/attrdefine.h index 4b6ebb46..54c35463 100644 --- a/server/gameserver/attrdefine.h +++ b/server/gameserver/attrdefine.h @@ -47,6 +47,7 @@ enum HumanAttrType_e kHAT_CoolDownPct = 51, kHAT_PickUpPct = 52, kHAT_Shield = 53, + kHAT_Tenacity = 54, kHAT_End }; diff --git a/server/gameserver/battledatacontext.cc b/server/gameserver/battledatacontext.cc index e4712cec..79695a4e 100644 --- a/server/gameserver/battledatacontext.cc +++ b/server/gameserver/battledatacontext.cc @@ -912,3 +912,13 @@ float BattleDataContext::GetDrugEfficacyPct() { return 0.0f; } + +float BattleDataContext::GetTenacityPct() +{ + return 0.0f; +} + +float BattleDataContext::GetRecoverHpAdd() +{ + return 0.0f; +} diff --git a/server/gameserver/battledatacontext.h b/server/gameserver/battledatacontext.h index 43f60ec9..1eb6030a 100644 --- a/server/gameserver/battledatacontext.h +++ b/server/gameserver/battledatacontext.h @@ -66,6 +66,8 @@ struct BattleDataContext float GetRescueTimePct(); float GetDrugTimePct(); float GetDrugEfficacyPct(); + float GetTenacityPct(); + float GetRecoverHpAdd(); void SetReviveCoin(int num); int GetReviveCoin(); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index c7e00c18..2d4536cf 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -272,9 +272,13 @@ int Creature::AddBuff(Creature* caster, list_add_tail(&buff->depend_entry, &depend_effect_[buff->meta->depend_effect()]); } { + float dur_time = buff_meta->GetDurationTime(buff.get()); + if (buff->meta->tenacity()) { + dur_time *= (1.0f - GetBattleContext()->GetTenacityPct()); + } buff->remover_timer = room->xtimer.SetTimeoutWpEx ( - buff_meta->GetDurationTime(buff.get()) * SERVER_FRAME_RATE, + dur_time * SERVER_FRAME_RATE, [buff_wp = (std::weak_ptr)buff] (int event, const a8::Args* args) { if (a8::TIMER_EXEC_EVENT == event) { diff --git a/server/gameserver/lispenv.cc b/server/gameserver/lispenv.cc index c3c7c72e..c34230a9 100644 --- a/server/gameserver/lispenv.cc +++ b/server/gameserver/lispenv.cc @@ -110,6 +110,17 @@ public: } return std::make_shared(a8::lisp::Atom(result)); }); + RegisterCProc + ( + "caster.get_skill_recover_effect", + [this] (const a8::lisp::List& params) -> std::shared_ptr + { + double result = 0.0f; + if (context_.buff->GetCaster().Get()) { + context_.buff->GetCaster().Get()->GetBattleContext()->GetRecoverHpAdd(); + } + return std::make_shared(a8::lisp::Atom(result)); + }); RegisterCProc ( "caster.get_skill_distance", diff --git a/server/gameserver/mtb/Buff.h b/server/gameserver/mtb/Buff.h index a3b3264d..fa79e0d8 100644 --- a/server/gameserver/mtb/Buff.h +++ b/server/gameserver/mtb/Buff.h @@ -45,6 +45,7 @@ namespace mtb int disable_useskill() const { return disable_useskill_; }; const std::string effect_list() const { return effect_list_; }; const std::string res_scale() const { return res_scale_; }; + int tenacity() const { return tenacity_; }; bool has_buff_id() const { return __flags__.test(0);}; bool has_name() const { return __flags__.test(1);}; @@ -81,6 +82,7 @@ namespace mtb bool has_disable_useskill() const { return __flags__.test(32);}; bool has_effect_list() const { return __flags__.test(33);}; bool has_res_scale() const { return __flags__.test(34);}; + bool has_tenacity() const { return __flags__.test(35);}; protected: @@ -119,9 +121,10 @@ namespace mtb int disable_useskill_ = 0; std::string effect_list_; std::string res_scale_; + int tenacity_ = 0; public: - std::bitset<35> __flags__; + std::bitset<36> __flags__; }; }; diff --git a/server/gameserver/mtb/mtb.all.cc b/server/gameserver/mtb/mtb.all.cc index 5eacb044..2e94852c 100644 --- a/server/gameserver/mtb/mtb.all.cc +++ b/server/gameserver/mtb/mtb.all.cc @@ -445,7 +445,7 @@ namespace mtb { a8::reflect::Class* meta_class = nullptr; if (!meta_class) { - meta_class = new a8::reflect::Class("Buff", 35, 0); + meta_class = new a8::reflect::Class("Buff", 36, 0); meta_class->SetSimpleField(0, "buff_id", a8::reflect::ET_INT32, my_offsetof2(Buff, buff_id_)); meta_class->SetSimpleField(1, "name", a8::reflect::ET_STRING, my_offsetof2(Buff, name_)); meta_class->SetSimpleField(2, "buff_target", a8::reflect::ET_INT32, my_offsetof2(Buff, buff_target_)); @@ -481,6 +481,7 @@ namespace mtb meta_class->SetSimpleField(32, "disable_useskill", a8::reflect::ET_INT32, my_offsetof2(Buff, disable_useskill_)); meta_class->SetSimpleField(33, "effect_list", a8::reflect::ET_STRING, my_offsetof2(Buff, effect_list_)); meta_class->SetSimpleField(34, "res_scale", a8::reflect::ET_STRING, my_offsetof2(Buff, res_scale_)); + meta_class->SetSimpleField(35, "tenacity", a8::reflect::ET_INT32, my_offsetof2(Buff, tenacity_)); } return meta_class; } diff --git a/server/tools/protobuild/mt.proto b/server/tools/protobuild/mt.proto index 2e7064e7..67808d57 100755 --- a/server/tools/protobuild/mt.proto +++ b/server/tools/protobuild/mt.proto @@ -386,6 +386,7 @@ message Buff optional int32 disable_useskill = 33; optional string effect_list = 35; optional string res_scale = 39; + optional int32 tenacity = 40; } message Drop