From 0853244c999f0650ff592fdc93c1e84ffe48f837 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 26 Oct 2021 11:57:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A9=BA=E6=8A=95=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/creature.cc | 8 +++--- server/gameserver/metadata.cc | 33 +++++++++++++++++++++++++ server/gameserver/metadata.h | 3 +++ server/gameserver/room.cc | 2 +- server/tools/protobuild/metatable.proto | 2 +- 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index be593c0..3d04f81 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -59,9 +59,11 @@ static void InternalCreateBullet(BulletInfo& bullet_info) } } if (bullet_info.recoil_force > 0) { - c->DoRecoilForce(bullet_info.recoil_force); - bullet_info.bullet_born_pos = bullet_info.bullet_born_pos - - (bullet_info.bullet_dir * bullet_info.recoil_force); + if (c->GetCurrWeapon()->ammo <= 0) { + c->DoRecoilForce(bullet_info.recoil_force); + bullet_info.bullet_born_pos = bullet_info.bullet_born_pos - + (bullet_info.bullet_dir * bullet_info.recoil_force); + } } int bullet_uniid = 0; if (MetaMgr::Instance()->prebattle_can_use_skill || diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index be6928a..019eb28 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -866,6 +866,39 @@ namespace MetaData void AirDrop::Init() { + { + int total_weight = 0; + std::vector strings; + a8::Split(i->drop_id(), strings, '|'); + for (const std::string& str : strings) { + std::vector strings2; + a8::Split(str, strings2, ':'); + assert(strings2.size() == 2); + int drop_id = a8::XValue(strings2[0]); + int weight = a8::XValue(strings2[1]); + total_weight += weight; + drop.push_back + (std::make_tuple( + drop_id, + total_weight + ) + ); + } + } + } + + int AirDrop::RandDrop() + { + if (HasDrop()) { + int total_weight = std::get<1>(drop[drop.size() - 1]); + int rnd = rand() % total_weight; + for (auto& tuple : drop) { + if (rnd < std::get<1>(tuple)) { + return std::get<0>(tuple); + } + } + } + return 0; } void AirRaid::Init() diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 474c132..89feb22 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -200,8 +200,11 @@ namespace MetaData struct AirDrop { const metatable::AirDrop* i = nullptr; + std::vector> drop; + bool HasDrop() { return !drop.empty();}; void Init(); + int RandDrop(); }; struct AirRaid diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index e84f3b0..71d7456 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1637,7 +1637,7 @@ void Room::InitAirDrop() a8::XParams() .SetSender(this) .SetParam1(air_drop.i->appear_time()) - .SetParam2(air_drop.i->drop_id()) + .SetParam2(air_drop.RandDrop()) .SetParam3(air_drop.i->id()), [] (const a8::XParams& param) { diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index ed92562..a0ce3b6 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -326,7 +326,7 @@ message AirDrop optional int32 id = 1; optional int32 time = 2; optional int32 appear_time = 3; - optional int32 drop_id = 4; + optional string drop_id = 4; } message AirRaid