This commit is contained in:
aozhiwei 2023-03-16 10:00:27 +08:00
parent 8abeb7f234
commit 1efbf7783e
8 changed files with 17 additions and 128 deletions

View File

@ -22,11 +22,13 @@ GunGrasp::~GunGrasp()
void GunGrasp::Init() void GunGrasp::Init()
{ {
#if 0
owner_->GetTrigger()->AddListener owner_->GetTrigger()->AddListener
( (
kDieEvent, kTakeonWeaponEvent
[this] (const a8::Args& args) mutable [this] (const a8::Args& args) mutable
{ {
} }
); );
#endif
} }

View File

@ -3,30 +3,12 @@
#include "mt/Grasp.h" #include "mt/Grasp.h"
IMPL_TABLE(mt::Grasp) IMPL_TABLE(mt::Grasp)
std::map<long long, std::map<int, mt::GraspBuffs>> mt::Grasp::hero_weapon_hash_;
static std::set<int> hero_lv_sets({1, 5, 10, 15});
namespace mt namespace mt
{ {
void Grasp::Init1() void Grasp::Init1()
{ {
buff1_meta = mt::GraspBuff::GetById(graspbuff_id1());
if (graspbuff_id1() && !buff1_meta) {
abort();
}
floor2_buff_meta = mt::GraspBuff::GetById(graspbuff_id1_floor2());
if (graspbuff_id1_floor2() && !floor2_buff_meta) {
abort();
}
buff2_meta = mt::GraspBuff::GetById(graspbuff_id2());
if (graspbuff_id2() && !buff2_meta) {
abort();
}
if (hero_lv_sets.find(hero_lv()) == hero_lv_sets.end()) {
abort();
}
} }
void Grasp::Init2() void Grasp::Init2()
@ -36,104 +18,6 @@ namespace mt
void Grasp::StaticPreInit() void Grasp::StaticPreInit()
{ {
Traverse
(
[] (const mt::Grasp* meta, bool& stop)
{
auto itr = hero_weapon_hash_.find(a8::MakeInt64(meta->hero_id(), meta->weapon_id()));
if (itr != hero_weapon_hash_.end()) {
auto itr2 = itr->second.find(meta->hero_lv());
if (itr2 == itr->second.end()) {
itr->second[meta->hero_lv()] = GraspBuffs();
}
itr2 = itr->second.find(meta->hero_lv());
if (itr2 == itr->second.end()) {
abort();
}
if (meta->buff1_meta && meta->floor2_buff_meta) {
itr2->second.push_back(std::make_tuple(meta->buff1_meta, meta->floor2_buff_meta));
} else {
if (meta->buff1_meta) {
itr2->second.push_back(std::make_tuple(meta->buff1_meta, nullptr));
}
}
if (meta->buff2_meta) {
itr2->second.push_back(std::make_tuple(meta->buff2_meta, nullptr));
}
}
});
auto merge_func =
[] (mt::GraspBuffs* a, mt::GraspBuffs* b)
{
for (auto& tuple1 : *b) {
bool found = false;
for (auto& tuple2 : *a) {
if (std::get<0>(tuple1) && std::get<1>(tuple1)) {
if (std::get<0>(tuple1) == std::get<0>(tuple2) &&
std::get<1>(tuple1) == std::get<1>(tuple2)) {
found = true;
break;
}
} else if (std::get<0>(tuple1) &&
(
std::get<0>(tuple1) == std::get<0>(tuple2) ||
std::get<0>(tuple1) == std::get<1>(tuple2)
)
) {
found = true;
break;
} else if (std::get<1>(tuple1) &&
(std::get<1>(tuple1) == std::get<0>(tuple2) ||
std::get<1>(tuple1) == std::get<1>(tuple2))
) {
found = true;
break;
}
}//end for tuple2
if (!found) {
a->push_back(tuple1);
}
}
};
for (auto& pair : hero_weapon_hash_) {
if (!pair.second.empty()) {
std::vector<std::tuple<int, mt::GraspBuffs*>> tuples;
{
for (auto& pair2 : pair.second) {
tuples.push_back(std::make_tuple(pair2.first, &pair2.second));
}
}
std::sort
(tuples.begin(), tuples.end(),
[] (std::tuple<int, mt::GraspBuffs*>& a, std::tuple<int, mt::GraspBuffs*>& b) -> bool
{
if (std::get<0>(a) == std::get<0>(b)) {
abort();
} else {
return std::get<0>(a) > std::get<0>(b);
}
});
for (size_t i = tuples.size() - 1; i >= 0; ++i) {
int lv = std::get<0>(tuples[i]);
auto buffs = std::get<1>(tuples[i]);
for (size_t ii = 0; ii < tuples.size(); ++ii) {
if (std::get<0>(tuples[ii]) < lv) {
merge_func(buffs, std::get<1>(tuples[ii]));
}
}
}
}
}
}
GraspBuffs* Grasp::GetGrasp(int hero_id, int hero_lv, int weapon_id)
{
auto itr = hero_weapon_hash_.find(a8::MakeInt64(hero_id, weapon_id));
if (itr != hero_weapon_hash_.end()) {
auto itr2 = itr->second.find(hero_lv);
return itr2 != itr->second.end() ? &itr2->second : nullptr;
}
return nullptr;
} }
} }

