add EntityWeakPtr
This commit is contained in:
parent
3e2f90bc36
commit
b9dce95940
@ -1,6 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "weakptr.h"
|
|
||||||
#include "moveableentity.h"
|
#include "moveableentity.h"
|
||||||
#include "buff.h"
|
#include "buff.h"
|
||||||
#include "trigger.h"
|
#include "trigger.h"
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
Entity::Entity()
|
Entity::Entity()
|
||||||
{
|
{
|
||||||
|
entity_weak_ptr_chunk_.Set(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity::~Entity()
|
Entity::~Entity()
|
||||||
@ -235,3 +235,18 @@ void Entity::AddClientCache(Human* hum)
|
|||||||
sync_flags->last_sync_frameno = hum->room->GetFrameNo();
|
sync_flags->last_sync_frameno = hum->room->GetFrameNo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EntityWeakPtr Entity::AllocEntityWeakPtr()
|
||||||
|
{
|
||||||
|
EntityWeakPtr ptr;
|
||||||
|
ptr.Attach(this);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityWeakPtr& Entity::GetEntityWeakPtrRef()
|
||||||
|
{
|
||||||
|
if (!entity_weak_ptr_.Get()) {
|
||||||
|
entity_weak_ptr_.Attach(this);
|
||||||
|
}
|
||||||
|
return entity_weak_ptr_;
|
||||||
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "weakptr.h"
|
||||||
|
|
||||||
namespace cs
|
namespace cs
|
||||||
{
|
{
|
||||||
class MFObjectPart;
|
class MFObjectPart;
|
||||||
@ -63,6 +65,9 @@ class Entity
|
|||||||
float GetY() { return pos_.y; }
|
float GetY() { return pos_.y; }
|
||||||
void SetX(float x) { pos_.x = x; }
|
void SetX(float x) { pos_.x = x; }
|
||||||
void SetY(float y) { pos_.y = y; }
|
void SetY(float y) { pos_.y = y; }
|
||||||
|
EntityWeakPtrChunk* GetEntityWeakPtrChunk() { return &entity_weak_ptr_chunk_; };
|
||||||
|
EntityWeakPtr AllocEntityWeakPtr();
|
||||||
|
EntityWeakPtr& GetEntityWeakPtrRef();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool IsClientCached(Human* hum);
|
bool IsClientCached(Human* hum);
|
||||||
@ -81,6 +86,9 @@ private:
|
|||||||
EntityType_e entity_type_ = ET_None;
|
EntityType_e entity_type_ = ET_None;
|
||||||
EntitySubType_e entity_subtype_ = EST_None;
|
EntitySubType_e entity_subtype_ = EST_None;
|
||||||
|
|
||||||
|
EntityWeakPtr entity_weak_ptr_;
|
||||||
|
EntityWeakPtrChunk entity_weak_ptr_chunk_;
|
||||||
|
|
||||||
a8::Vec2 pos_;
|
a8::Vec2 pos_;
|
||||||
int grid_id_ = 0;
|
int grid_id_ = 0;
|
||||||
|
|
||||||
|
@ -218,3 +218,111 @@ void RoomObstacleWeakPtr::Detach()
|
|||||||
list_del_init(&entry_);
|
list_del_init(&entry_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EntityWeakPtrChunk::EntityWeakPtrChunk()
|
||||||
|
{
|
||||||
|
INIT_LIST_HEAD(&ptrs_);
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityWeakPtrChunk::~EntityWeakPtrChunk()
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityWeakPtrChunk::Clear()
|
||||||
|
{
|
||||||
|
struct EntityWeakPtr *weakptr, *tmp;
|
||||||
|
struct list_head ptr_list;
|
||||||
|
|
||||||
|
list_replace_init(&ptrs_, &ptr_list);
|
||||||
|
list_for_each_entry_safe(weakptr, tmp, &ptr_list, entry_) {
|
||||||
|
weakptr->Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityWeakPtrChunk::Set(Entity* c)
|
||||||
|
{
|
||||||
|
ptr_ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityWeakPtr::EntityWeakPtr()
|
||||||
|
{
|
||||||
|
INIT_LIST_HEAD(&entry_);
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityWeakPtr::EntityWeakPtr(const EntityWeakPtr& x)
|
||||||
|
{
|
||||||
|
INIT_LIST_HEAD(&entry_);
|
||||||
|
if (x.ptr_) {
|
||||||
|
Attach(x.ptr_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityWeakPtr::EntityWeakPtr(EntityWeakPtr&& x)
|
||||||
|
{
|
||||||
|
INIT_LIST_HEAD(&entry_);
|
||||||
|
if (x.ptr_) {
|
||||||
|
Attach(x.ptr_);
|
||||||
|
x.Detach();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityWeakPtr& EntityWeakPtr::operator=(const EntityWeakPtr& x)
|
||||||
|
{
|
||||||
|
if (ptr_) {
|
||||||
|
Detach();
|
||||||
|
}
|
||||||
|
if (x.ptr_) {
|
||||||
|
Attach(x.ptr_);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityWeakPtr&& EntityWeakPtr::operator=(EntityWeakPtr&& x)
|
||||||
|
{
|
||||||
|
if (ptr_) {
|
||||||
|
Detach();
|
||||||
|
}
|
||||||
|
if (x.ptr_) {
|
||||||
|
Attach(x.ptr_);
|
||||||
|
x.Detach();
|
||||||
|
}
|
||||||
|
abort();
|
||||||
|
// return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityWeakPtr::~EntityWeakPtr()
|
||||||
|
{
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityWeakPtr::Reset()
|
||||||
|
{
|
||||||
|
if (ptr_) {
|
||||||
|
Detach();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Entity* EntityWeakPtr::Get()
|
||||||
|
{
|
||||||
|
return ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityWeakPtr::Attach(Entity* c)
|
||||||
|
{
|
||||||
|
Reset();
|
||||||
|
EntityWeakPtrChunk* chunk = c->GetEntityWeakPtrChunk();
|
||||||
|
if (c != chunk->ptr_) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
ptr_ = c;
|
||||||
|
list_add_tail(&entry_, &chunk->ptrs_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityWeakPtr::Detach()
|
||||||
|
{
|
||||||
|
if (ptr_) {
|
||||||
|
ptr_ = nullptr;
|
||||||
|
list_del_init(&entry_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -80,3 +80,42 @@ class RoomObstacleWeakPtr
|
|||||||
|
|
||||||
friend class RoomObstacleWeakPtrChunk;
|
friend class RoomObstacleWeakPtrChunk;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Entity;
|
||||||
|
|
||||||
|
class EntityWeakPtrChunk
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
EntityWeakPtrChunk();
|
||||||
|
~EntityWeakPtrChunk();
|
||||||
|
void Clear();
|
||||||
|
void Set(Entity* c);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Entity* ptr_ = nullptr;
|
||||||
|
list_head ptrs_;
|
||||||
|
friend class EntityWeakPtr;
|
||||||
|
};
|
||||||
|
|
||||||
|
class EntityWeakPtr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
EntityWeakPtr();
|
||||||
|
EntityWeakPtr(const EntityWeakPtr& x);
|
||||||
|
EntityWeakPtr(EntityWeakPtr&& x);
|
||||||
|
EntityWeakPtr& operator=(const EntityWeakPtr& x);
|
||||||
|
EntityWeakPtr&& operator=(EntityWeakPtr&& x);
|
||||||
|
~EntityWeakPtr();
|
||||||
|
void Reset();
|
||||||
|
Entity* Get();
|
||||||
|
void Attach(Entity* c);
|
||||||
|
void Detach();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Entity* ptr_ = nullptr;
|
||||||
|
list_head entry_;
|
||||||
|
|
||||||
|
friend class EntityWeakPtrChunk;
|
||||||
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user