From 4b9e532e8764bf845517532e0e820f6b08532b96 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 20 Oct 2021 11:43:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=AF=8F=E7=A7=91=E5=AD=90?= =?UTF-8?q?=E5=BC=B9=E5=90=8E=E5=9D=90=E5=8A=9B=E5=92=8C=E5=AD=90=E5=BC=B9?= =?UTF-8?q?=E6=B6=88=E8=80=97=E7=B1=BB=E5=9E=8B=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/constant.h | 15 +++++++++++ server/gameserver/creature.cc | 36 ++++++++++++++++++++----- server/gameserver/creature.h | 1 + server/gameserver/metadata.cc | 3 ++- server/gameserver/metadata.h | 3 ++- server/gameserver/roomobstacle.cc | 22 ++++++++++++--- server/tools/protobuild/metatable.proto | 2 ++ 7 files changed, 71 insertions(+), 11 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 37844ac..83759c1 100644 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -429,6 +429,21 @@ enum KillTextFieldIdx kFieldIdxWeaponTextIcon, }; +enum BulletConsumeType_e +{ + kBulletConsumeOne = 0, + kBulletConsumeMulti = 1, +}; + +enum BulletBornOffsetIdx_e +{ + kBulletBornOffsetX = 0, + kBulletBornOffsetY = 1, + kBulletBornOffsetAngle = 2, + kBulletBornOffsetDelayTime = 3, + kBulletBornOffsetRecoilForce = 4, +}; + const char* const PROJ_NAME_FMT = "game%d_gameserver"; const char* const PROJ_ROOT_FMT = "/data/logs/%s"; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 5c049ac..d6c40c7 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -25,6 +25,7 @@ struct BulletInfo bool is_tank_skin = false; int weapon_lv = 0; int delay_time = 0; + int recoil_force = 0; int invincible_buff_uniid = 0; }; @@ -40,10 +41,24 @@ static void InternalCreateBullet(BulletInfo& bullet_info) if (c->downed) { return; } + if (c->GetCurrWeapon()->weapon_idx == 0) { + return; + } + if (c->GetCurrWeapon()->meta->i->bullet_consume_type() == kBulletConsumeMulti) { + if (c->GetCurrWeapon()->ammo <= 0) { + return; + } + --c->GetCurrWeapon()->ammo; + } if (bullet_info.delay_time <= 0) { int bullet_uniid = 0; if (MetaMgr::Instance()->prebattle_can_use_skill || !(c->HasBuffEffect(kBET_Jump) || c->HasBuffEffect(kBET_Fly))) { + if (bullet_info.recoil_force > 0) { + c->DoRecoilForce(bullet_info.recoil_force); + bullet_info.bullet_born_pos = bullet_info.bullet_born_pos - + (bullet_info.bullet_dir * bullet_info.recoil_force); + } bullet_uniid = c->room->CreateBullet (c, c->shot_passenger, @@ -192,17 +207,14 @@ void InternalShot(Creature* c, bullet_info.is_tank_skin = is_tank_skin; bullet_info.weapon_lv = weapon_lv; bullet_info.delay_time = std::get<3>(tuple); + bullet_info.recoil_force = std::get<4>(tuple); bullet_info.invincible_buff_uniid = invincible_buff_uniid; InternalCreateBullet(bullet_info); } } c->GetTrigger()->Shot(weapon_meta); if (weapon_meta->i->recoil_force() > 0.000001) { - a8::Vec2 old_move_dir = c->GetMoveDir(); - c->MustBeAddBuff(c, kRecoilBuffId); - c->SetMoveDir(c->GetAttackDir() * -1); - c->_UpdateMove(weapon_meta->i->recoil_force()); - c->SetMoveDir(old_move_dir); + c->DoRecoilForce(weapon_meta->i->recoil_force()); } if (c->HasBuffEffect(kBET_Hide)) { c->RemoveBuffByEffectId(kBET_Hide); @@ -1674,7 +1686,8 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance) abort(); } - if (GetCurrWeapon()->weapon_idx != 0) { + if (GetCurrWeapon()->weapon_idx != 0 && + GetCurrWeapon()->meta->i->bullet_consume_type() == kBulletConsumeOne) { --GetCurrWeapon()->ammo; } int slot_id = GetCurrWeapon()->meta->i->_inventory_slot(); @@ -2889,3 +2902,14 @@ void Creature::FollowToTarget() } } } + +void Creature::DoRecoilForce(int distance) +{ + if (distance > 0) { + a8::Vec2 old_move_dir = GetMoveDir(); + MustBeAddBuff(this, kRecoilBuffId); + SetMoveDir(GetAttackDir() * -1); + _UpdateMove(distance); + SetMoveDir(old_move_dir); + } +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index c08b3e3..2e6e8bf 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -248,6 +248,7 @@ class Creature : public MoveableEntity void DecDisableMoveDirTimes() { --disable_move_dir_times_ ; }; int GetDisableMoveDirTimes() { return disable_move_dir_times_ ; }; void SetDisableMoveDirTimes(int times) { disable_move_dir_times_ = times; }; + void DoRecoilForce(int distance); protected: virtual void OnBuffRemove(Buff& buff); diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 6245255..8733926 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -256,7 +256,8 @@ namespace MetaData a8::XValue(strings2[0]).GetDouble(), a8::XValue(strings2[1]).GetDouble(), strings2.size() > 2 ? a8::XValue(strings2[2]).GetDouble() : 0, - strings2.size() > 3 ? a8::XValue(strings2[3]).GetInt() : 0 + strings2.size() > 3 ? a8::XValue(strings2[3]).GetInt() : 0, + strings2.size() > 4 ? a8::XValue(strings2[4]).GetInt() : 0 ) ); lock_time += strings2.size() > 3 ? a8::XValue(strings2[3]).GetInt() : 0; diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index cb33e8d..301467a 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -86,7 +86,8 @@ namespace MetaData const metatable::Equip* i = nullptr; int lock_time = 0; - std::vector> bullet_born_offset; + //0,0,0,0,后座力 + std::vector> bullet_born_offset; std::vector> shoot_offsets; std::array volume = {}; int int_param1 = 0; diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index a373eca..1950227 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -493,9 +493,18 @@ void RoomObstacle::ActiveAirDrop() [] (const a8::XParams& param) { RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + a8::Vec2 born_pos = obstacle->GetPos(); + { + MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(obstacle->meta->int_param1); + if (thing_meta && thing_meta->i->summon_born_rad() > 0) { + a8::Vec2 born_dir = a8::Vec2::UP; + born_dir.Rotate(obstacle->GetUniId()); + born_pos = born_pos + born_dir * thing_meta->i->summon_born_rad(); + } + } obstacle->room->frame_event.AddAirDrop(param.param2, param.param3, - obstacle->GetPos()); + born_pos); }, &xtimer_attacher.timer_list_ ); @@ -511,11 +520,18 @@ bool RoomObstacle::DoInteraction(Human* sender) void RoomObstacle::SummonAirDropBox(int box_id) { + a8::Vec2 born_pos = GetPos(); + MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(box_id); + if (thing_meta && thing_meta->i->summon_born_rad() > 0) { + a8::Vec2 born_dir = a8::Vec2::UP; + born_dir.Rotate(GetUniId()); + born_pos = born_pos + born_dir * thing_meta->i->summon_born_rad(); + } RoomObstacle* obstacle = room->CreateObstacle ( box_id, - GetPos().x, - GetPos().y + born_pos.x, + born_pos.y ); if (obstacle) { obstacle->PushCollisionObjects(); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 0e76cb3..9a1a68a 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -74,6 +74,7 @@ message MapThing optional string sweep_tags = 31; optional int32 prebattle_hide = 32; optional int32 life_time = 33; + optional int32 summon_born_rad = 34; } message SafeArea @@ -172,6 +173,7 @@ message Equip optional int32 auto_switch_weapon_time = 65; optional int32 quality = 66; optional int32 explosion_damage_delay = 67; + optional int32 bullet_consume_type = 68; optional string inventory_slot = 31; //库存槽位 optional int32 _inventory_slot = 32; //库存槽位