From e9baeff23657cc33e36b45a4225759e3bf075401 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 20 May 2021 19:51:27 +0800 Subject: [PATCH] 1 --- server/gameserver/entity.h | 3 +++ server/gameserver/hero.cc | 18 ++++++++++++++++++ server/gameserver/hero.h | 2 ++ server/gameserver/human.cc | 3 +++ server/gameserver/human.h | 1 + server/gameserver/room.cc | 14 ++++++++++++++ server/gameserver/room.h | 1 + 7 files changed, 42 insertions(+) diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index 3fc41c5..132e9c2 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -15,6 +15,7 @@ class Bullet; class Entity { public: + long long delete_frameno = 0; Entity(); virtual ~Entity(); @@ -32,6 +33,8 @@ class Entity virtual void OnPreCollision(Room* room) {}; virtual void RecalcSelfCollider() {}; virtual void OnBulletHit(Bullet* bullet) {}; + virtual void OnAddToTargetPartObject(Entity* target) {}; + virtual void OnRemoveFromTargetPartObject(Entity* target) {}; int GetEntityUniId() const { return entity_uniid_; } EntityType_e GetEntityType() const { return entity_type_; } EntitySubType_e GetEntitySubType() const { return entity_subtype_; } diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 4ec2c1a..aee20ef 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -306,6 +306,24 @@ void Hero::BeKill(int killer_id, const std::string& killer_name, int weapon_id) hero->RemoveFromAroundPlayers(hero->room); hero->room->grid_service->RemoveCreature(hero); hero->room->RemoveObjectLater(hero); + hero->delete_frameno = hero->room->GetFrameNo(); + std::vector watch_list; + hero->room->GetPartObjectWatchList(hero, watch_list); + if (watch_list.empty()) { + + } }, &xtimer_attacher.timer_list_); } + +void Hero::OnAddToTargetPartObject(Entity* target) +{ + if (delete_frameno > 0) { + abort(); + } +} + +void Hero::OnRemoveFromTargetPartObject(Entity* target) +{ + +} diff --git a/server/gameserver/hero.h b/server/gameserver/hero.h index 0159e58..80fddb2 100644 --- a/server/gameserver/hero.h +++ b/server/gameserver/hero.h @@ -35,6 +35,8 @@ public: virtual float GetHitRadius() override; virtual void GetAabbBox(AabbCollider& aabb_box) override; virtual void GetHitAabbBox(AabbCollider& aabb_box) override; + virtual void OnAddToTargetPartObject(Entity* target) override; + virtual void OnRemoveFromTargetPartObject(Entity* target) override; void SetAiLevel(int ai_level); void DetachFromMaster(); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 1cfd37a..8e51f3b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -967,12 +967,15 @@ void Human::AddToPartObjects(Entity* entity) part_obj.entity_uniid = entity->GetEntityUniId(); part_obj.entity_type = entity->GetEntityType(); part_obj.entity_subtype = entity->GetEntitySubType(); + part_obj.add_frameno = room->GetFrameNo(); part_objects[entity] = part_obj; + entity->OnAddToTargetPartObject(this); } void Human::RemovePartObjects(Entity* entity) { part_objects.erase(entity); + entity->OnRemoveFromTargetPartObject(this); } void Human::ClearPartObjects() diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 011aa19..2b74be2 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -36,6 +36,7 @@ struct PartObject int entity_uniid = 0; int entity_type = 0; int entity_subtype = 0; + long long add_frameno = 0; }; struct xtimer_list; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index f3e0575..a156e47 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -3887,3 +3887,17 @@ void Room::ShuaMon(const a8::Vec2& center, std::vector& airdrop_mon_list, f }//end if }//end for hero_id } + +void Room::GetPartObjectWatchList(Entity* entity, std::vector& watch_list) +{ + TouchHumanList + ( + a8::XParams(), + [&watch_list, entity] (Human* hum, a8::XParams& param) -> bool + { + if (hum->InPartObjects(entity)) { + watch_list.push_back(hum); + } + return true; + }); +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 21668d1..d61168a 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -177,6 +177,7 @@ public: int AllocUniid(); Incubator* GetIncubator() { return incubator_;}; void ShuaMon(const a8::Vec2& center, std::vector& airdrop_mon_list, float radius); + void GetPartObjectWatchList(Entity* entity, std::vector& watch_list); private: void ShuaAndroid();