bool Cmd_IsLoadDoor_Execute(COMMAND_ARGS) { *result = 0; if (!thisObj) return true; if (GetByTypeCast(thisObj->extraDataList, Teleport) || GetByTypeCast(thisObj->extraDataList, RandomTeleportMarker)) *result = 1; return true; }
bool Cmd_SetDoorTeleport_Execute(COMMAND_ARGS) { // linkedDoor x y z (rot). if omitted, coords/rot taken from linked ref *result = 0; if (!thisObj || thisObj->baseForm->typeID != kFormType_Door) return true; TESObjectREFR* linkedDoor = NULL; float x = 999; float y = 999; float z = 999; float rot = 999; if (GetByTypeCast(thisObj->extraDataList, RandomTeleportMarker)) return true; if (ExtractArgs(EXTRACT_ARGS, &linkedDoor, &x, &y, &z, &rot) && linkedDoor && linkedDoor->IsPersistent()) // ###TODO: necessary for linkedref to be door? { ExtraTeleport* tele = GetByTypeCast(thisObj->extraDataList, Teleport); if (!tele) { tele = ExtraTeleport::Create(); thisObj->extraDataList.Add(tele); } tele->data->linkedDoor = linkedDoor; if (x == 999 && y == 999 && z == 999) { x = linkedDoor->posX; y = linkedDoor->posY; z = linkedDoor->posZ; } if (rot == 999) rot = linkedDoor->rotZ; else rot *= kDegreeToRad; tele->data->x = x; tele->data->y = y; tele->data->z = z; tele->data->zRot = rot; *result = 1; } return true; }
bool GetTeleportInfo(COMMAND_ARGS, UInt32 which) { *result = 0; if (!thisObj || thisObj->baseForm->typeID != kFormType_Door) return true; ExtraTeleport* tele = GetByTypeCast(thisObj->extraDataList, Teleport); if (tele && tele->data) { switch (which) { case kTeleport_X: *result = tele->data->x; break; case kTeleport_Y: *result = tele->data->y; break; case kTeleport_Z: *result = tele->data->z; break; case kTeleport_Rot: *result = tele->data->zRot * kRadToDegree; break; } } return true; }
bool Cmd_GetLinkedDoor_Execute(COMMAND_ARGS) { UInt32* refResult = (UInt32*)result; *refResult = 0; if (!thisObj) return true; ExtraTeleport* xTele = GetByTypeCast(thisObj->extraDataList, Teleport); if (xTele) *refResult = xTele->data->linkedDoor->refID; return true; }
TESForm* GetPermanentBaseForm(TESObjectREFR* thisObj) // For LevelledForm, find real baseForm, not temporary one. { ExtraLeveledCreature * pXCreatureData = NULL; if (thisObj) { pXCreatureData = GetByTypeCast(thisObj->extraDataList, LeveledCreature); if (pXCreatureData && pXCreatureData->baseForm) { return pXCreatureData->baseForm; } } if (thisObj && thisObj->baseForm) { return thisObj->baseForm; } return NULL; }
bool Cmd_GetTeleportCell_Execute(COMMAND_ARGS) { UInt32* refResult = (UInt32*)result; *refResult = 0; if (!thisObj) return true; ExtraTeleport* xTele = GetByTypeCast(thisObj->extraDataList, Teleport); // parentCell will be null if linked door's cell is not currently loaded (e.g. most exterior cells) if (xTele && xTele->data && xTele->data->linkedDoor && xTele->data->linkedDoor->parentCell) { *refResult = xTele->data->linkedDoor->parentCell->refID; } return true; }
bool Cmd_GetParentWorldspace_Execute(COMMAND_ARGS) { UInt32 * refResult = (UInt32 *)result; *refResult = 0; if(!thisObj) return true; ExtraPersistentCell* xPersistentCell = (ExtraPersistentCell*)GetByTypeCast(thisObj->extraDataList, PersistentCell); if (xPersistentCell && xPersistentCell->persistentCell && xPersistentCell->persistentCell->worldSpace) *refResult = xPersistentCell->persistentCell->worldSpace->refID; else if (thisObj->parentCell && thisObj->parentCell->worldSpace) { *refResult = thisObj->parentCell->worldSpace->refID; } return true; }