This commit is contained in:
aozhiwei 2021-04-28 13:56:33 +08:00
parent e1c8d1379d
commit 385d6aef84
7 changed files with 70 additions and 15 deletions

View File

@ -173,14 +173,61 @@ void Buff::ProcBecome(Creature* caster)
{
caster->second_weapon = Weapon();
if (caster->IsHuman() && meta->param2 > 0.01) {
MetaData::Equip* second_weapon_meta = MetaMgr::Instance()->GetEquip(meta->param2);
if (second_weapon_meta) {
caster->second_weapon.weapon_idx = 100;
caster->second_weapon.weapon_id = second_weapon_meta->i->id();
caster->second_weapon.weapon_lv = 1;
caster->second_weapon.meta = second_weapon_meta;
caster->second_weapon.Recalc();
caster->second_weapon.ammo = caster->second_weapon.GetClipVolume();
}
std::vector<std::string> strings;
a8::Split(meta->i->buff_param2(), 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 = &caster->weapons[0];
}
break;
case 1:
{
weapon = &caster->weapons[GUN_SLOT1];
}
break;
case 2:
{
weapon = &caster->weapons[GUN_SLOT2];
}
break;
default:
{
}
break;
}
hold_weapons_.push_back(*weapon);
weapon->weapon_idx = i;
weapon->weapon_id = weapon_meta->i->id();
weapon->weapon_lv = 1;
weapon->meta = weapon_meta;
weapon->Recalc();
#if 1
weapon->ammo = 10000000;
#else
weapon->ammo = weapon->GetClipVolume();
#endif
}
}
}//end if
caster->need_sync_active_player = true;
caster->SyncAroundPlayers(__FILE__, __LINE__, __func__);
}
}
void Buff::ProcRemoveBecome(Creature* caster)
{
for (auto& weapon : hold_weapons_) {
if (weapon.weapon_idx >= 0 &&
weapon.weapon_idx <= GUN_SLOT2) {
caster->weapons[weapon.weapon_idx] = weapon;
}
}
hold_weapons_.clear();
}

View File

@ -38,7 +38,11 @@ class Buff
void ProcSummonHero(Creature* caster);
void ProcBeRecycle(Creature* caster);
void ProcBecome(Creature* caster);
void ProcRemoveBecome(Creature* caster);
private:
void InternalTimerAddBuff(Creature* caster);
private:
std::list<Weapon> hold_weapons_;
};

View File

@ -233,7 +233,7 @@ void Creature::RemoveBuffById(int buff_id)
{
std::vector<MetaData::Buff*> removed_buffs;
for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) {
const Buff& buff = *itr;
Buff& buff = *itr;
if (buff.meta->i->buff_id() == buff_id) {
if (buff_effect_[buff.meta->i->buff_effect()] == &(*itr)) {
buff_effect_[buff.meta->i->buff_effect()] = nullptr;
@ -306,7 +306,7 @@ void Creature::RecalcBuffAttr()
}
}
void Creature::OnBuffRemove(const Buff& buff)
void Creature::OnBuffRemove(Buff& buff)
{
}

View File

@ -149,7 +149,7 @@ class Creature : public MoveableEntity
private:
virtual void AddBuffPostProc(Creature* caster, Buff* buff);
virtual void OnBuffRemove(const Buff& buff);
virtual void OnBuffRemove(Buff& buff);
virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos);
virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos);

View File

@ -3211,7 +3211,7 @@ void Human::ProcReloadAction()
}
}
void Human::OnBuffRemove(const Buff& buff)
void Human::OnBuffRemove(Buff& buff)
{
switch (buff.meta->i->buff_effect()) {
case kBET_Jump:
@ -3232,7 +3232,7 @@ void Human::OnBuffRemove(const Buff& buff)
break;
case kBET_Become:
{
second_weapon = Weapon();
buff.ProcRemoveBecome(this);
}
break;
default:

View File

@ -285,7 +285,7 @@ private:
void OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj);
void ClearSpecMapAreaTimer(SpecMapObject& map_obj);
virtual void AddBuffPostProc(Creature* caster, Buff* buff) override;
virtual void OnBuffRemove(const Buff& buff) override;
virtual void OnBuffRemove(Buff& buff) override;
virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos) override;
virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos) override;

View File

@ -515,7 +515,11 @@ namespace MetaData
for (int buff_id : buff_list) {
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
if (!buff_meta) {
#if 1
return;
#else
abort();
#endif
}
auto itr = trigger_type_buffs.find(buff_meta->i->trigger_type());
if (itr != trigger_type_buffs.end()) {