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(); } } }