From e13331b253e3e9fdf43a723ae22c79e25637b2a7 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 28 Apr 2019 14:03:26 +0800 Subject: [PATCH] skill ok --- server/gameserver/bullet.cc | 12 ++- server/gameserver/constant.h | 18 ++++ server/gameserver/human.cc | 185 +++++++++++++++++++++++++++++++++-- server/gameserver/human.h | 4 + server/gameserver/player.cc | 12 +++ server/gameserver/player.h | 3 + server/gameserver/types.h | 8 ++ 7 files changed, 231 insertions(+), 11 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index ff574f6..9485929 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -104,11 +104,17 @@ void Bullet::OnHit(std::set& objects) #else if (!hum->dead && (hum->team_id == 0 || hum->team_id != player->team_id)) { #endif - float dmg = gun_meta->i->atk(); - float def = hum->def; + float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add); + float def = hum->def + hum->buff.def_add; float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); player->stats.damage_amount += finaly_dmg; hum->DecHP(finaly_dmg, player->entity_uniid, player->name); + if (a8::HasBitFlag(hum->status, HS_ReflectDamage) && hum->skill_meta) { + float reflect_dmg = finaly_dmg * hum->skill_meta->i->value1(); + if (reflect_dmg > 1.0f) { + player->DecHP(reflect_dmg, hum->entity_uniid, hum->name); + } + } } } break; @@ -116,7 +122,7 @@ void Bullet::OnHit(std::set& objects) { Obstacle* obstacle = (Obstacle*)target; if (!obstacle->dead && obstacle->meta->i->attack_type() == 1) { - float dmg = gun_meta->i->atk(); + float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add); float def = 0; float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); player->stats.damage_amount += finaly_dmg; diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index a56794f..1f3a381 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -87,6 +87,24 @@ enum InventorySlot_e IS_END }; +enum SkillType_e +{ + ST_Hide = 1, + ST_SummonHero = 2, + ST_Accelerate = 3, + ST_DamageAdd = 4, + ST_DefAdd = 5, + ST_RecoverHP = 6, + ST_ReflectDamage = 7, + ST_SelfDetonate = 8 +}; + +enum SkillCond_e +{ + SC_Active = 1, + SC_Passive = 2 +}; + const char* const PROJ_NAME_FMT = "game%d_gameserver"; const char* const PROJ_ROOT_FMT = "/data/logs/%s"; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index c95848f..ed493d5 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -43,7 +43,7 @@ void Human::Initialize() float Human::GetSpeed() { - return meta->i->move_speed(); + return meta->i->move_speed() + buff.speed; } void Human::FillMFObjectPart(cs::MFObjectPart* part_data) @@ -102,49 +102,49 @@ void Human::FillMFObjectFull(cs::MFObjectFull* full_data) 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::min(0, MetaMgr::Instance()->jump_time * 1000 - passed_time)); + state->set_left_time(std::max(0, MetaMgr::Instance()->jump_time * 1000 - passed_time)); state->set_lasting_time(MetaMgr::Instance()->jump_time * 1000); } if (a8::HasBitFlag(status, HS_Hide) && skill_meta) { int passed_time = (room->frame_no - hide_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = p->add_states(); state->set_state_type(HS_Hide); - state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time)); + state->set_left_time(std::max(0, skill_meta->i->cd_time() * 1000 - passed_time)); state->set_lasting_time(skill_meta->i->last_time() * 1000); } if (a8::HasBitFlag(status, HS_Accelerate) && skill_meta) { int passed_time = (room->frame_no - accelerate_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = p->add_states(); state->set_state_type(HS_Accelerate); - state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time)); + state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); state->set_lasting_time(skill_meta->i->last_time() * 1000); } if (a8::HasBitFlag(status, HS_DamageAdd) && skill_meta) { int passed_time = (room->frame_no - damageadd_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = p->add_states(); state->set_state_type(HS_DamageAdd); - state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time)); + state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); state->set_lasting_time(skill_meta->i->last_time() * 1000); } if (a8::HasBitFlag(status, HS_DefAdd) && skill_meta) { int passed_time = (room->frame_no - defadd_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = p->add_states(); state->set_state_type(HS_DefAdd); - state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time)); + state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); state->set_lasting_time(skill_meta->i->last_time() * 1000); } if (a8::HasBitFlag(status, HS_RecoverHP) && skill_meta) { int passed_time = (room->frame_no - recover_hp_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = p->add_states(); state->set_state_type(HS_RecoverHP); - state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time)); + state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); state->set_lasting_time(skill_meta->i->last_time() * 1000); } if (a8::HasBitFlag(status, HS_ReflectDamage) && skill_meta) { int passed_time = (room->frame_no - reflect_damage_frameno_) * FRAME_RATE_MS; cs::MFBodyState* state = p->add_states(); state->set_state_type(HS_ReflectDamage); - state->set_left_time(std::min(0, skill_meta->i->last_time() * 1000 - passed_time)); + state->set_left_time(std::max(0, skill_meta->i->last_time() * 1000 - passed_time)); state->set_lasting_time(skill_meta->i->last_time() * 1000); } } @@ -638,6 +638,167 @@ void Human::DoJump() } } +void Human::DoSkill() +{ + if (skill_meta && skill_meta->i->condition() == SC_Active) { + int passed_time = (room->frame_no - last_use_skill_frameno_) * FRAME_RATE_MS; + int skill_left_time = std::max(0, skill_meta->i->last_time() * 1000 - passed_time); + if (skill_left_time <= 0) { + skill_xtimer_attacher_.ClearTimerList(); + switch (skill_meta->i->type()) { + case ST_Hide: + { + hide_frameno_ = room->frame_no; + a8::SetBitFlag(status, HS_Hide); + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + }, + &skill_xtimer_attacher_.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + a8::UnSetBitFlag(hum->status, HS_Hide); + hum->need_sync_active_player = true; + hum->BroadcastFullState(); + } + ); + need_sync_active_player = true; + BroadcastFullState(); + } + break; + case ST_SummonHero: + { + + } + break; + case ST_Accelerate: + { + accelerate_frameno_ = room->frame_no; + a8::SetBitFlag(status, HS_Accelerate); + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + }, + &skill_xtimer_attacher_.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + a8::UnSetBitFlag(hum->status, HS_Accelerate); + hum->need_sync_active_player = true; + hum->BroadcastFullState(); + } + ); + need_sync_active_player = true; + BroadcastFullState(); + } + break; + case ST_DamageAdd: + { + damageadd_frameno_ = room->frame_no; + a8::SetBitFlag(status, HS_DamageAdd); + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + }, + &skill_xtimer_attacher_.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + a8::UnSetBitFlag(hum->status, HS_DamageAdd); + hum->need_sync_active_player = true; + hum->BroadcastFullState(); + } + ); + need_sync_active_player = true; + BroadcastFullState(); + } + break; + case ST_DefAdd: + { + defadd_frameno_ = room->frame_no; + a8::SetBitFlag(status, HS_DefAdd); + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + }, + &skill_xtimer_attacher_.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + a8::UnSetBitFlag(hum->status, HS_DefAdd); + hum->need_sync_active_player = true; + hum->BroadcastFullState(); + } + ); + need_sync_active_player = true; + BroadcastFullState(); + } + break; + case ST_RecoverHP: + { + recover_hp_frameno_ = room->frame_no; + a8::SetBitFlag(status, HS_RecoverHP); + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + }, + &skill_xtimer_attacher_.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + a8::UnSetBitFlag(hum->status, HS_RecoverHP); + hum->need_sync_active_player = true; + hum->BroadcastFullState(); + } + ); + need_sync_active_player = true; + BroadcastFullState(); + } + break; + case ST_ReflectDamage: + { + reflect_damage_frameno_ = room->frame_no; + a8::SetBitFlag(status, HS_ReflectDamage); + room->xtimer.AddDeadLineTimerAndAttach(skill_meta->i->last_time() * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + }, + &skill_xtimer_attacher_.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + a8::UnSetBitFlag(hum->status, HS_ReflectDamage); + hum->need_sync_active_player = true; + hum->BroadcastFullState(); + } + ); + need_sync_active_player = true; + BroadcastFullState(); + } + break; + default: + { + } + break; + } + last_use_skill_frameno_ = room->frame_no; + } + } +} + void Human::FindLocation() { { @@ -835,6 +996,14 @@ void Human::FillMFActivePlayerData(cs::MFActivePlayerData* player_data) player_data->set_max_energy_shield(max_energy_shield); } #endif + #if 1 + if (skill_meta) { + int passed_time = (room->frame_no - last_use_skill_frameno_) * FRAME_RATE_MS; + int skill_left_time = std::max(0, skill_meta->i->last_time() * 1000 - passed_time); + player_data->set_skill_left_time(skill_left_time); + player_data->set_skill_cd_time(skill_meta->i->last_time() * 1000); + } + #endif } void Human::FillMFGasData(cs::MFGasData* gas_data) diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 51d9cda..f2fa5ce 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -39,6 +39,7 @@ class Human : public Entity MetaData::Equip* chest_meta = nullptr; MetaData::Dress* skin_meta = nullptr; MetaData::Skill* skill_meta = nullptr; + HumanAbility buff; Vector2D move_dir; Vector2D attack_dir; @@ -131,6 +132,7 @@ class Human : public Entity bool HasLiveTeammate(); void Land(); void DoJump(); + void DoSkill(); void FindLocation(); void RefreshView(); void OnGridListChange(std::set& old_grid_list, @@ -149,12 +151,14 @@ class Human : public Entity protected: long long last_shot_frameno_ = 0; + long long last_use_skill_frameno_ = 0; long long hide_frameno_ = 0; long long accelerate_frameno_ = 0; long long damageadd_frameno_ = 0; long long defadd_frameno_ = 0; long long recover_hp_frameno_ = 0; long long reflect_damage_frameno_ = 0; + a8::XTimerAttacher skill_xtimer_attacher_; std::array inventory_ = {}; std::array volume_ = {}; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 2d2c24f..6d86807 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -81,6 +81,9 @@ void Player::Update(int delta_time) if (jump) { UpdateJump(); } + if (use_skill) { + UpdateUseSkill(); + } } } @@ -417,6 +420,12 @@ void Player::UpdateJump() jump = false; } +void Player::UpdateUseSkill() +{ + DoSkill(); + use_skill = false; +} + void Player::Shot() { if (!curr_weapon->meta) { @@ -837,6 +846,9 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) if (msg.has_jump()) { jump = true; } + if (msg.has_use_skill()) { + use_skill = true; + } } void Player::UpdateDropWeapon() diff --git a/server/gameserver/player.h b/server/gameserver/player.h index b04f7a4..38dd1a0 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -60,6 +60,8 @@ class Player : public Human bool jump = false; + bool use_skill = false; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > interaction_objids; template @@ -85,6 +87,7 @@ class Player : public Human void UpdateGameOver(); void UpdateEmote(); void UpdateJump(); + void UpdateUseSkill(); void Shot(); void ProcInteraction(); void ObstacleInteraction(Obstacle* entity); diff --git a/server/gameserver/types.h b/server/gameserver/types.h index c067162..503e5ab 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -68,3 +68,11 @@ struct Plane Vector2D dir; Vector2D curr_pos; }; + +struct HumanAbility +{ + float speed = 0.0f; + float damage_add = 0.0f; + float def_add = 0.0f; + float reflect_damage = 0.0f; +};