diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 5d7bc99c..76f48d35 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -430,6 +430,9 @@ void AndroidNewAI::UpdateNewAI() abort(); } } + if (hum->playing_skill) { + hum->UpdateSkill(); + } ++node_.exec_frame_num; hum->shot_hold = false; switch (node_.main_state) { diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 76b92a6f..6cf1b492 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -484,6 +484,12 @@ bool Creature::CanUseSkill(int skill_id) if (!skill) { return false; } + if (dead) { + return false; + } + if (playing_skill) { + return false; + } return skill->GetCurrTimes() > 0; } @@ -513,7 +519,10 @@ void Creature::DoSkill(int skill_id, std::set target_list; SelectSkillTargets(CurrentSkill(), GetPos(), target_list); TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill); - UpdateSkill(); + if (!CurrentSkill()->meta->phases.empty() && + CurrentSkill()->meta->phases[0].time_offset <= 0) { + UpdateSkill(); + } } else { Entity* entity = room->GetEntityByUniId(skill_target_id_); if (entity && entity->IsEntityType(ET_Player)) { @@ -564,7 +573,7 @@ void Creature::ResetSkill() void Creature::UpdateSkill() { - if (CurrentSkill()) { + if (CurrentSkill() && !dead) { if (curr_skill_phase < CurrentSkill()->meta->phases.size()) { MetaData::SkillPhase* phase = &CurrentSkill()->meta->phases[curr_skill_phase]; if (phase->time_offset >= CurrentSkill()->GetPassedTime()) { @@ -574,6 +583,8 @@ void Creature::UpdateSkill() } else { playing_skill = false; } + } else { + playing_skill = false; } } @@ -848,9 +859,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) break; case kBET_SummonObstacle: { - a8::Vec2 target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_; - target_pos = buff_vec2_param1; - SummonObstacle(buff->meta->param1, target_pos); + if (!dead) { + a8::Vec2 target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_; + target_pos = buff_vec2_param1; + SummonObstacle(buff->meta->param1, target_pos); + } } break; case kBET_Sprint: @@ -1151,7 +1164,14 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance) int weapon_idx = GetCurrWeapon()->weapon_idx; *GetCurrWeapon() = Weapon(); GetCurrWeapon()->weapon_idx = weapon_idx; - SetCurrWeapon(ChooseNextWeapon(slot_id, SPEC1_IS_BEGIN, SPEC1_IS_END)); + Weapon* next_weapon = ChooseNextWeapon(slot_id, SPEC1_IS_BEGIN, SPEC1_IS_END); + if (!next_weapon) { + next_weapon = ChooseNextWeapon(SPEC2_IS_BEGIN, SPEC2_IS_BEGIN, SPEC2_IS_END); + } + if (!next_weapon) { + next_weapon = AutoChgWeapon(); + } + SetCurrWeapon(next_weapon); AutoLoadingBullet(); } } @@ -1172,7 +1192,14 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance) int weapon_idx = GetCurrWeapon()->weapon_idx; *GetCurrWeapon() = Weapon(); GetCurrWeapon()->weapon_idx = weapon_idx; - SetCurrWeapon(ChooseNextWeapon(slot_id, SPEC2_IS_BEGIN, SPEC2_IS_END)); + Weapon* next_weapon = ChooseNextWeapon(slot_id, SPEC2_IS_BEGIN, SPEC2_IS_END); + if (!next_weapon) { + next_weapon = ChooseNextWeapon(SPEC1_IS_BEGIN, SPEC1_IS_BEGIN, SPEC1_IS_END); + } + if (!next_weapon) { + next_weapon = AutoChgWeapon(); + } + SetCurrWeapon(next_weapon); AutoLoadingBullet(); } } @@ -1192,6 +1219,7 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance) last_shot_frameno_ = room->GetFrameNo(); if (!need_sync_active_player && IsPlayer()) { room->frame_event.AddBulletNumChg((Human*)this); + room->frame_event.AddWeaponAmmoChg((Human*)this); } shot_ok = true; } @@ -1455,7 +1483,7 @@ Weapon* Creature::ChooseNextWeapon(int curr_weapon_slot_id, int begin_slot_id, i break; } } - return next_weapon ? next_weapon : AutoChgWeapon(); + return next_weapon; } void Creature::SetCurrWeapon(Weapon* weapon) @@ -1473,3 +1501,10 @@ void Creature::SetCurrWeapon(Weapon* weapon) #endif curr_weapon_ = weapon; } + +void Creature::ResetAllSkillCd() +{ + for (auto& pair : skill_hash_) { + pair.second->ResetSkillCd(); + } +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index ad89eebf..ca48fdf1 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -45,6 +45,7 @@ class Creature : public MoveableEntity std::function on_move_collision; bool poisoning = false; long long poisoning_time = 0; + bool playing_skill = false; Weapon car_weapon; a8::Vec2 buff_vec2_param1; @@ -139,6 +140,8 @@ class Creature : public MoveableEntity Weapon* ChooseNextWeapon(int curr_weapon_slot_id, int begin_slot_id, int end_slot_id); Weapon* GetCurrWeapon() { return curr_weapon_; }; void SetCurrWeapon(Weapon* weapon); + void ResetAllSkillCd(); + void UpdateSkill(); private: @@ -147,7 +150,6 @@ private: virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos); virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos); - void UpdateSkill(); void ProcSkillPhase(MetaData::SkillPhase* phase); void ProcBuffEffect(Creature* caster, Buff* buff); void TriggerOneObjectBuff(Skill* skill, Creature* target, BuffTriggerType_e trigger_type); @@ -176,7 +178,6 @@ private: a8::Vec2 skill_dir_; float skill_param1 = 0; - bool playing_skill = false; size_t curr_skill_phase = 0; Skill* curr_skill_ = nullptr; int skill_target_id_ = 0; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index a41aa582..89147114 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -249,6 +249,7 @@ void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb) stats_pb->set_player_avatar_url(avatar_url); stats_pb->set_charid(meta->i->id()); stats_pb->set_team_id(team_id); + stats_pb->set_nickname(name); if (!dead) { stats_pb->set_time_alive(room->GetFrameNo() * 1000.0f / SERVER_FRAME_RATE); @@ -1789,12 +1790,14 @@ void Human::_UpdateSpecMove() void Human::_UpdateMove(int speed) { - do { - int distance = std::min(5, speed); - _InternalUpdateMove(distance); - speed -= distance; - } while (speed > 0); - CheckSpecObject(); + if (!HasBuffEffect(kBET_Vertigo)) { + do { + int distance = std::min(5, speed); + _InternalUpdateMove(distance); + speed -= distance; + } while (speed > 0); + CheckSpecObject(); + } } void Human::ChangeToRace(RaceType_e race, int level) diff --git a/server/gameserver/mapmgr.cc b/server/gameserver/mapmgr.cc index 375b3073..42b24c8c 100644 --- a/server/gameserver/mapmgr.cc +++ b/server/gameserver/mapmgr.cc @@ -51,7 +51,10 @@ void MapMgr::AttachRoom(Room* room, RoomInitInfo& init_info) if (!map_instance) { map_instance = RandMapInstance(init_info.room_mode); } else if (map_instance->GetMapMeta()->i->map_mode() != init_info.room_mode) { +#ifdef DEBUG +#else map_instance = RandMapInstance(init_info.room_mode); +#endif } if (!map_instance) { diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index dfbb4d4c..c2a69c05 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -80,6 +80,17 @@ namespace MetaData abort(); } } + first_safearea_center = a8::Vec2(i->map_width() / 2.0f, + i->map_height() / 2.0f); + if (!i->first_safearea_center().empty()) { + std::vector strings; + a8::Split(i->first_safearea_center(), strings, ':'); + if (strings.size() != 2) { + abort(); + } + first_safearea_center = a8::Vec2(a8::XValue(strings[0]).GetDouble(), + a8::XValue(strings[1]).GetDouble()); + } if (i->player() < 10) { abort(); } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 85bb08fe..c6d97906 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -28,6 +28,7 @@ namespace MetaData int refresh_robot_min_time = 0; int refresh_robot_max_time = 0; std::vector buff_list; + a8::Vec2 first_safearea_center; void Init(); std::string RandTemplate(); diff --git a/server/gameserver/molotor_cocktail_mitask.cc b/server/gameserver/molotor_cocktail_mitask.cc index 3d65a2e5..e255c881 100644 --- a/server/gameserver/molotor_cocktail_mitask.cc +++ b/server/gameserver/molotor_cocktail_mitask.cc @@ -64,14 +64,14 @@ void MolotorCocktailMiTask::Check() } } ); - a8::Vec2 old_buff_vec2_param1 = sender.Get()->buff_vec2_param1; - sender.Get()->buff_vec2_param1 = sender.Get()->GetPos(); for (Creature* target : objects) { if (!target->GetBuffById(meta->i->buffid())) { + a8::Vec2 old_buff_vec2_param1 = target->buff_vec2_param1; + target->buff_vec2_param1 = target->GetPos(); target->MustBeAddBuff(sender.Get(), meta->i->buffid()); + target->buff_vec2_param1 = old_buff_vec2_param1; } } - sender.Get()->buff_vec2_param1 = old_buff_vec2_param1; } } diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 789384e0..1207a517 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -129,8 +129,15 @@ void Player::InternalUpdate(int delta_time) if (has_use_item_id) { UpdateUseItemId(); } +<<<<<<< HEAD UpdateViewObjects(); } +======= + if (playing_skill) { + UpdateSkill(); + } + } +>>>>>>> dev } void Player::UpdateMove() @@ -625,7 +632,7 @@ void Player::LootInteraction(Loot* entity) case IS_15XSCOPE: { if (item_meta->i->_inventory_slot() - IS_1XSCOPE > curr_scope_idx) { - curr_scope_idx = item_meta->i->_inventory_slot() - IS_1XSCOPE; + curr_scope_idx = item_meta->i->_inventory_slot() - IS_1XSCOPE; } } break; diff --git a/server/gameserver/posiongas_mitask.cc b/server/gameserver/posiongas_mitask.cc index 9a4efc39..6a349b1b 100644 --- a/server/gameserver/posiongas_mitask.cc +++ b/server/gameserver/posiongas_mitask.cc @@ -64,14 +64,14 @@ void PosionGasMiTask::Check() } } ); - a8::Vec2 old_buff_vec2_param1 = sender.Get()->buff_vec2_param1; - sender.Get()->buff_vec2_param1 = sender.Get()->GetPos(); for (Creature* target : objects) { if (!target->GetBuffById(meta->i->buffid())) { + a8::Vec2 old_buff_vec2_param1 = target->buff_vec2_param1; + target->buff_vec2_param1 = target->GetPos(); target->MustBeAddBuff(sender.Get(), meta->i->buffid()); + target->buff_vec2_param1 = old_buff_vec2_param1; } } - sender.Get()->buff_vec2_param1 = old_buff_vec2_param1; } } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index fe5bc639..1b343f78 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1243,27 +1243,11 @@ void Room::UpdateGasMoving() } if (std::abs(gas_data_.gas_progress - gas_data_.rad_new) <= 0.001f) { int pre_area_id = gas_data_.new_area_meta->i->id(); - a8::Vec2 pre_pos = gas_data_.pos_new; if (!MetaMgr::Instance()->GetSafeArea(pre_area_id + 1)) { gas_data_.is_last_gas = true; return; } - gas_data_.gas_mode = GasWaiting; - gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(pre_area_id); - gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(pre_area_id + 1); - gas_data_.gas_progress = gas_data_.old_area_meta->i->rad(); - gas_data_.gas_start_frameno = GetFrameNo(); - gas_data_.pos_old = pre_pos; - 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(); + ForwardGasRing(1); if (!MetaMgr::Instance()->GetSafeArea(gas_data_.new_area_meta->i->id() + 2)) { #if 1 //最后一圈 @@ -1308,8 +1292,7 @@ void Room::UpdateGasJump() 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 = map_meta_->first_safearea_center; gas_data_.pos_old_bk = gas_data_.pos_old; { bool gen_ok = GenSmallCircle(gas_data_.pos_old, @@ -1320,6 +1303,9 @@ void Room::UpdateGasJump() } gas_data_.rad_old = gas_data_.old_area_meta->i->rad(); gas_data_.rad_new = gas_data_.new_area_meta->i->rad(); + if (map_meta_->i->init_gas_ring() > 0) { + ForwardGasRing(map_meta_->i->init_gas_ring()); + } battle_start_frameno_ = GetFrameNo(); xtimer.DeleteTimer(auto_jump_timer_); auto_jump_timer_ = nullptr; @@ -1723,6 +1709,7 @@ void Room::ShuaPlane() for (auto& pair : human_hash_) { pair.second->MustBeAddBuff(pair.second, FLY_BUFFID); + pair.second->ResetAllSkillCd(); pair.second->SetPos(plane.curr_pos); pair.second->attack_dir = plane.dir; pair.second->SetMoveDir(plane.dir); @@ -3681,3 +3668,33 @@ void Room::InitAndroidAI() } #endif } + +void Room::ForwardGasRing(int n) +{ + while (n > 0) { + int pre_area_id = gas_data_.new_area_meta->i->id(); + if (!MetaMgr::Instance()->GetSafeArea(pre_area_id + 1)) { + gas_data_.is_last_gas = true; + return; + } + a8::Vec2 pre_pos = gas_data_.pos_new; + gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(pre_area_id); + gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(pre_area_id + 1); + gas_data_.gas_progress = gas_data_.old_area_meta->i->rad(); + gas_data_.gas_start_frameno = GetFrameNo(); + gas_data_.pos_old = pre_pos; + 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); + if (!gen_ok) { + abort(); + } + } + gas_data_.rad_old = gas_data_.old_area_meta->i->rad(); + gas_data_.rad_new = gas_data_.new_area_meta->i->rad(); + --n; + } +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 63a20ce5..a1159925 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -252,6 +252,7 @@ private: void ShuaLastGas(); size_t GetRoomMaxPlayerNum(); void InitAndroidAI(); + void ForwardGasRing(int n); #ifdef DEBUG void InitDebugInfo(); diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 971770fc..36a5f2e6 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -7,6 +7,7 @@ void Skill::Initialzie() { + curr_times_ = GetMaxTimes(); switch (meta->i->skill_type()) { case kActiveSkill: { @@ -132,3 +133,14 @@ void Skill::NotifySkillState() owner->room->frame_event.AddSkillCurrTimesChg(owner->AllocWeakPtr(), meta->i->skill_id(), GetCurrTimes()); } } + +void Skill::ResetSkillCd() +{ + if (meta->i->skill_id() != TURN_OVER_SKILL_ID) { + curr_times_ = 0; + if (inc_times_timer_) { + owner->room->xtimer.ModifyTimer(inc_times_timer_, GetCd() / FRAME_RATE_MS); + NotifySkillState(); + } + } +} diff --git a/server/gameserver/skill.h b/server/gameserver/skill.h index 117f8b7a..56949d96 100644 --- a/server/gameserver/skill.h +++ b/server/gameserver/skill.h @@ -34,6 +34,7 @@ class Skill int GetMaxTimes(); void DecTimes(); void FillMFSkill(cs::MFSkill* skill_pb); + void ResetSkillCd(); void ClearPassiveSkillBuff(); void AddPassiveSkillBuff(); diff --git a/server/gameserver/zombiemode.ai.cc b/server/gameserver/zombiemode.ai.cc index 18441dfe..0cbedbe6 100644 --- a/server/gameserver/zombiemode.ai.cc +++ b/server/gameserver/zombiemode.ai.cc @@ -93,6 +93,9 @@ void ZombieModeAI::UpdateAI() abort(); } } + if (hum->playing_skill) { + hum->UpdateSkill(); + } ++node_->exec_frame_num; hum->shot_hold = false; switch (node_->main_state) { diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 9fbfd35e..59ad856e 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -669,6 +669,7 @@ message MFPlayerStats optional int32 sex = 37 [default = 0]; //性别 optional int32 charid = 38; //人物id optional int32 team_id = 39; //tamid + optional string nickname = 43; //昵称 } //空投 diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index b6c1cb7f..ee0e77c5 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -34,6 +34,8 @@ message Map optional int32 safearea = 11; optional string game_start_buff_list = 12; optional string map_pic = 13; + optional string first_safearea_center = 14; + optional int32 init_gas_ring = 15; } message MapThing diff --git a/third_party/a8engine b/third_party/a8engine index 1bcc2495..8b641082 160000 --- a/third_party/a8engine +++ b/third_party/a8engine @@ -1 +1 @@ -Subproject commit 1bcc24955410e67342d5e44c2e35addff5111fca +Subproject commit 8b6410826da2c0c667abdacadae6d7c00f70300d