横着する方法
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