アイテムの所有権

Modを作ろう

目次 横着する方法真面目にやる方法 横着する方法 HUDの文字列を読み取り、赤くする制御文字が見つかったら盗む扱いと見なすという方法です。 よくもまぁ見つけるものですね。 以下の真面目にやる方法は私が頑張って書いたコード […]

横着する方法

HUDの文字列を読み取り、赤くする制御文字が見つかったら盗む扱いと見なすという方法です。

サンプルソースコード (papyrus)

string HUD = "HUD Menu"
string RolloverText = "_root.HUDMovieBaseInstance.RolloverText.htmlText"
string Red = "COLOR=\"#FF0000\""

if StringUtil.Find( UI.GetString(HUD, RolloverText), Red ) >= 0
    ; 盗む
endif

よくもまぁ見つけるものですね。

以下の真面目にやる方法は私が頑張って書いたコードですが、どこかに見落としがあるらしくて完璧ではないのですが、この方法だと完璧です。

真面目にやる方法

アイテムの所有権は4つ調べる必要があります。

内容Papyrusでの取得方法
アイテムの所有者akTarget.GetActorOwner()
アイテムのセルの所有者akTarget.GetParentCell().GetActorOwner()
アイテムの所有組織akTarget.GetFactionOwner()
アイテムのセルの所有組織akTarget.GetParentCell().GetFactionOwner()

アイテムをプレイヤーが取得しても窃盗にならないかどうかは、以下の順で調べるとわかります。

  • アイテムの所有者がプレイヤーならOK
  • アイテムの所有者が他人ならNG
  • アイテムの所有者がいないならアイテムのセルの所有者を調べる
  • アイテムのセルの所有者がプレイヤーならOK
  • アイテムのセルの所有者が他人ならNG
  • アイテムのセルの所有者がいないならアイテムの所有組織を調べる
  • アイテムの所有組織がプレイヤーの所属組織ならOK
  • アイテムの所有組織がプレイヤーの所属組織でないならNG
  • アイテムの所有組織がないならアイテムのセルの所有組織を調べる
  • アイテムのセルの所有組織がプレイヤーの所属組織ならOK
  • アイテムのセルの所有組織がプレイヤーの所属組織でないならNG
  • アイテムのセルの所有組織がないならOK

Papyrusのサンプルコードを以下に示します。

354 (papyrus)

Function CheckItemOwner()
    ObjectReference kTarget = Game.GetCurrentCrosshairRef()

    if !kTarget
        return
    endif

    Int iType = kTarget.GetBaseObject().GetType()

    ; kContainer/kArmor/kAmmo/kWeapon
    if iType == 28 || iType == 26 || iType == 42 || iType == 41
        ActorBase kActorOwner = kTarget.GetActorOwner()

        if !kActorOwner
            kActorOwner = kTarget.GetParentCell().GetActorOwner()
        endif

        if kActorOwner == Game.GetPlayer().GetActorBase()
            Debug.Trace("actor owner is player")
        elseif kActorOwner
            Debug.Trace("actor owner is " + kActorOwner.GetName())
        else
            Faction kFactionOwner = kTarget.GetFactionOwner()

            if !kFactionOwner
                kFactionOwner = kTarget.GetParentCell().GetFactionOwner()
            endif

            if !kFactionOwner
                Debug.Trace("faction owner is none")
            elseif Game.GetPlayer().IsInFaction(kFactionOwner)
                Debug.Trace("faction owner is player")
            else
                Debug.Trace("faction owner is other")
            endif
        endif
    endif
EndFunction

タイトルとURLをコピーしました