From bb636746eadf5e7fe3702efb04f4b06103bad741 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Apr 2021 11:31:38 +0800 Subject: [PATCH] 1 --- server/gameserver/constant.h | 1 + server/gameserver/creature.cc | 50 ++++++++++++++++++++---------- server/gameserver/creature.h | 7 ++++- server/gameserver/player.cc | 6 ++-- server/gameserver/zombiemode.ai.cc | 12 ++++++- 5 files changed, 54 insertions(+), 22 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 367a470..6bb0966 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -158,6 +158,7 @@ enum BuffEffectType_e kBET_CrazyMode = 33, //暴走模式 kBET_ShockWave = 34, //冲击波 kBET_Sprint = 35, //冲刺 + kBET_SummonObstacle = 36, //召唤物件 kBET_ThroughWall = 50, //穿墙 kBET_Driver = 51, //驾驶中 diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 7ffdbf5..2dfa36b 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -19,6 +19,17 @@ void InternalShot(Creature* c, float fly_distance, bool is_tank_skin) { + if (weapon_meta->i->_inventory_slot() == IS_TRAP || + weapon_meta->i->_inventory_slot() == IS_MINE) { + MetaData::Buff * buff_meta = MetaMgr::Instance()->GetBuff(bullet_meta->i->buffid()); + if (buff_meta) { + c->AddBuff(c, + buff_meta, + 1 + ); + } + return; + } for (auto& tuple : weapon_meta->bullet_born_offset) { a8::Vec2 bullet_born_offset = a8::Vec2(std::get<0>(tuple), std::get<1>(tuple)); bullet_born_offset.Rotate(c->attack_dir.CalcAngle(a8::Vec2::UP)); @@ -444,7 +455,11 @@ bool Creature::CanUseSkill(int skill_id) return skill->GetLeftTime() <= 0; } -void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& skill_dir, const a8::Vec2& target_pos) +void Creature::DoSkill(int skill_id, + int target_id, + const a8::Vec2& skill_dir, + float skill_distance, + const a8::Vec2& target_pos) { DoSkillPreProc(skill_id, target_id, target_pos); Skill* skill = GetSkill(skill_id); @@ -453,6 +468,7 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& skill_dir, c skill_target_id_ = target_id; skill_target_pos_ = target_pos; skill_dir_ = skill_dir; + skill_distance_ = skill_distance; curr_skill_ = skill; playing_skill = true; CurrentSkill()->last_use_frameno = room->GetFrameNo(); @@ -671,27 +687,27 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) if (caster == this) { abort(); } - #if 1 - skill_dir_.Normalize(); - target_pos = GetPos() + skill_dir_ * skill_distance_; - move_dir = target_pos - GetPos(); - move_dir.Normalize(); - #else - float target_distance = caster->GetPos().Distance(GetPos()); - if (target_distance <= 0.000001f) { - SetPos(caster->GetPos()); - target_pos = caster->GetPos(); - } else { - if (target_distance <= buff->meta->param3) { + if (caster->GetEntitySubType() == EST_Android) { + float target_distance = caster->GetPos().Distance(GetPos()); + if (target_distance <= 0.000001f) { SetPos(caster->GetPos()); target_pos = caster->GetPos(); } else { - move_dir = caster->GetPos() - GetPos(); - move_dir.Normalize(); - target_pos = GetPos() + move_dir * (target_distance - buff->meta->param3); + if (target_distance <= buff->meta->param3) { + SetPos(caster->GetPos()); + target_pos = caster->GetPos(); + } else { + move_dir = caster->GetPos() - GetPos(); + move_dir.Normalize(); + target_pos = GetPos() + move_dir * (target_distance - buff->meta->param3); + } } + } else { + caster->skill_dir_.Normalize(); + target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_; + move_dir = target_pos - GetPos(); + move_dir.Normalize(); } - #endif } break; case kBET_JumpTo: diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index bc99407..4194389 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -75,7 +75,12 @@ class Creature : public MoveableEntity const a8::Vec2& target_pos, std::set& target_list); virtual bool CanUseSkill(int skill_id); - void DoSkill(int skill_id, int target_id, const a8::Vec2& skill_dir, const a8::Vec2& target_pos); + void DoSkill(int skill_id, + int target_id, + const a8::Vec2& skill_dir, + float skill_distance, + const a8::Vec2& target_pos + ); void ResetSkill(); Skill* CurrentSkill(); MetaData::SkillPhase* GetCurrSkillPhase(); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index edaea7b..1208956 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -393,7 +393,7 @@ void Player::UpdateUseSkill() if (HasBuffEffect(kBET_Vertigo)) { return; } - DoSkill(use_skill_id, skill_target_id, skill_dir, a8::Vec2()); + DoSkill(use_skill_id, skill_target_id, skill_dir, skill_distance, a8::Vec2()); use_skill = false; } @@ -439,7 +439,7 @@ void Player::Shot() int slot_id = curr_weapon->meta->i->_inventory_slot(); //扔完手雷,如无手雷,则优先换武器1>武器2 switch (slot_id) { - case 5: + case IS_FRAG: { //手雷 if (curr_weapon->ammo <= 0) { @@ -462,7 +462,7 @@ void Player::Shot() SyncAroundPlayers(__FILE__, __LINE__, __func__); } break; - case 6: + case IS_SMOKE: { //烟雾弹 if (curr_weapon->ammo <= 0) { diff --git a/server/gameserver/zombiemode.ai.cc b/server/gameserver/zombiemode.ai.cc index 35ab1d4..169b3b3 100644 --- a/server/gameserver/zombiemode.ai.cc +++ b/server/gameserver/zombiemode.ai.cc @@ -467,7 +467,17 @@ void ZombieModeAI::DoShot() void ZombieModeAI::DoSkill(int skill_id) { Human* myself = (Human*)owner; - myself->DoSkill(skill_id, node_->target.Get()->GetEntityUniId(), a8::Vec2(), node_->target.Get()->GetPos()); + a8::Vec2 skill_dir; + float skill_distance = node_->target.Get()->GetPos().Distance(myself->GetPos()); + if (fabs(skill_distance) > 0.00001f) { + skill_dir = node_->target.Get()->GetPos() - myself->GetPos(); + skill_dir.Normalize(); + } + myself->DoSkill(skill_id, + node_->target.Get()->GetEntityUniId(), + a8::Vec2(), + skill_distance, + node_->target.Get()->GetPos()); } int ZombieModeAI::GetAttackTimes()