bool GetPath_Execute(COMMAND_ARGS, UInt32 whichPath) { TESForm* form = NULL; const char* pathStr = ""; if (ExtractArgsEx(EXTRACT_ARGS_EX, &form)) { if (form) form = form->TryGetREFRParent(); if (!form) if (thisObj) form = thisObj->baseForm; switch (whichPath) { case kPath_Icon: { TESIcon* icon = DYNAMIC_CAST(form, TESForm, TESIcon); if (icon) pathStr = icon->ddsPath.m_data; } break; case kPath_Texture: { TESTexture* tex = DYNAMIC_CAST(form, TESForm, TESTexture); if (tex) pathStr = tex->ddsPath.m_data; } break; } } AssignToStringVarLong(PASS_COMMAND_ARGS, pathStr); return true; }
bgsee::FormCollectionSerializer* GlobalClipboardOperator::GetSerializer(bgsee::FormListT& Forms) { bool ExpectedRefs = false; SME_ASSERT(Forms.size()); TESForm* Wrapped = dynamic_cast<TESFormWrapper*>(Forms.at(0))->GetWrappedForm(); if (Wrapped->IsReference()) ExpectedRefs = true; bgsee::FormCollectionSerializer* Out = DefaultFormSerializer; if (ExpectedRefs) Out = ObjectRefSerializer; for (auto Itr : Forms) { TESForm* Wrapped = dynamic_cast<TESFormWrapper*>(Itr)->GetWrappedForm(); if ((Wrapped->IsReference() && ExpectedRefs == false) || (Wrapped->IsReference() == false && ExpectedRefs)) { BGSEECONSOLE_MESSAGE("Selection type mismatch! Selection can be either base forms of the same type or object references"); Out = nullptr; } } return Out; }
static bool Cmd_SetScript_Execute(COMMAND_ARGS) { *result = 0; UInt32* refResult = (UInt32*)result; TESForm* form = NULL; TESForm* scriptArg = NULL; ExtractArgsEx(paramInfo, arg1, opcodeOffsetPtr, scriptObj, eventList, &scriptArg, &form); form = form->TryGetREFRParent(); if (!form) { if (!thisObj) return true; form = thisObj->baseForm; } TESScriptableForm* scriptForm = (TESScriptableForm*)Oblivion_DynamicCast(form, 0, RTTI_TESForm, RTTI_TESScriptableForm, 0); if (!scriptForm) return true; Script* script = (Script*)Oblivion_DynamicCast(scriptArg, 0, RTTI_TESForm, RTTI_Script, 0); if (!script) return true; // we can't get a magic script here if (script->IsMagicScript()) return true; if (script->IsQuestScript() && form->typeID == kFormType_Quest) { *refResult = scriptForm->script->refID; scriptForm->script = script; } else if (script->IsObjectScript()) { if (scriptForm->script) { *refResult = scriptForm->script->refID; } scriptForm->script = script; } return true; }
static bool Cmd_GetRuntimeEditorID_Execute(COMMAND_ARGS) { TESForm* BaseObject = NULL; if (!g_scriptIntfc->ExtractArgsEx(paramInfo, arg1, opcodeOffsetPtr, scriptObj, eventList, &BaseObject) || (thisObj == NULL && BaseObject == NULL)) { g_strVarInfc->Assign(PASS_COMMAND_ARGS, ""); return true; } UInt32 FormID = 0; if (thisObj) FormID = thisObj->refID; else if (BaseObject) FormID = BaseObject->refID; const char* EditorID = g_editorIDManager.LookupByFormID(FormID); if (EditorID == NULL && BaseObject) EditorID = BaseObject->GetEditorID(); if (EditorID == NULL) g_strVarInfc->Assign(PASS_COMMAND_ARGS, ""); else { g_strVarInfc->Assign(PASS_COMMAND_ARGS, EditorID); if (IsConsoleMode()) Console_Print("EditorID: %s", EditorID); } return true; }
static bool GetScript_Execute(COMMAND_ARGS, EScriptMode eMode) { *result = 0; TESForm* form = 0; ExtractArgsEx(paramInfo, arg1, opcodeOffsetPtr, scriptObj, eventList, &form); form = form->TryGetREFRParent(); if (!form) { if (!thisObj) return true; form = thisObj->baseForm; } TESScriptableForm* scriptForm = (TESScriptableForm*)Oblivion_DynamicCast(form, 0, RTTI_TESForm, RTTI_TESScriptableForm, 0); Script* script = (scriptForm) ? scriptForm->script : NULL; if (eMode == eScript_HasScript) { *result = (script != NULL) ? 1 : 0; } else { if (script) { UInt32* refResult = (UInt32*)result; *refResult = script->refID; } if (eMode == eScript_Remove) { scriptForm->script = NULL; } } return true; }
// serialization void BoundItemMgefHandler::LinkHandler() { TESForm* assocItem = TESForm::LookupByFormID(parentEffect.mgefParam); #ifndef OBLIVION if (assocItem) FormRefCounter::AddReference(&parentEffect,assocItem); // add a cross ref for the associated form #endif if (!parentEffect.GetFlag(EffectSetting::kMgefFlagShift_UseArmor) && !parentEffect.GetFlag(EffectSetting::kMgefFlagShift_UseWeapon)) { // Use* flags are not set properly, attempt to guess value from assoc item and/or defaults if (assocItem && assocItem->GetFormType() == TESForm::kFormType_Weapon) // assoc item is a weapon parentEffect.SetFlag(EffectSetting::kMgefFlagShift_UseWeapon,true); else if (assocItem && assocItem->GetFormType() == TESForm::kFormType_Armor) // assoc item is armor parentEffect.SetFlag(EffectSetting::kMgefFlagShift_UseArmor,true); else if (EffectSetting::GetDefaultMgefFlags(parentEffect.mgefCode) & EffectSetting::kMgefFlag_UseWeapon) // default flag is 'Use Weapon' parentEffect.SetFlag(EffectSetting::kMgefFlagShift_UseWeapon,true); else // default flag is 'Use Armor' OR there is no default flag setting parentEffect.SetFlag(EffectSetting::kMgefFlagShift_UseArmor,true); // check vanilla bound item group & switch groups if necessary if (parentEffect.MagicGroupList::GetMagicGroup(MagicGroup::g_BoundWeaponLimit) && parentEffect.GetFlag(EffectSetting::kMgefFlagShift_UseArmor)) { // TODO - implement switch over armor slot to choose appripriate limit parentEffect.RemoveMagicGroup(MagicGroup::g_BoundWeaponLimit); parentEffect.AddMagicGroup(MagicGroup::g_BoundHelmLimit,1); } } }
TESForm * TempClone(TESForm * thisForm) { TESForm * result = NULL; if(thisForm) { IFormFactory * factory = IFormFactory::GetFactoryForType(thisForm->formType); if(factory) { result = factory->Create(); if(result) { result->Init(); result->CopyFrom(thisForm); result->CopyFromEx(thisForm); } else { _ERROR("Form::TempClone: factory for type %02X failed", thisForm->formType); } } else { _MESSAGE("Form::TempClone: tried to clone form %08X (type %02X), no factory found", thisForm->formID, thisForm->formType); } } return result; }
TESForm* TESForm::CreateTemporaryCopy(TESForm* Source, bool CopyModifiedState /*= true*/) { SME_ASSERT(Source); TESForm* Buffer = TESForm::CreateInstance(Source->formType); Buffer->MarkAsTemporary(); Buffer->CopyFrom(Source); if (CopyModifiedState) Buffer->SetFromActiveFile(Source->GetFromActiveFile()); return Buffer; }
bool IRenderWindowOSDLayer::Helpers::ResolveReference(UInt32 FormID, TESObjectREFR*& OutRef) { TESForm* Form = TESForm::LookupByFormID(FormID); if (Form) { SME_ASSERT(Form->formType == TESForm::kFormType_ACHR || Form->formType == TESForm::kFormType_ACRE || Form->formType == TESForm::kFormType_REFR); OutRef = CS_CAST(Form, TESForm, TESObjectREFR); return (Form->IsDeleted() == false); } else return false; }
void DispelMgefHandler::SetInDialog(HWND dialog) { HWND ctl = 0; // Effect Handler TESComboBox::SetCurSelByData(GetDlgItem(dialog,IDC_DSPL_EFFECTHANDLER),(void*)ehCode); // Effect Setting ::EffectSetting* mgef = EffectSettingCollection::LookupByCode(mgefCode); TESComboBox::SetCurSelByData(GetDlgItem(dialog,IDC_DSPL_EFFECTSETTING),mgef); // Magic Type Checkboxes CheckDlgButton(dialog,IDC_DSPL_SPELLS,magicTypes & (1 << Magic::kMagicType_Spell)); CheckDlgButton(dialog,IDC_DSPL_DISEASES,magicTypes & (1 << Magic::kMagicType_Disease)); CheckDlgButton(dialog,IDC_DSPL_POWERS,magicTypes & (1 << Magic::kMagicType_Power)); CheckDlgButton(dialog,IDC_DSPL_LPOWERS,magicTypes & (1 << Magic::kMagicType_LesserPower)); CheckDlgButton(dialog,IDC_DSPL_ABILITIES,magicTypes & (1 << Magic::kMagicType_Ability)); CheckDlgButton(dialog,IDC_DSPL_POISONS,magicTypes & (1 << Magic::kMagicType_Poison)); CheckDlgButton(dialog,IDC_DSPL_POTIONS,magicTypes & (1 << Magic::kMagicType_AlchemyItem)); CheckDlgButton(dialog,IDC_DSPL_INGREDIENTS,magicTypes & (1 << Magic::kMagicType_Ingredient)); // Cast Type Checkboxes CheckDlgButton(dialog,IDC_DSPL_SCROLLENCH,castTypes & (1 << ::Magic::kCast_Once)); CheckDlgButton(dialog,IDC_DSPL_STAFFENCH,castTypes & (1 << ::Magic::kCast_WhenUsed)); CheckDlgButton(dialog,IDC_DSPL_WEAPENCH,castTypes & (1 << ::Magic::kCast_WhenStrikes)); CheckDlgButton(dialog,IDC_DSPL_APPARELENCH,castTypes & (1 << ::Magic::kCast_Constant)); // Magic Item Type Select TESForm* form = TESForm::LookupByFormID(magicitemFormID); TESComboBox::SetCurSelByData(GetDlgItem(dialog,IDC_DSPL_MAGICITEMTYPE),form ? (void*)form->GetFormType() : 0); SendNotifyMessage(dialog, WM_USERCOMMAND, MAKEWPARAM(IDC_DSPL_MAGICITEMTYPE,CBN_SELCHANGE),(LPARAM)GetDlgItem(dialog,IDC_DSPL_MAGICITEMTYPE)); // behaviors CheckDlgButton(dialog,IDC_DSPL_ATOMICITEM,atomicItems); CheckDlgButton(dialog,IDC_DSPL_ATOMICDISPEL,atomicDispel); CheckDlgButton(dialog,IDC_DSPL_DISTRIBUTEMAG,distributeMag); CheckDlgButton(dialog,IDC_DSPL_USECASTINGCOST,useCastingCost); }
TESForm * TESForm::CloneForm(bool persist) const { TESForm * result = CreateFormInstance(typeID); if(result) { result->CopyFrom(this); CALL_MEMBER_FN(DataHandler::Get(), DoAddForm)(result); if(persist) { CALL_MEMBER_FN(TESSaveLoadGame::Get(), AddCreatedForm)(result); } } return result; }
bool Cmd_SetModelPathEX_Execute(COMMAND_ARGS) { TESForm* form = NULL; char newPath[kMaxMessageLength] = { 0 }; if (ExtractFormatStringArgs(0, newPath, PASS_FMTSTR_ARGS, kCommandInfo_SetModelPathEX.numParams, &form)) { if (form) form = form->TryGetREFRParent(); if (!form) if (thisObj) form = thisObj->baseForm; TESModel* model = DYNAMIC_CAST(form, TESForm, TESModel); if (model) model->SetPath(newPath); } return true; }
bool Cmd_GetSourceModIndex_Execute(COMMAND_ARGS) { TESForm* form = NULL; *result = -1; if (!ExtractArgsEx(EXTRACT_ARGS_EX, &form)) return true; if (!form) form = thisObj; if (form) { if (form->IsCloned()) *result = 0xFF; else *result = (UInt8)(form->refID >> 24); } return true; }
bool TESLeveledList::WalkForCircularPath( std::string& Output, TESLeveledList* Check, TESLeveledList* Against ) { bool Result = true; TESForm* CheckBase = CS_CAST(Check, TESLeveledList, TESForm); TESForm* CheckAgainstBase = CS_CAST(Against, TESLeveledList, TESForm); SME_ASSERT(CheckBase && CheckAgainstBase); for (TESLeveledList::LevListT::Iterator Itr = Check->levList.Begin(); Itr.Get() && Itr.End() == false; ++Itr) { TESForm* Item = Itr->form; TESLeveledList* Inner = CS_CAST(Item, TESForm, TESLeveledList); if (Item->formID == CheckAgainstBase->formID) { // the source lev list is an item Output += CheckBase->GetEditorID(); Output += " >"; Output += CheckAgainstBase->GetEditorID(); Result = false; break; } else if (Inner) { std::string TempStr = Output + CheckBase->GetEditorID(); TempStr += " >"; // recurse if (WalkForCircularPath(TempStr, Inner, Against) == false) { Output = TempStr; Result = false; break; } } } return Result; }
TESForm * TESForm::CloneForm(bool persist) const { TESForm * result = CreateFormInstance(typeID); if(result) { result->CopyFrom(this); // it looks like some fields are not copied, case in point: TESObjectCONT does not copy BoundObject information. TESBoundObject* boundObject = DYNAMIC_CAST(result, TESForm, TESBoundObject); if (boundObject) { TESBoundObject* boundSource = DYNAMIC_CAST(this, TESForm, TESBoundObject); if (boundSource) { for (UInt8 i=0; i<6; i++) boundObject->bounds[i] = boundSource->bounds[i]; } } DoAddForm(result, persist); } return result; }
bool Cmd_GetModelPath_Execute(COMMAND_ARGS) { TESForm* form = NULL; const char* pathStr = ""; *result = 0; if (ExtractArgsEx(EXTRACT_ARGS_EX, &form)) { if (form) form = form->TryGetREFRParent(); if (!form) if (thisObj) form = thisObj->baseForm; TESModel* model = DYNAMIC_CAST(form, TESForm, TESModel); if (model) pathStr = model->nifPath.m_data; } AssignToStringVar(PASS_COMMAND_ARGS, pathStr); return true; }
bool Cmd_NX_IsInList_Execute(COMMAND_ARGS) { BGSListForm *pFormList = NULL; // the formlist TESForm *pItem = NULL; // item we are looking for TESForm *pListItem = NULL; // current item from list TESForm *pBaseItem = NULL; // item we are looking for TESForm *pBaseListItem = NULL; // current item from list // need to handle creatures in a special fashion TESCreature *pCreature = NULL; TESCreature *pLCreature = NULL; TESCreature *pCreatureB = NULL; TESCreature *pLCreatureB = NULL; UInt32 n = 0; // do not do recursion int i; _MESSAGE("START IsInList"); *result = 0; ExtractArgs(EXTRACT_ARGS, &pFormList, &pItem, &n); if (pFormList && pItem) { pBaseItem = pItem->TryGetREFRParent(); pCreature = DYNAMIC_CAST(pBaseItem, TESForm, TESCreature); _MESSAGE(" Item %s (%x) p %s (%x)", GetObjectClassName(pItem), pItem->refID, GetObjectClassName(pBaseItem), pBaseItem->refID); if (NULL != pCreature) { _MESSAGE(" Item is a creature (%s)", pCreature->fullName.name); } for (i = 0; i < pFormList->Count(); i++) { pListItem = pFormList->GetNthForm(i); if (pListItem) { if (NULL != pCreature) { pCreatureB = GetRootCreature(pCreature); pLCreature = DYNAMIC_CAST(pListItem, TESForm, TESCreature); if (NULL != pLCreature) { pLCreatureB = GetRootCreature(pLCreature); if (pCreature->refID == pLCreature->refID) { *result = 1; break; } else if (pCreatureB->refID == pLCreature->refID) { *result = 2; break; } else if (pCreature->refID == pLCreatureB->refID) { *result = 3; break; } else if (pCreatureB->refID == pLCreatureB->refID) { *result = 4; break; } } } else { pBaseListItem = pListItem->TryGetREFRParent(); if (pItem->refID == pListItem->refID) { *result = 1; break; } else if (pBaseItem->refID == pListItem->refID) { *result = 2; break; } else if (pItem->refID == pBaseListItem->refID) { *result = 3; break; } else if (pBaseItem->refID == pBaseListItem->refID) { *result = 4; break; } } } } _MESSAGE(" IsInList Result %1.0f", *result); } else { if (!pFormList) { _MESSAGE(" invalid formlist arg"); } if (!pItem) { _MESSAGE(" invalid item arg"); } } _MESSAGE("END IsInList"); return true; }