diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index dcecd0e..94d76b5 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -139,10 +139,11 @@ void AndroidNewAI::ChangeToStateOldAI(AndroidState_e to_state) case AS_moving: { Human* hum = (Human*)owner; - hum->move_dir = a8::Vec2(1.0f, 0); - hum->move_dir.Rotate(a8::RandAngle()); - hum->move_dir.Normalize(); - hum->attack_dir = hum->move_dir; + a8::Vec2 move_dir = a8::Vec2(1.0f, 0); + move_dir.Rotate(a8::RandAngle()); + move_dir.Normalize(); + hum->SetMoveDir(move_dir); + hum->attack_dir = hum->GetMoveDir(); } break; default: @@ -164,12 +165,13 @@ void AndroidNewAI::DoMoveOldAI() int speed = std::max(1, (int)hum->GetSpeed()); if (a8::HasBitFlag(hum->status, HS_NewBieGuideAndroid) && hum->room->GetFrameNo() - hum->enable_frameno < SERVER_FRAME_RATE * 8) { - hum->move_dir = hum->room->GetFirstNewBie()->GetPos() - hum->GetPos(); - hum->move_dir.Normalize(); + a8::Vec2 move_dir = hum->room->GetFirstNewBie()->GetPos() - hum->GetPos(); + move_dir.Normalize(); + hum->SetMoveDir(move_dir); } for (int i = 0; i < speed; ++i) { a8::Vec2 old_pos = hum->GetPos(); - hum->SetPos(hum->GetPos() + hum->move_dir); + hum->SetPos(hum->GetPos() + hum->GetMoveDir()); if (hum->IsCollisionInMapService()) { hum->SetPos(old_pos); if (i == 0) { @@ -217,17 +219,18 @@ void AndroidNewAI::UpdateNewBieNpc() Human* hum = (Human*)owner; if (hum->room->GetFrameNo() - hum->enable_frameno < 2) { if (hum->GetPos().ManhattanDistance(hum->room->GetFirstNewBie()->GetPos()) > 100) { - hum->move_dir = hum->room->GetFirstNewBie()->GetPos() - hum->GetPos(); - hum->move_dir.Normalize(); + a8::Vec2 move_dir = hum->room->GetFirstNewBie()->GetPos() - hum->GetPos(); + move_dir.Normalize(); + hum->SetMoveDir(move_dir); } - hum->attack_dir = hum->move_dir; + hum->attack_dir = hum->GetMoveDir(); if (hum->curr_weapon->weapon_idx != 0) { hum->curr_weapon->ammo = MetaMgr::Instance()->newbie_first_robot_ammo; } } else if (hum->room->GetFrameNo() - hum->enable_frameno < SERVER_FRAME_RATE * 1.5) { int speed = std::max(1, (int)hum->GetSpeed()); for (int i = 0; i < speed; ++i) { - hum->SetPos(hum->GetPos() + hum->move_dir); + hum->SetPos(hum->GetPos() + hum->GetMoveDir()); hum->room->grid_service->MoveCreature(hum); } } else if (hum->room->GetFrameNo() - hum->enable_frameno < SERVER_FRAME_RATE * 3) { @@ -252,10 +255,11 @@ void AndroidNewAI::UpdateLastNpc() Human* hum = (Human*)owner; if (hum->room->GetFrameNo() - hum->enable_frameno < 2) { if (hum->GetPos().ManhattanDistance(hum->last_human_target->GetPos()) > 100) { - hum->move_dir = hum->last_human_target->GetPos() - hum->GetPos(); - hum->move_dir.Normalize(); + a8::Vec2 move_dir = hum->last_human_target->GetPos() - hum->GetPos(); + move_dir.Normalize(); + hum->SetMoveDir(move_dir); } - hum->attack_dir = hum->move_dir; + hum->attack_dir = hum->GetMoveDir(); if (hum->curr_weapon->weapon_idx != 0) { hum->curr_weapon->ammo = MetaMgr::Instance()->newbie_first_robot_ammo * 2; } @@ -263,7 +267,7 @@ void AndroidNewAI::UpdateLastNpc() int speed = std::max(1, (int)hum->GetSpeed()); for (int i = 0; i < speed; ++i) { a8::Vec2 old_pos = hum->GetPos(); - hum->SetPos(hum->GetPos() + hum->move_dir); + hum->SetPos(hum->GetPos() + hum->GetMoveDir()); if (!hum->room->OverBorder(hum->GetPos(), hum->meta->i->radius())) { hum->room->grid_service->MoveCreature(hum); } else { @@ -347,7 +351,7 @@ void AndroidNewAI::UpdateNewBieRoomLogic() if (hum->room->AliveCount() < 15) { if (hum->GetPos().ManhattanDistance(target->GetPos()) > 1000) { a8::Vec2 pos = target->GetPos(); - a8::Vec2 dir = target->move_dir; + a8::Vec2 dir = target->GetMoveDir(); dir = a8::Vec2::UP; if (rand() % 100 < 1) { dir.Rotate(a8::RandAngle() / 2.0f); @@ -375,12 +379,13 @@ void AndroidNewAI::UpdateNewBieRoomLogic() old_ai_data_.last_target.Reset(); } else { int speed = std::max(1, (int)hum->GetSpeed()); - hum->move_dir = target->GetPos() - hum->GetPos(); - hum->move_dir.Normalize(); - hum->attack_dir = hum->move_dir; + a8::Vec2 move_dir = target->GetPos() - hum->GetPos(); + move_dir.Normalize(); + hum->SetMoveDir(move_dir); + hum->attack_dir = hum->GetMoveDir(); speed *= 0.7; for (int i = 0; i < speed; ++i) { - hum->SetPos(hum->GetPos() + hum->move_dir); + hum->SetPos(hum->GetPos() + hum->GetMoveDir()); hum->room->grid_service->MoveCreature(hum); } } @@ -585,8 +590,8 @@ void AndroidNewAI::UpdatePursuit() void AndroidNewAI::DoMoveNewAI() { Human* hum = (Human*)owner; - if (std::abs(hum->move_dir.x) > FLT_EPSILON || - std::abs(hum->move_dir.y) > FLT_EPSILON) { + if (std::abs(hum->GetMoveDir().x) > FLT_EPSILON || + std::abs(hum->GetMoveDir().y) > FLT_EPSILON) { hum->on_move_collision = [this] () { ChangeToStateNewAI(ASE_RandomWalk); @@ -657,10 +662,11 @@ void AndroidNewAI::ChangeToStateNewAI(AndroidStateEx_e to_state) node_.shot_times = 0; node_.next_random_move_frameno = hum->room->GetFrameNo() + SERVER_FRAME_RATE * ai_meta->GetMoveIdleTime(); - hum->move_dir = a8::Vec2(1.0f, 0); - hum->move_dir.Rotate(a8::RandAngle()); - hum->move_dir.Normalize(); - hum->attack_dir = hum->move_dir; + a8::Vec2 move_dir = a8::Vec2(1.0f, 0); + move_dir.Rotate(a8::RandAngle()); + move_dir.Normalize(); + hum->SetMoveDir(move_dir); + hum->attack_dir = hum->GetMoveDir(); if (node_.param1 <= 1) { moving_ = false; } @@ -670,9 +676,10 @@ void AndroidNewAI::ChangeToStateNewAI(AndroidStateEx_e to_state) { moving_ = true; if (node_.target.Get()) { - hum->move_dir = node_.target.Get()->GetPos() - hum->GetPos(); - hum->move_dir.Normalize(); - hum->attack_dir = hum->move_dir; + a8::Vec2 move_dir = node_.target.Get()->GetPos() - hum->GetPos(); + move_dir.Normalize(); + hum->SetMoveDir(move_dir); + hum->attack_dir = hum->GetMoveDir(); } } break; diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 9b2b398..ada4e2f 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -33,7 +33,7 @@ void Car::FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) cs::MFCarPart* p = part_data->mutable_union_obj_11(); p->set_obj_uniid(GetEntityUniId()); TypeConvert::ToPb(GetPos(), p->mutable_pos()); - TypeConvert::ToPb(move_dir, p->mutable_dir()); + TypeConvert::ToPb(GetMoveDir(), p->mutable_dir()); } void Car::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) @@ -42,7 +42,7 @@ void Car::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) cs::MFCarFull* p = full_data->mutable_union_obj_11(); p->set_obj_uniid(GetEntityUniId()); TypeConvert::ToPb(GetPos(), p->mutable_pos()); - TypeConvert::ToPb(move_dir, p->mutable_dir()); + TypeConvert::ToPb(GetMoveDir(), p->mutable_dir()); p->set_car_id(meta->i->id()); p->set_driver(driver_ ? driver_->GetEntityUniId() : 0); for (auto hum : passengers_) { @@ -167,11 +167,11 @@ void Car::SyncPos() { if (driver_) { SetPos(driver_->GetPos()); - move_dir = driver_->move_dir; + SetMoveDir(driver_->GetMoveDir()); for (auto hum : passengers_) { if (hum != driver_) { hum->SetPos(GetPos()); - hum->move_dir = move_dir; + hum->SetMoveDir(GetMoveDir()); room->grid_service->MoveCreature(hum); } } diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 9d1899e..20434ed 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -78,11 +78,11 @@ void InternalShot(Creature* c, } } if (weapon_meta->i->recoil_force() > 0.000001) { - a8::Vec2 old_move_dir = c->move_dir; + a8::Vec2 old_move_dir = c->GetMoveDir(); c->MustBeAddBuff(c, kRecoilBuffId); - c->move_dir = c->attack_dir * -1; + c->SetMoveDir(c->attack_dir * -1); c->_UpdateMove(weapon_meta->i->recoil_force()); - c->move_dir = old_move_dir; + c->SetMoveDir(old_move_dir); } } @@ -727,16 +727,18 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) SetPos(caster->GetPos()); target_pos = caster->GetPos(); } else { - move_dir = caster->GetPos() - GetPos(); + a8::Vec2 move_dir = caster->GetPos() - GetPos(); move_dir.Normalize(); - target_pos = GetPos() + move_dir * (target_distance - buff->meta->param3); + SetMoveDir(move_dir); + target_pos = GetPos() + GetMoveDir() * (target_distance - buff->meta->param3); } } } else { caster->skill_dir_.Normalize(); target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_; - move_dir = target_pos - GetPos(); + a8::Vec2 move_dir = target_pos - GetPos(); move_dir.Normalize(); + SetMoveDir(move_dir); } } break; @@ -753,10 +755,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) SetPos(entity->GetPos()); skill_target_pos_ = entity->GetPos(); } else { - move_dir = entity->GetPos() - GetPos(); + a8::Vec2 move_dir = entity->GetPos() - GetPos(); move_dir.Normalize(); - skill_dir_ = move_dir; - skill_target_pos_ = GetPos() + move_dir * (target_distance - buff->meta->param3); + SetMoveDir(move_dir); + skill_dir_ = GetMoveDir(); + skill_target_pos_ = GetPos() + GetMoveDir() * (target_distance - buff->meta->param3); } } } diff --git a/server/gameserver/hero.ai.cc b/server/gameserver/hero.ai.cc index 74de353..1079e32 100644 --- a/server/gameserver/hero.ai.cc +++ b/server/gameserver/hero.ai.cc @@ -230,8 +230,8 @@ void HeroAI::UpdatePursuit() void HeroAI::DoMoveAI() { Hero* hero = (Hero*)owner; - if (std::abs(hero->move_dir.x) > FLT_EPSILON || - std::abs(hero->move_dir.y) > FLT_EPSILON) { + if (std::abs(hero->GetMoveDir().x) > FLT_EPSILON || + std::abs(hero->GetMoveDir().y) > FLT_EPSILON) { hero->on_move_collision = [this] () { ChangeToStateAI(HSE_RandomWalk); @@ -294,10 +294,11 @@ void HeroAI::ChangeToStateAI(HeroState_e to_state) node_.shot_times = 0; node_.next_random_move_frameno = hero->room->GetFrameNo() + SERVER_FRAME_RATE * ai_meta->GetMoveIdleTime(); - hero->move_dir = a8::Vec2(1.0f, 0); - hero->move_dir.Rotate(a8::RandAngle()); - hero->move_dir.Normalize(); - hero->attack_dir = hero->move_dir; + a8::Vec2 move_dir = a8::Vec2(1.0f, 0); + move_dir.Rotate(a8::RandAngle()); + move_dir.Normalize(); + hero->SetMoveDir(move_dir); + hero->attack_dir = hero->GetMoveDir(); if (node_.param1 <= 1) { moving_ = false; } @@ -307,9 +308,10 @@ void HeroAI::ChangeToStateAI(HeroState_e to_state) { moving_ = true; if (node_.target.Get()) { - hero->move_dir = node_.target.Get()->GetPos() - hero->GetPos(); - hero->move_dir.Normalize(); - hero->attack_dir = hero->move_dir; + a8::Vec2 move_dir = node_.target.Get()->GetPos() - hero->GetPos(); + move_dir.Normalize(); + hero->SetMoveDir(move_dir); + hero->attack_dir = hero->GetMoveDir(); } } break; diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 774bcf1..dead4e4 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -36,7 +36,7 @@ void Hero::FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) cs::MFHeroPart* p = part_data->mutable_union_obj_10(); p->set_obj_uniid(GetEntityUniId()); TypeConvert::ToPb(GetPos(), p->mutable_pos()); - TypeConvert::ToPb(move_dir, p->mutable_dir()); + TypeConvert::ToPb(GetMoveDir(), p->mutable_dir()); } void Hero::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) @@ -45,7 +45,7 @@ void Hero::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) cs::MFHeroFull* p = full_data->mutable_union_obj_10(); p->set_obj_uniid(GetEntityUniId()); TypeConvert::ToPb(GetPos(), p->mutable_pos()); - TypeConvert::ToPb(move_dir, p->mutable_dir()); + TypeConvert::ToPb(GetMoveDir(), p->mutable_dir()); p->set_heroid(meta->i->id()); p->set_master_uniid(master ? master->GetEntityUniId() : 0); } @@ -74,7 +74,7 @@ void Hero::_UpdateMove(int speed) void Hero::InternalUpdateMove(float speed) { a8::Vec2 old_pos = GetPos(); - a8::Vec2 new_pos = GetPos() + move_dir * speed; + a8::Vec2 new_pos = GetPos() + GetMoveDir() * speed; SetPos(new_pos); if (!IsCollisionInMapService()) { diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 795f96a..5bf1954 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -588,8 +588,8 @@ void Human::FindPathInMapService() } } { - float up_dot = a8::Vec2::UP.Dot(move_dir); - bool at_left_side = a8::Vec2::LEFT.Dot(move_dir) > 0.0001f; + float up_dot = a8::Vec2::UP.Dot(GetMoveDir()); + bool at_left_side = a8::Vec2::LEFT.Dot(GetMoveDir()) > 0.0001f; if (std::abs(up_dot) <= 0.001f) { //相互垂直 //向上 SetPos(old_pos + a8::Vec2::UP); @@ -1391,7 +1391,7 @@ void Human::SummonHero(int heroid) (this, hero_meta, GetPos(), - move_dir, + GetMoveDir(), team_id ); } @@ -1711,9 +1711,10 @@ void Human::_UpdateSpecMove() if (target_distance <= 0.000001f) { move_end = true; } else { - a8::Vec2 old_move_dir = move_dir; - move_dir = target_pos - GetPos(); + a8::Vec2 old_move_dir = GetMoveDir(); + a8::Vec2 move_dir = target_pos - GetPos(); move_dir.Normalize(); + SetMoveDir(move_dir); bool is_collision = false; std::function old_on_move_collision = on_move_collision; on_move_collision = @@ -1875,8 +1876,8 @@ void Human::WinExp(Human* sender, int exp) void Human::_InternalUpdateMove(float speed) { - float nx = move_dir.x * speed; - float ny = move_dir.y * speed; + float nx = GetMoveDir().x * speed; + float ny = GetMoveDir().y * speed; a8::Vec2 old_pos = GetPos(); #if 1 diff --git a/server/gameserver/moveableentity.h b/server/gameserver/moveableentity.h index f5c73db..9d67e69 100644 --- a/server/gameserver/moveableentity.h +++ b/server/gameserver/moveableentity.h @@ -7,7 +7,6 @@ class AIComponent; class MoveableEntity : public RoomEntity { public: - a8::Vec2 move_dir; AIComponent* ai = nullptr; virtual void Update(int delta_time) {}; @@ -25,9 +24,12 @@ class MoveableEntity : public RoomEntity std::set& dec_grids ); virtual void SyncAroundPlayers(const char* file, int line, const char* func); + virtual const a8::Vec2& GetMoveDir() { return move_dir_; }; + virtual void SetMoveDir(const a8::Vec2& move_dir) { move_dir_ = move_dir; }; protected: int updated_times_ = 0; + a8::Vec2 move_dir_; private: std::set grid_list_; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 9f88ce7..7f25aba 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1060,12 +1060,14 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) std::abs(msg.move_dir().y()) > FLT_EPSILON ) { a8::Vec2 old_move_dir; - TypeConvert::FromPb(move_dir, &msg.move_dir()); - move_dir.Normalize(); + a8::Vec2 new_move_dir; + TypeConvert::FromPb(new_move_dir, &msg.move_dir()); + new_move_dir.Normalize(); + SetMoveDir(new_move_dir); moving = true; } } - assert(!isnan(move_dir.x) && !isnan(move_dir.y)); + assert(!isnan(GetMoveDir().x) && !isnan(GetMoveDir().y)); if (msg.has_attack_dir()) { if (std::isfinite(msg.attack_dir().x()) && std::isfinite(msg.attack_dir().y()) && @@ -1079,7 +1081,7 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) } } else { if (moving) { - attack_dir = move_dir; + attack_dir = GetMoveDir(); } } if (moving) { diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 4d8e52d..bef0f3d 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -221,7 +221,7 @@ void Room::AddPlayer(Player* hum) hum->attack_dir = hum->GetPos(); hum->attack_dir.Normalize(); hum->attack_dir.Rotate(a8::RandAngle()); - hum->move_dir = hum->attack_dir; + hum->SetMoveDir(hum->attack_dir); hum->room = this; hum->join_frameno = GetFrameNo(); @@ -333,7 +333,7 @@ void Room::CreateAndroid(int robot_num) hum->attack_dir = hum->GetPos(); hum->attack_dir.Normalize(); hum->attack_dir.Rotate(a8::RandAngle()); - hum->move_dir = hum->attack_dir; + hum->SetMoveDir(hum->attack_dir); hum->room = this; hum->Initialize(); AddToEntityHash(hum); @@ -596,7 +596,7 @@ Hero* Room::CreateHero(Creature* master, hero->master = master; hero->room = this; hero->SetPos(pos); - hero->move_dir = dir; + hero->SetMoveDir(dir); hero->attack_dir = dir; hero->team_id = team_id; hero->Initialize(); @@ -1702,7 +1702,7 @@ void Room::ShuaPlane() pair.second->MustBeAddBuff(pair.second, FLY_BUFFID); pair.second->SetPos(plane.curr_pos); pair.second->attack_dir = plane.dir; - pair.second->move_dir = plane.dir; + pair.second->SetMoveDir(plane.dir); grid_service->MoveCreature(pair.second); pair.second->AddToNewObjects(pair.second); } @@ -2495,7 +2495,7 @@ void Room::ProcShuaAndroid(int shua_time, int shua_num) GetCanEnableAndroids(humans, real_shua_num); for (auto& hum : humans) { a8::Vec2 pos = target->GetPos(); - a8::Vec2 dir = target->move_dir; + a8::Vec2 dir = target->GetMoveDir(); dir = a8::Vec2::UP; if (rand() % 100 < 1) { dir.Rotate(a8::RandAngle() / 2.0f); @@ -3400,7 +3400,7 @@ void Room::ShowHand() Human* hum = androids[i]; { a8::Vec2 pos = target->GetPos(); - a8::Vec2 dir = target->move_dir; + a8::Vec2 dir = target->GetMoveDir(); if (rand() % 100 < 80) { dir.Rotate(a8::RandAngle() / 2.0f); } else { diff --git a/server/gameserver/zombiemode.ai.cc b/server/gameserver/zombiemode.ai.cc index 169b3b3..eb9ab4c 100644 --- a/server/gameserver/zombiemode.ai.cc +++ b/server/gameserver/zombiemode.ai.cc @@ -277,8 +277,8 @@ void ZombieModeAI::DoMove() if (hum->HasBuffEffect(kBET_Vertigo)) { return; } - if (std::abs(hum->move_dir.x) > FLT_EPSILON || - std::abs(hum->move_dir.y) > FLT_EPSILON) { + if (std::abs(hum->GetMoveDir().x) > FLT_EPSILON || + std::abs(hum->GetMoveDir().y) > FLT_EPSILON) { hum->on_move_collision = [this] () { ChangeToState(ZSE_RandomWalk); @@ -344,10 +344,11 @@ void ZombieModeAI::ChangeToState(ZombieState_e to_state) node_->shot_times = 0; node_->next_random_move_frameno = hum->room->GetFrameNo() + SERVER_FRAME_RATE * node_->ai_meta->GetMoveIdleTime(); - hum->move_dir = a8::Vec2(1.0f, 0); - hum->move_dir.Rotate(a8::RandAngle()); - hum->move_dir.Normalize(); - hum->attack_dir = hum->move_dir; + a8::Vec2 move_dir = a8::Vec2(1.0f, 0); + move_dir.Rotate(a8::RandAngle()); + move_dir.Normalize(); + hum->SetMoveDir(move_dir); + hum->attack_dir = hum->GetMoveDir(); if (node_->param1 <= 1) { node_->moving = false; } @@ -357,9 +358,10 @@ void ZombieModeAI::ChangeToState(ZombieState_e to_state) { node_->moving = true; if (node_->target.Get()) { - hum->move_dir = node_->target.Get()->GetPos() - hum->GetPos(); - hum->move_dir.Normalize(); - hum->attack_dir = hum->move_dir; + a8::Vec2 move_dir = node_->target.Get()->GetPos() - hum->GetPos(); + move_dir.Normalize(); + hum->SetMoveDir(move_dir); + hum->attack_dir = hum->GetMoveDir(); } } break;