diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 3b647428..04ed96e6 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -569,3 +569,11 @@ void Car::DoSkillPostProc(bool used, int skill_id, int target_id) #endif } } + +void Car::Update(int delta_time) +{ + ++updated_times_; + if (playing_skill) { + UpdateSkill(); + } +} diff --git a/server/gameserver/car.h b/server/gameserver/car.h index 4a005378..c1404c3e 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -13,6 +13,7 @@ class Car : public Creature Car(); virtual ~Car() override; + virtual void Update(int delta_time) override; virtual void Initialize() override; virtual void FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) override; virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override; diff --git a/server/gameserver/commands.cc b/server/gameserver/commands.cc index 44d43162..c4ed50cd 100644 --- a/server/gameserver/commands.cc +++ b/server/gameserver/commands.cc @@ -9,6 +9,7 @@ #include "movement.h" #include "android.h" #include "airraid.h" +#include "car.h" #include "cs_proto.pb.h" @@ -326,6 +327,21 @@ void Player::_CMExecCommand(f8::MsgHdr& hdr, const cs::CMExecCommand& msg) #endif } } + } else if (cmd == "use_skill") { + if (cmds.size() >= 2 && GetCar() && GetCar()->IsDriver(this)) { + int skill_id = a8::XValue(cmds[1]); + Skill* skill = GetCar()->GetSkill(skill_id); + Human* enemy = room->FindEnemy(this, 300); + if (enemy && skill) { + if (GetCar()->CanUseSkill(skill_id) && enemy->GetPos().Distance2D2(GetPos()) > 0.0001f) { + glm::vec3 skill_dir = enemy->GetPos().ToGlmVec3() - GetPos().ToGlmVec3(); + float skill_distance = GlmHelper::Norm(skill_dir); + GlmHelper::Normalize(skill_dir); + + GetCar()->DoSkill(skill_id, enemy->GetUniId(), skill_dir, skill_distance); + } + } + } } #ifdef DEBUG a8::XPrintf("exec_cmd:%s\n", {cmd}); diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index a99c32bc..8ceb52d2 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -380,7 +380,8 @@ void FrameEvent::AddSkillCdChg(CreatureWeakPtr sender, int skill_id, int left_ti ((Human*)sender.Get())->GetFrameData().chged_skillcds_.push_back(idx); } else if (sender.Get()->IsCar() && sender.Get()->AsCar()->GetDriver()) { Car* car = sender.Get()->AsCar(); - room->frame_event_data->chged_skillcds_.push_back(std::make_tuple(car->GetDriver()->GetWeakPtrRef(), skill_id, left_time)); + room->frame_event_data->chged_skillcds_.push_back + (std::make_tuple(car->GetWeakPtrRef(), skill_id, left_time)); int idx = room->frame_event_data->chged_skillcds_.size() - 1; car->GetDriver()->GetFrameData().chged_skillcds_.push_back(idx); } diff --git a/server/gameserver/netdata.cc b/server/gameserver/netdata.cc index f34db4fa..2062d3d2 100644 --- a/server/gameserver/netdata.cc +++ b/server/gameserver/netdata.cc @@ -900,30 +900,39 @@ void BattleDataContext::GetSkillList(std::vector& skill_list) const mt::Skill* skill1 = mt::Skill::GetById(hero_ability_->hero_meta->skill1list()); const mt::Skill* skill2 = mt::Skill::GetById(hero_ability_->hero_meta->skill2list()); const mt::Skill* skill3 = mt::Skill::GetById(hero_ability_->hero_meta->skill3list()); - if (skill1 && skill2 && skill3 && skill1_lv > 0 && skill2_lv > 0 && skill3_lv > 0) { - if (mt::Skill::GetById(skill1->skill_id() + skill1_lv - 1)) { - skill_list.push_back(skill1->skill_id() + skill1_lv - 1); - } else { - skill_list.push_back(skill1->skill_id()); - } - - //替换翻滚 - if (spec_skill) { - skill_list.push_back(spec_skill->skill_id()); - } else { - if (mt::Skill::GetById(skill2->skill_id() + skill2_lv - 2)) { - skill_list.push_back(skill2->skill_id() + skill2_lv - 2); + if (owner_.Get()->IsHuman()) { + if (skill1 && skill2 && skill3 && skill1_lv > 0 && skill2_lv > 0 && skill3_lv > 0) { + if (mt::Skill::GetById(skill1->skill_id() + skill1_lv - 1)) { + skill_list.push_back(skill1->skill_id() + skill1_lv - 1); } else { - skill_list.push_back(skill2->skill_id()); + skill_list.push_back(skill1->skill_id()); + } + + //替换翻滚 + if (spec_skill) { + skill_list.push_back(spec_skill->skill_id()); + } else { + if (mt::Skill::GetById(skill2->skill_id() + skill2_lv - 2)) { + skill_list.push_back(skill2->skill_id() + skill2_lv - 2); + } else { + skill_list.push_back(skill2->skill_id()); + } + } + + if (mt::Skill::GetById(skill3->skill_id() + skill3_lv - 3)) { + skill_list.push_back(skill3->skill_id() + skill3_lv - 3); + } else { + skill_list.push_back(skill3->skill_id()); + } + + } + } else { + std::vector skills = {skill1, skill2, skill3}; + for (auto skill_meta : skills) { + if (skill_meta) { + skill_list.push_back(skill_meta->skill_id()); } } - - if (mt::Skill::GetById(skill3->skill_id() + skill3_lv - 3)) { - skill_list.push_back(skill3->skill_id() + skill3_lv - 3); - } else { - skill_list.push_back(skill3->skill_id()); - } - } } diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 9c57e2d5..34911707 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -254,7 +254,7 @@ void Skill::InitActiveSkill() }, &xtimer_attacher); actived_ = !owner->GetBattleContext()->IsMainSkill(this); - if (owner->IsAndroid() || owner->IsHero()) { + if (owner->IsAndroid() || owner->IsHero() || owner->IsCar()) { actived_ = true; } }