youhua room player android bullet Update

This commit is contained in:
aozhiwei 2020-05-22 22:17:26 +08:00
parent 3381f31ba0
commit 61946d50bf
14 changed files with 284 additions and 25 deletions

View File

@ -102,7 +102,7 @@ void AndroidAI::DoMove()
if (hum->room->waiting_start) { if (hum->room->waiting_start) {
return; return;
} }
if (owner->updated_times % 2 == 0) { if (owner->UpdatedTimes() % 2 == 0) {
Human* hum = (Human*)owner; Human* hum = (Human*)owner;
int speed = std::max(1, (int)hum->GetSpeed()); int speed = std::max(1, (int)hum->GetSpeed());
for (int i = 0; i < speed; ++i) { for (int i = 0; i < speed; ++i) {
@ -129,7 +129,7 @@ void AndroidAI::DoAttack()
if (hum->room->gas_data.gas_mode == GasInactive) { if (hum->room->gas_data.gas_mode == GasInactive) {
return; return;
} }
if (owner->updated_times % 10 == 0) { if (owner->UpdatedTimes() % 10 == 0) {
Human* enemy = owner->room->FindEnemy((Human*)owner); Human* enemy = owner->room->FindEnemy((Human*)owner);
if (enemy) { if (enemy) {
Human* sender = (Human*)owner; Human* sender = (Human*)owner;

View File

@ -35,6 +35,20 @@ void Android::Initialize()
} }
void Android::Update(int delta_time) void Android::Update(int delta_time)
{
if (UpdatedTimes() <= 0) {
if (room->frame_no % 2 != 0) {
return;
}
}
InternalUpdate(delta_time);
if (room->frame_no % 2 == 0) {
SendUpdateMsg();
}
++updated_times_;
}
void Android::InternalUpdate(int delta_time)
{ {
if (a8::HasBitFlag(status, HS_Disable)) { if (a8::HasBitFlag(status, HS_Disable)) {
return; return;

View File

@ -20,4 +20,6 @@ class Android : public Human
virtual void Update(int delta_time) override; virtual void Update(int delta_time) override;
void GiveEquip(); void GiveEquip();
private:
void InternalUpdate(int delta_time);
}; };

View File

@ -56,7 +56,7 @@ static void SavePerfLog()
{ {
a8::UdpLog::Instance()->Info a8::UdpLog::Instance()->Info
("mainloop_rundelay:%d room_num:%d player_num:%d online_num:%d alive_count:%d " ("mainloop_rundelay:%d room_num:%d player_num:%d online_num:%d alive_count:%d "
"sys_request_delay:%d user_request_delay:%d http_pending_num:%d", "sys_request_delay:%d user_request_delay:%d http_pending_num:%d active_count:%d",
{ {
App::Instance()->perf.max_run_delay_time, App::Instance()->perf.max_run_delay_time,
RoomMgr::Instance()->RoomNum(), RoomMgr::Instance()->RoomNum(),
@ -65,7 +65,8 @@ static void SavePerfLog()
App::Instance()->perf.alive_count, App::Instance()->perf.alive_count,
f8::HttpClientPool::Instance()->max_sys_request_delay, f8::HttpClientPool::Instance()->max_sys_request_delay,
f8::HttpClientPool::Instance()->max_user_request_delay, f8::HttpClientPool::Instance()->max_user_request_delay,
f8::HttpClientPool::Instance()->GetPendingNum() f8::HttpClientPool::Instance()->GetPendingNum(),
App::Instance()->perf.active_count
}); });
App::Instance()->perf.max_run_delay_time = 0; App::Instance()->perf.max_run_delay_time = 0;
App::Instance()->perf.max_dispatchmsg_time = 0; App::Instance()->perf.max_dispatchmsg_time = 0;

View File

@ -28,6 +28,7 @@ void Bullet::Initialize()
void Bullet::Update(int delta_time) void Bullet::Update(int delta_time)
{ {
MapServiceUpdate(); MapServiceUpdate();
++updated_times_;
} }
void Bullet::RecalcSelfCollider() void Bullet::RecalcSelfCollider()

View File

@ -39,7 +39,7 @@ class Bullet : public MoveableEntity
void OnHit(std::set<Entity*>& objects); void OnHit(std::set<Entity*>& objects);
void ProcBomb(); void ProcBomb();
bool IsBomb(); bool IsBomb();
void MapServiceUpdate(); inline void MapServiceUpdate();
private: private:
CircleCollider* self_collider_ = nullptr; CircleCollider* self_collider_ = nullptr;

View File

@ -8,6 +8,9 @@
#include "metamgr.h" #include "metamgr.h"
#include "app.h" #include "app.h"
#define METAMGR_READ(field_name, def_val) MetaMgr::Instance()->field_name = \
a8::XValue(MetaMgr::Instance()->GetSysParamAsString(#field_name, #def_val));
class MetaDataLoader class MetaDataLoader
{ {
public: public:
@ -180,6 +183,25 @@ public:
MetaMgr::Instance()->newbie_fill_interval = MetaMgr::Instance()->GetSysParamAsInt("newbie_fill_interval", 5000); MetaMgr::Instance()->newbie_fill_interval = MetaMgr::Instance()->GetSysParamAsInt("newbie_fill_interval", 5000);
MetaMgr::Instance()->other_fill_interval = MetaMgr::Instance()->GetSysParamAsInt("other_fill_interval", 2000); MetaMgr::Instance()->other_fill_interval = MetaMgr::Instance()->GetSysParamAsInt("other_fill_interval", 2000);
MetaMgr::Instance()->map_cell_width = MetaMgr::Instance()->GetSysParamAsInt("map_cell_width", 64 * 8); MetaMgr::Instance()->map_cell_width = MetaMgr::Instance()->GetSysParamAsInt("map_cell_width", 64 * 8);
{
METAMGR_READ(level0room_shua_robot_min_time, 5);
METAMGR_READ(level0room_shua_robot_max_time, 7);
METAMGR_READ(level0room_shua_robot_min_num, 1);
METAMGR_READ(level0room_shua_robot_max_num, 3);
METAMGR_READ(level0room_die_robot_min_time, 10);
METAMGR_READ(level0room_die_robot_max_time, 20);
METAMGR_READ(level0room_die_robot_min_num, 2);
METAMGR_READ(level0room_die_robot_max_num, 5);
METAMGR_READ(level1room_shua_robot_min_time, 5);
METAMGR_READ(level1room_shua_robot_max_time, 7);
METAMGR_READ(level1room_shua_robot_min_num, 2);
METAMGR_READ(level1room_shua_robot_max_num, 5);
METAMGR_READ(level1room_die_robot_min_time, 10);
METAMGR_READ(level1room_die_robot_max_time, 20);
METAMGR_READ(level1room_die_robot_min_num, 1);
METAMGR_READ(level1room_die_robot_max_num, 5);
}
if (MetaMgr::Instance()->K < 0.01f) { if (MetaMgr::Instance()->K < 0.01f) {
abort(); abort();
} }
@ -195,10 +217,54 @@ public:
} }
} }
#endif #endif
Check();
} }
private: private:
void Check()
{
{
if (MetaMgr::Instance()->level0room_shua_robot_min_time >
MetaMgr::Instance()->level0room_shua_robot_max_time) {
abort();
}
if (MetaMgr::Instance()->level0room_shua_robot_min_num >
MetaMgr::Instance()->level0room_shua_robot_max_num) {
abort();
}
if (MetaMgr::Instance()->level0room_die_robot_min_time >
MetaMgr::Instance()->level0room_die_robot_max_time) {
abort();
}
if (MetaMgr::Instance()->level0room_die_robot_min_num >
MetaMgr::Instance()->level0room_die_robot_max_num) {
abort();
}
}
{
if (MetaMgr::Instance()->level1room_shua_robot_min_time >
MetaMgr::Instance()->level1room_shua_robot_max_time) {
abort();
}
if (MetaMgr::Instance()->level1room_shua_robot_min_num >
MetaMgr::Instance()->level1room_shua_robot_max_num) {
abort();
}
if (MetaMgr::Instance()->level1room_die_robot_min_time >
MetaMgr::Instance()->level1room_die_robot_max_time) {
abort();
}
if (MetaMgr::Instance()->level1room_die_robot_min_num >
MetaMgr::Instance()->level1room_die_robot_max_num) {
abort();
}
}
}
void BindToMetaData() void BindToMetaData()
{ {

View File

@ -73,6 +73,24 @@ class MetaMgr : public a8::Singleton<MetaMgr>
int newbie_first_robot_distance = 0; int newbie_first_robot_distance = 0;
std::vector<int> newbie_buff_list; std::vector<int> newbie_buff_list;
int level0room_shua_robot_min_time = 0;
int level0room_shua_robot_max_time = 0;
int level0room_shua_robot_min_num = 0;
int level0room_shua_robot_max_num = 0;
int level0room_die_robot_min_time = 0;
int level0room_die_robot_max_time = 0;
int level0room_die_robot_min_num = 0;
int level0room_die_robot_max_num = 0;
int level1room_shua_robot_min_time = 0;
int level1room_shua_robot_max_time = 0;
int level1room_shua_robot_min_num = 0;
int level1room_shua_robot_max_num = 0;
int level1room_die_robot_min_time = 0;
int level1room_die_robot_max_time = 0;
int level1room_die_robot_min_num = 0;
int level1room_die_robot_max_num = 0;
int other_fill_interval = 0; int other_fill_interval = 0;
float android_attack_range = 0; float android_attack_range = 0;
float android_pursuit_range = 0; float android_pursuit_range = 0;

View File

@ -5,6 +5,9 @@
class MoveableEntity : public RoomEntity class MoveableEntity : public RoomEntity
{ {
public: public:
int updated_times = 0;
virtual void Update(int delta_time) {}; virtual void Update(int delta_time) {};
int UpdatedTimes() { return updated_times_;}
protected:
int updated_times_ = 0;
}; };

View File

@ -38,16 +38,24 @@ void Player::Initialize()
} }
void Player::Update(int delta_time) void Player::Update(int delta_time)
{
if (UpdatedTimes() <= 0) {
if (room->frame_no % 2 != 0) {
return;
}
}
InternalUpdate(delta_time);
if (room->frame_no % 2 == 0) {
SendUpdateMsg();
}
++updated_times_;
}
void Player::InternalUpdate(int delta_time)
{ {
if (poisoning) { if (poisoning) {
poisoning_time += delta_time; poisoning_time += delta_time;
} }
#if 0
if (a8::HasBitFlag(status, HS_Fly)) {
SetPos(room->plane.curr_pos);
room->grid_service.MoveHuman(this);
}
#endif
if (moving) { if (moving) {
UpdateMove(); UpdateMove();
} }

View File

@ -102,4 +102,5 @@ class Player : public Human
private: private:
void InternalAdCancel(); void InternalAdCancel();
void InternalAdOk(); void InternalAdOk();
void InternalUpdate(int delta_time);
}; };

View File

@ -89,27 +89,16 @@ void Room::Update(int delta_time)
return; return;
} }
real_alive_count_ = 0;
elapsed_time_ += delta_time; elapsed_time_ += delta_time;
while (elapsed_time_ >= 50) { while (elapsed_time_ >= 50) {
if (frame_no % 2 == 0) { if (frame_no % 2 == 0) {
UpdateGas(); UpdateGas();
} }
for (auto& pair : moveable_hash_) { for (auto& pair : moveable_hash_) {
if (pair.second->entity_type == ET_Player &&
pair.second->updated_times <= 0) {
if (frame_no % 2 == 0) {
pair.second->Update(50); pair.second->Update(50);
pair.second->updated_times++;
}
} else {
pair.second->Update(50);
pair.second->updated_times++;
}
} }
if (frame_no % 2 == 0) { if (frame_no % 2 == 0) {
for (auto& pair : human_hash_) {
pair.second->SendUpdateMsg();
}
frame_event.Clear(); frame_event.Clear();
} }
++frame_no; ++frame_no;
@ -145,6 +134,16 @@ int Room::AliveCount()
return alive_count_; return alive_count_;
} }
int Room::RealAliveCount()
{
return real_alive_count_;
}
int Room::ActiveCount()
{
return active_count_;
}
void Room::AddPlayer(Player* hum) void Room::AddPlayer(Player* hum)
{ {
assert(gas_data.gas_mode == GasInactive); assert(gas_data.gas_mode == GasInactive);
@ -1675,6 +1674,10 @@ void Room::NotifyGameStart()
room->waiting_start = false; room->waiting_start = false;
}, },
&xtimer_attacher_.timer_list_); &xtimer_attacher_.timer_list_);
if (room_type == RT_MidBrid) {
ShuaAndroidTimerFunc();
DieAndroidTimerFunc();
}
} }
void Room::InitObstacleDatas() void Room::InitObstacleDatas()
@ -1753,4 +1756,132 @@ void Room::ShuaNewBieAndroid(Human* target)
break; break;
} }
} }
ShuaAndroidTimerFunc();
DieAndroidTimerFunc();
}
void Room::ShuaAndroidTimerFunc()
{
if (room_type == RT_NewBrid || room_type == RT_MidBrid) {
int shua_time = a8::RandEx(
MetaMgr::Instance()->level0room_shua_robot_min_time,
MetaMgr::Instance()->level0room_shua_robot_max_time
);
int shua_num = a8::RandEx(
MetaMgr::Instance()->level0room_shua_robot_min_num,
MetaMgr::Instance()->level0room_shua_robot_max_num
);
if (room_type == RT_MidBrid) {
shua_time = a8::RandEx(
MetaMgr::Instance()->level1room_shua_robot_min_time,
MetaMgr::Instance()->level1room_shua_robot_max_time
);
shua_num = a8::RandEx(
MetaMgr::Instance()->level1room_shua_robot_min_num,
MetaMgr::Instance()->level1room_shua_robot_max_num
);
}
if (shua_time <= 0) {
return;
}
if (shua_num <= 0) {
return;
}
shua_android_timer = xtimer.AddDeadLineTimerAndAttach
(SERVER_FRAME_RATE * shua_time,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
{
Room* room = (Room*)param.sender.GetUserData();
room->ShuaAndroidTimerFunc();
},
&xtimer_attacher_.timer_list_,
[] (const a8::XParams& param)
{
Room* room = (Room*)param.sender.GetUserData();
room->shua_android_timer = nullptr;
}
);
ProcShuaAndroid(shua_time, shua_num);
}
}
void Room::DieAndroidTimerFunc()
{
if (room_type == RT_NewBrid || room_type == RT_MidBrid) {
int die_time = a8::RandEx(
MetaMgr::Instance()->level0room_die_robot_min_time,
MetaMgr::Instance()->level0room_die_robot_max_time
);
int die_num = a8::RandEx(
MetaMgr::Instance()->level0room_die_robot_min_num,
MetaMgr::Instance()->level0room_die_robot_max_num
);
if (room_type == RT_MidBrid) {
die_time = a8::RandEx(
MetaMgr::Instance()->level1room_die_robot_min_time,
MetaMgr::Instance()->level1room_die_robot_max_time
);
die_num = a8::RandEx(
MetaMgr::Instance()->level1room_die_robot_min_num,
MetaMgr::Instance()->level1room_die_robot_max_num
);
}
if (die_time <= 0) {
return;
}
if (die_num <= 0) {
return;
}
die_android_timer = xtimer.AddDeadLineTimerAndAttach
(SERVER_FRAME_RATE * die_time,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
{
Room* room = (Room*)param.sender.GetUserData();
room->DieAndroidTimerFunc();
},
&xtimer_attacher_.timer_list_,
[] (const a8::XParams& param)
{
Room* room = (Room*)param.sender.GetUserData();
room->die_android_timer = nullptr;
}
);
ProcDieAndroid(die_time, die_num);
}
}
void Room::ProcShuaAndroid(int shua_time, int shua_num)
{
for (auto& pair : human_hash_) {
if (pair.second->entity_subtype == EST_Android &&
a8::HasBitFlag(pair.second->status, HS_Disable)) {
Android* hum = (Android*)pair.second;
}
}
}
void Room::ProcDieAndroid(int die_time, int die_num)
{
for (auto& pair : human_hash_) {
if (pair.second->entity_subtype == EST_Android &&
a8::HasBitFlag(pair.second->status, HS_Disable)) {
Android* hum = (Android*)pair.second;
}
}
}
void Room::IncActiveCount()
{
++active_count_;
++App::Instance()->perf.active_count;
}
void Room::DecActiveCount()
{
--active_count_;
--App::Instance()->perf.active_count;
} }

