FANDOM


Normaler Weise haben Interaktive Objekte immer ihr Handsymbol und es steht immer der selbe vordefinierte Text da. In DIE SIEDLER - Reich des Ostens kommen Handelsposten und auffüllbare Minen hinzu. Aber wie wäre es, wenn man den Text des Tooltip und das Bild auf dem Button selbst bestimmen könnte? Das wird nun möglich sein.

Texte und Button verändernBearbeiten

Alles was ein Interaktives Objekt benötigt ist einen Skriptnamen und ein Setup mit LordsTreasureDeliver oder MachSchatzTausch. Um Text und Bild zu verändern wird diese Funktion verwendet:

SetupIO(_eName,_icon,_title,_text)

ArgumenteBearbeiten

Argument Beschreibung
_eName

Skriptname der Entity

_icon

optional: Koordinaten der Buttontextur (siehe dazu: SetIcon) Wird hier nil angegeben, wird das Handsymbol verwendet.

_title

optional: Text der in der Titelleiste des Tooltips angezeigt werden soll. Wird hier nil angegeben, wird der Standarttext verwendet.

_text

optional: Text, der angezeigt werden soll. Wird hier nil angegeben, wird der Standarttext verwendet

AnwendungsbeispielBearbeiten

SetupIO("weltenbaum",{16, 4,},"Beschenken","So wie es Sitte ist, sollt auch Ihr dem Adler ein Geschenk darbringen.")

Beliebiger Entity einen Schalter zuordnenBearbeiten

Neben dem ändern der Schalter und der Beschreibung ermöglicht der Code auch ein beliebiges Objekt mit einem Schalter auszustatten. Alles was dafür benötigt wird, ist ein Skriptname. Zur Zeit ist es leider nicht möglich diesen Objekten Kosten zuzuweisen.

Stellen wir uns folgendes Szenario vor: Hakim buddelt auf einem Friedhof nach einer versteckten Schatztruhe. Man nehme eine Entities.XD_ScriptEntity und gebe ihr einen eindeutigen Skriptnamen. Nun wollen wir, das ein Schalter erscheint, mit dem der Spieler etwas auslösen kann. Zum Beispiel ein Briefing.

FunktionBearbeiten

local t = {
	Name = "graben",
	Button = {6,4,1,},
	Description = {
		Title = Umlaute("Schatzversteck"),
		Text = Umlaute("Hier wurde ein Schatz versteckt. Last Hakim danach graben."),
	},
	ShowDistance = 500,
	Action = function(_IO)
		GUI.SendScriptCommand("BriefingGraben()")
	end,
}
SetupInteractiveObject(t)

ErläuterungBearbeiten

Schlüssel Beschreibung
Name

Skriptname der Entity

Button Texturposition des Icons
Description.Title Titelleiste im Tooltip
Description.Text  Textfeld im Tooltip
ShowDistance optional: Auslösedistanz für den Ritter. Wird dieser Eintrag weggelassen, ist der Schalter dauerhaft eingeblendet
SingleUse optional: Wenn SingleUse false gesetzt wird, bleibt der Button nach dem klicken erhalten und kann erneut benutzt werden. Empfiehlt sich z.B. bei Durchgängen.
Action Callback nach klicken des Schalters. Als Argument wird der Table t übergeben und kann somit für das Callback verwendet werden.

Funktionen für das globale SkriptBearbeiten

Da sich alle Aktionen in der lokalen Skriptumgebung befinden, müssen Funktionen, die nur in der globalen Umgebung vorhanden sind an das globale Skript gesendet werden. Das betrifft fast alle Funktionen also kommst du besser, wenn du dir gleich eine Refferenz in das globale Skript erstellst.

Dazu gest du wie folgt vor:

  1. Erstelle deine Funktion im globalen Skript
  2. Schreibe GUI.SendScriptCommand("") in die Action des Objektes
  3. Trage zwischen die "" den Funktionsnamen deiner Funktion ein

FunktionscodeBearbeiten

Diese Funktionen müssen einmalig in der lokalen Skriptumgebung vorkommen.

-- INTERAKTIVE OBJEKTE --------------------------------------------------------------------
-- Version 5. 2013 ------------------------------------------------------------------------
function SetupIO(_eName,_button,_title,_text)
	assert(IsExisting(_eName),"LUA ERRRUN SetupIO : IO dosen't exist on the map.")
	if _text == nil then _text = "Interaktion möglich." end
	if _title == nil then _title = "Interaktives Objekt" end
	if _button == nil then _button = {14, 10} end
	
	local t = {
		Name = _eName,
		Button = _button,
		Description = {
			Title = Umlaute(_title),
			Text = Umlaute(_text),
		},
	}
	SetupInteractiveObject(t)
end

function SetupInteractiveObject(_table)
	g_Interaction.ActiveObjectsOnScreen = g_Interaction.ActiveObjectsOnScreen or {}
	TWA_IO = TWA_IO or {}
	if not _table.Button then
		_table.Button = {14, 10}
	end
	table.insert( TWA_IO, _table )
	
	if not IO_Init then
		ControlInteractiveObjectIconAndDescription()
		IO_Init = true
	end
end

