This commit is contained in:
aozhiwei 2021-03-17 13:33:54 +08:00
parent e867fb4a36
commit b9cdccc885
3 changed files with 79 additions and 43 deletions

View File

@ -37,14 +37,16 @@ HeroAI::~HeroAI()
void HeroAI::Update(int delta_time) void HeroAI::Update(int delta_time)
{ {
Human* hum = (Human*)owner; Hero* hero = (Hero*)owner;
#if 0
if (hum->poisoning) { if (hum->poisoning) {
hum->poisoning_time += delta_time; hum->poisoning_time += delta_time;
} }
if (hum->poisoning) { if (hum->poisoning) {
hum->UpdatePoisoning(); hum->UpdatePoisoning();
} }
if (hum->dead) { #endif
if (hero->dead) {
return; return;
} }
UpdateAI(); UpdateAI();
@ -61,10 +63,7 @@ float HeroAI::GetAttackRate()
void HeroAI::UpdateAI() void HeroAI::UpdateAI()
{ {
Human* hum = (Human*)owner; Hero* hero = (Hero*)owner;
if (a8::HasBitFlag(hum->status, HS_Disable)) {
return;
}
if (!ai_meta && GetAiLevel() != 0) { if (!ai_meta && GetAiLevel() != 0) {
ai_meta = MetaMgr::Instance()->GetAI(GetAiLevel(), 0); ai_meta = MetaMgr::Instance()->GetAI(GetAiLevel(), 0);
if (!ai_meta) { if (!ai_meta) {
@ -72,7 +71,7 @@ void HeroAI::UpdateAI()
} }
} }
++node_.exec_frame_num; ++node_.exec_frame_num;
hum->shot_hold = false; hero->shot_hold = false;
switch (node_.main_state) { switch (node_.main_state) {
case HSE_Idle: case HSE_Idle:
{ {
@ -112,20 +111,20 @@ void HeroAI::UpdateAI()
void HeroAI::UpdateIdle() void HeroAI::UpdateIdle()
{ {
Human* hum = (Human*)owner; Hero* hero = (Hero*)owner;
if (hum->room->GetFrameNo() > node_.frameno + node_.param1) { if (hero->room->GetFrameNo() > node_.frameno + node_.param1) {
ChangeToStateAI(HSE_Thinking); ChangeToStateAI(HSE_Thinking);
} }
} }
void HeroAI::UpdateThinking() void HeroAI::UpdateThinking()
{ {
Human* hum = (Human*)owner; Hero* hero = (Hero*)owner;
if (hum->room->GetGasData().gas_mode == GasInactive || if (hero->room->GetGasData().gas_mode == GasInactive ||
hum->room->IsWaitingStart() || hero->room->IsWaitingStart() ||
hum->HasBuffEffect(kBET_Jump) || hero->HasBuffEffect(kBET_Jump)
a8::HasBitFlag(hum->status, HS_DisableAttack)) { ) {
if (hum->room->IsWaitingStart()) { if (hero->room->IsWaitingStart()) {
ChangeToStateAI(HSE_Idle); ChangeToStateAI(HSE_Idle);
} else { } else {
ChangeToStateAI(HSE_RandomWalk); ChangeToStateAI(HSE_RandomWalk);
@ -136,7 +135,7 @@ void HeroAI::UpdateThinking()
node_.target = target; node_.target = target;
ChangeToStateAI(HSE_Attack); ChangeToStateAI(HSE_Attack);
} else { } else {
if (hum->room->GetFrameNo() >= node_.next_random_move_frameno) { if (hero->room->GetFrameNo() >= node_.next_random_move_frameno) {
if ((rand() % 7) < 4) { if ((rand() % 7) < 4) {
ChangeToStateAI(HSE_Idle); ChangeToStateAI(HSE_Idle);
} else { } else {
@ -144,7 +143,7 @@ void HeroAI::UpdateThinking()
} }
} else { } else {
ChangeToStateAI(HSE_Idle); ChangeToStateAI(HSE_Idle);
node_.param1 = node_.next_random_move_frameno - hum->room->GetFrameNo(); node_.param1 = node_.next_random_move_frameno - hero->room->GetFrameNo();
} }
} }
} }
@ -152,7 +151,7 @@ void HeroAI::UpdateThinking()
void HeroAI::UpdateAttack() void HeroAI::UpdateAttack()
{ {
Human* myself = (Human*)owner; Hero* myself = (Hero*)owner;
if (!node_.target || node_.target->dead) { if (!node_.target || node_.target->dead) {
ChangeToStateAI(HSE_Thinking); ChangeToStateAI(HSE_Thinking);
return; return;
@ -210,18 +209,17 @@ void HeroAI::UpdateAttack()
void HeroAI::UpdateRandomWalk() void HeroAI::UpdateRandomWalk()
{ {
Human* hum = (Human*)owner; Hero* hero = (Hero*)owner;
if (hum->room->GetFrameNo() > node_.frameno + node_.param1) { if (hero->room->GetFrameNo() > node_.frameno + node_.param1) {
ChangeToStateAI(HSE_Thinking); ChangeToStateAI(HSE_Thinking);
} }
} }
void HeroAI::UpdatePursuit() void HeroAI::UpdatePursuit()
{ {
Human* myself = (Human*)owner; Hero* myself = (Hero*)owner;
float distance = myself->GetPos().Distance(node_.target->GetPos()); float distance = myself->GetPos().Distance(node_.target->GetPos());
if (!myself->HasBuffEffect(kBET_Jump) && if (!myself->HasBuffEffect(kBET_Jump) &&
!a8::HasBitFlag(myself->status, HS_DisableAttack) &&
distance < GetAttackRange()) { distance < GetAttackRange()) {
ChangeToStateAI(HSE_Attack); ChangeToStateAI(HSE_Attack);
} else { } else {
@ -233,15 +231,18 @@ void HeroAI::UpdatePursuit()
void HeroAI::DoMoveAI() void HeroAI::DoMoveAI()
{ {
Human* hum = (Human*)owner; Hero* hero = (Hero*)owner;
if (std::abs(hum->move_dir.x) > FLT_EPSILON || if (std::abs(hero->move_dir.x) > FLT_EPSILON ||
std::abs(hum->move_dir.y) > FLT_EPSILON) { std::abs(hero->move_dir.y) > FLT_EPSILON) {
#if 0
hum->on_move_collision = hum->on_move_collision =
[this] () { [this] () {
ChangeToStateAI(HSE_RandomWalk); ChangeToStateAI(HSE_RandomWalk);
return false; return false;
}; };
int speed = std::max(1, (int)hum->GetSpeed()) * 1; #endif
int speed = std::max(1, (int)hero->GetSpeed()) * 1;
#if 0
hum->_UpdateMove(speed); hum->_UpdateMove(speed);
hum->on_move_collision = nullptr; hum->on_move_collision = nullptr;
if (node_.nearest_human) { if (node_.nearest_human) {
@ -252,12 +253,13 @@ void HeroAI::DoMoveAI()
GetTarget(); GetTarget();
} }
} }
#endif
} }
} }
void HeroAI::ChangeToStateAI(HeroState_e to_state) void HeroAI::ChangeToStateAI(HeroState_e to_state)
{ {
Human* hum = (Human*)owner; Hero* hero = (Hero*)owner;
switch (to_state) { switch (to_state) {
case HSE_Idle: case HSE_Idle:
{ {
@ -266,9 +268,9 @@ void HeroAI::ChangeToStateAI(HeroState_e to_state)
node_.start_shot_frameno = 0; node_.start_shot_frameno = 0;
node_.shot_times = 0; node_.shot_times = 0;
moving_ = false; moving_ = false;
if (hum->room->GetGasData().gas_mode == GasInactive || if (hero->room->GetGasData().gas_mode == GasInactive ||
hum->room->IsWaitingStart() || hero->room->IsWaitingStart() ||
hum->HasBuffEffect(kBET_Jump)) { hero->HasBuffEffect(kBET_Jump)) {
node_.param1 = rand() % (3 * SERVER_FRAME_RATE); node_.param1 = rand() % (3 * SERVER_FRAME_RATE);
} else { } else {
node_.param1 = rand() % (2 * SERVER_FRAME_RATE); node_.param1 = rand() % (2 * SERVER_FRAME_RATE);
@ -304,12 +306,14 @@ void HeroAI::ChangeToStateAI(HeroState_e to_state)
#endif #endif
node_.start_shot_frameno = 0; node_.start_shot_frameno = 0;
node_.shot_times = 0; node_.shot_times = 0;
node_.next_random_move_frameno = hum->room->GetFrameNo() + node_.next_random_move_frameno = hero->room->GetFrameNo() +
SERVER_FRAME_RATE * ai_meta->GetMoveIdleTime(); SERVER_FRAME_RATE * ai_meta->GetMoveIdleTime();
hum->move_dir = a8::Vec2(1.0f, 0); hero->move_dir = a8::Vec2(1.0f, 0);
hum->move_dir.Rotate(a8::RandAngle()); hero->move_dir.Rotate(a8::RandAngle());
hum->move_dir.Normalize(); hero->move_dir.Normalize();
hum->attack_dir = hum->move_dir; #if 0
hero->attack_dir = hero->move_dir;
#endif
if (node_.param1 <= 1) { if (node_.param1 <= 1) {
moving_ = false; moving_ = false;
} }
@ -319,15 +323,17 @@ void HeroAI::ChangeToStateAI(HeroState_e to_state)
{ {
moving_ = true; moving_ = true;
if (node_.target) { if (node_.target) {
hum->move_dir = node_.target->GetPos() - hum->GetPos(); hero->move_dir = node_.target->GetPos() - hero->GetPos();
hum->move_dir.Normalize(); hero->move_dir.Normalize();
hum->attack_dir = hum->move_dir; #if 0
hero->attack_dir = hero->move_dir;
#endif
} }
} }
break; break;
} }
node_.main_state = to_state; node_.main_state = to_state;
node_.frameno = hum->room->GetFrameNo(); node_.frameno = hero->room->GetFrameNo();
node_.exec_frame_num = 0; node_.exec_frame_num = 0;
} }
@ -336,7 +342,7 @@ Human* HeroAI::GetTarget()
if (GetAiLevel() <= 1) { if (GetAiLevel() <= 1) {
return nullptr; return nullptr;
} }
Human* myself = (Human*)owner; Hero* myself = (Hero*)owner;
if (myself->room->GetGasData().gas_mode == GasInactive) { if (myself->room->GetGasData().gas_mode == GasInactive) {
return nullptr; return nullptr;
} }
@ -378,17 +384,19 @@ Human* HeroAI::GetTarget()
float HeroAI::GetAttackRange() float HeroAI::GetAttackRange()
{ {
float attack_range = 0; float attack_range = 0;
Human* myself = (Human*)owner; Hero* myself = (Hero*)owner;
#if 0
if (myself->curr_weapon && myself->curr_weapon->meta) { if (myself->curr_weapon && myself->curr_weapon->meta) {
attack_range = myself->curr_weapon->meta->i->range(); attack_range = myself->curr_weapon->meta->i->range();
} }
#endif
attack_range = std::min(ai_meta->i->attack_range(), (int)attack_range); attack_range = std::min(ai_meta->i->attack_range(), (int)attack_range);
return attack_range; return attack_range;
} }
void HeroAI::DoShotAI() void HeroAI::DoShotAI()
{ {
Human* myself = (Human*)owner; Hero* myself = (Hero*)owner;
if (!node_.target) { if (!node_.target) {
return; return;
} }
@ -414,7 +422,9 @@ void HeroAI::DoShotAI()
} }
a8::Vec2 old_attack_dir = myself->attack_dir; a8::Vec2 old_attack_dir = myself->attack_dir;
myself->attack_dir = shot_dir; myself->attack_dir = shot_dir;
#if 0
myself->Shot(shot_dir, shot_ok); myself->Shot(shot_dir, shot_ok);
#endif
myself->attack_dir = old_attack_dir; myself->attack_dir = old_attack_dir;
if (shot_ok) { if (shot_ok) {
if (node_.shot_times <= 0) { if (node_.shot_times <= 0) {
@ -428,10 +438,12 @@ void HeroAI::DoShotAI()
int HeroAI::GetAttackTimes() int HeroAI::GetAttackTimes()
{ {
Human* myself = (Human*)owner; Hero* myself = (Hero*)owner;
#if 0
if (myself->curr_weapon) { if (myself->curr_weapon) {
return std::min(ai_meta->i->attack_times(), myself->curr_weapon->GetClipVolume()); return std::min(ai_meta->i->attack_times(), myself->curr_weapon->GetClipVolume());
} else { } else {
return ai_meta->i->attack_times(); return ai_meta->i->attack_times();
} }
#endif
} }

View File

@ -47,3 +47,18 @@ void Hero::Update(int delta_time)
{ {
++updated_times_; ++updated_times_;
} }
bool Hero::HasBuffEffect(int buff_effect_id)
{
return false;
}
Buff* Hero::GetBuffByEffectId(int effect_id)
{
return nullptr;
}
float Hero::GetSpeed()
{
return 0;
}

View File

@ -11,11 +11,16 @@ namespace MetaData
class Human; class Human;
class Room; class Room;
class Buff;
class Hero : public MoveableEntity class Hero : public MoveableEntity
{ {
public: public:
Entity* master = nullptr; Entity* master = nullptr;
MetaData::Player* meta = nullptr; MetaData::Player* meta = nullptr;
bool dead = false;
bool shot_hold = false;
int team_id = 0;
a8::Vec2 attack_dir;
Hero(); Hero();
virtual ~Hero() override; virtual ~Hero() override;
@ -24,6 +29,10 @@ class Hero : public MoveableEntity
virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override; virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override;
virtual void Update(int delta_time) override; virtual void Update(int delta_time) override;
bool HasBuffEffect(int buff_effect_id);
Buff* GetBuffByEffectId(int effect_id);
float GetSpeed();
private: private:
bool later_removed_ = false; bool later_removed_ = false;