plane ok
This commit is contained in:
parent
4d5cfc4928
commit
cab988d642
@ -11,6 +11,11 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum)
|
|||||||
cs::SMUpdate* msg = new cs::SMUpdate;
|
cs::SMUpdate* msg = new cs::SMUpdate;
|
||||||
{
|
{
|
||||||
Room* room = hum->room;
|
Room* room = hum->room;
|
||||||
|
if (room->GetGasData().gas_mode == GasJump) {
|
||||||
|
cs::MFPlane* p = msg->mutable_plane();
|
||||||
|
TypeConvert::ToPb(room->plane.start_point, p->mutable_start_point());
|
||||||
|
TypeConvert::ToPb(room->plane.end_point, p->mutable_end_point());
|
||||||
|
}
|
||||||
for (auto& itr : hum->new_objects) {
|
for (auto& itr : hum->new_objects) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (hum->del_objects.find(itr->GetEntityUniId()) != hum->del_objects.end()) {
|
if (hum->del_objects.find(itr->GetEntityUniId()) != hum->del_objects.end()) {
|
||||||
@ -27,6 +32,12 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum)
|
|||||||
hum->room->GetFrameNo() - entity->GetDeadFrameNo(room) > 10) {
|
hum->room->GetFrameNo() - entity->GetDeadFrameNo(room) > 10) {
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
|
if (room->GetGasData().gas_mode == GasJump &&
|
||||||
|
entity != hum &&
|
||||||
|
entity->GetEntityType() == ET_Player &&
|
||||||
|
a8::HasBitFlag(((Human*)entity)->status, HS_Fly)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (((Human*)hum)->GetPos().ManhattanDistance(entity->GetPos()) > VIEW_RANGE + 300) {
|
if (((Human*)hum)->GetPos().ManhattanDistance(entity->GetPos()) > VIEW_RANGE + 300) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -78,7 +78,8 @@ void InternalShot(Human* hum,
|
|||||||
bullet_born_pos,
|
bullet_born_pos,
|
||||||
bullet_dir,
|
bullet_dir,
|
||||||
fly_distance);
|
fly_distance);
|
||||||
if (hum->room->BattleStarted()) {
|
if (hum->room->BattleStarted() ||
|
||||||
|
(hum->room->GetGasData().gas_mode == GasJump && !a8::HasBitFlag(hum->status, HS_Jump))) {
|
||||||
hum->room->CreateBullet(hum,
|
hum->room->CreateBullet(hum,
|
||||||
weapon_meta,
|
weapon_meta,
|
||||||
weapon_upgrade_meta,
|
weapon_upgrade_meta,
|
||||||
@ -1345,6 +1346,26 @@ bool Human::CanUseSkill()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Human::DoJump()
|
||||||
|
{
|
||||||
|
if (a8::HasBitFlag(status, HS_Fly)) {
|
||||||
|
a8::UnSetBitFlag(status, HS_Fly);
|
||||||
|
a8::SetBitFlag(status, HS_Jump);
|
||||||
|
jump_frameno_ = room->GetFrameNo();
|
||||||
|
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||||
|
room->xtimer.AddDeadLineTimerAndAttach
|
||||||
|
(MetaMgr::Instance()->jump_time * SERVER_FRAME_RATE,
|
||||||
|
a8::XParams()
|
||||||
|
.SetSender(this),
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
Human* hum = (Human*)param.sender.GetUserData();
|
||||||
|
hum->OnLand();
|
||||||
|
},
|
||||||
|
&xtimer_attacher.timer_list_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Human::DoSkill()
|
void Human::DoSkill()
|
||||||
{
|
{
|
||||||
if (action_type == AT_Reload ||
|
if (action_type == AT_Reload ||
|
||||||
@ -1562,6 +1583,8 @@ void Human::FillMFGasData(cs::MFGasData* gas_data)
|
|||||||
long long duration = room->GetGasInactiveTime() * SERVER_FRAME_RATE -
|
long long duration = room->GetGasInactiveTime() * SERVER_FRAME_RATE -
|
||||||
(room->GetFrameNo() - room->GetGasData().gas_start_frameno);
|
(room->GetFrameNo() - room->GetGasData().gas_start_frameno);
|
||||||
gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000);
|
gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000);
|
||||||
|
} else if (room->GetGasData().gas_mode == GasJump) {
|
||||||
|
gas_data->set_duration(0);
|
||||||
} else if (room->GetGasData().gas_mode == GasMoving) {
|
} else if (room->GetGasData().gas_mode == GasMoving) {
|
||||||
if (room->GetGasData().new_area_meta->i->shrink_speed() > 0.01f) {
|
if (room->GetGasData().new_area_meta->i->shrink_speed() > 0.01f) {
|
||||||
long long duration = (room->GetGasData().old_area_meta->i->rad() - room->GetGasData().new_area_meta->i->rad()) /
|
long long duration = (room->GetGasData().old_area_meta->i->rad() - room->GetGasData().new_area_meta->i->rad()) /
|
||||||
|
@ -24,6 +24,7 @@ enum HumanStatus
|
|||||||
HS_LastAndroid = 7,
|
HS_LastAndroid = 7,
|
||||||
HS_DisableAttack = 8,
|
HS_DisableAttack = 8,
|
||||||
HS_Fly = 9,
|
HS_Fly = 9,
|
||||||
|
HS_Jump = 10,
|
||||||
HS_End
|
HS_End
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -204,6 +205,7 @@ class Human : public MoveableEntity
|
|||||||
bool HasLiveTeammate();
|
bool HasLiveTeammate();
|
||||||
bool HasNoDownedTeammate();
|
bool HasNoDownedTeammate();
|
||||||
bool CanUseSkill();
|
bool CanUseSkill();
|
||||||
|
void DoJump();
|
||||||
void DoSkill();
|
void DoSkill();
|
||||||
void DoGetDown();
|
void DoGetDown();
|
||||||
void FindLocation();
|
void FindLocation();
|
||||||
@ -416,6 +418,7 @@ private:
|
|||||||
std::vector<Skin> skins;
|
std::vector<Skin> skins;
|
||||||
|
|
||||||
Entity* last_collision_door_ = nullptr;
|
Entity* last_collision_door_ = nullptr;
|
||||||
|
long long jump_frameno_ = 0;
|
||||||
|
|
||||||
friend class FrameMaker;
|
friend class FrameMaker;
|
||||||
friend class FrameEvent;
|
friend class FrameEvent;
|
||||||
|
@ -310,7 +310,9 @@ void Player::UpdateUseItemId()
|
|||||||
|
|
||||||
void Player::UpdateSpectate()
|
void Player::UpdateSpectate()
|
||||||
{
|
{
|
||||||
if (room->GetGasData().gas_mode == GasInactive) {
|
if (room->GetGasData().gas_mode == GasInactive ||
|
||||||
|
room->GetGasData().gas_mode == GasJump ||
|
||||||
|
a8::HasBitFlag(status, HS_Fly)) {
|
||||||
spectate = false;
|
spectate = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -985,17 +985,18 @@ void Room::UpdateGas()
|
|||||||
case GasInactive:
|
case GasInactive:
|
||||||
UpdateGasInactive();
|
UpdateGasInactive();
|
||||||
break;
|
break;
|
||||||
|
case GasJump:
|
||||||
|
UpdateGasJump();
|
||||||
|
break;
|
||||||
case GasWaiting:
|
case GasWaiting:
|
||||||
UpdateGasWaiting();
|
UpdateGasWaiting();
|
||||||
break;
|
break;
|
||||||
case GasMoving:
|
case GasMoving:
|
||||||
UpdateGasMoving();
|
UpdateGasMoving();
|
||||||
break;
|
break;
|
||||||
case GasJump:
|
|
||||||
UpdateGasJump();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#if 1
|
if (gas_data_.gas_mode != GasInactive && gas_data_.gas_mode != GasJump) {
|
||||||
|
#if 1
|
||||||
if (GetRoomMode() == kZombieMode) {
|
if (GetRoomMode() == kZombieMode) {
|
||||||
int zombie_num = 0;
|
int zombie_num = 0;
|
||||||
for (auto& pair : human_hash_) {
|
for (auto& pair : human_hash_) {
|
||||||
@ -1009,7 +1010,7 @@ void Room::UpdateGas()
|
|||||||
OnGameOver();
|
OnGameOver();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (gas_data_.gas_mode != GasInactive && GetRoomMode() == kChiJiMode) {
|
if (gas_data_.gas_mode != GasInactive && GetRoomMode() == kChiJiMode) {
|
||||||
if (!IsGameOver() && alive_count_ <= MAX_TEAM_NUM && GetAliveTeamNum() <= 1) {
|
if (!IsGameOver() && alive_count_ <= MAX_TEAM_NUM && GetAliveTeamNum() <= 1) {
|
||||||
game_over_ = true;
|
game_over_ = true;
|
||||||
@ -1039,40 +1040,54 @@ void Room::UpdateGas()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Room::UpdateGasInactive()
|
void Room::UpdateGasInactive()
|
||||||
{
|
{
|
||||||
if (GetFrameNo() - gas_data_.gas_start_frameno >= GetGasInactiveTime() * SERVER_FRAME_RATE) {
|
if (GetFrameNo() - gas_data_.gas_start_frameno >= GetGasInactiveTime() * SERVER_FRAME_RATE) {
|
||||||
gas_data_.gas_mode = GasWaiting;
|
gas_data_.gas_mode = GasJump;
|
||||||
gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea());
|
|
||||||
gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea() + 1);
|
|
||||||
gas_data_.gas_progress = gas_data_.old_area_meta->i->rad();
|
|
||||||
gas_data_.gas_start_frameno = GetFrameNo();
|
gas_data_.gas_start_frameno = GetFrameNo();
|
||||||
gas_data_.pos_old = a8::Vec2(map_meta_->i->map_width() / 2.0f,
|
|
||||||
map_meta_->i->map_height() / 2.0f);
|
|
||||||
gas_data_.pos_old_bk = gas_data_.pos_old;
|
|
||||||
{
|
|
||||||
bool gen_ok = GenSmallCircle(gas_data_.pos_old,
|
|
||||||
gas_data_.old_area_meta->i->rad(),
|
|
||||||
gas_data_.new_area_meta->i->rad(),
|
|
||||||
gas_data_.pos_new);
|
|
||||||
assert(gen_ok);
|
|
||||||
}
|
|
||||||
gas_data_.rad_old = gas_data_.old_area_meta->i->rad();
|
|
||||||
gas_data_.rad_new = gas_data_.new_area_meta->i->rad();
|
|
||||||
battle_start_frameno_ = GetFrameNo();
|
|
||||||
if (human_hash_.size() < GetRoomMaxPlayerNum()) {
|
if (human_hash_.size() < GetRoomMaxPlayerNum()) {
|
||||||
CreateAndroid(GetRoomMaxPlayerNum() - human_hash_.size());
|
CreateAndroid(GetRoomMaxPlayerNum() - human_hash_.size());
|
||||||
|
NotifyUiUpdate();
|
||||||
}
|
}
|
||||||
CombineTeam();
|
CombineTeam();
|
||||||
NotifyGameStart();
|
ShuaPlane();
|
||||||
NotifyUiUpdate();
|
|
||||||
NotifyWxVoip();
|
NotifyWxVoip();
|
||||||
if (room_type_ != RT_NewBrid) {
|
|
||||||
InitAirDrop();
|
InitAirDrop();
|
||||||
|
RoomMgr::Instance()->ActiveRoom(GetRoomUuid());
|
||||||
|
int auto_jump_interval = MetaMgr::Instance()->GetSysParamAsInt("auto_jump_interval");
|
||||||
|
auto_jump_timer_ = xtimer.AddRepeatTimerAndAttach
|
||||||
|
(SERVER_FRAME_RATE * auto_jump_interval,
|
||||||
|
a8::XParams()
|
||||||
|
.SetSender(this),
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
Room* room = (Room*)param.sender.GetUserData();
|
||||||
|
int auto_jump_min_num = MetaMgr::Instance()->GetSysParamAsInt("auto_jump_min_num");
|
||||||
|
int auto_jump_max_num = MetaMgr::Instance()->GetSysParamAsInt("auto_jump_max_num");
|
||||||
|
int jump_num = a8::RandEx(auto_jump_min_num, auto_jump_max_num);
|
||||||
|
if (room->last_player_jump_pos_.Distance(room->plane.curr_pos) < 64 * 8) {
|
||||||
|
jump_num = 1 + rand() % 2;
|
||||||
}
|
}
|
||||||
RoomMgr::Instance()->ActiveRoom(room_uuid_);
|
for (int i = 0; i < jump_num; ++i) {
|
||||||
|
room->TouchHumanList
|
||||||
|
(
|
||||||
|
a8::XParams()
|
||||||
|
.SetSender(room),
|
||||||
|
[] (Human* hum, a8::XParams& param) -> bool
|
||||||
|
{
|
||||||
|
if (a8::HasBitFlag(hum->status, HS_Fly) &&
|
||||||
|
hum->GetEntitySubType() != EST_Player) {
|
||||||
|
hum->DoJump();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
&xtimer_attacher_.timer_list_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1151,7 +1166,49 @@ void Room::UpdateGasMoving()
|
|||||||
|
|
||||||
void Room::UpdateGasJump()
|
void Room::UpdateGasJump()
|
||||||
{
|
{
|
||||||
|
a8::Vec2 len_vec = plane.dir *
|
||||||
|
((GetFrameNo() - GetGasData().gas_start_frameno)*airline_->i->plane_speed() / SERVER_FRAME_RATE);
|
||||||
|
plane.curr_pos = plane.start_point + len_vec;
|
||||||
|
if ((plane.end_point - plane.start_point).Norm() <= len_vec.Norm()) {
|
||||||
|
TouchHumanList(
|
||||||
|
a8::XParams(),
|
||||||
|
[] (Human* hum, a8::XParams& param) -> bool
|
||||||
|
{
|
||||||
|
if (a8::HasBitFlag(hum->status, HS_Fly)) {
|
||||||
|
hum->DoJump();
|
||||||
|
}
|
||||||
|
if (hum->GetEntitySubType() == EST_Player) {
|
||||||
|
GameLog::Instance()->GameStart((Player*)hum);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
gas_data_.gas_mode = GasWaiting;
|
||||||
|
gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea());
|
||||||
|
gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea() + 1);
|
||||||
|
gas_data_.gas_progress = gas_data_.old_area_meta->i->rad();
|
||||||
|
gas_data_.gas_start_frameno = GetFrameNo();
|
||||||
|
gas_data_.pos_old = a8::Vec2(map_meta_->i->map_width() / 2.0f,
|
||||||
|
map_meta_->i->map_height() / 2.0f);
|
||||||
|
gas_data_.pos_old_bk = gas_data_.pos_old;
|
||||||
|
{
|
||||||
|
bool gen_ok = GenSmallCircle(gas_data_.pos_old,
|
||||||
|
gas_data_.old_area_meta->i->rad(),
|
||||||
|
gas_data_.new_area_meta->i->rad(),
|
||||||
|
gas_data_.pos_new);
|
||||||
|
assert(gen_ok);
|
||||||
|
}
|
||||||
|
gas_data_.rad_old = gas_data_.old_area_meta->i->rad();
|
||||||
|
gas_data_.rad_new = gas_data_.new_area_meta->i->rad();
|
||||||
|
battle_start_frameno_ = GetFrameNo();
|
||||||
|
xtimer.DeleteTimer(auto_jump_timer_);
|
||||||
|
auto_jump_timer_ = nullptr;
|
||||||
|
NotifyGameStart();
|
||||||
|
NotifyUiUpdate();
|
||||||
|
NotifyWxVoip();
|
||||||
|
if (room_type_ != RT_NewBrid) {
|
||||||
|
InitAirDrop();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Room::GenSmallCircle(a8::Vec2 big_circle_pos, float big_circle_rad, float small_circle_rad,
|
bool Room::GenSmallCircle(a8::Vec2 big_circle_pos, float big_circle_rad, float small_circle_rad,
|
||||||
@ -1530,6 +1587,29 @@ void Room::AdjustAirDropPos(MetaData::MapThing* thing_meta, a8::Vec2& box_pos)
|
|||||||
AdjustPosInnerMap(box_pos, 100);
|
AdjustPosInnerMap(box_pos, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Room::ShuaPlane()
|
||||||
|
{
|
||||||
|
airline_ = MetaMgr::Instance()->RandAirLine(map_meta_->i->map_id());
|
||||||
|
if (!airline_) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
plane.start_point = a8::Vec2(airline_->start_point_x, airline_->start_point_y);
|
||||||
|
plane.end_point = a8::Vec2(airline_->end_point_x, airline_->end_point_y);
|
||||||
|
plane.dir = plane.end_point - plane.start_point;
|
||||||
|
plane.dir.Normalize();
|
||||||
|
plane.curr_pos = plane.start_point;
|
||||||
|
last_player_jump_pos_ = plane.curr_pos;
|
||||||
|
|
||||||
|
for (auto& pair : human_hash_) {
|
||||||
|
a8::SetBitFlag(pair.second->status, HS_Fly);
|
||||||
|
pair.second->SetPos(plane.curr_pos);
|
||||||
|
pair.second->attack_dir = plane.dir;
|
||||||
|
pair.second->move_dir = plane.dir;
|
||||||
|
grid_service->MoveHuman(pair.second);
|
||||||
|
pair.second->AddToNewObjects(pair.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RoomObstacle* Room::InternalCreateObstacle(int id, float x, float y,
|
RoomObstacle* Room::InternalCreateObstacle(int id, float x, float y,
|
||||||
std::function<void (Obstacle*)> on_precreate)
|
std::function<void (Obstacle*)> on_precreate)
|
||||||
{
|
{
|
||||||
|
@ -39,6 +39,7 @@ public:
|
|||||||
FrameEvent frame_event;
|
FrameEvent frame_event;
|
||||||
FrameMaker frame_maker;
|
FrameMaker frame_maker;
|
||||||
a8::XTimer xtimer;
|
a8::XTimer xtimer;
|
||||||
|
Plane plane;
|
||||||
a8::TimerAttacher timer_attacher;
|
a8::TimerAttacher timer_attacher;
|
||||||
GridService* grid_service = nullptr;
|
GridService* grid_service = nullptr;
|
||||||
MapService* map_service = nullptr;
|
MapService* map_service = nullptr;
|
||||||
@ -298,4 +299,7 @@ private:
|
|||||||
std::map<int, Human*> removed_robot_hash_;
|
std::map<int, Human*> removed_robot_hash_;
|
||||||
|
|
||||||
std::vector<ObstacleData> obstacle_datas_;
|
std::vector<ObstacleData> obstacle_datas_;
|
||||||
|
|
||||||
|
xtimer_list* auto_jump_timer_ = nullptr;
|
||||||
|
a8::Vec2 last_player_jump_pos_;
|
||||||
};
|
};
|
||||||
|
@ -116,6 +116,14 @@ struct BornPoint
|
|||||||
a8::Vec2 RandPoint() const;
|
a8::Vec2 RandPoint() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Plane
|
||||||
|
{
|
||||||
|
a8::Vec2 start_point;
|
||||||
|
a8::Vec2 end_point;
|
||||||
|
a8::Vec2 dir;
|
||||||
|
a8::Vec2 curr_pos;
|
||||||
|
};
|
||||||
|
|
||||||
struct HumanAbility
|
struct HumanAbility
|
||||||
{
|
{
|
||||||
float hp = 0.0f;
|
float hp = 0.0f;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user