From 1c15c04cd5dfca86f6603194c5ea832935bfe5b4 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Jul 2021 02:37:07 +0000 Subject: [PATCH 01/20] 1 --- server/gameserver/ability.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/gameserver/ability.cc b/server/gameserver/ability.cc index 749e69e..7f5121f 100644 --- a/server/gameserver/ability.cc +++ b/server/gameserver/ability.cc @@ -39,7 +39,7 @@ float Ability::GetAttrAbs(int attr_id) float Ability::GetAttrRate(int attr_id) { - float attr_rate_val = GetBuffAttrRate(attr_id); + float attr_rate_val = GetBuffAttrRate(attr_id) / 100.0f; return attr_rate_val; } From 862e47246799398f26ec0a1344c530d374101fd8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Jul 2021 03:00:27 +0000 Subject: [PATCH 02/20] 1 --- server/gameserver/creature.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 32a1090..a2b1ec8 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1332,7 +1332,7 @@ void Creature::UpdatePoisoning() } else { dmg = room->GetGasData().old_area_meta->i->hurt(); } - dmg *= 1 - GetAbility()->GetAttrRate(kHAT_PoisoningReduction); + dmg *= 1 + GetAbility()->GetAttrRate(kHAT_PoisoningReduction); dmg = std::max(10.0f, dmg); DecHP(dmg, VP_SafeArea, TEXT("battle_server_killer_gas", "毒圈"), VW_SafeArea); if (dead) { From 03c1d3ce9361c132874442fbacd7d07396841d66 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Jul 2021 03:30:07 +0000 Subject: [PATCH 03/20] 1 --- server/gameserver/metadata.cc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 8656840..886a274 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -753,11 +753,7 @@ namespace MetaData for (int buff_id : buff_list) { MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); if (!buff_meta) { - #if 1 - continue; - #else abort(); - #endif } auto itr = trigger_type_buffs.find(buff_meta->i->trigger_type()); if (itr != trigger_type_buffs.end()) { @@ -939,11 +935,9 @@ namespace MetaData } } if (i->buff_effect() == kBET_CondAddBuff) { - #if 0 if (!IsValidCondBuff(int_param1)) { abort(); } - #endif } } From 8c300f328a044287f2b56c31601fe3318dab354a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Jul 2021 03:33:11 +0000 Subject: [PATCH 04/20] 1 --- server/gameserver/human.cc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index c6f0f3b..e682b62 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3533,11 +3533,6 @@ void Human::OnBulletHit(Bullet* bullet) finaly_dmg = std::max(finaly_dmg, 0.0f); #if 0 sender->stats.damage_amount_out += finaly_dmg; -#endif -#ifdef DEBUG - if (App::Instance()->HasFlag(1) && IsPlayer()) { - return; - } #endif if (bullet->meta->buff_meta) { MustBeAddBuff(this, bullet->meta->i->buffid()); From bc40f5fc7e12f1cdc46342ac77520d67ed12dafd Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Jul 2021 06:03:47 +0000 Subject: [PATCH 05/20] 1 --- server/gameserver/metadata.cc | 10 ++++++++++ server/gameserver/metadata.h | 2 ++ server/gameserver/metamgr.cc | 9 +++++++++ 3 files changed, 21 insertions(+) diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 886a274..1860e62 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -765,6 +765,11 @@ namespace MetaData } } + void Skill::Init2() + { + + } + bool Skill::IsTurnOverSkill() { return !phases.empty() && phases[0].func_id == kSkill_TurnOver; @@ -941,6 +946,11 @@ namespace MetaData } } + void Buff::Init2() + { + + } + bool Buff::EffectCanStack() { return true; diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index a56c64e..e3c96da 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -195,6 +195,7 @@ namespace MetaData const metatable::Buff* i = nullptr; void Init(); + void Init2(); bool EffectCanStack(); bool IsImmuneBuffEffect(int buff_effect); bool Match(CondAddBuff_e cond, int val); @@ -241,6 +242,7 @@ namespace MetaData const metatable::Skill* i = nullptr; void Init(); + void Init2(); float value_up = 0.0f; std::set buff_list; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index f7b4073..46de99a 100644 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -445,6 +445,15 @@ private: } } #endif + + { + for (auto& skill : skill_list) { + skill.Init2(); + } + for (auto& buff : buff_list) { + buff.Init2(); + } + } } void BindToMetaData() From 81cd0f68c98c0a27fc80a5b32686c4938d5a3bed Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Jul 2021 07:09:56 +0000 Subject: [PATCH 06/20] 1 --- server/gameserver/human.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index e682b62..25eb92c 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -642,6 +642,8 @@ void Human::FillSMGameOver(cs::SMGameOver& msg) { if (this != member) { member->FillMFTeamData(msg.add_team_data(), true); + cs::MFPlayerStats* p = msg.add_player_stats(); + member->FillMFPlayerStats(p); } return true; }); From 25483eef74c90d7da494a75c7de5cfdfe7f4091b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Jul 2021 09:11:57 +0000 Subject: [PATCH 07/20] 1 --- server/gameserver/constant.h | 6 ++++++ server/gameserver/metadata.cc | 40 +++++++++++++++++++++++++++++------ server/gameserver/skill.h | 6 ------ 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index d879e5d..6eb6498 100644 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -111,6 +111,12 @@ enum InventorySlot_e IS_END }; +enum SkillType_e +{ + kActiveSkill = 1, + kPassiveSkill = 2 +}; + enum BuffTriggerType_e { kBTT_UseSkill = 1, //技能释放时触发 diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 1860e62..21cba3a 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -749,12 +749,30 @@ namespace MetaData } } } + } + + void Skill::Init2() + { + int skill_id = i->skill_id(); + if (!(i->skill_type() == kActiveSkill || i->skill_type() == kPassiveSkill)) { + abort(); + } + #if 0 + if (!(i->use_method() == 1 || i->use_method() == 2 || i->use_method() == 3)) { + abort(); + } + #endif { for (int buff_id : buff_list) { MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); if (!buff_meta) { abort(); } + if (i->skill_type() == kPassiveSkill) { + if (buff_meta->i->trigger_type() != kBTT_UseSkill) { + abort(); + } + } auto itr = trigger_type_buffs.find(buff_meta->i->trigger_type()); if (itr != trigger_type_buffs.end()) { itr->second.insert(buff_meta); @@ -765,11 +783,6 @@ namespace MetaData } } - void Skill::Init2() - { - - } - bool Skill::IsTurnOverSkill() { return !phases.empty() && phases[0].func_id == kSkill_TurnOver; @@ -948,7 +961,22 @@ namespace MetaData void Buff::Init2() { - + switch (i->buff_effect()) { + case kBET_ChgAttr: + { + assert(int_param2 == 1 || int_param2 == 2); + if (int_param2 == 2) { + if (i->buff_param3().find('.') != std::string::npos) { + abort(); + } + } + } + break; + default: + { + } + break; + } } bool Buff::EffectCanStack() diff --git a/server/gameserver/skill.h b/server/gameserver/skill.h index ddc243f..07fecb8 100644 --- a/server/gameserver/skill.h +++ b/server/gameserver/skill.h @@ -10,12 +10,6 @@ namespace cs class MFSkill; } -enum SkillType_e -{ - kActiveSkill = 1, - kPassiveSkill = 2 -}; - struct xtimer_list; class Creature; class Skill From 911500fced17a1fd3050e56954de8da0d75c09c1 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Jul 2021 05:09:27 +0000 Subject: [PATCH 08/20] 1 --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..f3ae2e0 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +* 击杀情况 + +1、自杀(击按钮) +2、自杀(主动离开) +3、子弹击杀 +4、毒圈 +5、爆炸 +6、buff + From b7d8632ddad3cbfc1989d74107647ff2f18f93b3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Jul 2021 06:20:01 +0000 Subject: [PATCH 09/20] 1 --- server/gameserver/collider.cc | 8 ++++++++ server/gameserver/collider.h | 1 + server/gameserver/human.cc | 10 +++++++--- server/tools/protobuild/cs_proto.proto | 1 - server/tools/protobuild/metatable.proto | 4 ++++ 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/server/gameserver/collider.cc b/server/gameserver/collider.cc index 338717c..8f78081 100644 --- a/server/gameserver/collider.cc +++ b/server/gameserver/collider.cc @@ -304,6 +304,14 @@ bool ColliderComponent::CalcSafePointEx(const a8::Vec2& a_pos, ColliderComponent return false; } +void AabbCollider::MoveCenter(float x, float y) +{ + _min.x += x; + _min.y += y; + _max.x += x; + _max.y += y; +} + void DestoryCollider(ColliderComponent* collider) { switch (collider->type) { diff --git a/server/gameserver/collider.h b/server/gameserver/collider.h index ea9b0ee..5a389f1 100644 --- a/server/gameserver/collider.h +++ b/server/gameserver/collider.h @@ -32,6 +32,7 @@ public: a8::Vec2 _max; AabbCollider() { type = CT_Aabb; }; + void MoveCenter(float x, float y); }; class CircleCollider : public ColliderComponent diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 25eb92c..fb73d47 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -258,9 +258,7 @@ void Human::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data p->set_revive_countdown(countdown); } } - if (room->GetRoomMode() == kZombieMode) { - p->set_charid(meta->i->id()); - } + p->set_charid(meta->i->id()); if (GetCar()) { p->set_car_uniid(GetCar()->car_uniid); p->set_car_seat(GetSeat()); @@ -357,11 +355,14 @@ void Human::GetAabbBox(AabbCollider& aabb_box) aabb_box._min.y = -GetCar()->meta->i->rad(); aabb_box._max.x = GetCar()->meta->i->rad(); aabb_box._max.y = GetCar()->meta->i->rad(); + aabb_box.MoveCenter(GetCar()->hero_meta_->i->move_offset_x(), + GetCar()->hero_meta_->i->move_offset_y()); } else { aabb_box._min.x = -meta->i->radius(); aabb_box._min.y = -meta->i->radius(); aabb_box._max.x = meta->i->radius(); aabb_box._max.y = meta->i->radius(); + aabb_box.MoveCenter(meta->i->hit_offset_x(), meta->i->hit_offset_y()); } } @@ -3353,11 +3354,14 @@ void Human::GetHitAabbBox(AabbCollider& aabb_box) aabb_box._min.y = -GetCar()->meta->i->rad(); aabb_box._max.x = GetCar()->meta->i->rad(); aabb_box._max.y = GetCar()->meta->i->rad(); + aabb_box.MoveCenter(GetCar()->hero_meta_->i->move_offset_x(), + GetCar()->hero_meta_->i->move_offset_y()); } else { aabb_box._min.x = -GetHitRadius(); aabb_box._min.y = -GetHitRadius(); aabb_box._max.x = GetHitRadius(); aabb_box._max.y = GetHitRadius(); + aabb_box.MoveCenter(meta->i->hit_offset_x(), meta->i->hit_offset_y()); } } diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 3559b8b..1cbd0b7 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -268,7 +268,6 @@ message MFPlayerFull repeated MFAttrAddition attr_addition= 61; //属性加成 - //一下字段只有僵尸模式才有效 optional int32 charid = 44; //人物id optional float speed = 45; //速度 diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 57b6140..ea2a748 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -152,6 +152,8 @@ message EquipUpgrade message Player { optional int32 id = 1; //唯一id + optional float move_offset_x = 40; + optional float move_offset_y = 41; optional float radius = 2; //半径 optional int32 health = 3; //初始血量 optional int32 move_speed = 4; //移动速度 @@ -175,6 +177,8 @@ message Player optional int32 revive_time = 22; optional string name = 23; optional int32 normal_skill = 24; + optional float hit_offset_x = 42; + optional float hit_offset_y = 43; optional float hit_radius = 25; optional string ai_script = 26; optional string init_buffs = 27; From 5791a64893da8dc03fa0726ea56eb375ff7f6d26 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Jul 2021 14:32:54 +0800 Subject: [PATCH 10/20] 1 --- server/tools/protobuild/cs_proto.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 1cbd0b7..399f0c9 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -901,6 +901,7 @@ message CMJoin optional int32 mapid = 53; //地图id 0:随机地图 repeated MFPair skill_list = 54; //技能列表 key:技能id value:预留给之后扩展,目前传0就行 optional string user_data = 60 [default = ""]; //用户自定义数据 + optional int32 hero_id = 61; //英雄id } //断线重连 From f73f24fd65cfdc26a2226c1e432e36c8e9203621 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Jul 2021 14:40:36 +0800 Subject: [PATCH 11/20] 1 --- server/gameserver/roommgr.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index 4d6e309..ce9518d 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -165,7 +165,10 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) hdr.socket_handle, msg ); - hum->meta = MetaMgr::Instance()->human_meta; + hum->meta = MetaMgr::Instance()->GetPlayer(msg.hero_id()); + if (!hum->meta) { + hum->meta = MetaMgr::Instance()->human_meta; + } hum->room = room; room->AddPlayer(hum); hum->ProcPrepareItems(msg.prepare_items()); From 2d883c2abac8916cacdf500e3d5136fd0679a129 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Jul 2021 11:13:14 +0000 Subject: [PATCH 12/20] 1 --- server/gameserver/human.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index fb73d47..e4d0e51 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -362,7 +362,7 @@ void Human::GetAabbBox(AabbCollider& aabb_box) aabb_box._min.y = -meta->i->radius(); aabb_box._max.x = meta->i->radius(); aabb_box._max.y = meta->i->radius(); - aabb_box.MoveCenter(meta->i->hit_offset_x(), meta->i->hit_offset_y()); + aabb_box.MoveCenter(meta->i->move_offset_x(), meta->i->move_offset_y()); } } From c4f1461361c5d04fce6d208d73e78c4cf677f2b6 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Jul 2021 11:26:45 +0000 Subject: [PATCH 13/20] 1 --- server/gameserver/human.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index e4d0e51..d72562b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3354,8 +3354,8 @@ void Human::GetHitAabbBox(AabbCollider& aabb_box) aabb_box._min.y = -GetCar()->meta->i->rad(); aabb_box._max.x = GetCar()->meta->i->rad(); aabb_box._max.y = GetCar()->meta->i->rad(); - aabb_box.MoveCenter(GetCar()->hero_meta_->i->move_offset_x(), - GetCar()->hero_meta_->i->move_offset_y()); + aabb_box.MoveCenter(GetCar()->hero_meta_->i->hit_offset_x(), + GetCar()->hero_meta_->i->hit_offset_y()); } else { aabb_box._min.x = -GetHitRadius(); aabb_box._min.y = -GetHitRadius(); From 6836d9eb3b2c8b4a586a16985c735ad917dc7ebf Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 14 Jul 2021 19:17:58 +0800 Subject: [PATCH 14/20] 1 --- server/gameserver/room.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index aa8387c..1d7a30a 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -3914,7 +3914,8 @@ void Room::AirRaid(int airraid_id) } a8::Vec2 dir = a8::Vec2::UP; dir.Rotate(a8::RandAngle()); - a8::Vec2 center = gas_data_.pos_new + dir * (100 + rand() % gas_data_.new_area_meta->i->rad()); + float rnd_rad = gas_data_.new_area_meta->i->rad() > 0 ? rand() % gas_data_.new_area_meta->i->rad() : 0; + a8::Vec2 center = gas_data_.pos_new + dir * (100 + rnd_rad); { std::vector humans; GetAlivePlayers(humans, GetRoomMaxPlayerNum()); From 9d7478854f311100c9377618c352e208d1705049 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 14 Jul 2021 19:52:30 +0800 Subject: [PATCH 15/20] 1 --- server/gameserver/creature.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index a2b1ec8..e9f5b08 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -512,10 +512,12 @@ void Creature::AddPassiveSkill(int skill_id) skill->Initialzie(); passive_skill_hash_[skill_meta->i->skill_id()] = skill; skill->AddPassiveSkillBuff(); + #if 0 if (skill_meta->i->skill_cd() > 10000) { //永久被动被动技能 skill->AddPassiveSkillBuff(); } + #endif } } @@ -1146,6 +1148,9 @@ void Creature::SetMoveDir(const a8::Vec2& move_dir) void Creature::AddSkill(int skill_id) { + #if 1 + a8::XPrintf("AddSkill skill:%d\n", {skill_id}); + #endif MetaData::Skill* skill_meta = MetaMgr::Instance()->GetSkill(skill_id); if (skill_meta && !GetSkill(skill_id)) { if (skill_meta->i->skill_type() == 1) { From 4f72b959f010ae34386e9631099e7cf10e01c559 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Jul 2021 13:47:21 +0800 Subject: [PATCH 16/20] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BB=B6=E8=BF=9F?= =?UTF-8?q?=E5=AD=90=E5=BC=B9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/creature.cc | 108 ++++++++++++++++++++++++++-------- server/gameserver/metadata.cc | 14 +++-- server/gameserver/metadata.h | 2 +- 3 files changed, 93 insertions(+), 31 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index e9f5b08..d9dc80f 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -13,6 +13,77 @@ #include "trigger.h" #include "car.h" +struct BulletInfo +{ + CreatureWeakPtr c; + MetaData::Equip* weapon_meta = nullptr; + MetaData::EquipUpgrade* weapon_upgrade_meta = nullptr; + MetaData::Equip* bullet_meta = nullptr; + a8::Vec2 bullet_born_pos; + a8::Vec2 bullet_dir; + float fly_distance = 0; + bool is_tank_skin = false; + int weapon_lv = 0; + int delay_time = 0; +}; + +static void InternalCreateBullet(BulletInfo& bullet_info) +{ + if (!bullet_info.c.Get()) { + return; + } + if (bullet_info.delay_time <= 0) { + int bullet_uniid = 0; + Creature* c = bullet_info.c.Get(); + if (c->room->BattleStarted() || + (c->room->GetGasData().gas_mode == GasJump && + !c->HasBuffEffect(kBET_Jump))) { + bullet_uniid = c->room->CreateBullet + (c, + c->shot_passenger, + bullet_info.weapon_meta, + bullet_info.weapon_upgrade_meta, + bullet_info.bullet_meta, + bullet_info.bullet_born_pos, + bullet_info.bullet_dir, + bullet_info.fly_distance, + bullet_info.is_tank_skin); + } + if (bullet_uniid == 0) { + bullet_uniid = c->room->AllocUniid(); + } + c->room->frame_event.AddBullet + (bullet_uniid, + c->GetWeakPtrRef(), + bullet_info.weapon_meta, + bullet_info.weapon_lv, + bullet_info.bullet_born_pos, + bullet_info.bullet_dir, + bullet_info.fly_distance); + } else { + BulletInfo* info_copy = new BulletInfo(); + *info_copy = bullet_info; + bullet_info.c.Get()->room->xtimer.AddDeadLineTimerAndAttach + ( + bullet_info.delay_time / FRAME_RATE_MS, + a8::XParams() + .SetSender(info_copy), + [] (const a8::XParams& param) + { + BulletInfo* info_copy = (BulletInfo*)param.sender.GetUserData(); + info_copy->delay_time = 0; + InternalCreateBullet(*info_copy); + }, + &bullet_info.c.Get()->xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + BulletInfo* info_copy = (BulletInfo*)param.sender.GetUserData(); + delete info_copy; + } + ); + } +} + void InternalShot(Creature* c, MetaData::Equip* weapon_meta, MetaData::EquipUpgrade* weapon_upgrade_meta, @@ -60,31 +131,20 @@ void InternalShot(Creature* c, } } bullet_dir.Rotate(bullet_angle / 180.0f); - int bullet_uniid = 0; - if (c->room->BattleStarted() || - (c->room->GetGasData().gas_mode == GasJump && - !c->HasBuffEffect(kBET_Jump))) { - bullet_uniid = c->room->CreateBullet - (c, - c->shot_passenger, - weapon_meta, - weapon_upgrade_meta, - bullet_meta, - bullet_born_pos, - bullet_dir, - fly_distance, - is_tank_skin); + { + BulletInfo bullet_info; + bullet_info.c = c->GetWeakPtrRef(); + bullet_info.weapon_meta = weapon_meta; + bullet_info.weapon_upgrade_meta = weapon_upgrade_meta; + bullet_info.bullet_meta = bullet_meta; + bullet_info.bullet_born_pos = bullet_born_pos; + bullet_info.bullet_dir = bullet_dir; + bullet_info.fly_distance = fly_distance; + bullet_info.is_tank_skin = is_tank_skin; + bullet_info.weapon_lv = weapon_lv; + bullet_info.delay_time = std::get<3>(tuple); + InternalCreateBullet(bullet_info); } - if (bullet_uniid == 0) { - bullet_uniid = c->room->AllocUniid(); - } - c->room->frame_event.AddBullet(bullet_uniid, - c->GetWeakPtrRef(), - weapon_meta, - weapon_lv, - bullet_born_pos, - bullet_dir, - fly_distance); } c->GetTrigger()->Shot(weapon_meta); if (weapon_meta->i->recoil_force() > 0.000001) { diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 21cba3a..e554a7e 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -189,12 +189,14 @@ namespace MetaData std::vector strings2; a8::Split(str, strings2, ':'); assert(strings2.size() >= 2); - bullet_born_offset.push_back(std::make_tuple( - a8::XValue(strings2[0]).GetDouble(), - a8::XValue(strings2[1]).GetDouble(), - strings2.size() > 2 ? a8::XValue(strings2[2]).GetDouble() : 0 - ) - ); + bullet_born_offset.push_back + (std::make_tuple( + 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 + ) + ); } } { diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index e3c96da..d9a7e49 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -72,7 +72,7 @@ namespace MetaData { const metatable::Equip* i = nullptr; - std::vector> bullet_born_offset; + std::vector> bullet_born_offset; std::vector> shoot_offsets; std::array volume = {}; int int_param1 = 0; From 72e0139859222c1aa5e4d69cb7ddde09e5a3871b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Jul 2021 13:54:21 +0800 Subject: [PATCH 17/20] 1 --- server/gameserver/creature.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 474f865..84e7861 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -32,9 +32,15 @@ static void InternalCreateBullet(BulletInfo& bullet_info) if (!bullet_info.c.Get()) { return; } + Creature* c = bullet_info.c.Get(); + if (c->dead) { + return; + } + if (c->downed) { + return; + } if (bullet_info.delay_time <= 0) { int bullet_uniid = 0; - Creature* c = bullet_info.c.Get(); if (c->room->BattleStarted() || (c->room->GetGasData().gas_mode == GasJump && !c->HasBuffEffect(kBET_Jump))) { From 22ef2e0301b48989bd1862d2edb5949aae8998ef Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Jul 2021 15:22:47 +0800 Subject: [PATCH 18/20] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B0=84=E5=87=BB?= =?UTF-8?q?=E9=94=81=E5=AE=9Abuff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/buff.h | 1 + server/gameserver/constant_export.h | 1 + server/gameserver/creature.cc | 43 +++++++++++++++++++------ server/gameserver/creature.h | 8 +++-- server/gameserver/metadata.cc | 1 + server/gameserver/metadata.h | 1 + server/tools/protobuild/metatable.proto | 2 ++ 7 files changed, 45 insertions(+), 12 deletions(-) diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index f9544a2..0f5cac0 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -29,6 +29,7 @@ struct xtimer_list; class Buff { public: + int buff_uniid = 0; Creature* owner = nullptr; MetaData::Buff* meta = nullptr; MetaData::Skill* skill_meta = nullptr; diff --git a/server/gameserver/constant_export.h b/server/gameserver/constant_export.h index b2dc5b4..71cfe37 100644 --- a/server/gameserver/constant_export.h +++ b/server/gameserver/constant_export.h @@ -15,6 +15,7 @@ const int kInMountainTopBuffId = 7014; const int kDownBuffId = 7015; const int kPoisioningBuffId = 7016; const int kRescueBuffId = 7017; +const int kVertigoBuffId = 7018; enum BuffEffectType_e { diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 84e7861..c7f12fd 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 invincible_buff_uniid = 0; }; static void InternalCreateBullet(BulletInfo& bullet_info) @@ -124,6 +125,14 @@ void InternalShot(Creature* c, if (skill_id == 0) { c->room->frame_event.AddShot(c->GetWeakPtrRef()); } + int invincible_buff_uniid = 0; + if (weapon_meta->lock_time > 0) { + int buff_uniid = c->TryAddBuff(c, kVertigoBuffId); + Buff* buff = c->GetBuffByUniId(buff_uniid); + if (buff && buff->remover_timer) { + c->room->xtimer.ModifyTimer(buff->remover_timer, weapon_meta->lock_time / FRAME_RATE_MS); + } + } 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->GetAttackDir().CalcAngle(a8::Vec2::UP)); @@ -149,6 +158,7 @@ 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.invincible_buff_uniid = invincible_buff_uniid; InternalCreateBullet(bullet_info); } } @@ -236,6 +246,16 @@ Buff* Creature::GetBuffById(int buff_id) return nullptr; } +Buff* Creature::GetBuffByUniId(int buff_uniid) +{ + for (Buff& buff : buff_list_) { + if (buff.buff_uniid == buff_uniid) { + return &buff; + } + } + return nullptr; +} + int Creature::GetBuffNum(int buff_id) { int num = 0; @@ -247,14 +267,14 @@ int Creature::GetBuffNum(int buff_id) return num; } -void Creature::AddBuff(Creature* caster, +int Creature::AddBuff(Creature* caster, MetaData::Buff* buff_meta, int skill_lv, MetaData::Skill* buff_skill_meta) { if (buff_meta->i->buff_interval() > 0) { if (buff_interval_hash_.find(buff_meta->i->buff_id()) != buff_interval_hash_.end()) { - return; + return 0; } buff_interval_hash_[buff_meta->i->buff_id()] = room->GetFrameNo(); room->xtimer.AddDeadLineTimerAndAttach @@ -272,14 +292,14 @@ void Creature::AddBuff(Creature* caster, } if (buff_meta->i->coexist_num() > 0){ if (GetBuffNum(buff_meta->i->buff_id()) >= buff_meta->i->coexist_num()) { - return; + return 0; } } if (IsImmuneBuffEffect(buff_meta->i->buff_effect())) { - return; + return 0; } if (buff_meta->i->depend_effect() != 0 && !HasBuffEffect(buff_meta->i->depend_effect())) { - return; + return 0; } if (!buff_meta->EffectCanStack()) { Buff* buff = GetBuffByEffectId(buff_meta->i->buff_effect()); @@ -290,7 +310,10 @@ void Creature::AddBuff(Creature* caster, if (buff_meta->i->buff_effect() == kBET_OnceChgAttr) { ProcOnceChgAttrBuff(buff_meta); } + ++buff_uniid_; + int new_buff_uniid = buff_uniid_; Buff* buff = &a8::FastAppend(buff_list_); + buff->buff_uniid = new_buff_uniid; buff->SetCaster(caster); buff->skill_lv = skill_lv; buff->owner = this; @@ -340,6 +363,7 @@ void Creature::AddBuff(Creature* caster, } } } + return new_buff_uniid; #ifdef DEBUG SendDebugMsg(a8::Format("添加buff_id:%d effect:%d %s params:%d,%d,%d,%d,%d", { @@ -365,21 +389,22 @@ bool Creature::IsImmuneBuffEffect(int buff_effect) return false; } -void Creature::MustBeAddBuff(Creature* caster, int buff_id) +int Creature::MustBeAddBuff(Creature* caster, int buff_id) { MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); if (!buff_meta) { abort(); } - AddBuff(caster, buff_meta, 1); + return AddBuff(caster, buff_meta, 1); } -void Creature::TryAddBuff(Creature* caster, int buff_id) +int Creature::TryAddBuff(Creature* caster, int buff_id) { MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); if (buff_meta) { - AddBuff(caster, buff_meta, 1); + return AddBuff(caster, buff_meta, 1); } + return -1; } void Creature::RemoveBuffById(int buff_id) diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 11051e9..50046ae 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -92,14 +92,15 @@ class Creature : public MoveableEntity bool HasBuffEffect(int buff_effect_id); Buff* GetBuffByEffectId(int effect_id); Buff* GetBuffById(int buff_id); + Buff* GetBuffByUniId(int buff_uniid); int GetBuffNum(int buff_id); - void AddBuff(Creature* caster, + int AddBuff(Creature* caster, MetaData::Buff* buff_meta, int skill_lv, MetaData::Skill* buff_skill_meta = nullptr); bool IsImmuneBuffEffect(int buff_effect); - void MustBeAddBuff(Creature* caster, int buff_id); - void TryAddBuff(Creature* caster, int buff_id); + int MustBeAddBuff(Creature* caster, int buff_id); + int TryAddBuff(Creature* caster, int buff_id); void RemoveBuffById(int buff_id); void ClearBuffById(int buff_id); void RecalcBuffAttr(); @@ -252,6 +253,7 @@ private: CreatureWeakPtrChunk weak_ptr_chunk_; HumanAbility ability; std::shared_ptr ability_; + int buff_uniid_ = 1000; std::array buff_effect_ = {}; std::array depend_effect_ = {}; std::array cond_buffs_ = {}; diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index e554a7e..b78103c 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -197,6 +197,7 @@ namespace MetaData strings2.size() > 3 ? a8::XValue(strings2[3]).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 d9a7e49..4a7ed6e 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -72,6 +72,7 @@ namespace MetaData { const metatable::Equip* i = nullptr; + int lock_time = 0; std::vector> bullet_born_offset; std::vector> shoot_offsets; std::array volume = {}; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index ea2a748..2b18247 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -137,6 +137,8 @@ message Equip optional float average_oil = 58; optional float atk_mech = 59; optional int32 use_scene = 60; + optional int32 ispenetrate = 61; + optional int32 is_penetrate_thing = 62; optional string inventory_slot = 31; //库存槽位 optional int32 _inventory_slot = 32; //库存槽位 From 39e7f5f6f6072a7b35543e9974459067d4f794d4 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Jul 2021 15:52:22 +0800 Subject: [PATCH 19/20] 1 --- server/gameserver/bullet.cc | 31 ++++++++++++++++++++++++++++--- server/gameserver/bullet.h | 1 + 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 8a0f284..218e7d9 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -343,21 +343,30 @@ float Bullet::GetExplosionRange() void Bullet::Check(float distance) { + int c_hit_num = 0; + int t_hit_num = 0; std::set objects; room->grid_service->TraverseCreatures (room->GetRoomIdx(), GetGridList(), - [this, &objects] (Creature* c, bool& stop) + [this, &objects, &c_hit_num] (Creature* c, bool& stop) { if (sender.Get()->IsProperTarget(c)) { + if (gun_meta->i->ispenetrate() && + hit_objects_.find(c->GetUniId()) != hit_objects_.end()) { + //穿人 + return; + } AabbCollider aabb_box; c->GetHitAabbBox(aabb_box); if (c != sender.Get() && !c->dead && TestCollision(room, &aabb_box)) { if (meta->i->_inventory_slot() == IS_C4) { if (!c->IsHuman()) { + ++c_hit_num; objects.insert(c); } } else { + ++c_hit_num; objects.insert(c); } } @@ -369,8 +378,14 @@ void Bullet::Check(float distance) for (ColliderComponent* collider : colliders) { if (collider->owner->IsEntityType(ET_Obstacle)) { Obstacle* obstacle = (Obstacle*)collider->owner; + if (gun_meta->i->is_penetrate_thing() && + hit_objects_.find(obstacle->GetUniId()) != hit_objects_.end()) { + //穿物件 + continue; + } if (!obstacle->CanThroughable(this)) { if (TestCollision(room, collider)) { + ++t_hit_num; objects.insert(collider->owner); } } @@ -390,8 +405,18 @@ void Bullet::Check(float distance) if (!objects.empty()) { OnHit(objects); } - room->RemoveObjectLater(this); - later_removed_ = true; + bool need_remove = true; + if (distance < bullet_range) { + if (!gun_meta->i->is_penetrate_thing() && t_hit_num > 0 || + !gun_meta->i->ispenetrate() && c_hit_num > 0) { + } else { + need_remove = false; + } + } + if (need_remove) { + room->RemoveObjectLater(this); + later_removed_ = true; + } } } } diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 53cfbc1..dd4f2bd 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -66,6 +66,7 @@ private: bool later_removed_ = false; std::shared_ptr ability_; bool is_curr_weapon = false; + std::set hit_objects_; friend class EntityFactory; }; From e666cd558bf03b3b9ff4658c062ce048fc8508bd Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Jul 2021 16:27:55 +0800 Subject: [PATCH 20/20] 1 --- server/gameserver/bullet.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 218e7d9..dde4f86 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -362,12 +362,18 @@ void Bullet::Check(float distance) if (c != sender.Get() && !c->dead && TestCollision(room, &aabb_box)) { if (meta->i->_inventory_slot() == IS_C4) { if (!c->IsHuman()) { - ++c_hit_num; objects.insert(c); + if (gun_meta->i->ispenetrate()) { + ++c_hit_num; + hit_objects_.insert(c->GetUniId()); + } } } else { - ++c_hit_num; objects.insert(c); + if (gun_meta->i->ispenetrate()) { + ++c_hit_num; + hit_objects_.insert(c->GetUniId()); + } } } } @@ -385,8 +391,11 @@ void Bullet::Check(float distance) } if (!obstacle->CanThroughable(this)) { if (TestCollision(room, collider)) { - ++t_hit_num; objects.insert(collider->owner); + if (gun_meta->i->is_penetrate_thing()) { + ++t_hit_num; + hit_objects_.insert(collider->owner->GetUniId()); + } } } }