diff --git a/server/gameserver/android_agent.cc b/server/gameserver/android_agent.cc index 7f02a748..e8fdbd2b 100644 --- a/server/gameserver/android_agent.cc +++ b/server/gameserver/android_agent.cc @@ -106,6 +106,9 @@ behaviac::EBTStatus AndroidAgent::DoRandomShot() if (status_ == behaviac::BT_RUNNING) { return DoRunningCb(); } + if (a8::HasBitFlag(GetOwner()->status, CS_DisableAttackAndroid)) { + return behaviac::BT_FAILURE; + } glm::vec3 dir = GetOwner()->GetMoveDir(); GlmHelper::RotateY(dir, (10 + rand() % 360)/ 180.0f); diff --git a/server/gameserver/commands.cc b/server/gameserver/commands.cc index c4ed50cd..88ba1b7d 100644 --- a/server/gameserver/commands.cc +++ b/server/gameserver/commands.cc @@ -10,6 +10,7 @@ #include "android.h" #include "airraid.h" #include "car.h" +#include "incubator.h" #include "cs_proto.pb.h" @@ -342,6 +343,17 @@ void Player::_CMExecCommand(f8::MsgHdr& hdr, const cs::CMExecCommand& msg) } } } + } else if (cmd == "show_hand") { + room->xtimer.SetTimeoutEx + ( + 1, + [this] (int event, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == event) { + room->GetIncubator()->ShowHand(); + } + }, + &xtimer_attacher); } #ifdef DEBUG a8::XPrintf("exec_cmd:%s\n", {cmd}); diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 795a9426..615b8e01 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -9,6 +9,7 @@ #include "glmhelper.h" #include "mapinstance.h" #include "bornpoint.h" +#include "movement.h" #include "mt/Param.h" #include "mt/Map.h" @@ -493,6 +494,9 @@ void Incubator::ShowHand() { #ifdef DEBUG glm::vec3 center; + if (hold_humans_.empty()) { + return; + } a8::XPrintf("ShowHand hold_humans_.size:%d\n", {hold_humans_.size()}); #endif for (auto& hum : hold_humans_) { @@ -506,30 +510,34 @@ void Incubator::ShowHand() hum->GetMutablePos().FromGlmVec3(point); Global::Instance()->verify_set_pos = 0; - a8::SetBitFlag(hum->status, CS_CrazeMode); - a8::SetBitFlag(hum->status, CS_DisableAttackAndroid); room->xtimer.SetTimeoutEx ( SERVER_FRAME_RATE * 20, [hum] (int event, const a8::Args* args) { if (a8::TIMER_EXEC_EVENT == event) { + #if 0 a8::UnSetBitFlag(hum->status, CS_DisableAttackAndroid); + #endif } }, &hum->xtimer_attacher); room->EnableHuman(hum); hum->MustBeAddBuff(hum, kTraceBuffId); + a8::SetBitFlag(hum->status, CS_CrazeMode); + a8::SetBitFlag(hum->status, CS_DisableAttackAndroid); } hold_humans_.clear(); -#ifdef DEBUG +#ifdef DEBUG1 room->TraversePlayerList ( [this, center] (Player* hum) { hum->GetMutablePos().FromGlmVec3(center); + a8::XPrintf("showhand %f %f %f\n", {center.x, center.y, center.z}); room->grid_service->MoveCreature(hum); + hum->GetMovement()->ClearPath(); }); #endif } diff --git a/server/gameserver/incubator.h b/server/gameserver/incubator.h index 7f9aab65..df57cdde 100644 --- a/server/gameserver/incubator.h +++ b/server/gameserver/incubator.h @@ -18,13 +18,13 @@ class Incubator bool IsTimeOut() { return timeout_; }; int GetPveLeftTime(); void NextWave(); + void ShowHand(); private: bool CanSee(Human* hum, Human* exclude_hum); void AutoAllocAndroid(); void OnEnterNewWave(int wave); void SpawnWaveMon(int wave); - void ShowHand(); private: int wait_alloc_time_ = 0; diff --git a/server/gameserver/mt/SafeArea.cc b/server/gameserver/mt/SafeArea.cc index e9ad0646..613c7ad6 100644 --- a/server/gameserver/mt/SafeArea.cc +++ b/server/gameserver/mt/SafeArea.cc @@ -11,6 +11,9 @@ namespace mt void SafeArea::Init1() { + #ifdef DEBUG1 + wait_time_ = 30; + #endif { auto itr = type_hash_.find(type()); if (itr == type_hash_.end()) { diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 5f3a9e3f..b9e6988d 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -484,11 +484,15 @@ Creature* Room::FindEnemy(Creature* c, float range) if (!hum->dead && !a8::HasBitFlag(hum->status, CS_Disable) && hum->team_id != myself->team_id) { - float distance = hum->GetPos().Distance2D2(myself->GetPos()); - if (distance <= range) { - if (distance < last_distance) { - target = hum; - last_distance = distance; + if (a8::HasBitFlag(myself->status, CS_DisableAttackAndroid) && + hum->IsAndroid()) { + } else { + float distance = hum->GetPos().Distance2D2(myself->GetPos()); + if (distance <= range) { + if (distance < last_distance) { + target = hum; + last_distance = distance; + } } } }