diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index e5604864..a70b2b8c 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -419,12 +419,12 @@ void Bullet::MapServiceUpdate() Check(distance); } } while(!later_removed_ && move_length >= 0.0001f); -#ifdef DEBUG1 +#ifdef DEBUG { if (sender.Get()->IsPlayer()) { if ((room->GetFrameNo() - create_frameno_) % 2 == 0) { float distance = (GetPos() - born_pos).Norm(); - a8::XPrintf("bullet_id:%d frame_no:%d speed:%f range:%f fly_distance:%f born_pos:%f,%f pos:%f,%f\n", + a8::XPrintf("bullet_id:%d frame_no:%d speed:%f range:%f fly_distance:%f born_pos:%f,%f pos:%f,%f src_fly_distance:%f\n", { gun_meta->i->id(), (room->GetFrameNo() - create_frameno_) / 2, @@ -434,7 +434,8 @@ void Bullet::MapServiceUpdate() born_pos.x, born_pos.y, GetPos().x, - GetPos().y + GetPos().y, + fly_distance }); } } @@ -609,6 +610,7 @@ void Bullet::Check(float distance) } float bullet_range = gun_meta->i->range(); if (!objects.empty() || (!IsBomb() && distance > bullet_range) || eat || + (gun_meta->i->id() == 30918 && distance >= fly_distance) || (IsBomb() && meta->i->_inventory_slot() != IS_RPG && distance >= fly_distance) ) { if (IsBomb()) { diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 40074318..ecf2c9a3 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -38,6 +38,7 @@ #include "httpproxy.h" #include "skillhelper.h" #include "shot.h" +#include "battledatacontext.h" const int kReviveTimeAdd = 12; const int kSkinNum = 4; @@ -248,7 +249,7 @@ 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::ParseReward(a8::XObject& xobj) +void PlayerStats::ParseReward(Human* hum, a8::XObject& xobj) { if (!xobj.IsObject()) { AdjustRewardData(); @@ -265,6 +266,10 @@ void PlayerStats::ParseReward(a8::XObject& xobj) if (hero_xobj && hero_xobj->IsObject()) { over_reward.hero.obtain_gold = hero_xobj->At("obtain_ceg")->AsXValue().GetString(); over_reward.hero.gold_limit = hero_xobj->At("ceg_uplimit")->AsXValue().GetString(); + if (hum->GetBattleContext()->hero_dto && + hum->GetBattleContext()->hero_dto->IsObject()) { + over_reward.hero.id = hum->GetBattleContext()->hero_dto->At("hero_id")->AsXValue(); + } } } { @@ -272,6 +277,10 @@ void PlayerStats::ParseReward(a8::XObject& xobj) if (weapon_xobj && weapon_xobj->IsObject()) { over_reward.weapon1.obtain_gold = weapon_xobj->At("obtain_ceg")->AsXValue().GetString(); over_reward.weapon1.gold_limit = weapon_xobj->At("ceg_uplimit")->AsXValue().GetString(); + if (hum->GetBattleContext()->weapon_dto1 && + hum->GetBattleContext()->weapon_dto1->IsObject()) { + over_reward.hero.id = hum->GetBattleContext()->weapon_dto1->At("gun_id")->AsXValue(); + } } } { @@ -279,6 +288,10 @@ void PlayerStats::ParseReward(a8::XObject& xobj) if (weapon_xobj && weapon_xobj->IsObject()) { over_reward.weapon2.obtain_gold = weapon_xobj->At("obtain_ceg")->AsXValue().GetString(); over_reward.weapon2.gold_limit = weapon_xobj->At("ceg_uplimit")->AsXValue().GetString(); + if (hum->GetBattleContext()->weapon_dto2 && + hum->GetBattleContext()->weapon_dto2->IsObject()) { + over_reward.hero.id = hum->GetBattleContext()->weapon_dto2->At("gun_id")->AsXValue(); + } } } { @@ -2409,7 +2422,7 @@ void Human::SendBattleReport() } hum->sending_battlereport_ = false; hum->already_report_battle_ = true; - hum->stats.ParseReward(data); + hum->stats.ParseReward(hum, data); hum->SendGameOver(); }; auto on_error = diff --git a/server/gameserver/human.h b/server/gameserver/human.h index e09bf58a..4bc41628 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -41,6 +41,7 @@ struct HeroStats struct OverRewardItem { std::string uniid; + int id = 0; std::string obtain_gold; std::string gold_limit; }; @@ -123,7 +124,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 ParseReward(a8::XObject& xobj); + void ParseReward(Human* hum, a8::XObject& xobj); void AdjustRewardData(); void Statement(Human* hum); }; diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 9c90fc0e..970cdd9f 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -560,12 +560,14 @@ void Skill::ProcCMXD() Entity* e = std::any_cast(params.at(1)); if (sender.Get() && e->IsCreature(sender.Get()->room)) { Creature* c = (Creature*)e; + a8::Vec2 target_pos = sender.Get()->GetPos() + + sender.Get()->GetAttackDir() * SkillHelper::GetCmxdRange(this_skill_meta) / 2; bool ret = Check2dRotationRectangle (c->GetPos().x, c->GetPos().y, 20, - sender.Get()->GetPos().x, - sender.Get()->GetPos().y, + target_pos.x, + target_pos.y, shield_buff_meta->param4, SkillHelper::GetCmxdRange(this_skill_meta), sender.Get()->GetAttackDirRotate() * 180.0f