From bb24c44830ec47edc9c20a02a069f9ead3d7bb56 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 23 May 2019 11:48:02 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9A=AE=E8=82=A4=E7=AD=89=E7=BA=A7ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 2 +- server/gameserver/constant.h | 1 + server/gameserver/human.cc | 46 ++++++------- server/gameserver/metadata.cc | 88 +++++++++++++++++++++++++ server/gameserver/metadata.h | 13 ++++ server/gameserver/metamgr.cc | 1 + server/gameserver/room.cc | 4 +- server/tools/protobuild/metatable.proto | 8 +-- 8 files changed, 133 insertions(+), 30 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 737e1ea..6924d2b 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -114,7 +114,7 @@ void Bullet::OnHit(std::set& objects) player->stats.damage_amount_out += finaly_dmg; hum->DecHP(finaly_dmg, player->entity_uniid, player->name, gun_meta->i->id()); if (a8::HasBitFlag(hum->status, HS_ReflectDamage) && hum->skill_meta) { - float reflect_dmg = finaly_dmg * hum->skill_meta->i->value1(); + float reflect_dmg = finaly_dmg * hum->skill_meta->GetValue1(hum->skin.skin_lv); if (reflect_dmg > 1.0f) { player->DecHP(reflect_dmg, hum->entity_uniid, hum->name, gun_meta->i->id()); } diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 158f8b4..a323a23 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -146,6 +146,7 @@ const int SYNC_FRAME_RATE = 10; const float FRAME_RATE_MS = 1000.0f / SERVER_FRAME_RATE; const int MAX_WEAPON_NUM = 5; +const int MAX_SKIN_LV = 9; const int GUN_SLOT1 = 1; const int GUN_SLOT2 = 2; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 2bc2c5d..a61590e 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -773,7 +773,7 @@ void Human::DoSkill() { if (skill_meta && skill_meta->i->condition() == SC_Active) { int passed_time = (room->frame_no - last_use_skill_frameno_) * FRAME_RATE_MS; - int skill_left_time = std::max(0, skill_meta->i->last_time() * 1000 - passed_time); + int skill_left_time = std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time); if (skill_left_time <= 0 || last_use_skill_frameno_ == 0) { skill_xtimer_attacher_.ClearTimerList(); switch (skill_meta->i->type()) { @@ -781,7 +781,7 @@ void Human::DoSkill() { hide_frameno_ = room->frame_no; a8::SetBitFlag(status, HS_Hide); - room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE, a8::XParams() .SetSender(this), [] (const a8::XParams& param) @@ -809,8 +809,8 @@ void Human::DoSkill() { accelerate_frameno_ = room->frame_no; a8::SetBitFlag(status, HS_Accelerate); - buff.speed += skill_meta->i->value1(); - room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + buff.speed += skill_meta->GetValue1(skin.skin_lv); + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE, a8::XParams() .SetSender(this), [] (const a8::XParams& param) @@ -834,7 +834,7 @@ void Human::DoSkill() { damageadd_frameno_ = room->frame_no; a8::SetBitFlag(status, HS_DamageAdd); - room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE, a8::XParams() .SetSender(this), [] (const a8::XParams& param) @@ -857,7 +857,7 @@ void Human::DoSkill() { defadd_frameno_ = room->frame_no; a8::SetBitFlag(status, HS_DefAdd); - room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE, a8::XParams() .SetSender(this), [] (const a8::XParams& param) @@ -894,7 +894,7 @@ void Human::DoSkill() }, &skill_xtimer_attacher_.timer_list_ ); - room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE, a8::XParams() .SetSender(this), [] (const a8::XParams& param) @@ -917,7 +917,7 @@ void Human::DoSkill() { reflect_damage_frameno_ = room->frame_no; a8::SetBitFlag(status, HS_ReflectDamage); - room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE, a8::XParams() .SetSender(this), [] (const a8::XParams& param) @@ -1293,50 +1293,50 @@ void Human::FillBodyState(::google::protobuf::RepeatedPtrField<::cs::MFBodyState int passed_time = (room->frame_no - hide_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = states->Add(); state->set_state_type(HS_Hide); - state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); - state->set_lasting_time(skill_meta->i->last_time() * 1000); + state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time)); + state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000); } if (a8::HasBitFlag(status, HS_Accelerate) && skill_meta) { int passed_time = (room->frame_no - accelerate_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = states->Add(); state->set_state_type(HS_Accelerate); - state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); - state->set_lasting_time(skill_meta->i->last_time() * 1000); + state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time)); + state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000); } if (a8::HasBitFlag(status, HS_DamageAdd) && skill_meta) { int passed_time = (room->frame_no - damageadd_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = states->Add(); state->set_state_type(HS_DamageAdd); - state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); - state->set_lasting_time(skill_meta->i->last_time() * 1000); + state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time)); + state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000); } if (a8::HasBitFlag(status, HS_DefAdd) && skill_meta) { int passed_time = (room->frame_no - defadd_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = states->Add(); state->set_state_type(HS_DefAdd); - state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); - state->set_lasting_time(skill_meta->i->last_time() * 1000); + state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time)); + state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000); } if (a8::HasBitFlag(status, HS_RecoverHP) && skill_meta) { int passed_time = (room->frame_no - recover_hp_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = states->Add(); state->set_state_type(HS_RecoverHP); - state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); - state->set_lasting_time(skill_meta->i->last_time() * 1000); + state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time)); + state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000); } if (a8::HasBitFlag(status, HS_ReflectDamage) && skill_meta) { int passed_time = (room->frame_no - reflect_damage_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = states->Add(); state->set_state_type(HS_ReflectDamage); - state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); - state->set_lasting_time(skill_meta->i->last_time() * 1000); + state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time)); + state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000); } if (a8::HasBitFlag(status, HS_SummonHero) && skill_meta) { int passed_time = (room->frame_no - summon_hero_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = states->Add(); state->set_state_type(HS_SummonHero); - state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); - state->set_lasting_time(skill_meta->i->last_time() * 1000); + state->set_left_time(std::max(0, skill_meta->GetLastTime(skin.skin_lv) * 1000 - passed_time)); + state->set_lasting_time(skill_meta->GetLastTime(skin.skin_lv) * 1000); } } @@ -1346,7 +1346,7 @@ void Human::SummonHero() if (hero) { summon_hero_frameno_ = room->frame_no; a8::SetBitFlag(status, HS_SummonHero); - room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->GetLastTime(skin.skin_lv) * SERVER_FRAME_RATE, a8::XParams() .SetSender(this) .SetParam1(hero->entity_uniid), diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index e2390cb..712a428 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -332,4 +332,92 @@ namespace MetaData } } + void Skill::Init() + { + { + std::vector strings; + a8::Split(i->value1(), strings, '|'); + assert(i->value1() == "" || strings.size() == MAX_SKIN_LV); + for (size_t i = 0; i < strings.size(); ++i) { + if (i < MAX_SKIN_LV) { + value1[i] = a8::XValue(strings[i]).GetDouble(); + } + } + } + { + std::vector strings; + a8::Split(i->value2(), strings, '|'); + assert(i->value2() == "" || strings.size() == MAX_SKIN_LV); + for (size_t i = 0; i < strings.size(); ++i) { + if (i < MAX_SKIN_LV) { + value2[i] = a8::XValue(strings[i]).GetDouble(); + } + } + } + { + std::vector strings; + a8::Split(i->area(), strings, '|'); + assert(i->area() == "" || strings.size() == MAX_SKIN_LV); + for (size_t i = 0; i < strings.size(); ++i) { + if (i < MAX_SKIN_LV) { + area[i] = a8::XValue(strings[i]).GetDouble(); + } + } + } + { + std::vector strings; + a8::Split(i->last_time(), strings, '|'); + assert(i->last_time() == "" || strings.size() == MAX_SKIN_LV); + for (size_t i = 0; i < strings.size(); ++i) { + if (i < MAX_SKIN_LV) { + last_time[i] = a8::XValue(strings[i]); + } + } + } + } + + float Skill::GetValue1(int skin_lv) + { + if (skin_lv < 1) { + return value1[0]; + } + if (skin_lv > MAX_SKIN_LV) { + return value1[MAX_SKIN_LV - 1]; + } + return value1[skin_lv - 1]; + } + + float Skill::GetValue2(int skin_lv) + { + if (skin_lv < 1) { + return value2[0]; + } + if (skin_lv > MAX_SKIN_LV) { + return value2[MAX_SKIN_LV - 1]; + } + return value2[skin_lv - 1]; + } + + float Skill::GetArea(int skin_lv) + { + if (skin_lv < 1) { + return area[0]; + } + if (skin_lv > MAX_SKIN_LV) { + return area[MAX_SKIN_LV - 1]; + } + return area[skin_lv - 1]; + } + + int Skill::GetLastTime(int skin_lv) + { + if (skin_lv < 1) { + return last_time[0]; + } + if (skin_lv > MAX_SKIN_LV) { + return last_time[MAX_SKIN_LV - 1]; + } + return last_time[skin_lv - 1]; + } + } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 403bf3b..f4fed86 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -131,6 +131,19 @@ namespace MetaData struct Skill { const metatable::Skill* i = nullptr; + + void Init(); + float GetValue1(int skin_lv); + float GetValue2(int skin_lv); + float GetArea(int skin_lv); + int GetLastTime(int skin_lv); + + private: + std::array value1 = {}; + std::array value2 = {}; + std::array area = {}; + std::array last_time = {}; + }; struct Dress diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 0f6d885..5a41886 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -226,6 +226,7 @@ private: for (auto& meta : skill_meta_list) { MetaData::Skill& item = a8::FastAppend(skill_list); item.i = &meta; + item.Init(); skill_hash[item.i->id()] = &item; } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 2c53a55..a9adf57 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -597,8 +597,8 @@ void Room::OnHumanDie(Human* hum) for (auto& pair : human_hash_) { if (pair.second != hum && (pair.second->team_id == 0 || pair.second->team_id != hum->team_id)) { float distance = (hum->pos - pair.second->pos).Norm(); - if (distance <= hum->skill_meta->i->area()) { - pair.second->DecHP(hum->skill_meta->i->value1(), + if (distance <= hum->skill_meta->GetArea(hum->skin.skin_lv)) { + pair.second->DecHP(hum->skill_meta->GetValue1(hum->skin.skin_lv), hum->entity_uniid, hum->name, VW_SelfDetonate); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index b2d5e90..9c3c5fb 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -108,11 +108,11 @@ message Skill optional int32 id = 1; optional int32 type = 2; optional int32 condition = 3; - optional float value1 = 4; - optional float value2 = 5; - optional int32 area = 6; + optional string value1 = 4; + optional string value2 = 5; + optional string area = 6; optional int32 cd_time = 7; - optional int32 last_time = 8; + optional string last_time = 8; } message Drop