This commit is contained in:
aozhiwei 2023-03-30 11:28:09 +08:00
parent 4553fdfb2d
commit 10e302e81d
5 changed files with 85 additions and 27 deletions

View File

@ -265,6 +265,8 @@ class WeaponAbility
{ {
public: public:
long long weapon_uniid = 0; long long weapon_uniid = 0;
int weapon_lv = 1;
int quality = 1;
const mt::Equip* weapon_meta = nullptr; const mt::Equip* weapon_meta = nullptr;
std::shared_ptr<a8::XObject> weapon_dto; std::shared_ptr<a8::XObject> weapon_dto;
@ -440,6 +442,8 @@ void BattleDataContext::ParseResult(a8::XObject& obj)
if (meta) { if (meta) {
weapon1_ability_ = std::make_shared<WeaponAbility>(); weapon1_ability_ = std::make_shared<WeaponAbility>();
weapon1_ability_->weapon_uniid = weapon_dto1->Get("gun_uniid", 0); 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_meta = meta;
weapon1_ability_->weapon_dto = weapon_dto1; weapon1_ability_->weapon_dto = weapon_dto1;
} }
@ -453,6 +457,8 @@ void BattleDataContext::ParseResult(a8::XObject& obj)
if (meta) { if (meta) {
weapon2_ability_ = std::make_shared<WeaponAbility>(); weapon2_ability_ = std::make_shared<WeaponAbility>();
weapon2_ability_->weapon_uniid = weapon_dto2->Get("gun_uniid", 0); 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_meta = meta;
weapon2_ability_->weapon_dto = weapon_dto2; weapon2_ability_->weapon_dto = weapon_dto2;
} }
@ -478,14 +484,14 @@ void BattleDataContext::GetWeaponLvQuality(long long weapon_uniid, int& weapon_l
{ {
weapon_lv = 1; weapon_lv = 1;
quality = 1; quality = 1;
if (owner_.Get()->IsPlayer()) { if (owner_.Get()->IsPlayer() && weapon_uniid) {
if (weapon1_ability_ && weapon_uniid == weapon_dto1->Get("gun_uniid", 0).GetInt64()) { if (weapon1_ability_ && weapon_uniid == weapon1_ability_->weapon_uniid) {
weapon_lv = weapon_dto1->Get("gun_lv", 0).GetInt(); weapon_lv = weapon1_ability_->weapon_lv;
quality = weapon_dto1->Get("quality", 0).GetInt(); quality = weapon1_ability_->quality;
} }
if (weapon2_ability_ && weapon_uniid == weapon_dto2->Get("gun_uniid", 0).GetInt64()) { if (weapon2_ability_ && weapon_uniid == weapon2_ability_->weapon_uniid) {
weapon_lv = weapon_dto2->Get("gun_lv", 0).GetInt(); weapon_lv = weapon2_ability_->weapon_lv;
quality = weapon_dto2->Get("quality", 0).GetInt(); quality = weapon2_ability_->quality;
} }
} }
} }

View File

@ -278,4 +278,50 @@ namespace mt
return itr != slot_hash_.end() ? itr->second : nullptr; return itr != slot_hash_.end() ? itr->second : nullptr;
} }
void Equip::AddMuzzlePos(int lv, std::shared_ptr<std::tuple<float, float, float>> 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)
);
}
}
}
});
}
} }

View File

@ -14,7 +14,7 @@ namespace mt
//0,0,0,0,后座力,是否取消定身 //0,0,0,0,后座力,是否取消定身
std::vector<std::tuple<float, float, float, int, int, int>> _bullet_born_offset; std::vector<std::tuple<float, float, float, int, int, int>> _bullet_born_offset;
std::vector<std::tuple<int, glm::vec3>> _shoot_offsets; std::vector<std::tuple<int, glm::vec3>> _shoot_offsets;
std::shared_ptr<std::tuple<float, float, float>> _gun_muzzle_position; std::vector<std::shared_ptr<std::tuple<float, float, float>>> _gun_muzzle_positions;
std::shared_ptr<std::tuple<float, float, float>> _movex_position; std::shared_ptr<std::tuple<float, float, float>> _movex_position;
std::array<int, IS_END> _volume = {}; std::array<int, IS_END> _volume = {};
int _int_param1 = 0; int _int_param1 = 0;
@ -37,12 +37,15 @@ namespace mt
void Init1(); void Init1();
void Init2(); void Init2();
void AddMuzzlePos(int lv, std::shared_ptr<std::tuple<float, float, float>> pos);
int GetWeaponIdx() const; int GetWeaponIdx() const;
bool Match(EventAddBuff_e event, int val, int val2) const; bool Match(EventAddBuff_e event, int val, int val2) const;
static const Equip* GetByIdBySlotId(int slot_id); static const Equip* GetByIdBySlotId(int slot_id);
static void AdjustMuzzlePos();
private: private:
static std::map<int, const mt::Equip*> slot_hash_; static std::map<int, const mt::Equip*> slot_hash_;
std::map<int, std::shared_ptr<std::tuple<float, float, float>>> _gun_muzzle_position_hash_;
}; };
} }

View File