View File

@ -6,7 +6,6 @@
namespace mt namespace mt
{ {
typedef std::vector<std::tuple<const mt::GraspBuff*, const mt::GraspBuff*>> GraspBuffs;
DECLARE_ID_TABLE(Grasp, mtb::Grasp, DECLARE_ID_TABLE(Grasp, mtb::Grasp,
"grasp@grasp.json", "grasp@grasp.json",
@ -17,14 +16,6 @@ namespace mt
void Init2(); void Init2();
void StaticPreInit(); void StaticPreInit();
const mt::GraspBuff* buff1_meta = nullptr;
const mt::GraspBuff* floor2_buff_meta = nullptr;
const mt::GraspBuff* buff2_meta = nullptr;
static GraspBuffs* GetGrasp(int hero_id, int hero_lv, int weapon_id);
private:
static std::map<long long, std::map<int, GraspBuffs>> hero_weapon_hash_;
}; };
} }

View File

@ -17,6 +17,8 @@ namespace mtb
int graspbuff_id1_floor2() const { return graspbuff_id1_floor2_; }; int graspbuff_id1_floor2() const { return graspbuff_id1_floor2_; };
int graspbuff_id2() const { return graspbuff_id2_; }; int graspbuff_id2() const { return graspbuff_id2_; };
int weapon_id() const { return weapon_id_; }; int weapon_id() const { return weapon_id_; };
const std::string add_buff_list() const { return add_buff_list_; };
const std::string remove_buff_list() const { return remove_buff_list_; };
bool has_grasp_id() const { return __flags__.test(0);}; bool has_grasp_id() const { return __flags__.test(0);};
bool has_hero_id() const { return __flags__.test(1);}; bool has_hero_id() const { return __flags__.test(1);};
@ -25,6 +27,8 @@ namespace mtb
bool has_graspbuff_id1_floor2() const { return __flags__.test(4);}; bool has_graspbuff_id1_floor2() const { return __flags__.test(4);};
bool has_graspbuff_id2() const { return __flags__.test(5);}; bool has_graspbuff_id2() const { return __flags__.test(5);};
bool has_weapon_id() const { return __flags__.test(6);}; bool has_weapon_id() const { return __flags__.test(6);};
bool has_add_buff_list() const { return __flags__.test(7);};
bool has_remove_buff_list() const { return __flags__.test(8);};
protected: protected:
@ -35,9 +39,11 @@ namespace mtb
int graspbuff_id1_floor2_ = 0; int graspbuff_id1_floor2_ = 0;
int graspbuff_id2_ = 0; int graspbuff_id2_ = 0;
int weapon_id_ = 0; int weapon_id_ = 0;
std::string add_buff_list_;
std::string remove_buff_list_;
public: public:
std::bitset<7> __flags__; std::bitset<9> __flags__;
}; };
}; };

