From 5587ef56b9fff8e7e3384c5e08e15531288c501a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 14 Aug 2020 14:15:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E6=8A=8A=E6=AD=A6?= =?UTF-8?q?=E5=99=A8=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 14 ++++++++++++-- server/gameserver/human.h | 2 +- server/gameserver/player.cc | 14 ++++++++------ server/gameserver/playermgr.cc | 11 ++++++----- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 1b9349a..f5ae73d 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -135,7 +135,12 @@ void Human::Initialize() RecalcSelfCollider(); volume_ = meta->volume; observers_.insert(this); - ability.hp = meta->i->health() + (spec_weapon.meta ? spec_weapon.GetAttrValue(kHAT_MaxHp) : 0); + ability.hp = meta->i->health(); + for (auto& weapon : spec_weapons) { + if (weapon.meta) { + ability.hp += (weapon.meta ? weapon.GetAttrValue(kHAT_MaxHp) : 0); + } + } } float Human::GetSpeed() @@ -3943,7 +3948,12 @@ void Human::OnMetaChange() curr_weapon = &weapons[0]; } } - ability.hp = meta->i->health() + (spec_weapon.meta ? spec_weapon.GetAttrValue(kHAT_MaxHp) : 0); + ability.hp = meta->i->health(); + for (auto& weapon : spec_weapons) { + if (weapon.meta) { + ability.hp += (weapon.meta ? weapon.GetAttrValue(kHAT_MaxHp) : 0); + } + } room->frame_event.AddHpChg(this); RecalcBaseAttr(); skill_meta_ = MetaMgr::Instance()->GetSkill(meta->i->active_skill()); diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 9b1f085..0d5ae22 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -128,7 +128,7 @@ class Human : public MoveableEntity long long send_msg_times = 0; - Weapon spec_weapon; + std::list spec_weapons; Weapon grow_weapon; std::map weapon_configs; std::map skin_configs; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 8cffb8e..7457e5a 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -873,22 +873,24 @@ void Player::ProcPrepareItems(const ::google::protobuf::RepeatedField< ::google: curr_weapon->ammo = add_num; } } - if (spec_weapon.weapon_id != 0) { + for (auto& spec_weapon : spec_weapons) { MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquip(spec_weapon.weapon_id); if (item_meta && item_meta->i->equip_type() == EQUIP_TYPE_WEAPON) { if (item_meta->i->equip_subtype() != 1) { - Weapon* weapon = &weapons[GUN_SLOT1]; - weapon->weapon_idx = GUN_SLOT1; - if (curr_weapon != &weapons[GUN_SLOT2]) { - curr_weapon = &weapons[GUN_SLOT1]; + int weapon_idx = GUN_SLOT1; + if (weapons[weapon_idx].weapon_id != 0) { + weapon_idx = GUN_SLOT2; } - if (weapon) { + if (weapons[weapon_idx].weapon_id == 0) { + Weapon* weapon = &weapons[weapon_idx]; + weapon->weapon_idx = weapon_idx; weapon->weapon_id = spec_weapon.weapon_id; weapon->weapon_lv = spec_weapon.weapon_lv; weapon->ammo = spec_weapon.ammo; weapon->meta = item_meta; weapon->Recalc(); + curr_weapon = &weapons[GUN_SLOT1]; } } } diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index ae8dbd3..5e8a40a 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -82,11 +82,12 @@ Player* PlayerMgr::CreatePlayerByCMJoin(Player* hum, MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(weapon.weapon_id()); if (equip_meta) { hum->weapon_configs[weapon.weapon_id()] = weapon.weapon_lv(); - hum->spec_weapon.weapon_id = weapon.weapon_id(); - hum->spec_weapon.weapon_lv = weapon.weapon_lv(); - hum->spec_weapon.ammo = weapon.ammo(); - hum->spec_weapon.meta = equip_meta; - hum->spec_weapon.Recalc(); + Weapon& spec_weapon = a8::FastAppend(hum->spec_weapons); + spec_weapon.weapon_id = weapon.weapon_id(); + spec_weapon.weapon_lv = weapon.weapon_lv(); + spec_weapon.ammo = weapon.ammo(); + spec_weapon.meta = equip_meta; + spec_weapon.Recalc(); } } }