This commit is contained in:
aozhiwei 2019-04-18 10:39:17 +08:00
parent 993cc6285e
commit bcc8aeabd1
8 changed files with 133 additions and 7 deletions

View File

@ -84,6 +84,28 @@ void Human::FillMFObjectFull(cs::MFObjectFull* full_data)
#endif #endif
p->set_vip(vip); p->set_vip(vip);
p->set_sdmg(sdmg); p->set_sdmg(sdmg);
if (pain_killer_timer) {
int passed_time = (room->frame_no - pain_killer_frameno) * FRAME_RATE_MS;
int left_time = std::max(0, pain_killer_lastingtime * 1000 - passed_time);
int anodyne_max_time = MetaMgr::Instance()->GetSysParamAsInt("anodyne_max_time");
left_time = std::min(left_time, anodyne_max_time * 1000);
cs::MFBodyState* state = p->add_states();
state->set_state_type(1);
state->set_left_time(left_time);
state->set_lasting_time(anodyne_max_time * 1000);
}
if (a8::HasBitFlag(status, HS_Fly)) {
cs::MFBodyState* state = p->add_states();
state->set_state_type(2);
}
if (a8::HasBitFlag(status, HS_Jump)) {
int passed_time = (room->frame_no - jump_frameno) * FRAME_RATE_MS;
cs::MFBodyState* state = p->add_states();
state->set_state_type(3);
state->set_left_time(std::max(0, MetaMgr::Instance()->jump_time - passed_time));
state->set_lasting_time(MetaMgr::Instance()->jump_time);
}
} }
void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb) void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb)
@ -275,6 +297,10 @@ bool Human::IsCollision()
} }
} }
if (a8::HasBitFlag(status, HS_Jump)) {
return false;
}
int detection_flags = 0; int detection_flags = 0;
a8::SetBitFlag(detection_flags, ET_Obstacle); a8::SetBitFlag(detection_flags, ET_Obstacle);
a8::SetBitFlag(detection_flags, ET_Building); a8::SetBitFlag(detection_flags, ET_Building);
@ -375,9 +401,10 @@ void Human::UpdatePoisoning()
void Human::SyncAroundPlayers() void Human::SyncAroundPlayers()
{ {
room->TouchHumanList(a8::XParams(), room->TouchHumanList(a8::XParams(),
[this] (Human* hum, a8::XParams& param) [this] (Human* hum, a8::XParams& param) -> bool
{ {
hum->new_objects.insert(this); hum->new_objects.insert(this);
return true;
}); });
} }
@ -440,9 +467,10 @@ void Human::FillSMGameOver(cs::SMGameOver& msg)
{ {
std::vector<Human*> human_list; std::vector<Human*> human_list;
room->TouchHumanList(a8::XParams(), room->TouchHumanList(a8::XParams(),
[&human_list] (Human* hum, a8::XParams& param) [&human_list] (Human* hum, a8::XParams& param) -> bool
{ {
human_list.push_back(hum); human_list.push_back(hum);
return true;
}); });
std::sort(human_list.begin(), human_list.end(), std::sort(human_list.begin(), human_list.end(),
[] (Human* a, Human* b ) [] (Human* a, Human* b )
@ -582,3 +610,28 @@ bool Human::HasLiveTeammate()
} }
return false; return false;
} }
void Human::Land()
{
a8::UnSetBitFlag(status, HS_Jump);
SyncAroundPlayers();
}
void Human::DoJump()
{
if (a8::HasBitFlag(status, HS_Fly)) {
a8::UnSetBitFlag(status, HS_Fly);
a8::SetBitFlag(status, HS_Jump);
jump_frameno = room->frame_no;
SyncAroundPlayers();
room->xtimer.AddDeadLineTimerAndAttach(MetaMgr::Instance()->jump_time,
a8::XParams()
.SetSender(this),
[] (const a8::XParams& param)
{
Human* hum = (Human*)param.sender.GetUserData();
hum->Land();
},
&xtimer_attacher.timer_list_);
}
}

View File

@ -83,6 +83,8 @@ class Human : public Entity
std::set<Human*>* team_members = nullptr; std::set<Human*>* team_members = nullptr;
long long jump_frameno = 0;
Human(); Human();
virtual ~Human() override; virtual ~Human() override;
virtual void Initialize() override; virtual void Initialize() override;
@ -115,6 +117,10 @@ class Human : public Entity
void RemoveNewObjects(Entity* entity); void RemoveNewObjects(Entity* entity);
void RemovePartObjects(Entity* entity); void RemovePartObjects(Entity* entity);
bool HasLiveTeammate(); bool HasLiveTeammate();
void Land();
void DoJump();
protected:
protected: protected:
long long last_shot_frameno_ = 0; long long last_shot_frameno_ = 0;