View File

@ -748,7 +748,7 @@ namespace mtb
{ {
a8::reflect::Class* meta_class = nullptr; a8::reflect::Class* meta_class = nullptr;
if (!meta_class) { if (!meta_class) {
meta_class = new a8::reflect::Class("Grasp", 7, 0); meta_class = new a8::reflect::Class("Grasp", 9, 0);
meta_class->SetSimpleField(0, "grasp_id", a8::reflect::ET_INT32, my_offsetof2(Grasp, grasp_id_)); meta_class->SetSimpleField(0, "grasp_id", a8::reflect::ET_INT32, my_offsetof2(Grasp, grasp_id_));
meta_class->SetSimpleField(1, "hero_id", a8::reflect::ET_INT32, my_offsetof2(Grasp, hero_id_)); meta_class->SetSimpleField(1, "hero_id", a8::reflect::ET_INT32, my_offsetof2(Grasp, hero_id_));
meta_class->SetSimpleField(2, "hero_lv", a8::reflect::ET_INT32, my_offsetof2(Grasp, hero_lv_)); meta_class->SetSimpleField(2, "hero_lv", a8::reflect::ET_INT32, my_offsetof2(Grasp, hero_lv_));
@ -756,6 +756,8 @@ namespace mtb
meta_class->SetSimpleField(4, "graspbuff_id1_floor2", a8::reflect::ET_INT32, my_offsetof2(Grasp, graspbuff_id1_floor2_)); meta_class->SetSimpleField(4, "graspbuff_id1_floor2", a8::reflect::ET_INT32, my_offsetof2(Grasp, graspbuff_id1_floor2_));
meta_class->SetSimpleField(5, "graspbuff_id2", a8::reflect::ET_INT32, my_offsetof2(Grasp, graspbuff_id2_)); meta_class->SetSimpleField(5, "graspbuff_id2", a8::reflect::ET_INT32, my_offsetof2(Grasp, graspbuff_id2_));
meta_class->SetSimpleField(6, "weapon_id", a8::reflect::ET_INT32, my_offsetof2(Grasp, weapon_id_)); meta_class->SetSimpleField(6, "weapon_id", a8::reflect::ET_INT32, my_offsetof2(Grasp, weapon_id_));
meta_class->SetSimpleField(7, "add_buff_list", a8::reflect::ET_STRING, my_offsetof2(Grasp, add_buff_list_));
meta_class->SetSimpleField(8, "remove_buff_list", a8::reflect::ET_STRING, my_offsetof2(Grasp, remove_buff_list_));
} }
return meta_class; return meta_class;
} }

View File

@ -97,6 +97,7 @@ void Trigger::TakeonWeapon(Weapon* old_weapon, Weapon* new_weapon)
} }
} }
} }
DispatchEvent(kTakeonWeaponEvent, {old_weapon, new_weapon});
} }
void Trigger::Shot(const mt::Equip* weapon_meta) void Trigger::Shot(const mt::Equip* weapon_meta)

View File

@ -41,6 +41,7 @@ enum EventId_e
kAttacked, kAttacked,
kStartJump, kStartJump,
kEndJump, kEndJump,
kTakeonWeaponEvent
}; };
class Weapon; class Weapon;

View File

@ -564,6 +564,8 @@ message Grasp
optional int32 graspbuff_id1_floor2 = 5; optional int32 graspbuff_id1_floor2 = 5;
optional int32 graspbuff_id2 = 6; optional int32 graspbuff_id2 = 6;
optional int32 weapon_id = 7; optional int32 weapon_id = 7;
optional string add_buff_list = 8;
optional string remove_buff_list = 9;
} }
message GraspBuff message GraspBuff