@ -130,6 +130,7 @@ namespace mt
void Hero::StaticPostInit() void Hero::StaticPostInit()
{ {
LoadHeroAndEquipShotData(); LoadHeroAndEquipShotData();
Equip::AdjustMuzzlePos();
} }
const HeroShotAnimation* Hero::GetShotAnimi(int shotfire) const const HeroShotAnimation* Hero::GetShotAnimi(int shotfire) const
@ -280,31 +281,21 @@ anim.l_y = l_y;
float movez = equip_lv_xobj->At("movez") ? float movez = equip_lv_xobj->At("movez") ?
equip_lv_xobj->At("movez")->AsXValue().GetDouble() : 0; equip_lv_xobj->At("movez")->AsXValue().GetDouble() : 0;
((mt::Equip*)equip_meta)->_gun_muzzle_position = std::make_shared<std::tuple<float, float, float>> auto pos = std::make_shared<std::tuple<float, float, float>>
( (
x, x,
y, y,
z z
); );
((mt::Equip*)equip_meta)->AddMuzzlePos(equip_lv, pos);
#if 0
((mt::Equip*)equip_meta)->_movex_position = std::make_shared<std::tuple<float, float, float>> ((mt::Equip*)equip_meta)->_movex_position = std::make_shared<std::tuple<float, float, float>>
( (
movex, movex,
movey, movey,
movez movez
); );
#if 0 #endif
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
} }
} }
} }

View File

@ -12,6 +12,7 @@
#include "buff.h" #include "buff.h"
#include "debugcmd.h" #include "debugcmd.h"
#include "ability.h" #include "ability.h"
#include "battledatacontext.h"
#include "mt/Param.h" #include "mt/Param.h"
#include "mt/Hero.h" #include "mt/Hero.h"
@ -54,6 +55,7 @@ struct BulletInfo
}; };
static void CalcGunMuzzlePosition(Creature* c, static void CalcGunMuzzlePosition(Creature* c,
int weapon_lv,
const mt::Equip* weapon_meta, const mt::Equip* weapon_meta,
const mt::HeroShotAnimation* shot_animi, const mt::HeroShotAnimation* shot_animi,
glm::vec4& gun_muzzle_position, glm::vec4& gun_muzzle_position,
@ -122,12 +124,13 @@ static void CalcGunMuzzlePosition(Creature* c,
} }
} }
}//end if }//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 += gun_muzzle_position +=
glm::vec4( glm::vec4(
-std::get<0>(*weapon_meta->_gun_muzzle_position.get()), -std::get<0>(*pos.get()),
std::get<1>(*weapon_meta->_gun_muzzle_position.get()), std::get<1>(*pos.get()),
std::get<2>(*weapon_meta->_gun_muzzle_position.get()), std::get<2>(*pos.get()),
0 0
); );
} }
@ -182,6 +185,7 @@ static void InternalCreateBullet(BulletInfo& bullet_info)
glm::vec3(0.0, 1.0, 0.0)); glm::vec3(0.0, 1.0, 0.0));
glm::vec4 gun_muzzle_position(0.0, 0.0, 0.0, 0.0); glm::vec4 gun_muzzle_position(0.0, 0.0, 0.0, 0.0);
CalcGunMuzzlePosition(c, CalcGunMuzzlePosition(c,
bullet_info.weapon_lv,
bullet_info.weapon_meta, bullet_info.weapon_meta,
bullet_info.shot_animi, bullet_info.shot_animi,
gun_muzzle_position, 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); ProcMissile(c, weapon_meta, bullet_meta, skill_meta, fly_distance, weapon_uniid, trace_target_uniid);
return; 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; auto bullet_born_offset_ptr = &weapon_meta->_bullet_born_offset;
if (c->GetCurrWeapon()->meta == weapon_meta && if (c->GetCurrWeapon()->meta == weapon_meta &&
c->GetCurrWeapon()->bullet_born_offset_ptr) { c->GetCurrWeapon()->bullet_born_offset_ptr) {
@ -462,7 +473,7 @@ void InternalShot(Creature* c,
bullet_born_angle * A8_PI, bullet_born_angle * A8_PI,
glm::vec3(0.0, 1.0, 0.0)); glm::vec3(0.0, 1.0, 0.0));
glm::vec4 gun_muzzle_position(0.0, 0.0, 0.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; glm::vec4 v = transform * gun_muzzle_position;
bullet_born_offset = glm::vec3(v.z *10*1, v.y, v.x*10*-1); bullet_born_offset = glm::vec3(v.z *10*1, v.y, v.x*10*-1);
bullet_born_pos = c->GetPos().ToGlmVec3() + bullet_born_offset; 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.shot_animi = shot_animi;
bullet_info.bullet_idx = bulletIdx; bullet_info.bullet_idx = bulletIdx;
bullet_info.bullet_num = bulletNum; bullet_info.bullet_num = bulletNum;
bullet_info.weapon_lv = weapon_lv;
if (skill_meta && if (skill_meta &&
(skill_meta->GetMagicId() == MAGIC_20101_HL || (skill_meta->GetMagicId() == MAGIC_20101_HL ||
skill_meta->GetMagicId() == MAGIC_20201_HX) skill_meta->GetMagicId() == MAGIC_20201_HX)