diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 11ab08c..a7ef001 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -221,6 +221,9 @@ void Buff::ProcDriver(Creature* caster) if (hum->GetCar() && hum->GetCar()->GetCurrWeapon()) { hold_weapons_.push_back(hum->weapons[hum->GetCar()->GetCurrWeapon()->weapon_idx]); hum->weapons[hum->GetCar()->GetCurrWeapon()->weapon_idx] = *hum->GetCar()->GetCurrWeapon(); + if (hum->GetCar()->meta && !hum->GetCar()->meta->shoot_offsets.empty()) { + hum->shoot_offset = hum->GetCar()->meta->shoot_offsets[0]; + } } } caster->need_sync_active_player = true; @@ -230,6 +233,7 @@ void Buff::ProcDriver(Creature* caster) void Buff::ProcRemoveDriver(Creature* caster) { RecoverHoldWeapons(caster); + caster->shoot_offset = a8::Vec2(); } void Buff::RecoverHoldWeapons(Creature* caster) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index db19815..b34fe59 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1330,6 +1330,8 @@ void Human::FillMFActivePlayerData(cs::MFActivePlayerData* player_data) FillBodyState(player_data->mutable_states()); FillItemList(player_data->mutable_items()); FillSkillList(player_data->mutable_skill_list()); + player_data->set_shoot_offset_x(shoot_offset.x); + player_data->set_shoot_offset_y(shoot_offset.y); } void Human::FillMFGasData(cs::MFGasData* gas_data) diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index c8ab809..d895087 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -160,6 +160,19 @@ namespace MetaData int_param2 = a8::XValue(i->param2()); float_param2 = a8::XValue(i->param2()).GetDouble(); } + { + std::vector strings; + a8::Split(i->volume(), strings, '|'); + for (auto& str : strings) { + std::vector strings2; + a8::Split(str, strings2, ':'); + assert(strings2.size() == 2); + if (strings2.size() >= 2) { + shoot_offsets.push_back(a8::Vec2((float)a8::XValue(strings2[0]).GetDouble(), + (float)a8::XValue(strings2[1]).GetDouble())); + } + } + } } int Equip::GetWeaponIdx() diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index e65c817..28ccc4d 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -62,6 +62,7 @@ namespace MetaData const metatable::Equip* i = nullptr; std::vector> bullet_born_offset; + std::vector shoot_offsets; std::array volume = {}; int int_param1 = 0; float float_param1 = 0; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 87b76a1..5ccaa8d 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -115,6 +115,7 @@ message Equip optional float recoil_force = 47; optional int32 missiles_time = 48; optional int32 heroid = 49; + optional string launch_dev = 50; optional string inventory_slot = 31; //库存槽位 optional int32 _inventory_slot = 32; //库存槽位