diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 9485929..bae6d6c 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -107,7 +107,7 @@ void Bullet::OnHit(std::set& objects) float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add); float def = hum->def + hum->buff.def_add; float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); - player->stats.damage_amount += finaly_dmg; + player->stats.damage_amount_out += finaly_dmg; hum->DecHP(finaly_dmg, player->entity_uniid, player->name); if (a8::HasBitFlag(hum->status, HS_ReflectDamage) && hum->skill_meta) { float reflect_dmg = finaly_dmg * hum->skill_meta->i->value1(); @@ -125,7 +125,7 @@ void Bullet::OnHit(std::set& objects) float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add); float def = 0; float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); - player->stats.damage_amount += finaly_dmg; + player->stats.damage_amount_out += finaly_dmg; obstacle->health = std::max(0.0f, obstacle->health - finaly_dmg); obstacle->dead = obstacle->health <= 0.01f; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 67b84c9..f9648fc 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1,5 +1,7 @@ #include "precompile.h" +#include + #include "human.h" #include "cs_proto.pb.h" #include "metamgr.h" @@ -11,6 +13,8 @@ #include "building.h" #include "hero.h" +#include "framework/cpp/httpclientpool.h" + Human::Human():Entity() { default_weapon.weapon_idx = 0; @@ -107,7 +111,7 @@ void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb) stats_pb->set_time_alive(dead_frameno * 1000.0f / SERVER_FRAME_RATE); } stats_pb->set_kills(stats.kills); - stats_pb->set_damage_amount(stats.damage_amount); + stats_pb->set_damage_amount(stats.damage_amount_out); stats_pb->set_heal_amount(stats.heal_amount); stats_pb->set_history_time_alive(stats.history_time_alive); @@ -434,7 +438,7 @@ void Human::FillSMGameOver(cs::SMGameOver& msg) } } - msg.set_team_id(0); + msg.set_team_id(team_id); msg.set_team_rank(rank); msg.set_team_allcnt(1); msg.set_game_over(room->game_over); @@ -492,7 +496,11 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name) if (energy_shield > 0.001f) { energy_shield = std::max(0.0f, energy_shield - dec_hp); } else { + float old_health = health; health = std::max(0.0f, health - dec_hp); + if (health - old_health > 0.001f) { + stats.damage_amount_in += health - old_health; + } if (health <= 0.0001f && !dead) { if (downed) { if (downed_timer) { @@ -1213,3 +1221,56 @@ void Human::ClearFrameData() emotes_.clear(); } } + +void Human::BattleReport() +{ + int rank = 0; + { + std::vector human_list; + room->TouchHumanList(a8::XParams(), + [&human_list] (Human* hum, a8::XParams& param) -> bool + { + human_list.push_back(hum); + return true; + }); + std::sort(human_list.begin(), human_list.end(), + [] (Human* a, Human* b ) + { + if (a->dead_frameno == b->dead_frameno) { + return a->entity_uniid < b->entity_uniid; + } else { + return a->dead_frameno == 0 || + (b->dead_frameno != 0 && a->dead_frameno > b->dead_frameno); + } + }); + rank = human_list.size(); + for (size_t i = 0; i < human_list.size(); ++i) { + if (human_list[i] == this) { + rank = i + 1; + break; + } + } + } + a8::MutableXObject* params = a8::MutableXObject::NewObject(); + params->SetVal("account_id", account_id); + params->SetVal("map_name", room->map_meta->i->map_name()); + params->SetVal("game_time", time(nullptr)); + params->SetVal("hurt", stats.damage_amount_in); + params->SetVal("rank", rank); + params->SetVal("kills", stats.kills); + params->SetVal("harm", stats.damage_amount_out); + params->SetVal("add_HP", stats.heal_amount); + if (!dead) { + params->SetVal("alive_time", room->frame_no * 1000.0f / SERVER_FRAME_RATE); + } else { + params->SetVal("alive_time", dead_frameno * 1000.0f / SERVER_FRAME_RATE); + } + params->SetVal("team_status", team_id != 0); + params->SetVal("snipe_kill", 0); + params->SetVal("rifle_kill", 0); + params->SetVal("pistol_kill", 0); + params->SetVal("submachine_kill", 0); + params->SetVal("rescue_kill", 0); + params->SetVal("coin_num", 0); + delete params; +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index b8e2e0a..5cbda93 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -166,6 +166,7 @@ class Human : public Entity private: void ClearFrameData(); + void BattleReport(); protected: long long last_shot_frameno_ = 0; diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 014b70c..f585b40 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -130,4 +130,9 @@ namespace MetaData const metatable::Dress* i = nullptr; }; + struct RankReward + { + const metatable::RankReward* i = nullptr; + }; + } diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 7943a40..31f0e94 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -37,6 +37,8 @@ public: std::list dress_list; std::list skill_meta_list; std::list skill_list; + std::list rankreward_meta_list; + std::list rankreward_list; std::map parameter_hash; std::map gamemap_hash; @@ -52,6 +54,7 @@ public: std::map> maptpl_hash; std::map dress_hash; std::map skill_hash; + std::map rankreward_hash; void Load() { @@ -84,6 +87,7 @@ public: f8::ReadJsonMetaFile(res_path + "maps.json", building_meta_list); f8::ReadCsvMetaFile(res_path + "dress@dress.csv", dress_meta_list); f8::ReadCsvMetaFile(res_path + "skill@skill.csv", skill_meta_list); + f8::ReadCsvMetaFile(res_path + "rankReward@rankReward.csv", rankreward_meta_list); BindToMetaData(); #if 1 { @@ -220,6 +224,12 @@ private: skill_hash[item.i->id()] = &item; } + for (auto& meta : rankreward_meta_list) { + MetaData::RankReward& item = a8::FastAppend(rankreward_list); + item.i = &meta; + rankreward_hash[item.i->rank()] = &item; + } + } private: @@ -343,3 +353,9 @@ MetaData::Dress* MetaMgr::GetDress(int dress_id) auto itr = loader_->dress_hash.find(dress_id); return itr != loader_->dress_hash.end() ? itr->second : nullptr; } + +MetaData::RankReward* MetaMgr::GetRankReward(int rank) +{ + auto itr = loader_->rankreward_hash.find(rank); + return itr != loader_->rankreward_hash.end() ? itr->second : nullptr; +} diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 6de7838..000edc1 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -32,6 +32,7 @@ class MetaMgr : public a8::Singleton MetaData::AirLine* RandAirLine(); MetaData::Skill* GetSkill(int skill_id); MetaData::Dress* GetDress(int dress_id); + MetaData::RankReward* GetRankReward(int rank); int gas_inactive_time = 10; int jump_time = 10; diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 503e5ab..208f091 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -45,7 +45,8 @@ struct Weapon struct PlayerStats { int kills = 0; - int damage_amount = 0; + int damage_amount_in = 0; + int damage_amount_out = 0; int heal_amount = 0; int history_time_alive = 0; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 538a63b..447ba00 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -10,6 +10,7 @@ message Map { optional int32 map_id = 1; //地图id optional string template_list = 2; //模板列表 + optional string map_name = 3; //地图名 } message MapThing @@ -127,6 +128,12 @@ message Dress optional int32 skill_id = 2; } +message RankReward +{ + optional int32 rank = 1; + optional int32 parameter = 2; +} + //end message DoorObjJson