View File

@ -68,6 +68,7 @@ public:
{ {
MetaMgr::Instance()->gas_inactive_time = MetaMgr::Instance()->GetSysParamAsInt("gas_inactive_time"); MetaMgr::Instance()->gas_inactive_time = MetaMgr::Instance()->GetSysParamAsInt("gas_inactive_time");
MetaMgr::Instance()->plane_speed = MetaMgr::Instance()->GetSysParamAsFloat("plane_speed") / SERVER_FRAME_RATE; MetaMgr::Instance()->plane_speed = MetaMgr::Instance()->GetSysParamAsFloat("plane_speed") / SERVER_FRAME_RATE;
MetaMgr::Instance()->jump_time = MetaMgr::Instance()->GetSysParamAsFloat("jump_time");
} }
#endif #endif
} }

View File

@ -32,6 +32,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
int gas_inactive_time = 10; int gas_inactive_time = 10;
float plane_speed = 5.0f; float plane_speed = 5.0f;
int jump_time = 10;
private: private:
MetaDataLoader* loader_ = nullptr; MetaDataLoader* loader_ = nullptr;

View File

@ -77,6 +77,9 @@ void Player::Update(int delta_time)
if (emote) { if (emote) {
UpdateEmote(); UpdateEmote();
} }
if (jump) {
UpdateJump();
}
} }
} }
@ -116,7 +119,8 @@ void Player::UpdateMove()
void Player::UpdateShot() void Player::UpdateShot()
{ {
if (a8::HasBitFlag(status, HS_Fly)) { if (a8::HasBitFlag(status, HS_Fly) ||
a8::HasBitFlag(status, HS_Jump) ) {
shot_start = false; shot_start = false;
shot_hold = false; shot_hold = false;
series_shot_frames = 0; series_shot_frames = 0;
@ -391,6 +395,32 @@ void Player::UpdateEmote()
emote_id = 0; emote_id = 0;
} }
void Player::UpdateJump()
{
if (a8::HasBitFlag(status, HS_Fly)) {
DoJump();
room->xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE * 3,
a8::XParams(),
[] (const a8::XParams& param)
{
Human* hum = (Human*)param.sender.GetUserData();
hum->room->TouchHumanList(
a8::XParams()
.SetSender(hum),
[] (Human* hum, a8::XParams& param) -> bool
{
if (a8::HasBitFlag(hum->status, HS_Fly)) {
hum->DoJump();
return false;
}
return true;
});
},
&xtimer_attacher.timer_list_);
}
jump = false;
}
void Player::Shot() void Player::Shot()
{ {
if (!curr_weapon->meta) { if (!curr_weapon->meta) {
@ -554,7 +584,7 @@ void Player::ObstacleInteraction(Obstacle* entity)
} }
entity->RecalcSelfCollider(); entity->RecalcSelfCollider();
room->TouchHumanList(a8::XParams(), room->TouchHumanList(a8::XParams(),
[entity] (Human* hum, a8::XParams& param) [entity] (Human* hum, a8::XParams& param) -> bool
{ {
hum->AddToNewObjects(entity); hum->AddToNewObjects(entity);
if (entity->TestCollision(hum)) { if (entity->TestCollision(hum)) {
@ -562,6 +592,7 @@ void Player::ObstacleInteraction(Obstacle* entity)
} else if (hum->last_collision_door == entity) { } else if (hum->last_collision_door == entity) {
hum->last_collision_door = nullptr; hum->last_collision_door = nullptr;
} }
return true;
}); });
} else { } else {
} }
@ -809,6 +840,9 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)
emote = true; emote = true;
emote_id = msg.emote(); emote_id = msg.emote();
} }
if (msg.has_jump()) {
jump = true;
}
} }
void Player::UpdateDropWeapon() void Player::UpdateDropWeapon()
@ -979,6 +1013,8 @@ void Player::FillMFGasData(cs::MFGasData* gas_data)
long long duration = MetaMgr::Instance()->gas_inactive_time * SERVER_FRAME_RATE - long long duration = MetaMgr::Instance()->gas_inactive_time * SERVER_FRAME_RATE -
(room->frame_no - room->gas_data.gas_start_frameno); (room->frame_no - room->gas_data.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->gas_data.gas_mode == GasJump) {
gas_data->set_duration(0);
} else { } else {
if (room->gas_data.old_area_meta->i->wait_time() <= 0) { if (room->gas_data.old_area_meta->i->wait_time() <= 0) {
gas_data->set_duration(0); gas_data->set_duration(0);

View File

@ -58,6 +58,8 @@ class Player : public Human
bool emote = false; bool emote = false;
int emote_id = 0; int emote_id = 0;
bool jump = false;
::google::protobuf::RepeatedField< ::google::protobuf::int32 > interaction_objids; ::google::protobuf::RepeatedField< ::google::protobuf::int32 > interaction_objids;
template <typename T> template <typename T>
@ -82,6 +84,7 @@ class Player : public Human
void UpdateSpectate(); void UpdateSpectate();
void UpdateGameOver(); void UpdateGameOver();
void UpdateEmote(); void UpdateEmote();
void UpdateJump();
void Shot(); void Shot();
void ProcInteraction(); void ProcInteraction();
void ObstacleInteraction(Obstacle* entity); void ObstacleInteraction(Obstacle* entity);

View File

@ -705,14 +705,16 @@ void Room::TouchPlayerList(a8::XParams param,
} }
void Room::TouchHumanList(a8::XParams param, void Room::TouchHumanList(a8::XParams param,
std::function<void (Human*, a8::XParams&)> func) std::function<bool (Human*, a8::XParams&)> func)
{ {
if (!func) { if (!func) {
return; return;
} }
for (auto& pair : human_hash_) { for (auto& pair : human_hash_) {
if (pair.second) { if (pair.second) {
func(pair.second, param); if (!func(pair.second, param)) {
break;
}
} }
} }
} }
@ -769,6 +771,15 @@ void Room::UpdateGas()
Vector2D len_vec = plane.dir * (frame_no - gas_data.gas_start_frameno)*MetaMgr::Instance()->plane_speed; Vector2D len_vec = plane.dir * (frame_no - gas_data.gas_start_frameno)*MetaMgr::Instance()->plane_speed;
plane.curr_pos = plane.start_point + len_vec; plane.curr_pos = plane.start_point + len_vec;
if ((plane.end_point - plane.start_point).Norm() <= len_vec.Norm()) { 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();
}
return true;
});
gas_data.gas_mode = GasWaiting; gas_data.gas_mode = GasWaiting;
gas_data.old_area_meta = MetaMgr::Instance()->GetSafeArea(30001); gas_data.old_area_meta = MetaMgr::Instance()->GetSafeArea(30001);
gas_data.new_area_meta = MetaMgr::Instance()->GetSafeArea(30002); gas_data.new_area_meta = MetaMgr::Instance()->GetSafeArea(30002);
@ -1040,9 +1051,24 @@ void Room::AirDrop(int appear_time, int box_id)
void Room::ShuaPlane() void Room::ShuaPlane()
{ {
plane.start_point = Vector2D(100, 100);
plane.end_point = Vector2D(7500, 7500);
plane.dir = plane.end_point - plane.start_point;
plane.curr_pos = plane.start_point;
std::vector<Human*> humans;
for (auto& pair : human_hash_) { for (auto& pair : human_hash_) {
a8::SetBitFlag(pair.second->status, HS_Fly); a8::SetBitFlag(pair.second->status, HS_Fly);
pair.second->pos = plane.curr_pos; pair.second->pos = plane.curr_pos;
pair.second->attack_dir = plane.dir; pair.second->attack_dir = plane.dir;
pair.second->move_dir = plane.dir;
humans.push_back(pair.second);
} }
for (auto& hum : humans) {
for (auto& pair : human_hash_) {
hum->AddToNewObjects(pair.second);
hum->AddToPartObjects(pair.second);
}
}
} }

View File

@ -62,7 +62,7 @@ public:
void TouchPlayerList(a8::XParams param, void TouchPlayerList(a8::XParams param,
std::function<void (Player*, a8::XParams&)> func); std::function<void (Player*, a8::XParams&)> func);
void TouchHumanList(a8::XParams param, void TouchHumanList(a8::XParams param,
std::function<void (Human*, a8::XParams&)> func); std::function<bool (Human*, a8::XParams&)> func);
void ScatterDrop(Vector2D center, int drop_id); void ScatterDrop(Vector2D center, int drop_id);
void DropItem(Vector2D pos, int item_id, int item_count); void DropItem(Vector2D pos, int item_id, int item_count);