添加状态判断

This commit is contained in:
aozhiwei 2019-04-17 17:58:41 +08:00
parent 316a0dfc71
commit 993cc6285e
7 changed files with 101 additions and 32 deletions

View File

@ -12,6 +12,9 @@ namespace MetaData
enum HumanStatus enum HumanStatus
{ {
HS_PainKiller = 1, HS_PainKiller = 1,
HS_Fly = 2,
HS_Jump = 3,
HS_End
}; };
struct xtimer_list; struct xtimer_list;

View File

@ -64,6 +64,12 @@ public:
f8::ReadCsvMetaFile(res_path + "airdrop@airdrop.csv", airdrop_meta_list); f8::ReadCsvMetaFile(res_path + "airdrop@airdrop.csv", airdrop_meta_list);
f8::ReadJsonMetaFile(res_path + "maps.json", building_meta_list); f8::ReadJsonMetaFile(res_path + "maps.json", building_meta_list);
BindToMetaData(); BindToMetaData();
#if 1
{
MetaMgr::Instance()->gas_inactive_time = MetaMgr::Instance()->GetSysParamAsInt("gas_inactive_time");
MetaMgr::Instance()->plane_speed = MetaMgr::Instance()->GetSysParamAsFloat("plane_speed") / SERVER_FRAME_RATE;
}
#endif
} }
private: private:

View File

@ -31,7 +31,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
std::list<MetaData::AirDrop>& GetAirDrops(); std::list<MetaData::AirDrop>& GetAirDrops();
int gas_inactive_time = 10; int gas_inactive_time = 10;
int gas_jump_time = 0; float plane_speed = 5.0f;
private: private:
MetaDataLoader* loader_ = nullptr; MetaDataLoader* loader_ = nullptr;

View File