View File

@ -64,6 +64,8 @@ public:
MetaData::MapTplThing* newbie_born_point_meta = nullptr; MetaData::MapTplThing* newbie_born_point_meta = nullptr;
std::vector<MetaData::MapTplThing*>* loots = nullptr; std::vector<MetaData::MapTplThing*>* loots = nullptr;
std::vector<Building*>* buildings = nullptr; std::vector<Building*>* buildings = nullptr;
xtimer_list* shua_android_timer = nullptr;
xtimer_list* die_android_timer = nullptr;
~Room(); ~Room();
void Init(); void Init();
@ -71,6 +73,8 @@ public:
void Update(int delta_time); void Update(int delta_time);
int GetPlayerNum(); int GetPlayerNum();
int AliveCount(); int AliveCount();
inline int RealAliveCount();
int ActiveCount();
Player* GetPlayerByAccountId(const std::string& accountid); Player* GetPlayerByAccountId(const std::string& accountid);
Player* GetPlayerByUniId(int uniid); Player* GetPlayerByUniId(int uniid);
Entity* GetEntityByUniId(int uniid); Entity* GetEntityByUniId(int uniid);
@ -155,10 +159,18 @@ private:
void InitObstacleDatas(); void InitObstacleDatas();
void EnableHuman(Human* hum); void EnableHuman(Human* hum);
void DisableHuman(Human* hum); void DisableHuman(Human* hum);
void ShuaAndroidTimerFunc();
void DieAndroidTimerFunc();
void ProcShuaAndroid(int shua_time, int shua_num);
void ProcDieAndroid(int die_time, int die_num);
void IncActiveCount();
void DecActiveCount();
private: private:
int elapsed_time_ = 0; int elapsed_time_ = 0;
int alive_count_ = 0; int alive_count_ = 0;
int real_alive_count_ = 0;
int active_count_ = 0;
int force_shua_android_times_ = 0; int force_shua_android_times_ = 0;
MetaData::AirLine* airline_ = nullptr; MetaData::AirLine* airline_ = nullptr;
a8::XTimerAttacher xtimer_attacher_; a8::XTimerAttacher xtimer_attacher_;

View File

@ -11,6 +11,8 @@ struct PerfMonitor
long long grid_chg_times = 0; long long grid_chg_times = 0;
long long test_times = 0; long long test_times = 0;
long long alive_count = 0; long long alive_count = 0;
long long real_alive_count = 0;
long long active_count = 0;
std::array<long long, 30> params = {}; std::array<long long, 30> params = {};
std::array<int, 30> entity_num = {}; std::array<int, 30> entity_num = {};
}; };