diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index f3ff6f50..c1146cc7 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -251,7 +251,7 @@ int Creature::AddBuff(Creature* caster, SendDebugMsg(a8::Format("添加buff_id:%d effect:%d %s params:%d,%d,%d,%d,%d uniid:%d dur:%d", { buff_meta->i->buff_id(), - buff_meta->i->buff_effect(), + buff_meta->i->buff_effect(), buff_meta->i->name(), buff_meta->int_param1, buff_meta->int_param2, diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index a92e4599..f22b1a88 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -4155,12 +4155,13 @@ void Human::ProcAddItemDto(AddItemDTO& dto) } } -void Human::DropWeapon(int weapon_idx) +void Human::DropWeapon(int weapon_idx, int num) { if (weapon_idx < 0 || weapon_idx >= weapons.size()) { return; } + num = std::max(1, num); bool drop_ok = false; Weapon* weapon = &weapons[weapon_idx]; int weapon_id = weapon->weapon_id; @@ -4238,6 +4239,24 @@ void Human::DropWeapon(int weapon_idx) break; default: { + weapon_ammo = std::min(weapon->ammo, num); + if (weapon_ammo > 0) { + drop_ok = true; + weapon->ammo = std::max(0, weapon->ammo - weapon_ammo); + if (weapon->ammo <= 0) { + *weapon = Weapon(); + weapon->weapon_idx = weapon_idx; + if (GetCurrWeapon() == weapon) { + Weapon* next_weapon = ChooseNextSpecWeapon(weapon_idx); + if (!next_weapon) { + next_weapon = AutoChgWeapon(); + } + if (next_weapon) { + SetCurrWeapon(next_weapon); + } + } + } + } } break; } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 571fd278..f927e1a0 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -367,7 +367,7 @@ protected: Weapon* TakeonWeapon(MetaData::Equip* equip_meta); void LootInteraction(Loot* entity); void ProcAddItemDto(AddItemDTO& dto); - void DropWeapon(int weapon_idx); + void DropWeapon(int weapon_idx, int num); private: void GenBattleReportData(a8::MutableXObject* params); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 99feaef8..1801790a 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -855,6 +855,7 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) if (msg.has_drop_weapon()) { drop_weapon = true; drop_weapon_idx = msg.drop_weapon(); + drop_num = msg.drop_num(); } if (msg.has_use_scope()) { use_scope = true; @@ -1067,9 +1068,8 @@ void Player::UpdateDropWeapon() { if (drop_weapon_idx >= 0 && drop_weapon_idx < weapons.size() && - !HasBuffEffect(kBET_Terminator) && !FreezeOperate()) { - DropWeapon(drop_weapon_idx); + DropWeapon(drop_weapon_idx, drop_num); } ResetAction(); AutoLoadingBullet(); diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 5b3c2d2f..97287ccd 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -39,6 +39,7 @@ class Player : public Human bool drop_weapon = false; size_t drop_weapon_idx = 0; + size_t drop_num = 0; bool cancel_action = false; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 2cffe1f2..bd9b5dfa 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -951,6 +951,7 @@ message CMMove optional int32 select_weapon = 8; //切换武器(没切换是不用发) optional int32 drop_weapon = 9; //丢弃武器 + optional int32 drop_num = 43; //丢弃武器(数量) optional bool cancel_action = 10; //取消当前操作(比如取消使用道具装弹等) optional int32 use_item_idx = 11; //使用道具(对应库存索引0-16)