From 02032c878960702c4254aaf76a086c151f5966f6 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 29 Jul 2021 13:54:14 +0000 Subject: [PATCH] 1 --- server/gameserver/android.ai.cc | 6 ++++++ server/gameserver/buff.cc | 5 ----- server/gameserver/buff.h | 1 - server/gameserver/car.h | 1 + server/gameserver/constant_export.h | 3 ++- server/gameserver/creature.cc | 3 +-- server/gameserver/hero.ai.cc | 6 ++++++ server/gameserver/hero.cc | 15 +++++++++++++++ server/gameserver/human.cc | 17 +++++++++++++++++ server/tools/protobuild/metatable.proto | 1 + 10 files changed, 49 insertions(+), 9 deletions(-) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 2ddf163..de58366 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -8,6 +8,7 @@ #include "metamgr.h" #include "player.h" #include "app.h" +#include "car.h" const int SHUA_RANGE = 580; @@ -306,6 +307,7 @@ void AndroidAI::UpdateThinking() if (hum->room->GetGasData().gas_mode == GasInactive || hum->room->IsWaitingStart() || hum->HasBuffEffect(kBET_Jump) || + hum->HasBuffEffect(kBET_PeaceMode) || a8::HasBitFlag(hum->status, CS_DisableAttack)) { if (hum->room->IsWaitingStart()) { ChangeToStateNewAI(ASE_Idle); @@ -413,6 +415,7 @@ void AndroidAI::UpdatePursuit() if (node_->target.Get()) { float distance = myself->GetPos().Distance(node_->target.Get()->GetPos()); if (!myself->HasBuffEffect(kBET_Jump) && + !myself->HasBuffEffect(kBET_PeaceMode) && !a8::HasBitFlag(myself->status, CS_DisableAttack) && distance < GetAttackRange()) { ChangeToStateNewAI(ASE_Attack); @@ -554,6 +557,9 @@ Creature* AndroidAI::GetTarget() if (hum->HasBuffEffect(kBET_Jump)) { return; } + if (hum->IsCar() && hum->AsCar()->HasPassenter()) { + return; + } if (target) { if (myself->GetPos().ManhattanDistance(target->GetPos()) > myself->GetPos().ManhattanDistance(hum->GetPos())) { diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index e6ba0ad..dc40501 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -636,11 +636,6 @@ void Buff::ProcDisperse() } } -void Buff::ProcAISeting() -{ - -} - void Buff::CalcPassengerShotOffset() { if (meta->i->buff_effect() == kBET_Passenger && caster_.Get()->IsHuman()) { diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index bb036ad..b280024 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -72,7 +72,6 @@ class Buff void ProcAutoShot(); void ProcBeatBack(); void ProcDisperse(); - void ProcAISeting(); void CalcPassengerShotOffset(); diff --git a/server/gameserver/car.h b/server/gameserver/car.h index a7edae4..c4cf94e 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -38,6 +38,7 @@ class Car : public Creature float GetMaxOil(); bool HasOil() { return cur_oil_ >= 0.00000001f; }; void DecOil(float dec_oil); + bool HasPassenter() { return !passengers_.empty();}; virtual float GetRadius() override; virtual float GetSpeed() override; virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) override; diff --git a/server/gameserver/constant_export.h b/server/gameserver/constant_export.h index 60ed9c2..cd07eeb 100644 --- a/server/gameserver/constant_export.h +++ b/server/gameserver/constant_export.h @@ -16,6 +16,7 @@ const int kDownBuffId = 7015; const int kPoisioningBuffId = 7016; const int kRescueBuffId = 7017; const int kVertigoBuffId = 7018; +const int kPeaceModeBuffId = 7019; enum BuffEffectType_e { @@ -89,7 +90,7 @@ enum BuffEffectType_e kBET_AutoShot = 66, //自动射击 kBET_BeatBack = 67, //击退 kBET_Disperse = 68, //驱散 - kBET_AiSeting = 69, //设置ai参数 + kBET_PeaceMode = 69, //和平模式 kBET_End }; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index b35d49c..26b7bfc 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1277,9 +1277,8 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) buff->ProcDisperse(); } break; - case kBET_AiSeting: + case kBET_PeaceMode: { - buff->ProcAISeting(); } break; default: diff --git a/server/gameserver/hero.ai.cc b/server/gameserver/hero.ai.cc index 8745f46..4a27878 100644 --- a/server/gameserver/hero.ai.cc +++ b/server/gameserver/hero.ai.cc @@ -8,6 +8,7 @@ #include "metamgr.h" #include "player.h" #include "roomobstacle.h" +#include "car.h" HeroAI::HeroAI() { @@ -104,6 +105,7 @@ void HeroAI::UpdateThinking() Hero* hero = (Hero*)owner; if (hero->room->GetGasData().gas_mode == GasInactive || hero->room->IsWaitingStart() || + hero->HasBuffEffect(kBET_PeaceMode) || hero->HasBuffEffect(kBET_Jump) ) { if (hero->room->IsWaitingStart()) { @@ -219,6 +221,7 @@ void HeroAI::UpdatePursuit() Hero* myself = (Hero*)owner; float distance = myself->GetPos().Distance(node_->target.Get()->GetPos()); if (!myself->HasBuffEffect(kBET_Jump) && + !myself->HasBuffEffect(kBET_PeaceMode) && distance < GetAttackRange()) { ChangeToStateAI(HSE_Attack); } else { @@ -392,6 +395,9 @@ Creature* HeroAI::GetTarget() if (hum->HasBuffEffect(kBET_Jump)) { return; } + if (hum->IsCar() && hum->AsCar()->HasPassenter()) { + return; + } if (target) { if (myself->GetPos().ManhattanDistance(target->GetPos()) > myself->GetPos().ManhattanDistance(hum->GetPos())) { diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 84154b8..18da848 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -84,6 +84,7 @@ void Hero::OnExplosionHit(Explosion* e) if (dead) { return; } + RemoveBuffByEffectId(kBET_PeaceMode); float dmg = e->GetDmg(); float def = GetDef() * (1 + GetAbility()->GetAttrRate(kHAT_Def)) + GetAbility()->GetAttrAbs(kHAT_Def); @@ -115,6 +116,7 @@ void Hero::OnBulletHit(Bullet* bullet) if (IsInvincible()) { return; } + RemoveBuffByEffectId(kBET_PeaceMode); if (!IsDead(room) && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { float dmg = bullet->GetAtk(); float def = GetDef() * (1 + GetAbility()->GetAttrRate(kHAT_Def)) + @@ -297,4 +299,17 @@ void Hero::InitAI() ai->ai_meta = ai_meta; } ai->owner = this; + int buff_uniid = MustBeAddBuff(this, + kPeaceModeBuffId + ); + if (buff_uniid) { + Buff* buff = GetBuffByUniId(buff_uniid); + if (buff) { + int peace_time = 1000 * 6; + if (ai->ai_meta->i->peace_time() > 0) { + peace_time += ai->ai_meta->i->peace_time(); + } + room->xtimer.ModifyTimer(buff->remover_timer, peace_time / FRAME_RATE_MS); + } + } } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 1020438..702da18 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3273,6 +3273,21 @@ void Human::OnLand() } SetPos(old_pos); } + if (IsAndroid()) { + int buff_uniid = MustBeAddBuff(this, + kPeaceModeBuffId + ); + if (buff_uniid) { + Buff* buff = GetBuffByUniId(buff_uniid); + if (buff) { + int peace_time = 2000; + if (ai->ai_meta->i->peace_time() > 0) { + peace_time += ai->ai_meta->i->peace_time(); + } + room->xtimer.ModifyTimer(buff->remover_timer, peace_time / FRAME_RATE_MS); + } + } + } } void Human::NextReload(int prev_weapon_id, int prev_weapon_idx) @@ -3547,6 +3562,7 @@ void Human::OnBulletHit(Bullet* bullet) bullet->sender.Get()->GetRace() == GetRace()) { return; } + RemoveBuffByEffectId(kBET_PeaceMode); if (!dead && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { float old_hp = GetHP(); float old_max_hp = GetMaxHP(); @@ -3598,6 +3614,7 @@ void Human::OnExplosionHit(Explosion* e) if (dead) { return; } + RemoveBuffByEffectId(kBET_PeaceMode); float dmg = e->GetDmg(); float def = GetDef() * (1 + GetAbility()->GetAttrRate(kHAT_Def)) + GetAbility()->GetAttrAbs(kHAT_Def); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index bd9609f..7263d22 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -358,6 +358,7 @@ message AI optional string param3 = 17; optional string param4 = 18; optional string param5 = 19; + optional int32 peace_time = 20; } message Text