1
This commit is contained in:
parent
e867fb4a36
commit
b9cdccc885
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user