From afa05474e254e72f2ce166cc22c4e6b2418be81c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 26 Oct 2022 13:04:43 +0800 Subject: [PATCH] add IBullet --- server/gameserver/bullet.h | 14 +++++++---- server/gameserver/car.cc | 18 +++++++------- server/gameserver/car.h | 2 +- server/gameserver/dummyentity.cc | 2 +- server/gameserver/dummyentity.h | 2 +- server/gameserver/entity.h | 3 +-- server/gameserver/hero.cc | 20 +++++++-------- server/gameserver/hero.h | 2 +- server/gameserver/human.cc | 40 +++++++++++++++--------------- server/gameserver/human.h | 2 +- server/gameserver/mapblock.cc | 2 +- server/gameserver/mapblock.h | 2 +- server/gameserver/obstacle.cc | 34 ++++++++++++------------- server/gameserver/obstacle.h | 2 +- server/gameserver/skill.cc | 2 +- server/gameserver/skillhelper.cc | 16 ++++++------ server/gameserver/skillhelper.h | 4 +-- server/gameserver/trigger.cc | 6 ++--- server/gameserver/trigger.h | 2 +- server/gameserver/types.h | 10 ++++++++ server/gameserver/virtualbullet.cc | 30 ++++++++++++++++++++++ server/gameserver/virtualbullet.h | 10 +++++++- 22 files changed, 138 insertions(+), 87 deletions(-) diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 2d6419f5..07857e56 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -42,23 +42,27 @@ class Bullet : public MoveableEntity, public IBullet virtual void Initialize() override; virtual void Update(int delta_time) override; void RecalcSelfCollider(); - bool IsBomb(); float GetAtk(); float GetExplosionRange(); bool IsCurrWeapon(); - bool IsPreBattleBullet(); void ForceRemove(); void OnHit(std::set& objects); void TriggerHitBuff(Entity* e); bool IsFlyHook(); -protected: - Bullet(); - virtual float GetStrengthenWall() override { return strengthen_wall; }; virtual long long GetWeaponUniId() override { return weapon_uniid; }; virtual MetaData::Skill* GetSkillMeta() override {return skill_meta; }; virtual MetaData::Equip* GetGunMeta() override { return gun_meta; }; + virtual MetaData::Equip* GetBulletMeta() override { return meta; }; + virtual CreatureWeakPtr GetSender() override { return sender; }; + virtual CreatureWeakPtr GetPassenger() { return passenger; }; + virtual bool IsBomb(); + virtual bool IsPreBattleBullet(); + virtual Room* GetRoom() { return room; }; + +protected: + Bullet(); private: diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index d98e78be..9b30a6c8 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -313,22 +313,22 @@ float Car::GetSpeed() return speed; } -void Car::OnBulletHit(Bullet* bullet) +void Car::OnBulletHit(IBullet* bullet) { if (!IsDead(room)) { //超能电磁枪已删除 - float finaly_dmg = bullet->sender.Get()->GetBattleContext()->CalcDmg(this, bullet); - if (bullet->meta->buff_meta) { - MustBeAddBuff(bullet->sender.Get(), bullet->meta->i->buffid()); + float finaly_dmg = bullet->GetSender().Get()->GetBattleContext()->CalcDmg(this, bullet); + if (bullet->GetBulletMeta()->buff_meta) { + MustBeAddBuff(bullet->GetSender().Get(), bullet->GetBulletMeta()->i->buffid()); } if (!bullet->IsPreBattleBullet()) { DecHP(finaly_dmg, - bullet->sender.Get()->GetUniId(), - bullet->sender.Get()->GetName(), - bullet->gun_meta->i->id()); + bullet->GetSender().Get()->GetUniId(), + bullet->GetSender().Get()->GetName(), + bullet->GetGunMeta()->i->id()); } - if (bullet->meta->buff_meta) { - MustBeAddBuff(this, bullet->meta->i->buffid()); + if (bullet->GetBulletMeta()->buff_meta) { + MustBeAddBuff(this, bullet->GetBulletMeta()->i->buffid()); } } } diff --git a/server/gameserver/car.h b/server/gameserver/car.h index d54ac9a9..0e7fa86e 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -25,7 +25,7 @@ class Car : public Creature 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; - virtual void OnBulletHit(Bullet* bullet) override; + virtual void OnBulletHit(IBullet* bullet) override; virtual void OnExplosionHit(Explosion* e) override; virtual void GetAabbBox(AabbCollider& aabb_box) override; virtual void GetHitAabbBox(AabbCollider& aabb_box) override; diff --git a/server/gameserver/dummyentity.cc b/server/gameserver/dummyentity.cc index 28d8b8a1..304ce717 100644 --- a/server/gameserver/dummyentity.cc +++ b/server/gameserver/dummyentity.cc @@ -53,7 +53,7 @@ void DummyEntity::Initialize() } } -void DummyEntity::OnBulletHit(Bullet* bullet) +void DummyEntity::OnBulletHit(IBullet* bullet) { } diff --git a/server/gameserver/dummyentity.h b/server/gameserver/dummyentity.h index 31d61cce..81f0110b 100644 --- a/server/gameserver/dummyentity.h +++ b/server/gameserver/dummyentity.h @@ -16,7 +16,7 @@ class DummyEntity : public Entity std::list* blocks = nullptr; virtual void Initialize() override; - virtual void OnBulletHit(Bullet* bullet) override; + virtual void OnBulletHit(IBullet* bullet) override; virtual void OnExplosionHit(Explosion* explosion) override; }; diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index c54e388b..6113bba4 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -21,7 +21,6 @@ class ColliderComponent; class AabbCollider; class CircleCollider; class Human; -class Bullet; class Explosion; class Entity { @@ -44,7 +43,7 @@ class Entity virtual long long GetDeadFrameNo(Room* room) { return 0;}; virtual void OnPreCollision(Room* room) {}; virtual void RecalcSelfCollider() {}; - virtual void OnBulletHit(Bullet* bullet) {}; + virtual void OnBulletHit(IBullet* bullet) {}; virtual void OnExplosionHit(Explosion* explosion) {}; virtual void OnAddToTargetPartObject(Entity* target) {}; virtual void OnRemoveFromTargetPartObject(Entity* target) {}; diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 3fb57b57..6f4b92b6 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -118,7 +118,7 @@ void Hero::OnExplosionHit(Explosion* e) e->GetExplosionEffect()); } -void Hero::OnBulletHit(Bullet* bullet) +void Hero::OnBulletHit(IBullet* bullet) { if (IsInvincible()) { return; @@ -129,19 +129,19 @@ void Hero::OnBulletHit(Bullet* bullet) } RemoveBuffByEffectId(kBET_PeaceMode); - if (!IsDead(room) && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { - float finaly_dmg = bullet->sender.Get()->GetBattleContext()->CalcDmg(this, bullet); - if (bullet->sender.Get()->IsHuman()) { - bullet->sender.Get()->AsHuman()->stats.damage_amount_out += finaly_dmg; + if (!IsDead(room) && (bullet->IsBomb() || bullet->GetSender().Get()->team_id != team_id)) { + float finaly_dmg = bullet->GetSender().Get()->GetBattleContext()->CalcDmg(this, bullet); + if (bullet->GetSender().Get()->IsHuman()) { + bullet->GetSender().Get()->AsHuman()->stats.damage_amount_out += finaly_dmg; } - if (bullet->meta->buff_meta) { - MustBeAddBuff(bullet->sender.Get(), bullet->meta->i->buffid()); + if (bullet->GetBulletMeta()->buff_meta) { + MustBeAddBuff(bullet->GetSender().Get(), bullet->GetBulletMeta()->i->buffid()); } if (!bullet->IsPreBattleBullet()) { DecHP(finaly_dmg, - bullet->sender.Get()->GetUniId(), - bullet->sender.Get()->GetName(), - bullet->gun_meta->i->id()); + bullet->GetSender().Get()->GetUniId(), + bullet->GetSender().Get()->GetName(), + bullet->GetGunMeta()->i->id()); } } } diff --git a/server/gameserver/hero.h b/server/gameserver/hero.h index 0fbd8643..064db0d6 100644 --- a/server/gameserver/hero.h +++ b/server/gameserver/hero.h @@ -28,7 +28,7 @@ public: virtual void FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) override; virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override; virtual void OnExplosionHit(Explosion* e) override; - virtual void OnBulletHit(Bullet* bullet) override; + virtual void OnBulletHit(IBullet* bullet) override; virtual void Update(int delta_time) override; virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) override; virtual std::string GetName() override; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 6b650292..dcce543a 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3592,7 +3592,7 @@ void Human::GMAddItem(int item_id, int item_num) SyncAroundPlayers(__FILE__, __LINE__, __func__); } -void Human::OnBulletHit(Bullet* bullet) +void Human::OnBulletHit(IBullet* bullet) { if (IsInvincible()) { return; @@ -3614,40 +3614,40 @@ void Human::OnBulletHit(Bullet* bullet) } #endif #endif - if (bullet->sender.Get()) { - bullet->sender.Get()->GetTrigger()->BulletHit(bullet, this); + if (bullet->GetSender().Get()) { + bullet->GetSender().Get()->GetTrigger()->BulletHit(bullet, this); } RemoveBuffByEffectId(kBET_PeaceMode); - if (!dead && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { + if (!dead && (bullet->IsBomb() || bullet->GetSender().Get()->team_id != team_id)) { float finaly_dmg = 0; - if (bullet->skill_meta && SkillHelper::ProcBulletDmg(bullet, this, finaly_dmg)) { + if (bullet->GetSkillMeta() && SkillHelper::ProcBulletDmg(bullet, this, finaly_dmg)) { } else { - finaly_dmg = bullet->sender.Get()->GetBattleContext()->CalcDmg(this, bullet); + finaly_dmg = bullet->GetSender().Get()->GetBattleContext()->CalcDmg(this, bullet); } - if (bullet->sender.Get()->IsHuman()) { - bullet->sender.Get()->AsHuman()->stats.damage_amount_out += finaly_dmg; + if (bullet->GetSender().Get()->IsHuman()) { + bullet->GetSender().Get()->AsHuman()->stats.damage_amount_out += finaly_dmg; } - if (bullet->meta->buff_meta) { - MustBeAddBuff(bullet->sender.Get(), bullet->meta->i->buffid()); + if (bullet->GetBulletMeta()->buff_meta) { + MustBeAddBuff(bullet->GetSender().Get(), bullet->GetBulletMeta()->i->buffid()); } - if (bullet->sender.Get() && bullet->sender.Get()->IsCar() && bullet->passenger.Get()) { + if (bullet->GetSender().Get() && bullet->GetSender().Get()->IsCar() && bullet->GetPassenger().Get()) { if (!bullet->IsPreBattleBullet()) { DecHP(finaly_dmg, - bullet->passenger.Get()->GetUniId(), - bullet->passenger.Get()->GetName(), - bullet->gun_meta->i->id()); + bullet->GetPassenger().Get()->GetUniId(), + bullet->GetPassenger().Get()->GetName(), + bullet->GetGunMeta()->i->id()); } } else { if (!bullet->IsPreBattleBullet()) { - if (bullet->sender.Get() && bullet->sender.Get()->IsHuman()) { - bullet->sender.Get()->AsHuman()->stats.IncWeaponDamageOut - (bullet->gun_meta->i->id(), finaly_dmg); + if (bullet->GetSender().Get() && bullet->GetSender().Get()->IsHuman()) { + bullet->GetSender().Get()->AsHuman()->stats.IncWeaponDamageOut + (bullet->GetGunMeta()->i->id(), finaly_dmg); } DecHP(finaly_dmg, - bullet->sender.Get()->GetUniId(), - bullet->sender.Get()->GetName(), - bullet->gun_meta->i->id()); + bullet->GetSender().Get()->GetUniId(), + bullet->GetSender().Get()->GetName(), + bullet->GetGunMeta()->i->id()); } } } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 73890ee5..d7ee4995 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -249,7 +249,7 @@ class Human : public Creature virtual void GetHitAabbBox(AabbCollider& aabb_box) override; virtual bool IsDead(Room* room) override; virtual long long GetDeadFrameNo(Room* room) override; - virtual void OnBulletHit(Bullet* bullet) override; + virtual void OnBulletHit(IBullet* bullet) override; virtual void OnExplosionHit(Explosion* explosion) override; void FillItemList(::google::protobuf::RepeatedPtrField<::cs::MFPair>* pb_item_list); long long GetRealDeadFrameNo(Room* room); diff --git a/server/gameserver/mapblock.cc b/server/gameserver/mapblock.cc index 90ae1a9b..a4d32ee3 100644 --- a/server/gameserver/mapblock.cc +++ b/server/gameserver/mapblock.cc @@ -106,7 +106,7 @@ void MapBlock::OnPreCollision(Room* room) } -void MapBlock::OnBulletHit(Bullet* bullet) +void MapBlock::OnBulletHit(IBullet* bullet) { } diff --git a/server/gameserver/mapblock.h b/server/gameserver/mapblock.h index 86a07be1..9309afc8 100644 --- a/server/gameserver/mapblock.h +++ b/server/gameserver/mapblock.h @@ -36,7 +36,7 @@ class MapBlock : public Entity virtual bool IsDead(Room* room) override; virtual long long GetDeadFrameNo(Room* room) override; virtual void OnPreCollision(Room* room) override; - virtual void OnBulletHit(Bullet* bullet) override; + virtual void OnBulletHit(IBullet* bullet) override; virtual void OnExplosionHit(Explosion* explosion) override; virtual bool Attackable(Room* room) override; virtual bool ReceiveExplosionDmg(Explosion* explosion) override; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index b0abefa6..c6a4c3d3 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -488,7 +488,7 @@ void Obstacle::SetMasterId(Room* room, int master_id) } } -void Obstacle::OnBulletHit(Bullet* bullet) +void Obstacle::OnBulletHit(IBullet* bullet) { if (meta->i->bullet_hit() == kBulletHitEatDmg) { return; @@ -497,13 +497,13 @@ void Obstacle::OnBulletHit(Bullet* bullet) return; } - if (!IsDead(bullet->room)) { + if (!IsDead(bullet->GetRoom())) { if (meta->receive_special_damage_type != 0 && - ((bullet->gun_meta->special_damage_type & meta->receive_special_damage_type) == 0)) { + ((bullet->GetGunMeta()->special_damage_type & meta->receive_special_damage_type) == 0)) { return; } if (meta->i->thing_type() == kObstacleOilBucket) { - Entity* real_object = AsRoomObstacle()->GetRealObject(bullet->room); + Entity* real_object = AsRoomObstacle()->GetRealObject(bullet->GetRoom()); if (real_object->IsEntityType(ET_Loot)) { Loot* loot = (Loot*)real_object; if (loot->pickuped) { @@ -511,18 +511,18 @@ void Obstacle::OnBulletHit(Bullet* bullet) } } } - float finaly_dmg = bullet->sender.Get()->GetBattleContext()->CalcDmg(this, bullet); - SetHealth(bullet->room, std::max(0.0f, GetHealth(bullet->room) - finaly_dmg)); - if (GetHealth(bullet->room) <= 0.01f) { - Die(bullet->room); + float finaly_dmg = bullet->GetSender().Get()->GetBattleContext()->CalcDmg(this, bullet); + SetHealth(bullet->GetRoom(), std::max(0.0f, GetHealth(bullet->GetRoom()) - finaly_dmg)); + if (GetHealth(bullet->GetRoom()) <= 0.01f) { + Die(bullet->GetRoom()); if (meta->i->thing_type() == kObstacleOilBucket) { - Entity* real_object = AsRoomObstacle()->GetRealObject(bullet->room); + Entity* real_object = AsRoomObstacle()->GetRealObject(bullet->GetRoom()); if (real_object->IsEntityType(ET_Loot)) { Loot* loot = (Loot*)real_object; loot->pickuped = true; - bullet->room->RemoveObjectLater(loot); - bullet->room->RemoveObjectLater(AsRoomObstacle()); - RoomObstacle* obstacle = bullet->room->CreateObstacle + bullet->GetRoom()->RemoveObjectLater(loot); + bullet->GetRoom()->RemoveObjectLater(AsRoomObstacle()); + RoomObstacle* obstacle = bullet->GetRoom()->CreateObstacle ( meta->int_param1, GetPos().x, @@ -531,13 +531,13 @@ void Obstacle::OnBulletHit(Bullet* bullet) } } } - if (IsDead(bullet->room)) { - ProcDieExplosion(bullet->room); - bullet->sender.Get()->DropItems(this); + if (IsDead(bullet->GetRoom())) { + ProcDieExplosion(bullet->GetRoom()); + bullet->GetSender().Get()->DropItems(this); if (meta->i->thing_type() == kObstacleOilBucket) { MetaData::MapThing* bomb_meta = MetaMgr::Instance()->GetMapThing(meta->int_param1); if (bomb_meta) { - RoomObstacle* obstacle = bullet->room->CreateObstacle + RoomObstacle* obstacle = bullet->GetRoom()->CreateObstacle ( bomb_meta->i->thing_id(), GetPos().x, @@ -546,7 +546,7 @@ void Obstacle::OnBulletHit(Bullet* bullet) } } } - BroadcastFullState(bullet->room); + BroadcastFullState(bullet->GetRoom()); } } diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 354552aa..4b2a4575 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -42,7 +42,7 @@ class Obstacle : public Entity virtual bool IsDead(Room* room) override; virtual long long GetDeadFrameNo(Room* room) override; virtual void OnPreCollision(Room* room) override; - virtual void OnBulletHit(Bullet* bullet) override; + virtual void OnBulletHit(IBullet* bullet) override; virtual void OnExplosionHit(Explosion* explosion) override; virtual bool Attackable(Room* room) override; virtual bool CanThroughable(Creature* c); diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 970cdd9f..55b90e1e 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -305,7 +305,7 @@ void Skill::ProcSJXY() [this, shot_times, hited_objs] (const std::vector& params) mutable { ++shot_times; - Bullet* bullet = std::any_cast(params.at(0)); + IBullet* bullet = std::any_cast(params.at(0)); Creature* target = std::any_cast(params.at(1)); int rnd = rand(); bool is_hit = false; diff --git a/server/gameserver/skillhelper.cc b/server/gameserver/skillhelper.cc index 23a14b88..bc710fd3 100644 --- a/server/gameserver/skillhelper.cc +++ b/server/gameserver/skillhelper.cc @@ -237,13 +237,13 @@ float SkillHelper::GetSwzbBuffTime(const MetaData::Skill* skill_meta) return skill_meta->number_meta->float_time; } -void SkillHelper::ProcBulletHitBuff(Bullet* bullet, Creature* c, int buff_uniid) +void SkillHelper::ProcBulletHitBuff(IBullet* bullet, Creature* c, int buff_uniid) { Buff* buff = c->GetBuffByUniId(buff_uniid); if (!buff) { return; } - auto skill_meta = bullet->skill_meta; + auto skill_meta = bullet->GetSkillMeta(); if (!skill_meta) { return; } @@ -263,7 +263,7 @@ void SkillHelper::ProcBulletHitBuff(Bullet* bullet, Creature* c, int buff_uniid) skill_meta->i->skill_id(), skill_meta->number_meta->float_time }); - bullet->sender.Get()->SendDebugMsg(dbg_msg); + bullet->GetSender().Get()->SendDebugMsg(dbg_msg); a8::XPrintf("%s\n", {dbg_msg}); } #endif @@ -333,10 +333,10 @@ float SkillHelper::GetYmczDmg(Creature* sender, Creature* target, const MetaData return finaly_dmg; } -bool SkillHelper::ProcBulletDmg(Bullet* bullet, Creature* target, float& finaly_dmg) +bool SkillHelper::ProcBulletDmg(IBullet* bullet, Creature* target, float& finaly_dmg) { finaly_dmg = 0.0f; - MetaData::Skill* skill_meta = bullet->skill_meta; + MetaData::Skill* skill_meta = bullet->GetSkillMeta(); if (!skill_meta || !skill_meta->number_meta) { return false; } @@ -347,7 +347,7 @@ bool SkillHelper::ProcBulletDmg(Bullet* bullet, Creature* target, float& finaly_ finaly_dmg = (skill_meta->number_meta->float_ratio + skill_meta->number_meta->float_ratio2 * - bullet->sender.Get()->GetBattleContext()->GetHeroTotalAtk()) * + bullet->GetSender().Get()->GetBattleContext()->GetHeroTotalAtk()) * (1 - target->GetBattleContext()->GetDef() / (target->GetBattleContext()->GetDef() + 400)); #ifdef DEBUG { @@ -358,11 +358,11 @@ bool SkillHelper::ProcBulletDmg(Bullet* bullet, Creature* target, float& finaly_ skill_meta->i->skill_id(), skill_meta->number_meta->float_ratio, skill_meta->number_meta->float_ratio2, - bullet->sender.Get()->GetBattleContext()->GetHeroTotalAtk(), + bullet->GetSender().Get()->GetBattleContext()->GetHeroTotalAtk(), target->GetBattleContext()->GetDef(), finaly_dmg }); - bullet->sender.Get()->SendDebugMsg(dbg_msg); + bullet->GetSender().Get()->SendDebugMsg(dbg_msg); a8::XPrintf("%s\n", {dbg_msg}); } #endif diff --git a/server/gameserver/skillhelper.h b/server/gameserver/skillhelper.h index 2744fc87..4779f16b 100644 --- a/server/gameserver/skillhelper.h +++ b/server/gameserver/skillhelper.h @@ -57,8 +57,8 @@ class SkillHelper static float GetLdfyHp(Creature* c, const MetaData::Skill* skill_meta); static float GetLdfyBuffTime(Creature* c, const MetaData::Skill* skill_meta); - static void ProcBulletHitBuff(Bullet* bullet, Creature* c, int buff_uniid); - static bool ProcBulletDmg(Bullet* bullet, Creature* target, float& finaly_dmg); + static void ProcBulletHitBuff(IBullet* bullet, Creature* c, int buff_uniid); + static bool ProcBulletDmg(IBullet* bullet, Creature* target, float& finaly_dmg); static void ProcSummonObstacle(const MetaData::Skill* skill_meta, RoomObstacle* ob); private: diff --git a/server/gameserver/trigger.cc b/server/gameserver/trigger.cc index 74ab2cad..90573987 100644 --- a/server/gameserver/trigger.cc +++ b/server/gameserver/trigger.cc @@ -429,10 +429,10 @@ void Trigger::DispatchEvent(int event_id, const std::vector& param) } } -void Trigger::BulletHit(Bullet* bullet, Creature* target) +void Trigger::BulletHit(IBullet* bullet, Creature* target) { - if (bullet->sender.Get()) { - bullet->sender.Get()->GetTrigger()->DispatchEvent(kBulletHitEvent, {bullet, target}); + if (bullet->GetSender().Get()) { + bullet->GetSender().Get()->GetTrigger()->DispatchEvent(kBulletHitEvent, {bullet, target}); } } diff --git a/server/gameserver/trigger.h b/server/gameserver/trigger.h index 593b0b47..c747f731 100644 --- a/server/gameserver/trigger.h +++ b/server/gameserver/trigger.h @@ -64,7 +64,7 @@ public: void Die(); void ActiveBuff(MetaData::Buff* buff_meta); void DeactiveBuff(MetaData::Buff* buff_meta); - void BulletHit(Bullet* bullet, Creature* target); + void BulletHit(IBullet* bullet, Creature* target); void ShieldDestory(); void StartRescue(Human* target); void EndRescue(Human* target); diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 1d12af21..d13155c2 100644 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -1,5 +1,7 @@ #pragma once +#include "weakptr.h" + namespace MetaData { struct Equip; @@ -11,6 +13,8 @@ namespace cs struct CMJoin; } +class Room; + struct AddItemDTO { int uniid = 0; @@ -28,4 +32,10 @@ class IBullet virtual long long GetWeaponUniId() = 0; virtual MetaData::Skill* GetSkillMeta() = 0; virtual MetaData::Equip* GetGunMeta() = 0; + virtual MetaData::Equip* GetBulletMeta() = 0; + virtual CreatureWeakPtr GetSender() = 0; + virtual CreatureWeakPtr GetPassenger() = 0; + virtual bool IsBomb() = 0; + virtual bool IsPreBattleBullet() = 0; + virtual Room* GetRoom() = 0; }; diff --git a/server/gameserver/virtualbullet.cc b/server/gameserver/virtualbullet.cc index 1d1b61f9..eaab2ed8 100644 --- a/server/gameserver/virtualbullet.cc +++ b/server/gameserver/virtualbullet.cc @@ -20,3 +20,33 @@ MetaData::Equip* VirtualBullet::GetGunMeta() { return nullptr; } + +MetaData::Equip* VirtualBullet::GetBulletMeta() +{ + return nullptr; +} + +CreatureWeakPtr VirtualBullet::GetSender() +{ + +} + +CreatureWeakPtr VirtualBullet::GetPassenger() +{ + +} + +bool VirtualBullet::IsBomb() +{ + return false; +} + +bool VirtualBullet::IsPreBattleBullet() +{ + return false; +} + +Room* VirtualBullet::GetRoom() +{ + return nullptr; +} diff --git a/server/gameserver/virtualbullet.h b/server/gameserver/virtualbullet.h index 089c2b62..120d2366 100644 --- a/server/gameserver/virtualbullet.h +++ b/server/gameserver/virtualbullet.h @@ -6,15 +6,23 @@ namespace MetaData struct Equip; } +class Room; class VirtualBullet : public IBullet { public: long long weapon_uniid = 0; MetaData::Skill* skill_meta = nullptr; - MetaData::Equip* equip_meta = nullptr; + MetaData::Equip* gun_meta = nullptr; + MetaData::Equip* bullet_meta = nullptr; virtual float GetStrengthenWall() override; virtual long long GetWeaponUniId() override; virtual MetaData::Skill* GetSkillMeta() override; virtual MetaData::Equip* GetGunMeta() override; + virtual MetaData::Equip* GetBulletMeta() override; + virtual CreatureWeakPtr GetSender() override; + virtual CreatureWeakPtr GetPassenger() override; + virtual bool IsBomb() override; + virtual bool IsPreBattleBullet() override; + virtual Room* GetRoom() override; };