diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index e41b98a..c85f788 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -332,17 +332,10 @@ void Car::OnExplosionHit(Explosion* e) finaly_dmg})); } #endif -#if 1 DecHP(finaly_dmg, - 1, + VP_Explosion, "", - 1); -#else - DecHP(finaly_dmg, - sender.Get()->GetUniId(), - sender.Get()->GetName(), - gun_meta->i->id()); -#endif + e->GetExplosionEffect()); } void Car::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 33c76b8..e44547b 100644 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -408,6 +408,20 @@ enum HpOpt_e kHpOptEnd }; +enum RichTextElementType +{ + kTextElement = 1, + kImageElement = 2 +}; + +enum KillTextFieldIdx +{ + kFieldIdxMasterName = 1000, + kFieldIdxKillerName, + kFieldIdxDeadName, + kFieldIdxWeaponTextIcon, +}; + const char* const PROJ_NAME_FMT = "game%d_gameserver"; const char* const PROJ_ROOT_FMT = "/data/logs/%s"; diff --git a/server/gameserver/explosion.h b/server/gameserver/explosion.h index 130d3d5..bee7045 100644 --- a/server/gameserver/explosion.h +++ b/server/gameserver/explosion.h @@ -13,6 +13,7 @@ class Explosion float GetDmg() { return dmg_; }; long long GetSpecialDamageType() { return special_damage_type_; }; bool IsPreBattleExplosion(); + int GetExplosionEffect() { return explosion_effect_; }; void IndifferenceAttack(Room* room, const a8::Vec2& center, diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index b709a97..d5586fc 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -108,17 +108,10 @@ void Hero::OnExplosionHit(Explosion* e) finaly_dmg})); } #endif -#if 1 DecHP(finaly_dmg, - 1, + VP_Explosion, "", - 1); -#else - DecHP(finaly_dmg, - sender.Get()->GetUniId(), - sender.Get()->GetName(), - gun_meta->i->id()); -#endif + e->GetExplosionEffect()); } void Hero::OnBulletHit(Bullet* bullet) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 3e92567..809ec9d 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3263,17 +3263,10 @@ void Human::OnExplosionHit(Explosion* e) finaly_dmg})); } #endif -#if 1 DecHP(finaly_dmg, - 1, + VP_Explosion, "", - 1); -#else - DecHP(finaly_dmg, - sender.Get()->GetUniId(), - sender.Get()->GetName(), - gun_meta->i->id()); -#endif + e->GetExplosionEffect()); } void Human::SendRollMsgEx(KillInfo& info, diff --git a/server/gameserver/killmgr.cc b/server/gameserver/killmgr.cc index 70221a3..f224112 100644 --- a/server/gameserver/killmgr.cc +++ b/server/gameserver/killmgr.cc @@ -8,6 +8,49 @@ #include "cs_proto.pb.h" +struct RollMsgHintInfo +{ + std::string master_name; + std::string killer_name; + std::string dead_name; + std::string weapon_text_icon; + + std::vector>* hint_template = nullptr; + + bool Replace(int idx, std::string& text) + { + switch (idx) { + case kFieldIdxMasterName: + { + text = master_name; + } + break; + case kFieldIdxKillerName: + { + text = killer_name; + } + break; + case kFieldIdxDeadName: + { + text = dead_name; + } + break; + case kFieldIdxWeaponTextIcon: + { + text = weapon_text_icon; + } + break; + default: + { + return false; + } + break; + } + return true; + } + +}; + void KillMgr::Init() { @@ -43,28 +86,30 @@ void KillMgr::FillHintInfo(Human* dead_hum, KillInfo* info, RollMsgHintInfo& hin case VP_Gas: { hint_info.killer_name = ""; - hint_info.template_name = "battle_server_dead_text_gas"; - hint_info.template_defval = "%s 被${weapon_text_icon}干掉"; + hint_info.hint_template = MetaMgr::Instance()->GetTextElements + ("battle_server_dead_text_gas"); } break; case VP_Buff: { hint_info.killer_name = ""; - hint_info.template_name = a8::Format("battle_server_dead_text_buff_%d", {1}); - if (!MetaMgr::Instance()->HasText(hint_info.template_name)) { - hint_info.template_name = "battle_server_dead_text_buff_default"; + hint_info.hint_template = MetaMgr::Instance()->GetTextElements + (a8::Format("battle_server_dead_text_buff_%d", {1})); + if (!hint_info.hint_template) { + hint_info.hint_template = MetaMgr::Instance()->GetTextElements + ("battle_server_dead_text_buff_default"); } - hint_info.template_defval = "%s 被"; } break; case VP_Explosion: { hint_info.killer_name = ""; - hint_info.template_name = a8::Format("battle_server_dead_text_explosion_%d", {1}); - if (!MetaMgr::Instance()->HasText(hint_info.template_name)) { - hint_info.template_name = "battle_server_dead_text_explosion_default"; + hint_info.hint_template = MetaMgr::Instance()->GetTextElements + (a8::Format("battle_server_dead_text_explosion_%d", {1})); + if (!hint_info.hint_template) { + hint_info.hint_template = MetaMgr::Instance()->GetTextElements + ("battle_server_dead_text_explosion_default"); } - hint_info.template_defval = "%s 被"; } break; default: @@ -73,11 +118,13 @@ void KillMgr::FillHintInfo(Human* dead_hum, KillInfo* info, RollMsgHintInfo& hin if (killer) { hint_info.killer_name = killer->GetName(); if (info->killer_id == dead_hum->GetUniId()) { - hint_info.template_name = "battle_server_dead_text_specate"; - hint_info.template_defval = "${dead.name} 自杀"; + //${dead.name} 自杀 + hint_info.hint_template = MetaMgr::Instance()->GetTextElements + ("battle_server_dead_text_specate"); } else { - hint_info.template_name = "battle_server_dead_text_weapon"; - hint_info.template_defval = "${killer.name} 使用 ${weapon.text_icon} 干掉了 ${dead.name}"; + //${killer.name} 使用 ${weapon.text_icon} 干掉了 ${dead.name} + hint_info.hint_template = MetaMgr::Instance()->GetTextElements + ("battle_server_dead_text_weapon"); } } else { } @@ -89,80 +136,44 @@ void KillMgr::FillHintInfo(Human* dead_hum, KillInfo* info, RollMsgHintInfo& hin void KillMgr::PreprocessRollMsg(std::shared_ptr pb_msg, RollMsgHintInfo& hint_info) { -#if 0 - cs::SMRollMsg *pb_msg = new cs::SMRollMsg; - { - std::string result; - result.reserve(1024); - const char *p = fmt; - auto itr = args.begin(); - while (*p) { - if (*p == '%' && *(p+1)) { - p++; - switch(*p){ - case 'd': - { - assert(itr != args.end()); - result.append(itr->GetString().c_str()); - itr++; - } - break; - case 'f': - { - assert(itr != args.end()); - result.append(itr->GetString().c_str()); - itr++; - } - break; - case 's': - { - assert(itr != args.end()); - result.append(itr->GetString().c_str()); - itr++; - } - break; - default: - { - result.push_back('%'); - result.push_back(*p); - } - break; + if (hint_info.hint_template) { + for (auto& tuple : *hint_info.hint_template) { + int el_type = std::get<0>(tuple); + std::string el_val = std::get<1>(tuple); + switch (el_type) { + case kTextElement: + { + auto e = pb_msg->add_elements(); + e->set_element_type(el_type); + e->mutable_union_obj_1()->set_text(el_val); } - } else if (*p == '$' && *(p+1)) { - char* p1 = strstr((char*)p, "${weapon_text_icon}"); - if (p1) { - if (!result.empty()) { - auto element = pb_msg->add_elements(); - element->set_element_type(1); - element->mutable_union_obj_1()->set_text(result); - } - MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(info.weapon_id); - if (equip_meta) { - auto element = pb_msg->add_elements(); - element->set_element_type(2); - element->mutable_union_obj_2()->set_id(equip_meta->i->text_icon()); - } else { - auto element = pb_msg->add_elements(); - element->set_element_type(2); - element->mutable_union_obj_2()->set_id(info.weapon_id); - } - result = ""; - p = p1 + strlen("${weapon_text_icon}") - 1; - } else { - result.push_back(*p); + break; + case kImageElement: + { + auto e = pb_msg->add_elements(); + e->set_element_type(el_type); + e->mutable_union_obj_2()->set_id(a8::XValue(el_val)); } - } else { - result.push_back(*p); + break; + default: + { + std::string text; + if (hint_info.Replace(el_type, text)) { + if (el_type == kFieldIdxWeaponTextIcon) { + auto e = pb_msg->add_elements(); + e->set_element_type(el_type); + e->mutable_union_obj_2()->set_id(a8::XValue(text)); + } else { + auto e = pb_msg->add_elements(); + e->set_element_type(el_type); + e->mutable_union_obj_1()->set_text(text); + } + } + } + break; } - p++; - } //end while p - if (!result.empty()) { - auto element = pb_msg->add_elements(); - element->set_element_type(1); - element->mutable_union_obj_1()->set_text(result); } } -#endif } void KillMgr::BoradcastRollMsg(Human* dead_hum, @@ -216,7 +227,7 @@ void KillMgr::BoradcastRollMsgCb(Human* dead_hum, { for (int i = 0; i < pb_msg->elements_size(); ++i) { auto element = pb_msg->mutable_elements(i); - if (element->element_type() == 1) { + if (element->element_type() == kTextElement) { int color = element->mutable_union_obj_1()->color(); if (info->killer_id == hum->GetUniId()){ color = MetaMgr::Instance()->self_kill_color; diff --git a/server/gameserver/killmgr.h b/server/gameserver/killmgr.h index 54f55c5..cbb902f 100644 --- a/server/gameserver/killmgr.h +++ b/server/gameserver/killmgr.h @@ -13,18 +13,8 @@ struct KillInfo int weapon_id = 0; }; -struct RollMsgHintInfo -{ - std::string master_name; - std::string killer_name; - std::string dead_name; - std::string weapon_text_icon; - - std::string template_name; - std::string template_defval; -}; - class Human; +struct RollMsgHintInfo; class KillMgr : public a8::Singleton {