@ -85,6 +85,12 @@ void Player::UpdateMove()
if (action_type == AT_Relive) { if (action_type == AT_Relive) {
CancelAction(); CancelAction();
} }
if (a8::HasBitFlag(status, HS_Fly)) {
moving = false;
moved_frames = 0;
last_collision_door = nullptr;
return;
}
++moved_frames; ++moved_frames;
if (moved_frames > 4) { if (moved_frames > 4) {
moving = false; moving = false;
@ -110,6 +116,12 @@ void Player::UpdateMove()
void Player::UpdateShot() void Player::UpdateShot()
{ {
if (a8::HasBitFlag(status, HS_Fly)) {
shot_start = false;
shot_hold = false;
series_shot_frames = 0;
return;
}
if (shot_start) { if (shot_start) {
shot_start = false; shot_start = false;
Shot(); Shot();
@ -133,6 +145,11 @@ void Player::UpdateShot()
void Player::UpdateSelectWeapon() void Player::UpdateSelectWeapon()
{ {
if (a8::HasBitFlag(status, HS_Fly)) {
select_weapon = false;
selected_weapon_idx = 0;
return;
}
if (selected_weapon_idx >= 0 && selected_weapon_idx < weapons.size()) { if (selected_weapon_idx >= 0 && selected_weapon_idx < weapons.size()) {
Weapon* weapon = &weapons[selected_weapon_idx]; Weapon* weapon = &weapons[selected_weapon_idx];
if (weapon->weapon_id != 0) { if (weapon->weapon_id != 0) {
@ -331,6 +348,10 @@ void Player::UpdateUseItemIdx()
void Player::UpdateSpectate() void Player::UpdateSpectate()
{ {
if (a8::HasBitFlag(status, HS_Fly)) {
spectate = false;
return;
}
BeKill(entity_uniid, name); BeKill(entity_uniid, name);
spectate = false; spectate = false;
} }
@ -345,6 +366,11 @@ void Player::UpdateGameOver()
void Player::UpdateEmote() void Player::UpdateEmote()
{ {
if (a8::HasBitFlag(status, HS_Fly)) {
emote = false;
emote_id = 0;
return;
}
::google::protobuf::RepeatedPtrField<::cs::MFEmote>* emotes = nullptr; ::google::protobuf::RepeatedPtrField<::cs::MFEmote>* emotes = nullptr;
{ {
auto itr = room->frame_data.emotes_hash.find(room->frame_no); auto itr = room->frame_data.emotes_hash.find(room->frame_no);
@ -396,6 +422,7 @@ void Player::Shot()
shot->set_offhand(true); shot->set_offhand(true);
shot->set_bullskin(10001); shot->set_bullskin(10001);
} }
if (room->gas_data.gas_mode != GasInactive && room->gas_data.gas_mode != GasJump) {
for (auto& tuple : curr_weapon->meta->bullet_born_offset) { for (auto& tuple : curr_weapon->meta->bullet_born_offset) {
Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple)); Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple));
bullet_born_offset.Rotate(attack_dir.CalcAngle(Vector2D::UP)); bullet_born_offset.Rotate(attack_dir.CalcAngle(Vector2D::UP));
@ -423,7 +450,10 @@ void Player::Shot()
} }
room->CreateBullet(this, curr_weapon->meta, bullet_born_pos, attack_dir, fly_distance); room->CreateBullet(this, curr_weapon->meta, bullet_born_pos, attack_dir, fly_distance);
} }
}
if (curr_weapon->weapon_idx != 0) {
--curr_weapon->ammo; --curr_weapon->ammo;
}
int slot_id = curr_weapon->meta->i->_inventory_slot(); int slot_id = curr_weapon->meta->i->_inventory_slot();
switch (slot_id) { switch (slot_id) {
case 5: case 5:
@ -479,6 +509,10 @@ void Player::Shot()
void Player::ProcInteraction() void Player::ProcInteraction()
{ {
if (a8::HasBitFlag(status, HS_Fly)) {
interaction_objids.Clear();
return;
}
for (auto obj_id : interaction_objids) { for (auto obj_id : interaction_objids) {
Entity* entity = room->GetEntityByUniId(obj_id); Entity* entity = room->GetEntityByUniId(obj_id);
if (entity) { if (entity) {

View File

@ -755,7 +755,20 @@ void Room::UpdateGas()
switch (gas_data.gas_mode) { switch (gas_data.gas_mode) {
case GasInactive: case GasInactive:
{ {
if (frame_no - gas_data.gas_start_frameno >= MetaMgr::Instance()->gas_inactive_time * SERVER_FRAME_RATE) { if (frame_no - gas_data.gas_start_frameno >=
MetaMgr::Instance()->gas_inactive_time * SERVER_FRAME_RATE) {
gas_data.gas_mode = GasJump;
gas_data.gas_start_frameno = frame_no;
ShuaPlane();
RoomMgr::Instance()->RemoveFromInactiveRoomHash(room_uuid);
}
}
break;
case GasJump:
{
Vector2D len_vec = plane.dir * (frame_no - gas_data.gas_start_frameno)*MetaMgr::Instance()->plane_speed;
plane.curr_pos = plane.start_point + len_vec;
if ((plane.end_point - plane.start_point).Norm() <= len_vec.Norm()) {
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);
@ -773,15 +786,9 @@ void Room::UpdateGas()
} }
gas_data.rad_old = gas_data.old_area_meta->i->rad(); gas_data.rad_old = gas_data.old_area_meta->i->rad();
gas_data.rad_new = gas_data.new_area_meta->i->rad(); gas_data.rad_new = gas_data.new_area_meta->i->rad();
RoomMgr::Instance()->RemoveFromInactiveRoomHash(room_uuid);
} }
} }
break; break;
case GasJump:
{
}
break;
case GasWaiting: case GasWaiting:
{ {
if (frame_no - gas_data.gas_start_frameno >= if (frame_no - gas_data.gas_start_frameno >=
@ -845,7 +852,7 @@ void Room::UpdateGas()
} }
break; break;
} }
if (gas_data.gas_mode != GasInactive) { if (gas_data.gas_mode != GasInactive && gas_data.gas_mode != GasJump) {
if (!game_over && alive_count_ <= 1) { if (!game_over && alive_count_ <= 1) {
game_over = true; game_over = true;
game_over_frameno = frame_no; game_over_frameno = frame_no;
@ -1030,3 +1037,12 @@ void Room::AirDrop(int appear_time, int box_id)
&xtimer_attacher.timer_list_); &xtimer_attacher.timer_list_);
} }
} }
void Room::ShuaPlane()
{
for (auto& pair : human_hash_) {
a8::SetBitFlag(pair.second->status, HS_Fly);
pair.second->pos = plane.curr_pos;
pair.second->attack_dir = plane.dir;
}
}

View File

@ -35,6 +35,7 @@ public:
long long game_over_frameno = 0; long long game_over_frameno = 0;
RoomProfile profile; RoomProfile profile;
a8::XTimer xtimer; a8::XTimer xtimer;
Plane plane;
~Room(); ~Room();
void Init(); void Init();
@ -89,6 +90,7 @@ private:
void AutoMatchTeam(); void AutoMatchTeam();
void InitAirDrop(); void InitAirDrop();
void AirDrop(int appear_time, int box_id); void AirDrop(int appear_time, int box_id);
void ShuaPlane();
private: private:
timer_list* stats_timer_ = nullptr; timer_list* stats_timer_ = nullptr;

View File

@ -60,3 +60,11 @@ struct PlayerStats
std::string killer_name; std::string killer_name;
}; };
struct Plane
{
Vector2D start_point;
Vector2D end_point;
Vector2D dir;
Vector2D curr_pos;
};