Enderal SE
https://mod.pub/enderal-se/38-enderal-se
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
8.1 KiB
280 lines
8.1 KiB
#include "GameBSExtraData.h"
|
|
#include "GameExtraData.h"
|
|
#include "GameRTTI.h"
|
|
|
|
extern const void * RTTIForExtraType[0xB4] =
|
|
{
|
|
NULL, // 0x0
|
|
RTTI_ExtraHavok, // 0x1,
|
|
RTTI_ExtraCell3D, // 0x2,
|
|
RTTI_ExtraCellWaterType, // 0x3,
|
|
RTTI_ExtraRegionList, // 0x4,
|
|
RTTI_ExtraSeenData, // 0x5,
|
|
RTTI_ExtraEditorID, // 0x6,
|
|
RTTI_ExtraCellMusicType, // 0x7,
|
|
RTTI_ExtraCellSkyRegion, // 0x8,
|
|
RTTI_ExtraProcessMiddleLow, // 0x9,
|
|
RTTI_ExtraDetachTime, // 0xA,
|
|
RTTI_ExtraPersistentCell, // 0xB,
|
|
NULL, // 0xC,
|
|
RTTI_ExtraAction, // 0xD,
|
|
RTTI_ExtraStartingPosition, // 0xE,
|
|
NULL, // 0xF,
|
|
RTTI_ExtraAnimGraphManager, // 0x10,
|
|
NULL, // 0x11,
|
|
RTTI_ExtraUsedMarkers, // 0x12,
|
|
RTTI_ExtraDistantData, // 0x13,
|
|
RTTI_ExtraRagDollData, // 0x14,
|
|
RTTI_ExtraContainerChanges, // 0x15,
|
|
RTTI_ExtraWorn, // 0x16,
|
|
RTTI_ExtraWornLeft, // 0x17,
|
|
RTTI_ExtraPackageStartLocation, // 0x18,
|
|
RTTI_ExtraPackage, // 0x19,
|
|
RTTI_ExtraTresPassPackage, // 0x1A,
|
|
RTTI_ExtraRunOncePacks, // 0x1B,
|
|
RTTI_ExtraReferenceHandle, // 0x1C,
|
|
RTTI_ExtraFollower, // 0x1D,
|
|
RTTI_ExtraLevCreaModifier, // 0x1E,
|
|
RTTI_ExtraGhost, // 0x1F,
|
|
RTTI_ExtraOriginalReference, // 0x20,
|
|
RTTI_ExtraOwnership, // 0x21,
|
|
RTTI_ExtraGlobal, // 0x22,
|
|
RTTI_ExtraRank, // 0x23,
|
|
RTTI_ExtraCount, // 0x24,
|
|
RTTI_ExtraHealth, // 0x25,
|
|
NULL, // 0x26,
|
|
RTTI_ExtraTimeLeft, // 0x27,
|
|
RTTI_ExtraCharge, // 0x28,
|
|
RTTI_ExtraLight, // 0x29,
|
|
RTTI_ExtraLock, // 0x2A,
|
|
RTTI_ExtraTeleport, // 0x2B,
|
|
RTTI_ExtraMapMarker, // 0x2C,
|
|
RTTI_ExtraLeveledCreature, // 0x2D,
|
|
RTTI_ExtraLeveledItem, // 0x2E,
|
|
RTTI_ExtraScale, // 0x2F,
|
|
NULL, // 0x30, was ExtraSeed, removed in 1.7.7.0
|
|
NULL, // 0x31,
|
|
NULL, // 0x32,
|
|
NULL, // 0x33,
|
|
RTTI_ExtraPlayerCrimeList, // 0x34,
|
|
NULL, // 0x35
|
|
RTTI_ExtraEnableStateParent, // 0x36,
|
|
RTTI_ExtraEnableStateChildren, // 0x37,
|
|
RTTI_ExtraItemDropper, // 0x38,
|
|
RTTI_ExtraDroppedItemList, // 0x39,
|
|
RTTI_ExtraRandomTeleportMarker, // 0x3A,
|
|
NULL, // 0x3B
|
|
RTTI_ExtraSavedHavokData, // 0x3C,
|
|
RTTI_ExtraCannotWear, // 0x3D,
|
|
RTTI_ExtraPoison, // 0x3E,
|
|
NULL, // 0x3F
|
|
RTTI_ExtraLastFinishedSequence, // 0x40,
|
|
RTTI_ExtraSavedAnimation, // 0x41,
|
|
RTTI_ExtraNorthRotation, // 0x42,
|
|
RTTI_ExtraSpawnContainer, // 0x43,
|
|
RTTI_ExtraFriendHits, // 0x44,
|
|
RTTI_ExtraHeadingTarget, // 0x45,
|
|
NULL, // 0x46
|
|
RTTI_ExtraRefractionProperty, // 0x47,
|
|
RTTI_ExtraStartingWorldOrCell, // 0x48,
|
|
RTTI_ExtraHotkey, // 0x49,
|
|
NULL, // 0x4A
|
|
RTTI_ExtraEditorRefMoveData, // 0x4B,
|
|
RTTI_ExtraInfoGeneralTopic, // 0x4C,
|
|
RTTI_ExtraHasNoRumors, // 0x4D,
|
|
RTTI_ExtraSound, // 0x4E,
|
|
RTTI_ExtraTerminalState, // 0x4F,
|
|
RTTI_ExtraLinkedRef, // 0x50,
|
|
RTTI_ExtraLinkedRefChildren, // 0x51,
|
|
RTTI_ExtraActivateRef, // 0x52,
|
|
RTTI_ExtraActivateRefChildren, // 0x53,
|
|
RTTI_ExtraCanTalkToPlayer, // 0x54,
|
|
RTTI_ExtraObjectHealth, // 0x55,
|
|
RTTI_ExtraCellImageSpace, // 0x56,
|
|
RTTI_ExtraNavMeshPortal, // 0x57,
|
|
RTTI_ExtraModelSwap, // 0x58,
|
|
RTTI_ExtraRadius, // 0x59,
|
|
NULL, // 0x5A,
|
|
RTTI_ExtraFactionChanges, // 0x5B,
|
|
RTTI_ExtraDismemberedLimbs, // 0x5C,
|
|
RTTI_ExtraActorCause, // 0x5D,
|
|
RTTI_ExtraMultiBound, // 0x5E,
|
|
NULL, // 0x5F, was ExtraMultiBoundData, removed in 1.7.7.0
|
|
RTTI_ExtraMultiBoundRef, // 0x60,
|
|
RTTI_ExtraReflectedRefs, // 0x61,
|
|
RTTI_ExtraReflectorRefs, // 0x62,
|
|
RTTI_ExtraEmittanceSource, // 0x63,
|
|
NULL, // 0x64, was ExtraRadioData, removed in 1.7.7.0
|
|
RTTI_ExtraCombatStyle, // 0x65,
|
|
NULL, // 0x66,
|
|
RTTI_ExtraPrimitive, // 0x67,
|
|
RTTI_ExtraOpenCloseActivateRef, // 0x68,
|
|
RTTI_ExtraAnimNoteReceiver, // 0x69,
|
|
RTTI_ExtraAmmo, // 0x6A,
|
|
RTTI_ExtraPatrolRefData, // 0x6B,
|
|
RTTI_ExtraPackageData, // 0x6C,
|
|
RTTI_ExtraOcclusionShape, // 0x6D,
|
|
RTTI_ExtraCollisionData, // 0x6E,
|
|
RTTI_ExtraSayTopicInfoOnceADay, // 0x6F,
|
|
RTTI_ExtraEncounterZone, // 0x70,
|
|
RTTI_ExtraSayToTopicInfo, // 0x71,
|
|
RTTI_ExtraOcclusionPlaneRefData, // 0x72,
|
|
RTTI_ExtraPortalRefData, // 0x73,
|
|
RTTI_ExtraPortal, // 0x74,
|
|
RTTI_ExtraRoom, // 0x75,
|
|
RTTI_ExtraHealthPerc, // 0x76,
|
|
RTTI_ExtraRoomRefData, // 0x77,
|
|
RTTI_ExtraGuardedRefData, // 0x78,
|
|
RTTI_ExtraCreatureAwakeSound, // 0x79,
|
|
NULL, // 0x7A,
|
|
RTTI_ExtraHorse, // 0x7B,
|
|
RTTI_ExtraIgnoredBySandbox, // 0x7C,
|
|
RTTI_ExtraCellAcousticSpace, // 0x7D,
|
|
RTTI_ExtraReservedMarkers, // 0x7E,
|
|
RTTI_ExtraWeaponIdleSound, // 0x7F,
|
|
RTTI_ExtraWaterLightRefs, // 0x80,
|
|
RTTI_ExtraLitWaterRefs, // 0x81,
|
|
RTTI_ExtraWeaponAttackSound, // 0x82,
|
|
RTTI_ExtraActivateLoopSound, // 0x83,
|
|
RTTI_ExtraPatrolRefInUseData, // 0x84,
|
|
RTTI_ExtraAshPileRef, // 0x85,
|
|
NULL, // 0x86
|
|
RTTI_ExtraFollowerSwimBreadcrumbs, // 0x87,
|
|
RTTI_ExtraAliasInstanceArray, // 0x88,
|
|
RTTI_ExtraLocation, // 0x89,
|
|
NULL, // 0x8A,
|
|
RTTI_ExtraLocationRefType, // 0x8B,
|
|
RTTI_ExtraPromotedRef, // 0x8C,
|
|
NULL, // 0x8D,
|
|
RTTI_ExtraOutfitItem, // 0x8E,
|
|
NULL, // 0x8F,
|
|
RTTI_ExtraLeveledItemBase, // 0x90,
|
|
RTTI_ExtraLightData, // 0x91,
|
|
RTTI_ExtraSceneData, // 0x92,
|
|
RTTI_ExtraBadPosition, // 0x93,
|
|
RTTI_ExtraHeadTrackingWeight, // 0x94,
|
|
RTTI_ExtraFromAlias, // 0x95,
|
|
RTTI_ExtraShouldWear, // 0x96,
|
|
RTTI_ExtraFavorCost, // 0x97,
|
|
RTTI_ExtraAttachedArrows3D, // 0x98,
|
|
RTTI_ExtraTextDisplayData, // 0x99,
|
|
RTTI_ExtraAlphaCutoff, // 0x9A,
|
|
RTTI_ExtraEnchantment, // 0x9B,
|
|
RTTI_ExtraSoul, // 0x9C,
|
|
RTTI_ExtraForcedTarget, // 0x9D,
|
|
NULL, // 0x9E,
|
|
RTTI_ExtraUniqueID, // 0x9F,
|
|
RTTI_ExtraFlags, // 0xA0,
|
|
RTTI_ExtraRefrPath, // 0xA1,
|
|
RTTI_ExtraDecalGroup, // 0xA2,
|
|
RTTI_ExtraLockList, // 0xA3,
|
|
RTTI_ExtraForcedLandingMarker, // 0xA4,
|
|
RTTI_ExtraLargeRefOwnerCells, // 0xA5,
|
|
RTTI_ExtraCellWaterEnvMap, // 0xA6,
|
|
RTTI_ExtraCellGrassData, // 0xA7,
|
|
RTTI_ExtraTeleportName, // 0xA8,
|
|
RTTI_ExtraInteraction, // 0xA9,
|
|
RTTI_ExtraWaterData, // 0xAA,
|
|
RTTI_ExtraWaterCurrentZoneData, // 0xAB,
|
|
RTTI_ExtraAttachRef, // 0xAC,
|
|
RTTI_ExtraAttachRefChildren, // 0xAD,
|
|
RTTI_ExtraGroupConstraint, // 0xAE,
|
|
RTTI_ExtraScriptedAnimDependence, // 0xAF,
|
|
RTTI_ExtraCachedScale, // 0xB0,
|
|
RTTI_ExtraRaceData, // 0xB1,
|
|
RTTI_ExtraGIDBuffer, // 0xB2,
|
|
RTTI_ExtraMissingRefIDs, // 0xB3
|
|
};
|
|
|
|
|
|
BSExtraData* BaseExtraList::GetByType(UInt32 type)
|
|
{
|
|
BSReadLocker locker(&m_lock);
|
|
if (!HasType(type)) return NULL;
|
|
|
|
const void* rttiType = RTTIForExtraType[type];
|
|
|
|
for(BSExtraData * traverse = m_data; traverse; traverse = traverse->next) {
|
|
if (Runtime_DynamicCast((void*)(traverse), RTTI_BSExtraData, rttiType) != NULL) {
|
|
return traverse;
|
|
}
|
|
//if(traverse->type == type)
|
|
// return traverse;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
bool BaseExtraList::Remove(UInt8 type, BSExtraData* toRemove)
|
|
{
|
|
BSWriteLocker locker(&m_lock);
|
|
if (!toRemove) return false;
|
|
|
|
if (HasType(type)) {
|
|
bool bRemoved = false;
|
|
if (m_data == toRemove) {
|
|
m_data = m_data->next;
|
|
bRemoved = true;
|
|
}
|
|
|
|
for (BSExtraData* traverse = m_data; traverse; traverse = traverse->next) {
|
|
if (traverse->next == toRemove) {
|
|
traverse->next = toRemove->next;
|
|
bRemoved = true;
|
|
break;
|
|
}
|
|
}
|
|
if (bRemoved) {
|
|
MarkType(type, true);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool BaseExtraList::Add(UInt8 type, BSExtraData* toAdd)
|
|
{
|
|
if (!toAdd || HasType(type)) return false;
|
|
|
|
BSWriteLocker locker(&m_lock);
|
|
BSExtraData* next = m_data;
|
|
m_data = toAdd;
|
|
toAdd->next = next;
|
|
MarkType(type, false);
|
|
return true;
|
|
}
|
|
|
|
bool BaseExtraList::CheckContainerExtraData(bool isEquipped)
|
|
{
|
|
return CALL_MEMBER_FN(this, CheckContainerExtraData_Internal)(isEquipped);
|
|
}
|
|
|
|
const char * BaseExtraList::GetDisplayName(TESForm * type)
|
|
{
|
|
float healthValue = 1.0;
|
|
|
|
ExtraHealth* xHealth = static_cast<ExtraHealth*>(GetByType(kExtraData_Health));
|
|
if(xHealth)
|
|
healthValue = xHealth->health;
|
|
|
|
ExtraTextDisplayData * xText = CALL_MEMBER_FN(this, GetExtraTextDisplayData_Internal)();
|
|
if (!xText && healthValue != 1.0)
|
|
{
|
|
xText = ExtraTextDisplayData::Create();
|
|
Add(kExtraData_TextDisplayData, xText);
|
|
}
|
|
|
|
if (xText)
|
|
return xText->GenerateName(type, healthValue);
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
BSExtraData* BSExtraData::Create(UInt32 size, uintptr_t vtbl)
|
|
{
|
|
void* memory = Heap_Allocate(size);
|
|
memset(memory, 0, size);
|
|
((uintptr_t *)memory)[0] = vtbl;
|
|
BSExtraData* xData = (BSExtraData*)memory;
|
|
return xData;
|
|
}
|
|
|