diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 20a2253..d194f83 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2376,14 +2376,16 @@ void Human::GenZbModeBattleReportData(a8::MutableXObject* params) void Human::DeadDrop() { - for (auto& weapon : weapons) { - if (weapon.weapon_id != 0 && weapon.weapon_id != default_weapon.weapon_id) { - a8::Vec2 drop_pos = GetPos(); - room->DropItem(drop_pos, weapon.weapon_id, 1, weapon.weapon_lv); + if (GetRace() == kHumanRace && !HasBuffEffect(kBET_Terminator)) { + for (auto& weapon : weapons) { + if (weapon.weapon_id != 0 && weapon.weapon_id != default_weapon.weapon_id) { + a8::Vec2 drop_pos = GetPos(); + room->DropItem(drop_pos, weapon.weapon_id, 1, weapon.weapon_lv); + } + } + { + curr_weapon = &weapons[0]; } - } - { - curr_weapon = &weapons[0]; } { Skin* old_skin = GetSkinByIdx(kSkinSlot_HAT); @@ -3031,6 +3033,7 @@ void Human::ProcBuffEffect(Human* caster, Buff* buff) meta != MetaMgr::Instance()->terminator_meta) { WinExp(this, MetaMgr::Instance()->terminator_meta->i->exp() + 1); room->NotifySysPiao("终结者出现", a8::MkRgb(255, 0, 0), 3); + OnChgToTerminator(); } } break; @@ -3799,3 +3802,51 @@ void Human::OnMetaChange() AddPassiveSkill(passive_skill_meta); } } + +void Human::OnChgToTerminator() +{ + Buff* buff = GetBuffByEffectId(kBET_Terminator); + if (buff) { + std::vector strings; + a8::Split(buff->meta->i->buff_param1(), strings, ':'); + if (strings.size() >= 3) { + for (size_t i = 0; i < strings.size(); ++i) { + int weapon_id = a8::XValue(strings[i]); + MetaData::Equip* weapon_meta = MetaMgr::Instance()->GetEquip(weapon_id); + if (weapon_meta) { + Weapon* weapon = nullptr; + switch (i) { + case 0: + { + weapon = &weapons[0]; + } + break; + case 1: + { + weapon = &weapons[GUN_SLOT1]; + } + break; + case 2: + { + weapon = &weapons[GUN_SLOT2]; + } + break; + default: + { + } + break; + } + weapon->weapon_idx = 0; + weapon->weapon_id = weapon_meta->i->id(); + weapon->weapon_lv = 1; + weapon->ammo = 1; + weapon->meta = weapon_meta; + weapon->Recalc(); + if (i == 0) { + default_weapon = *weapon; + } + } + } + } + } +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index f087889..08aa30a 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -327,6 +327,7 @@ private: void ClearPassiveSkillBuff(MetaData::Skill* skill_meta); void AddPassiveSkillBuff(MetaData::Skill* skill_meta); void OnMetaChange(); + void OnChgToTerminator(); protected: int level_ = 0; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 98d9f71..955bb97 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1001,7 +1001,9 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) void Player::UpdateDropWeapon() { - if (drop_weapon_idx >= 0 && drop_weapon_idx < weapons.size()) { + if (drop_weapon_idx >= 0 && + drop_weapon_idx < weapons.size() && + !HasBuffEffect(kBET_Terminator)) { bool drop_ok = false; Weapon* weapon = &weapons[drop_weapon_idx]; int weapon_id = weapon->weapon_id;