diff options
author | Sergeanur <s.anureev@yandex.ua> | 2020-12-29 12:55:15 +0100 |
---|---|---|
committer | Sergeanur <s.anureev@yandex.ua> | 2020-12-29 12:55:15 +0100 |
commit | f75460fc1d83f82b088aaf69d6fba869fc1569f5 (patch) | |
tree | ae2bde9908a773eef046c10f8635129dac7b1c2a /src/core/References.cpp | |
parent | Merge pull request #904 from Sergeanur/bvf (diff) | |
download | re3-f75460fc1d83f82b088aaf69d6fba869fc1569f5.tar re3-f75460fc1d83f82b088aaf69d6fba869fc1569f5.tar.gz re3-f75460fc1d83f82b088aaf69d6fba869fc1569f5.tar.bz2 re3-f75460fc1d83f82b088aaf69d6fba869fc1569f5.tar.lz re3-f75460fc1d83f82b088aaf69d6fba869fc1569f5.tar.xz re3-f75460fc1d83f82b088aaf69d6fba869fc1569f5.tar.zst re3-f75460fc1d83f82b088aaf69d6fba869fc1569f5.zip |
Diffstat (limited to 'src/core/References.cpp')
-rw-r--r-- | src/core/References.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/core/References.cpp b/src/core/References.cpp index 52abbc3e..6b0c868c 100644 --- a/src/core/References.cpp +++ b/src/core/References.cpp @@ -22,6 +22,66 @@ CReferences::Init(void) } void +CEntity::RegisterReference(CEntity **pent) +{ + if(IsBuilding()) + return; + CReference *ref; + // check if already registered + for(ref = m_pFirstReference; ref; ref = ref->next) + if(ref->pentity == pent) + return; + // have to allocate new reference + ref = CReferences::pEmptyList; + if(ref){ + CReferences::pEmptyList = ref->next; + + ref->pentity = pent; + ref->next = m_pFirstReference; + m_pFirstReference = ref; + return; + } + return; +} + +// Clear all references to this entity +void +CEntity::ResolveReferences(void) +{ + CReference *ref; + // clear pointers to this entity + for(ref = m_pFirstReference; ref; ref = ref->next) + if(*ref->pentity == this) + *ref->pentity = nil; + // free list + if(m_pFirstReference){ + for(ref = m_pFirstReference; ref->next; ref = ref->next) + ; + ref->next = CReferences::pEmptyList; + CReferences::pEmptyList = m_pFirstReference; + m_pFirstReference = nil; + } +} + +// Free all references that no longer point to this entity +void +CEntity::PruneReferences(void) +{ + CReference *ref, *next, **lastnextp; + lastnextp = &m_pFirstReference; + for(ref = m_pFirstReference; ref; ref = next){ + next = ref->next; + if(*ref->pentity == this) + lastnextp = &ref->next; + else{ + *lastnextp = ref->next; + ref->next = CReferences::pEmptyList; + CReferences::pEmptyList = ref; + } + } +} + +void CReferences::RemoveReferencesToPlayer(void) { if(FindPlayerVehicle()) |