function ControlInteractiveObjectIconAndDescription()
	GUI_Interaction.InteractiveObjectUpdate_OrigTWA_IO = GUI_Interaction.InteractiveObjectUpdate
	GUI_Interaction.InteractiveObjectUpdate = function()
		GUI_Interaction.InteractiveObjectUpdate_OrigTWA_IO()
		for i=1, #TWA_IO do
			local eType = Logic.GetEntityType(GetEntityId(TWA_IO[i].Name))
			local eTypeName = Logic.GetEntityTypeName(eType)
			
			for j=1, #g_Interaction.ActiveObjectsOnScreen do
				local path = "/InGame/Root/Normal/InteractiveObjects/"..j
				if XGUIEng.IsWidgetExisting(path) == 1 then
					local objectID = g_Interaction.ActiveObjectsOnScreen[j]
					local entityName = Logic.GetEntityName(objectID)
					
					if TWA_IO[i].Name == entityName then
						SetIcon(path,TWA_IO[i].Button)
					end
				end
			end
			if TWA_IO[i].ShowDistance ~= nil and not(string.find(eTypeName,"I_X_"))then
				local pos = GetPosition(TWA_IO[i].Name)
				local entities = {Logic.GetPlayerEntitiesInArea(1,0,pos.X,pos.Y,TWA_IO[i].ShowDistance,16)}
				
				local found = false
				if entities[1] > 0 then
					for k=1,#entities do
						if Logic.IsEntityInCategory(entities[k],EntityCategories.Hero) == 1 then
							found = true
						end
					end
				end
				if found and not TWA_IO[i].CustomIOUsed then
					ScriptCallback_ObjectInteraction(1,GetEntityId(TWA_IO[i].Name))
				else
					ScriptCallback_CloseObjectInteraction(1,GetEntityId(TWA_IO[i].Name))
				end
			else
				if not TWA_IO[i].CustomIOUsed then
					ScriptCallback_ObjectInteraction(1,GetEntityId(TWA_IO[i].Name))
				else
					ScriptCallback_CloseObjectInteraction(1,GetEntityId(TWA_IO[i].Name))
				end
			end
		end
	end
	
	GUI_Tooltip.SetNameAndDescription_OrigTWA_IO = GUI_Tooltip.SetNameAndDescription
	GUI_Tooltip.SetNameAndDescription = function(_TooltipNameWidget, _TooltipDescriptionWidget, _OptionalTextKeyName, _OptionalDisabledTextKeyName, _OptionalMissionTextFileBoolean)
		if XGUIEng.GetWidgetPathByID(XGUIEng.GetCurrentWidgetID()) == "/InGame/Root/Normal/InteractiveObjects/1" 
		or XGUIEng.GetWidgetPathByID(XGUIEng.GetCurrentWidgetID()) == "/InGame/Root/Normal/InteractiveObjects/2" then
			GUI_Tooltip.SetNameAndDescription_OrigTWA_IO(_TooltipNameWidget, _TooltipDescriptionWidget, _OptionalTextKeyName, _OptionalDisabledTextKeyName, _OptionalMissionTextFileBoolean)
			
			local number = tonumber(XGUIEng.GetWidgetNameByID(XGUIEng.GetCurrentWidgetID()))
			local objectID = g_Interaction.ActiveObjectsOnScreen[number]
			
			for i=1, #TWA_IO do
				if objectID == GetEntityId(TWA_IO[i].Name)then
					XGUIEng.SetText(_TooltipNameWidget, "{center}"..TWA_IO[i].Description.Title)
					XGUIEng.SetText(_TooltipDescriptionWidget, ""..TWA_IO[i].Description.Text)
					local TTH = XGUIEng.GetTextHeight(_TooltipDescriptionWidget, true)
					local W, H = XGUIEng.GetWidgetSize(_TooltipDescriptionWidget)
					XGUIEng.SetWidgetSize(_TooltipDescriptionWidget, W, TTH)
				end
			end
		else
			GUI_Tooltip.SetNameAndDescription_OrigTWA_IO(_TooltipNameWidget, _TooltipDescriptionWidget, _OptionalTextKeyName, _OptionalDisabledTextKeyName, _OptionalMissionTextFileBoolean)
		end
	end
	
	GUI_Interaction.InteractiveObjectClicked_Orig = GUI_Interaction.InteractiveObjectClicked
	GUI_Interaction.InteractiveObjectClicked = function()
		GUI_Interaction.InteractiveObjectClicked_Orig()
		local i = tonumber(XGUIEng.GetWidgetNameByID(XGUIEng.GetCurrentWidgetID()))
		local eID = g_Interaction.ActiveObjectsOnScreen[i]
		
		for i=1, #TWA_IO do
			if TWA_IO[i].Action ~= nil then
				if eID == GetEntityId(TWA_IO[i].Name)then
					if TWA_IO[i].SingleUse ~= false then
						TWA_IO[i].CustomIOUsed = true
					end
					TWA_IO[i].Action(TWA_IO[i])
				end
			end
		end
	end
end

Außerdem wird - sofern nicht schon vorhanden - die Umlaute-Funktion benötigt. Wenn du den Briefing-Code von Old MacDonald und/oder das NEP in deiner Map benutzt, ist diese Funktion automatisch enthalten.

WichtigBearbeiten

Es gibt nur zwei Plätze für Interaktive Objekte. Achte stets darauf, dass es im Bildschirmausschnitt maximal zwei aktivierte interaktive Objekte gibt. Zusätzliche Objekte können erst angezeigt werden, wenn einer der beiden Slots frei wird. Gibt es mehr als zwei aktive Objekte im Bildausschnitt wird normaler Weise eine Fehlermeldung ausgegeben, wenn DisplayScriptError aktiv ist.

Störung durch Adblocker erkannt!


Wikia ist eine gebührenfreie Seite, die sich durch Werbung finanziert. Benutzer, die Adblocker einsetzen, haben eine modifizierte Ansicht der Seite.

Wikia ist nicht verfügbar, wenn du weitere Modifikationen in dem Adblocker-Programm gemacht hast. Wenn du sie entfernst, dann wird die Seite ohne Probleme geladen.

Auch bei FANDOM

Zufälliges Wiki