From 10e302e81de9ca93d9d8921b19aa12684a264ebb Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 30 Mar 2023 11:28:09 +0800 Subject: [PATCH] 1 --- server/gameserver/battledatacontext.cc | 20 +++++++---- server/gameserver/mt/Equip.cc | 46 ++++++++++++++++++++++++++ server/gameserver/mt/Equip.h | 5 ++- server/gameserver/mt/Hero.cc | 19 +++-------- server/gameserver/shot.cc | 22 +++++++++--- 5 files changed, 85 insertions(+), 27 deletions(-) diff --git a/server/gameserver/battledatacontext.cc b/server/gameserver/battledatacontext.cc index e1ba17f9..6ba7ee4e 100644 --- a/server/gameserver/battledatacontext.cc +++ b/server/gameserver/battledatacontext.cc @@ -265,6 +265,8 @@ class WeaponAbility { public: long long weapon_uniid = 0; + int weapon_lv = 1; + int quality = 1; const mt::Equip* weapon_meta = nullptr; std::shared_ptr weapon_dto; @@ -440,6 +442,8 @@ void BattleDataContext::ParseResult(a8::XObject& obj) if (meta) { weapon1_ability_ = std::make_shared(); weapon1_ability_->weapon_uniid = weapon_dto1->Get("gun_uniid", 0); + weapon1_ability_->weapon_lv = weapon_dto1->Get("gun_lv", 1); + weapon1_ability_->quality = weapon_dto1->Get("quality", 1); weapon1_ability_->weapon_meta = meta; weapon1_ability_->weapon_dto = weapon_dto1; } @@ -453,6 +457,8 @@ void BattleDataContext::ParseResult(a8::XObject& obj) if (meta) { weapon2_ability_ = std::make_shared(); weapon2_ability_->weapon_uniid = weapon_dto2->Get("gun_uniid", 0); + weapon2_ability_->weapon_lv = weapon_dto1->Get("gun_lv", 1); + weapon2_ability_->quality = weapon_dto1->Get("quality", 1); weapon2_ability_->weapon_meta = meta; weapon2_ability_->weapon_dto = weapon_dto2; } @@ -478,14 +484,14 @@ void BattleDataContext::GetWeaponLvQuality(long long weapon_uniid, int& weapon_l { weapon_lv = 1; quality = 1; - if (owner_.Get()->IsPlayer()) { - if (weapon1_ability_ && weapon_uniid == weapon_dto1->Get("gun_uniid", 0).GetInt64()) { - weapon_lv = weapon_dto1->Get("gun_lv", 0).GetInt(); - quality = weapon_dto1->Get("quality", 0).GetInt(); + if (owner_.Get()->IsPlayer() && weapon_uniid) { + if (weapon1_ability_ && weapon_uniid == weapon1_ability_->weapon_uniid) { + weapon_lv = weapon1_ability_->weapon_lv; + quality = weapon1_ability_->quality; } - if (weapon2_ability_ && weapon_uniid == weapon_dto2->Get("gun_uniid", 0).GetInt64()) { - weapon_lv = weapon_dto2->Get("gun_lv", 0).GetInt(); - quality = weapon_dto2->Get("quality", 0).GetInt(); + if (weapon2_ability_ && weapon_uniid == weapon2_ability_->weapon_uniid) { + weapon_lv = weapon2_ability_->weapon_lv; + quality = weapon2_ability_->quality; } } } diff --git a/server/gameserver/mt/Equip.cc b/server/gameserver/mt/Equip.cc index 495fbbc2..7f37cb10 100644 --- a/server/gameserver/mt/Equip.cc +++ b/server/gameserver/mt/Equip.cc @@ -278,4 +278,50 @@ namespace mt return itr != slot_hash_.end() ? itr->second : nullptr; } + void Equip::AddMuzzlePos(int lv, std::shared_ptr> pos) + { + _gun_muzzle_position_hash_[lv] = pos; + } + + void Equip::AdjustMuzzlePos() + { + Equip::MutTraverse + ( + [] + (mt::Equip* meta, bool& stop) mutable + { + if (meta->_gun_muzzle_position_hash_.size() == 1) { + if (meta->_gun_muzzle_position_hash_.find(0) != + meta->_gun_muzzle_position_hash_.end()) { + for (int i = 0; i < MAX_WEAPON_LV; ++i) { + meta->_gun_muzzle_positions.push_back(meta->_gun_muzzle_position_hash_[0]); + } + } else if (meta->_gun_muzzle_position_hash_.find(1) != + meta->_gun_muzzle_position_hash_.end()) { + for (int i = 0; i < MAX_WEAPON_LV; ++i) { + meta->_gun_muzzle_positions.push_back(meta->_gun_muzzle_position_hash_[1]); + } + } else { + abort(); + } + } else if (meta->_gun_muzzle_position_hash_.size() > 1) { + if (meta->_gun_muzzle_position_hash_.find(1) != + meta->_gun_muzzle_position_hash_.end()) { + abort(); + } + for (int i = 0; i < MAX_WEAPON_LV; ++i) { + auto itr = meta->_gun_muzzle_position_hash_.find(i + 1); + if (itr != meta->_gun_muzzle_position_hash_.end()){ + meta->_gun_muzzle_positions.push_back(itr->second); + } else { + meta->_gun_muzzle_positions.push_back + ( + meta->_gun_muzzle_positions.at(meta->_gun_muzzle_positions.size() - 1) + ); + } + } + } + }); + } + } diff --git a/server/gameserver/mt/Equip.h b/server/gameserver/mt/Equip.h index 50cc7089..8518a358 100644 --- a/server/gameserver/mt/Equip.h +++ b/server/gameserver/mt/Equip.h @@ -14,7 +14,7 @@ namespace mt //0,0,0,0,后座力,是否取消定身 std::vector> _bullet_born_offset; std::vector> _shoot_offsets; - std::shared_ptr> _gun_muzzle_position; + std::vector>> _gun_muzzle_positions; std::shared_ptr> _movex_position; std::array _volume = {}; int _int_param1 = 0; @@ -37,12 +37,15 @@ namespace mt void Init1(); void Init2(); + void AddMuzzlePos(int lv, std::shared_ptr> pos); int GetWeaponIdx() const; bool Match(EventAddBuff_e event, int val, int val2) const; static const Equip* GetByIdBySlotId(int slot_id); + static void AdjustMuzzlePos(); private: static std::map slot_hash_; + std::map>> _gun_muzzle_position_hash_; }; } diff --git a/server/gameserver/mt/Hero.cc b/server/gameserver/mt/Hero.cc index 71999ab9..282d3cbd 100644 --- a/server/gameserver/mt/Hero.cc +++ b/server/gameserver/mt/Hero.cc @@ -130,6 +130,7 @@ namespace mt void Hero::StaticPostInit() { LoadHeroAndEquipShotData(); + Equip::AdjustMuzzlePos(); } const HeroShotAnimation* Hero::GetShotAnimi(int shotfire) const @@ -280,31 +281,21 @@ anim.l_y = l_y; float movez = equip_lv_xobj->At("movez") ? equip_lv_xobj->At("movez")->AsXValue().GetDouble() : 0; - ((mt::Equip*)equip_meta)->_gun_muzzle_position = std::make_shared> + auto pos = std::make_shared> ( x, y, z ); + ((mt::Equip*)equip_meta)->AddMuzzlePos(equip_lv, pos); + #if 0 ((mt::Equip*)equip_meta)->_movex_position = std::make_shared> ( movex, movey, movez ); -#if 0 - f8::UdpLog::Instance()->Info - ("weapon animation equip_id:%d x:%f y:%f z:%f movex:%f lmovey:%f movez:%f", - { - equip_id, - x, - y, - z, - movex, - movey, - movez - }); -#endif + #endif } } } diff --git a/server/gameserver/shot.cc b/server/gameserver/shot.cc index 92fb4575..2f8ae1ba 100644 --- a/server/gameserver/shot.cc +++ b/server/gameserver/shot.cc @@ -12,6 +12,7 @@ #include "buff.h" #include "debugcmd.h" #include "ability.h" +#include "battledatacontext.h" #include "mt/Param.h" #include "mt/Hero.h" @@ -54,6 +55,7 @@ struct BulletInfo }; static void CalcGunMuzzlePosition(Creature* c, + int weapon_lv, const mt::Equip* weapon_meta, const mt::HeroShotAnimation* shot_animi, glm::vec4& gun_muzzle_position, @@ -122,12 +124,13 @@ static void CalcGunMuzzlePosition(Creature* c, } } }//end if - if (weapon_meta->_gun_muzzle_position) { + if (weapon_lv > 0 && weapon_lv < weapon_meta->_gun_muzzle_positions.size() + 1) { + auto pos = weapon_meta->_gun_muzzle_positions.at(weapon_lv - 1); gun_muzzle_position += glm::vec4( - -std::get<0>(*weapon_meta->_gun_muzzle_position.get()), - std::get<1>(*weapon_meta->_gun_muzzle_position.get()), - std::get<2>(*weapon_meta->_gun_muzzle_position.get()), + -std::get<0>(*pos.get()), + std::get<1>(*pos.get()), + std::get<2>(*pos.get()), 0 ); } @@ -182,6 +185,7 @@ static void InternalCreateBullet(BulletInfo& bullet_info) glm::vec3(0.0, 1.0, 0.0)); glm::vec4 gun_muzzle_position(0.0, 0.0, 0.0, 0.0); CalcGunMuzzlePosition(c, + bullet_info.weapon_lv, bullet_info.weapon_meta, bullet_info.shot_animi, gun_muzzle_position, @@ -362,6 +366,13 @@ void InternalShot(Creature* c, ProcMissile(c, weapon_meta, bullet_meta, skill_meta, fly_distance, weapon_uniid, trace_target_uniid); return; } + int weapon_lv = 1; + if (weapon_uniid) { + int p_weapon_lv = 1; + int p_quality = 1; + c->GetBattleContext()->GetWeaponLvQuality(weapon_uniid, p_weapon_lv, p_quality); + weapon_lv = weapon_lv; + } auto bullet_born_offset_ptr = &weapon_meta->_bullet_born_offset; if (c->GetCurrWeapon()->meta == weapon_meta && c->GetCurrWeapon()->bullet_born_offset_ptr) { @@ -462,7 +473,7 @@ void InternalShot(Creature* c, bullet_born_angle * A8_PI, glm::vec3(0.0, 1.0, 0.0)); glm::vec4 gun_muzzle_position(0.0, 0.0, 0.0, 0.0); - CalcGunMuzzlePosition(c, weapon_meta, shot_animi, gun_muzzle_position, bulletIdx, bulletNum); + CalcGunMuzzlePosition(c, weapon_lv, weapon_meta, shot_animi, gun_muzzle_position, bulletIdx, bulletNum); glm::vec4 v = transform * gun_muzzle_position; bullet_born_offset = glm::vec3(v.z *10*1, v.y, v.x*10*-1); bullet_born_pos = c->GetPos().ToGlmVec3() + bullet_born_offset; @@ -512,6 +523,7 @@ void InternalShot(Creature* c, bullet_info.shot_animi = shot_animi; bullet_info.bullet_idx = bulletIdx; bullet_info.bullet_num = bulletNum; + bullet_info.weapon_lv = weapon_lv; if (skill_meta && (skill_meta->GetMagicId() == MAGIC_20101_HL || skill_meta->GetMagicId() == MAGIC_20201_HX)