From 523c92e1c5619a0056836573da3b661936c98d38 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 2 Apr 2019 15:25:06 +0800 Subject: [PATCH] 1 --- server/gameserver/player.cc | 66 +++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index e21460d..e3aa2ab 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -267,12 +267,22 @@ void Player::LootInteraction(Loot* entity) weapons[0].num = 0; need_sync_active_player = true; } + need_sync_active_player = true; + for (auto& pair : room->human_hash_) { + pair.second->new_objects.insert(this); + } } else { Weapon* weapon = nullptr; if (weapons[GUN_SLOT1].weapon_id == 0) { weapon = &weapons[GUN_SLOT1]; + if (curr_weapon != &weapons[GUN_SLOT2]) { + curr_weapon = &weapons[GUN_SLOT1]; + } } else if (weapons[GUN_SLOT2].weapon_id == 0) { weapon = &weapons[GUN_SLOT2]; + if (curr_weapon != &weapons[GUN_SLOT1]) { + curr_weapon = &weapons[GUN_SLOT2]; + } } if (!weapon) { cs::SMPickup notifymsg; @@ -280,11 +290,14 @@ void Player::LootInteraction(Loot* entity) SendNotifyMsg(notifymsg); return; } - weapons[0].weapon_idx = 0; - weapons[0].weapon_id = entity->item_id; - weapons[0].weapon_lv = 1; - weapons[0].num = 0; + weapon->weapon_idx = 0; + weapon->weapon_id = entity->item_id; + weapon->weapon_lv = 1; + weapon->num = 0; need_sync_active_player = true; + for (auto& pair : room->human_hash_) { + pair.second->new_objects.insert(this); + } } } break; @@ -338,7 +351,47 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) void Player::_CMDropItem(f8::MsgHdr& hdr, const cs::CMDropItem& msg) { - + if (msg.has_weapon_idx()) { + if (msg.weapon_idx() >= 0 && msg.weapon_idx() < weapons.size()) { + bool drop_ok = false; + Weapon* weapon = &weapons[msg.weapon_idx()]; + if (weapon->weapon_id != 0) { + if (weapon->weapon_idx == 0) { + if (weapon->weapon_id != default_weapon.weapon_id) { + drop_ok = true; + *weapon = default_weapon; + } + } else if (weapon->weapon_idx == GUN_SLOT1) { + drop_ok = true; + *weapon = Weapon(); + weapon->weapon_idx = msg.weapon_idx(); + if (curr_weapon == weapon) { + if (weapons[GUN_SLOT2].weapon_id != 0) { + curr_weapon = &weapons[GUN_SLOT2]; + } else { + curr_weapon = &weapons[0]; + } + } + } else if (weapon->weapon_idx == GUN_SLOT2) { + drop_ok = true; + *weapon = Weapon(); + weapon->weapon_idx = msg.weapon_idx(); + if (curr_weapon == weapon) { + if (weapons[GUN_SLOT1].weapon_id != 0) { + curr_weapon = &weapons[GUN_SLOT1]; + } else { + curr_weapon = &weapons[0]; + } + } + } + if (drop_ok) { + for (auto& pair : room->human_hash_) { + pair.second->new_objects.insert(this); + } + } + } + } + } } void Player::_CMEmote(f8::MsgHdr& hdr, const cs::CMEmote& msg) @@ -425,9 +478,10 @@ void Player::MakeUpdateMsg() } #endif } - if (updated_times == 0) { + if (updated_times == 0 || need_sync_active_player) { update_msg->set_active_player_id(entity_uniid); FillMFActivePlayerData(update_msg->mutable_active_player_data()); + need_sync_active_player = true; } if (updated_times == 0 || last_sync_gas_frameno < room->gas_data.gas_start_frameno) { last_sync_gas_frameno = room->gas_data.gas_start_frameno;