diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index fb205be5..cedf6076 100644 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -178,6 +178,7 @@ enum HumanAttrType_e kHAT_RecoverHpAdd = 31, kHAT_SkillTime = 32, kHAT_WeaponThrowRange = 33, + kHAT_LUCKY = 34, kHAT_End }; diff --git a/server/gameserver/global.cc b/server/gameserver/global.cc index 7c6bea60..85ccdb80 100644 --- a/server/gameserver/global.cc +++ b/server/gameserver/global.cc @@ -35,3 +35,39 @@ bool IsValidBuffOpt(int opt) { return opt >= 0 && opt < kBuffOptEnd; } + +float GetAttrAbsFromXObject(std::shared_ptr obj, int attr_id) +{ + if (obj->IsArray()) { + for (int i = 0; i < obj->Size(); ++i) { + auto attr = obj->At(i); + if (attr->IsObject()){ + int tmp_attr_id = attr->Get("attr_id", 0); + int tmp_type = attr->Get("type", 0); + int tmp_val = attr->Get("val", 0); + if (tmp_attr_id == attr_id && tmp_type == 1) { + return tmp_val; + } + } + } + } + return 0; +} + +float GetAttrRateFromXObject(std::shared_ptr obj,int attr_id) +{ + if (obj->IsArray()) { + for (int i = 0; i < obj->Size(); ++i) { + auto attr = obj->At(i); + if (attr->IsObject()){ + int tmp_attr_id = attr->Get("attr_id", 0); + int tmp_type = attr->Get("type", 0); + int tmp_val = attr->Get("val", 0); + if (tmp_attr_id == attr_id && tmp_type == 2) { + return tmp_val; + } + } + } + } + return 0; +} diff --git a/server/gameserver/global.h b/server/gameserver/global.h index 0a724590..49087d89 100644 --- a/server/gameserver/global.h +++ b/server/gameserver/global.h @@ -21,3 +21,5 @@ bool IsValidHumanAttr(int attr_type); bool IsValidCondBuff(int cond); bool IsValidWeaponOpt(int opt); bool IsValidBuffOpt(int opt); +float GetAttrAbsFromXObject(std::shared_ptr obj, int attr_id); +float GetAttrRateFromXObject(std::shared_ptr obj,int attr_id); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index b442e0a1..084fd8f2 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -92,11 +92,45 @@ void PlayerStats::SetHeroWeaponLv(int hero_id, int weapon_lv) MustBeHero(hero_id).weapon_lv = std::max(MustBeHero(hero_id).weapon_lv, weapon_lv); } -void PlayerStats::CalcReward(int ranked, int kills) +void PlayerStats::CalcReward(Human* hum, int ranked, int kills) { int gold = MetaMgr::Instance()->GetRankRewardParam(ranked); gold += MetaMgr::Instance()->GetKillRewardParam(kills); int add_gold = std::floor(gold / 3); + if (add_gold > 0) { + if (hum->hero_dto) { + MetaData::HeroQuality* quality_meta = MetaMgr::Instance()->GetHeroQuality + (hum->hero_dto->Get("quality", 1)); + if (quality_meta) { + int gold_limit = quality_meta->i->gold_limit(); + int gold_lucky = 0; + if (hum->hero_dto->HasKey("attr")) { + gold_lucky = GetAttrAbsFromXObject(hum->hero_dto->At("attr"), kHAT_LUCKY); + } + int new_gold = std::min(gold_limit, + hum->hero_dto->Get("today_get_gold", 0).GetInt() + add_gold); + over_reward.hero.uniid = hum->hero_dto->Get("hero_uniid", "").GetString(); + over_reward.hero.gold_limit = gold_limit + gold_lucky; + over_reward.hero.obtain_gold = over_reward.hero.gold_limit - new_gold; + } + } + if (hum->weapon_dto1) { + MetaData::GunQuality* quality_meta = MetaMgr::Instance()->GetGunQuality + (hum->weapon_dto1->Get("quality", 1)); + if (quality_meta){ + int gold_limit = quality_meta->i->gold_limit(); + int gold_lucky = 0; + if (hum->weapon_dto1->HasKey("attr")) { + gold_lucky = GetAttrAbsFromXObject(hum->weapon_dto1->At("attr"), kHAT_LUCKY); + } + int new_gold = std::min(gold_limit, + hum->weapon_dto1->Get("today_get_gold", 0).GetInt() + add_gold); + over_reward.weapon1.uniid = hum->weapon_dto1->Get("gun_uniid", "").GetString(); + over_reward.weapon1.gold_limit = gold_limit + gold_lucky; + over_reward.weapon1.obtain_gold = over_reward.weapon1.gold_limit - new_gold; + } + } + } } Human::Human():Creature() diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 7c79fc76..d0997c60 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -109,7 +109,7 @@ struct PlayerStats HeroStats& MustBeHero(int hero_id); void SetHeroSkillLv(int hero_id, int skill_lv); void SetHeroWeaponLv(int hero_id, int weapon_lv); - void CalcReward(int ranked, int kills); + void CalcReward(Human* hum, int ranked, int kills); }; struct xtimer_list; diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index d86a4a87..d553b5a2 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -332,6 +332,16 @@ namespace MetaData void Init(); }; + struct HeroQuality + { + const metatable::HeroQuality* i = nullptr; + }; + + struct GunQuality + { + const metatable::GunQuality* i = nullptr; + }; + struct AI { const metatable::AI* i = nullptr; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 401e8fb6..5fe9525b 100644 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -1237,3 +1237,13 @@ MetaData::Item* MetaMgr::GetHeroSkin(int hero_id) auto itr = loader_->item_heroskin_hash.find(hero_id); return itr != loader_->item_heroskin_hash.end() ? itr->second : nullptr; } + +MetaData::HeroQuality* MetaMgr::GetHeroQuality(int quality) +{ + +} + +MetaData::GunQuality* MetaMgr::GetGunQuality(int quality) +{ + +} diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 006d2f89..3d32ba28 100644 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -63,6 +63,8 @@ class MetaMgr : public a8::Singleton MetaData::Robot* RandRobot(std::set& refreshed_robot_set); MetaData::AI* GetAndroidAI(int ai_level, int ai_mode); MetaData::AI* GetHeroAI(int id); + MetaData::HeroQuality* GetHeroQuality(int quality); + MetaData::GunQuality* GetGunQuality(int quality); std::string GetText(const std::string& textid, const std::string& def_text=""); bool HasText(const std::string& textid); std::vector>* GetTextElements(const std::string& textid); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index ba99472c..ac6b8276 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -428,6 +428,20 @@ message GunTalentGrow optional string addattr = 5; } +message HeroQuality +{ + optional int32 id = 1; + optional int32 quality = 2; + optional int32 gold_limit = 3; +} + +message GunQuality +{ + optional int32 id = 1; + optional int32 quality = 2; + optional int32 gold_limit = 3; +} + //end message DoorObjJson