コード例 #1
0
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;
}
コード例 #2
0
		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;
		}
コード例 #3
0
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;
}
コード例 #4
0
ファイル: Commands.cpp プロジェクト: shadeMe/RuntimeEditorIDs
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;
}
コード例 #5
0
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;
}
コード例 #6
0
// 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);
        }
    }
}
コード例 #7
0
	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;
	}
コード例 #8
0
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;
}
コード例 #9
0
		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;
		}
コード例 #10
0
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);
}
コード例 #11
0
ファイル: GameForms.cpp プロジェクト: ashmedai/NVSE
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;
}
コード例 #12
0
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;
}
コード例 #13
0
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;
}
コード例 #14
0
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;
}
コード例 #15
0
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;
}
コード例 #16
0
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;
}
コード例 #17
0
ファイル: nvse_extender.cpp プロジェクト: ashmedai/NVSE
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;
}