UI modding - support thread

Hier ist der ideale Ort um über Scripts und Mods für X Rebirth zu diskutieren.

Moderators: Moderatoren für Deutsches X-Forum, Scripting / Modding Moderators

stefanEgo
EGOSOFT
EGOSOFT
Posts: 443
Joined: Thu, 11. Apr 13, 14:12

UI modding - support thread

Post by stefanEgo » Fri, 20. Feb 15, 02:26

Dieser Thread dient als Plattform für Fragen und Probleme rund um das modifizieren des UIs.

Bevor du hier postest wäre es sinnvoll, wenn du zunächst einmal:
- in die UI Modding Dokumentation stöberst (Englisch) ( https://www.egosoft.com:8444/confluence ... dding+Home )
- im X Rebirth Wiki system reinschaust ( https://www.egosoft.com:8444/confluence ... birth+Wiki )
- im Bugtracker schaust, ob dein Problem schon bekannt ist ( https://www.egosoft.com:8443/jira/browse/XRUIMOD )
- im Forum und in diesem Thread suchst ob deine Frage/Problem bereits beantwortet wurde

Falls nichts hiervon zutrifft, trage deinen Bug/Frage einfach in den Bugtracker ein und/oder poste einfach in diesem Thread.

Hier noch einige shortcuts für den Bugtracker:
UI Modding changelog: https://www.egosoft.com:8443/jira/brows ... elog-panel
geplante Änderungen in einer späteren Version (Achtung!!! Diese fixes-changes wurden noch nicht bestätigt - Einträge die hier stehen können unter Umständen auch wieder entfallen!): https://www.egosoft.com:8443/jira/brows ... dmap-panel
Direkter Link zur Übersicht über noch nicht gefixte/gelöste Issues/Feature Requests bzw. Fixes/Feature requests in einer Version die noch nicht erschienen ist: https://www.egosoft.com:8443/jira/issue ... ity%20DESC

Direkte Links zu einigen Seiten im Wiki system:
UI Modding Changelog: https://www.egosoft.com:8444/confluence ... /Changelog
Last edited by stefanEgo on Fri, 24. Jul 15, 16:58, edited 5 times in total.
Stefan Hett, UI Engine Architect

stefanEgo
EGOSOFT
EGOSOFT
Posts: 443
Joined: Thu, 11. Apr 13, 14:12

Post by stefanEgo » Fri, 27. Feb 15, 23:43

Detailed UI modding changes in 3.50 Beta 2: http://www.egosoft.com:8282/jira/issues ... ity%20DESC
Stefan Hett, UI Engine Architect

stefanEgo
EGOSOFT
EGOSOFT
Posts: 443
Joined: Thu, 11. Apr 13, 14:12

Post by stefanEgo » Tue, 3. Mar 15, 14:40

UI Modding Versionsinformationen können jetzt direkt hier eingesehen werden: https://www.egosoft.com:8444/confluence ... /Changelog
Stefan Hett, UI Engine Architect

FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34

UI Modding

Post by FindolCaleb » Sun, 5. Jul 15, 17:17

Hallo,

ich wollte mich einmal hier erkundigen, ob und vor allem wie es möglich ist die UI, also das Menüsystem zu modden. konkret möchte ich für meine Handelsstation in der Preisliste und in der Traderestriction list die Handelswaren hizufügen.

Also eben die Frage, wie ich an die UI rankomme.

Ich hoffe es findet sich jemand der etwas weiß.
Schon mal danke.

Gruß
Findol

User avatar
X2-Illuminatus
Moderator (Deutsch)
Moderator (Deutsch)
Posts: 20944
Joined: Sun, 2. Apr 06, 16:38

Post by X2-Illuminatus » Sun, 5. Jul 15, 17:33

***Frage verschoben in UI Modding Support Thread***


stefanEgo hat weiter oben die UI-Modding-Doku verlinkt. Darüber hinaus wird im englischen Supportthema bereits seit einiger Zeit fleißig diskutiert. Vielleicht findest du dort auch bereits Antworten oder Anregungen.
Besteht Interesse an einem Nopileos-Hörbuch?

Farnhams Legende und Nopileos als E-Books!

"People who think they know everything are a great annoyance to those of us who do." - Isaac Asimov

"If it's not impossible, there must be a way to do it." - Sir Nicholas Winton

stefanEgo
EGOSOFT
EGOSOFT
Posts: 443
Joined: Thu, 11. Apr 13, 14:12

Post by stefanEgo » Mon, 6. Jul 15, 15:26

@FindolCaleb: Wie schon per PM erwähnt geht das was du vorhast momentan nur über den Umweg via MD. Dieser ist aber etwas kompliziert zu handhaben in deinem Fall. Ich habe für dich ein Feature-Request in unserer issue-DB angelegt ( http://www.egosoft.com:8282/jira/browse/XRUIMOD-38 ).
Stefan Hett, UI Engine Architect

stefanEgo
EGOSOFT
EGOSOFT
Posts: 443
Joined: Thu, 11. Apr 13, 14:12

Post by stefanEgo » Fri, 10. Jul 15, 17:02

@FindolCaleb: With the latest beta (3.60 Beta 3) we've added means so you can access that data directly from Lua. Pls let me know whether this suites ur needs.
Stefan Hett, UI Engine Architect

FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34

Post by FindolCaleb » Sun, 12. Jul 15, 12:05

Super danke, ich werde dann mal versuchen ob das ganze jetzt klappt.
Kannst du vll noch ein Minimalbeispiel posten (gerne auch im Supportforum) um zb. in eine bestehende lua neue inhalte einzufügen.
Bisher habe ich nur gefunden, wie man neue Dateien erstellt.

stefanEgo
EGOSOFT
EGOSOFT
Posts: 443
Joined: Thu, 11. Apr 13, 14:12

Post by stefanEgo » Tue, 14. Jul 15, 16:27

Es gibt noch so einige Sachen die wir gerne weitergehend dokumentieren würden (ein Minimalbeispiel wäre auch soetwas). Im englischen Forum hat ein User bereits soetwas gemacht: http://forum.egosoft.com/viewtopic.php?t=377561

Was UI-modding angeht, so läuft das ein wenig anders als die anderen Bereiche. Hier patchst du grundsätzlich keine existierenden Dateien, sondern schreibst deine eigenen scripte und hookst dich ggf. in existierende ein.

Wenn du Interesse hast so eine Dokumentation zu schreiben, melde dich gerne bei mir. Eine derartige Doku in Confluence hinzuzufügen wäre sicherlich für andere Nutzer auch sehr hilfreich.
Stefan Hett, UI Engine Architect

FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34

Post by FindolCaleb » Tue, 14. Jul 15, 22:13

Interesse durchaus, und es währe auch schnell gemacht, wenn es nur einfach mal funktionieren würde was ich möchte.
Ich habe mich sowohl mit wysiwyg und YorricVander unterhalten und ihre MOD's als Anschauungsobjekte bekommen, leider funktioniert keine der beiden Methoden. Derzeit habe ich folgendes:

ui.xml:

Code: Select all

<addon name="FC_Traderestriction" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Temp\Rebirth\ui\core\addon.xsd">
  <environment type="detailmonitor">
    <file name="ui/addon/ego_detailmonitor/FC_menu_traderestrictions.lua" />
    <dependency name="ego_detailmonitor" />
  </environment>
</addon>
Dies Sagt, dass ich eine lua Datei hinzufüge. (Soweit ich das richtig verstanden habe)

Dann habe cih die entsprechende Datei gechrieben, wobei ich lediglich die bestehende Datei genommen habe und einige Zeilen hinzugefügt habe, welche mit einen -- hinzugefügt makiert sind. Hinzugefügt habe ich innerhalb der GetComponentData() funktion das tradeware. Anschließend habe ich noch die Registereinträge der produkte kopiert und für die Tradeware verwendet.

Code: Select all

local menu = {
	name = "TradeRestrictionsMenu",
	transparent = { r = 0, g = 0, b = 0, a = 0 }
}

local function init()
	Menus = Menus or { }
	table.insert(Menus, menu)
	if Helper then
		Helper.registerMenu(menu)
	end
	return
end -- Aus dem Hauptcode kopiert.

menu.cleanup function() 
   menu.title = nil
	menu.entity = nil
	menu.traderestrictions = {}
	menu.products = {}
	menu.resources = {}
	menu.tradeware = {} --hinzugefügt--
	
	menu.infotable = nil
	menu.selecttable = nil
	return
end

menu.buttonTradeRestriction function()
ToggleFactionTradeRestriction(menu.object)
	menu.showMenu()
return
end

menu.buttonWareRestriction function(ware)
ToggleFactionTradeWareOverride(menu.object, ware)
	menu.showMenu()
	return
end

menu.buttonRestriction function()
	local rowdata = menu.rowDataMap[Helper.currentDefaultTableRow]
	if rowdata[1] == "global" then
		menu.buttonTradeRestriction()
	elseif rowdata[1] == "ware" then
		menu.buttonWareRestriction(rowdata[2])
	end
	return
end

menu.onShowMenu function()
menu.entity = menu.param[3]
	menu.object = GetContextByClass(menu.entity, "container")

	menu.showMenu()
	return
end

menu.showMenu function()
Helper.removeAllButtonScripts(menu)

	menu.traderestrictions = GetTradeRestrictions(menu.object)
	menu.products, menu.resources, menu.tradeware = GetComponentData(menu.object, "products", "resources", "tradeware") --geändert--
	
	local setup = Helper.createTableSetup(menu)

	local name, typestring, typeicon, typename, owner, ownericon = GetComponentData(menu.entity, "name", "typestring", "typeicon", "typename", "owner", "ownericon")
	menu.typestring = typestring
	menu.owner = owner
	setup:addTitleRow{
		Helper.createIcon(typeicon, false, 255, 255, 255, 100, 0, 0, Helper.headerCharacterIconSize, Helper.headerCharacterIconSize),
		Helper.createFontString(typename .. " " .. name, false, "left", 255, 255, 255, 100, Helper.headerRow1Font, Helper.headerRow1FontSize),
		Helper.createIcon(ownericon, false, 255, 255, 255, 100, 0, 0, Helper.headerCharacterIconSize, Helper.headerCharacterIconSize)	-- text depends on selection
	}
	
	setup:addTitleRow({
		Helper.getEmptyCellDescriptor()
	}, nil, {3})
	
	local infodesc = setup:createCustomWidthTable({ Helper.scaleX(Helper.headerCharacterIconSize), 0, Helper.scaleX(Helper.headerCharacterIconSize) + 37 }, false, true)

	setup = Helper.createTableSetup(menu)

	setup:addSimpleRow({
		ReadText(1001, 4202),
		menu.traderestrictions.faction and ReadText(1001, 2617) or ReadText(1001, 2618)
	}, {"global"}, {2, 1})

	setup:addHeaderRow({
		ReadText(1001, 41),
		ReadText(1001, 4600)
	}, nil, {2, 1})
	for _, ware in ipairs(menu.resources) do
		local restricted
		if next(menu.traderestrictions.overrides) and (menu.traderestrictions.overrides[ware] ~= nil) then
			restricted = menu.traderestrictions.overrides[ware]
		else
			restricted = menu.traderestrictions.faction
		end
		setup:addSimpleRow({
			GetWareData(ware, "name"),
			restricted and ReadText(1001, 2617) or ReadText(1001, 2618)
		}, {"ware", ware}, {2, 1})
	end

	setup:addHeaderRow({
		ReadText(1001, 1610)
	}, nil, {3})
	for _, ware in ipairs(menu.products) do
		local restricted
		if menu.traderestrictions.overrides[ware] ~= nil then
			restricted = menu.traderestrictions.overrides[ware]
		else
			restricted = menu.traderestrictions.faction
		end
		setup:addSimpleRow({
			GetWareData(ware, "name"),
			restricted and ReadText(1001, 2617) or ReadText(1001, 2618)
		}, {"ware", ware}, {2, 1})
	end
	--hinzugefügt--
	setup:addHeaderRow({
		ReadText(90903, 001),
	}, nil, {4})--geändert in vier
	for _, ware in ipairs(menu.tradeware) do
		local restricted
		if next(menu.traderestrictions.overrides) and (menu.traderestrictions.overrides[ware] ~= nil) then
			restricted = menu.traderestrictions.overrides[ware]
		else
			restricted = menu.traderestrictions.faction
		end
		setup:addSimpleRow({
			GetWareData(ware, "name"),
			restricted and ReadText(1001, 2617) or ReadText(1001, 2618)
		}, {"ware", ware}, {2, 1})
	end
	setup:addFillRows(15)
	
	local selectdesc = setup:createCustomWidthTable({Helper.standardButtonWidth, 0, 300}, false, false, true, 1, 0, 0, Helper.tableCharacterOffsety, 463)

	-- button table
	setup = Helper.createTableSetup(menu)
	setup:addSimpleRow({ 
		Helper.getEmptyCellDescriptor(),
		Helper.createButton(Helper.createButtonText(ReadText(1001, 2669), "center", Helper.standardFont, 11, 255, 255, 255, 100), nil, false, true, 0, 0, 150, 25, nil, Helper.createButtonHotkey("INPUT_STATE_DETAILMONITOR_B", true)),
		Helper.getEmptyCellDescriptor(),
		Helper.getEmptyCellDescriptor(),
		Helper.getEmptyCellDescriptor(),
		Helper.getEmptyCellDescriptor(),
		Helper.getEmptyCellDescriptor(),
		Helper.createButton(Helper.createButtonText(ReadText(1001, 3105), "center", Helper.standardFont, 11, 255, 255, 255, 100), nil, false, true, 0, 0, 150, 25, nil, Helper.createButtonHotkey("INPUT_STATE_DETAILMONITOR_X", true)),
		Helper.getEmptyCellDescriptor()
	}, nil, nil, false, menu.transparent)
	local buttondesc = setup:createCustomWidthTable({48, 150, 48, 150, 0, 150, 48, 150, 48}, false, false, true, 2, 1, 0, 555, 0, false)

	-- create tableview
	menu.infotable, menu.selecttable, menu.buttontable = Helper.displayThreeTableView(menu, infodesc, selectdesc, buttondesc, false)

	-- set button scripts
	Helper.setButtonScript(menu, nil, menu.buttontable, 1, 2, function () return menu.onCloseElement("back") end)
	Helper.setButtonScript(menu, nil, menu.buttontable, 1, 8, menu.buttonRestriction)

	-- clear descriptors again
	Helper.releaseDescriptors()
	return
end
-- Note here that I'm using the onUpdate function so I need to set an update interval - I access this via my local copy of the vanilla menu
emt_menu.updateInterval = 0.5
Funcs.EMT_onUpdate = function()
return
end

menu.onRowChanged function(row, rowdata)

return
end

menu.onSelectElement function()
return
end

menu.onCloseElement function(dueToClose)
if menu.interactive then
		if dueToClose == "close" then
			Helper.closeMenuAndCancel(menu)
			menu.cleanup()
		else
			Helper.closeMenuAndReturn(menu)
			menu.cleanup()
		end
	else
		if dueToClose == "close" then
			Helper.closeNonInteractiveMenuAndCancel(menu)
			menu.cleanup()
		else
			Helper.closeNonInteractiveMenuAndReturn(menu)
			menu.cleanup()
		end
	end
	return
end
init()
return
Dies ist eine Methode welche ich geunden habe, aber leider funktioniert diese nicht. Auch nach dem in dem Link gegebenen Tutorial hat sich bei mir kein Ergebniss gezeigt.
Interessant ist, dass der debuglog nichts anzeigt.

stefanEgo
EGOSOFT
EGOSOFT
Posts: 443
Joined: Thu, 11. Apr 13, 14:12

Post by stefanEgo » Wed, 15. Jul 15, 10:30

@ui.xml: Du solltest keine eigenen Dateien in ego_xxxx addons legen. Ich würde empfehlen, dass du deine FC_menu_traderestrictions.lua in dein eigenes Addon packst (sprich: <file name="ui/FC_menu_traderestrictions.lua" />
Damit sollte die Datei dann bei dir unter extensions/alpha_trade/ui/FC_menu_traderestrionc.lua liegen.

@ersetzen eines gesamten Menüs:
Wenn du, wie in deinem Fall, ein gesamtes Menü ersetzen willst, solltest du das alte menü aus dem Register entfernen. Dazu gibt es die Funktion Helper.unregisterMenu (siehe ego_detailmonitorHelper/helper.lua).

Bei dir also in init():

Code: Select all

Menus = Menus or {}
for _, curmenu in Menus do
   if curmenu.name == "TradeRestrictionsMenu" then
      Helper.unregisterMenu(curmenu)
      break
   end
end
gefolgt von der Registrierung deines menus.

Darüberhinaus solltest du im ui.xml dann die Abhängigkeit auf ego_detailmonitorHelper setzen, da du das Helper-Modul nutzt.

Als Alternative zum gesamten Ersetzen des Menus, kannst du dich aber genauso in das existierende TradeRestrionsMenu hooken.

Das wäre dann in etwa so (pseudocode):

Code: Select all

local orgfunc = nil

local function init()
   Menus = Menus or {}
   for _, curmenu in Menus do
      if curmenu.name == "TradeRestrictionsMenu" then
         orgfunc = curmenu.theorgfunc
         curmenu.theorgfunc = myreplacementfunc
      end
   end
end

local function myreplacementfunc(arg1, arg2, arg3...)
   -- call orgfunc (or don't --- depending on what u want to do)
   orgfunc(arg1, arg2, arg3,...)

  -- do whatever u want to do here...
end
Stefan Hett, UI Engine Architect

FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34

Post by FindolCaleb » Wed, 15. Jul 15, 11:14

Ahh super danke dir. Ich werde das mal testen. Sollte das so funktionieren, dann schreibe ich eine gesamte Zusammenfassung des Vorgangs und werde das auch gleich auf das Preismenu mit anwenden. Ich werde das mit dem hooken dann probieren wenn das ersetzen funkioniert und auch dann eine kleine Anleitung schreiben.

Danke stefan das du dir für das ganze Zeit nimmst.
Hier einmal die Version wie ich sie dann verstanden habe:

ui.xml:


Code: Select all

<addon name="FC_Traderestriction" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Temp\Rebirth\ui\core\addon.xsd">
  <environment type="detailmonitor">
    <file name="ui/addon/ego_detailmonitor/FC_menu_traderestrictions.lua" />
    <dependency name="ego_detailmonitorHelper" />
  </environment>
</addon>
und die Hauptdatei




Code: Select all


local function init()
  Menus = Menus or {}
for _, curmenu in Menus do
   if curmenu.name == "TradeRestrictionsMenu" then
      Helper.unregisterMenu(curmenu)
      break
   end
end 

local menu = {
   name = "TradeRestrictionsMenu",
   transparent = { r = 0, g = 0, b = 0, a = 0 }
}
HIer dann einfach das kopierte und erweiterte Menu

Leider tut sich auch in dieser Konfiguraation nichts.

Weiterhin habe ich auch folgenden Code ausprobiert und somit basierend auf dem hier geposteten Link für das kleine Tutorial von wysiwyg

Code: Select all

local FC_menu = {}
local Funcs = {}

local function init()
	for _, menu in ipairs(Menus) do
    if menu.name == "TradeRestrictionsMenu" then
      FC_menu = menu
      
      menu.cleanup = Funcs.FC_cleanup
	  menu.buttonTradeRestriction = Funcs.FC_buttonTradeRestriction
	  menu.buttonWareRestriction = Funcs.FC_buttonWareRestriction
	  menu.buttonRestriction = Funcs.FC_buttonRestriction
	  menu.onShowMenu = Funcs.FC_onShowMenu
	  menu.showMenu = Funcs.FC_showMenu
	  menu.onUpdate = Funcs.FC_onUpdate
	  menu.onRowChanged = Funcs.FC_onRowChanged
	  menu.onSelectElement = Funcs.FC_onSelectElement
	  menu.onCloseElement = Funcs.FC_onCloseElement
      break
    end
  end
end

 function Funcs.FC_cleanup() 
 local menu= FC_menu
   menu.title = nil
	menu.entity = nil
	menu.traderestrictions = {}
	menu.products = {}
	menu.resources = {}
	menu.tradeware = {} --hinzugefügt--
	
	menu.infotable = nil
	menu.selecttable = nil

end

function Funcs.FC_buttonTradeRestriction ()
 local menu= FC_menu
ToggleFactionTradeRestriction(menu.object)
	menu.showMenu()

end

function Funcs.FC_buttonWareRestriction(ware)
 local menu= FC_menu
ToggleFactionTradeWareOverride(menu.object, ware)
	menu.showMenu()
	
end

function Funcs.FC_buttonRestriction ()
 local menu= FC_menu
	local rowdata = menu.rowDataMap[Helper.currentDefaultTableRow]
	if rowdata[1] == "global" then
		menu.buttonTradeRestriction()
	elseif rowdata[1] == "ware" then
		menu.buttonWareRestriction(rowdata[2])
	end

end

function Funcs.FC_onShowMenu ()
 local menu= FC_menu
menu.entity = menu.param[3]
	menu.object = GetContextByClass(menu.entity, "container")

	menu.showMenu()

end

function Funcs.FC_showMenue ()
 local menu= FC_menu
Helper.removeAllButtonScripts(menu)

	menu.traderestrictions = GetTradeRestrictions(menu.object)
	menu.products, menu.resources, menu.tradeware = GetComponentData(menu.object, "products", "resources", "tradeware") --hhinzugefügt--
	
	local setup = Helper.createTableSetup(menu)

	local name, typestring, typeicon, typename, owner, ownericon = GetComponentData(menu.entity, "name", "typestring", "typeicon", "typename", "owner", "ownericon")
	menu.typestring = typestring
	menu.owner = owner
	setup:addTitleRow{
		Helper.createIcon(typeicon, false, 255, 255, 255, 100, 0, 0, Helper.headerCharacterIconSize, Helper.headerCharacterIconSize),
		Helper.createFontString(typename .. " " .. name, false, "left", 255, 255, 255, 100, Helper.headerRow1Font, Helper.headerRow1FontSize),
		Helper.createIcon(ownericon, false, 255, 255, 255, 100, 0, 0, Helper.headerCharacterIconSize, Helper.headerCharacterIconSize)	-- text depends on selection
	}
	
	setup:addTitleRow({
		Helper.getEmptyCellDescriptor()
	}, nil, {3})
	
	local infodesc = setup:createCustomWidthTable({ Helper.scaleX(Helper.headerCharacterIconSize), 0, Helper.scaleX(Helper.headerCharacterIconSize) + 37 }, false, true)

	setup = Helper.createTableSetup(menu)

	setup:addSimpleRow({
		ReadText(1001, 4202),
		menu.traderestrictions.faction and ReadText(1001, 2617) or ReadText(1001, 2618)
	}, {"global"}, {2, 1})

	setup:addHeaderRow({
		ReadText(1001, 41),
		ReadText(1001, 4600)
	}, nil, {2, 1})
	for _, ware in ipairs(menu.resources) do
		local restricted
		if next(menu.traderestrictions.overrides) and (menu.traderestrictions.overrides[ware] ~= nil) then
			restricted = menu.traderestrictions.overrides[ware]
		else
			restricted = menu.traderestrictions.faction
		end
		setup:addSimpleRow({
			GetWareData(ware, "name"),
			restricted and ReadText(1001, 2617) or ReadText(1001, 2618)
		}, {"ware", ware}, {2, 1})
	end

	setup:addHeaderRow({
		ReadText(1001, 1610)
	}, nil, {3})
	for _, ware in ipairs(menu.products) do
		local restricted
		if menu.traderestrictions.overrides[ware] ~= nil then
			restricted = menu.traderestrictions.overrides[ware]
		else
			restricted = menu.traderestrictions.faction
		end
		setup:addSimpleRow({
			GetWareData(ware, "name"),
			restricted and ReadText(1001, 2617) or ReadText(1001, 2618)
		}, {"ware", ware}, {2, 1})
	end
	--hinzugefügt beginn--
	setup:addHeaderRow({
		ReadText(90903, 001),
	}, nil, {4})--geändert in vier
	for _, ware in ipairs(menu.tradeware) do
		local restricted
		if next(menu.traderestrictions.overrides) and (menu.traderestrictions.overrides[ware] ~= nil) then
			restricted = menu.traderestrictions.overrides[ware]
		else
			restricted = menu.traderestrictions.faction
		end
		setup:addSimpleRow({
			GetWareData(ware, "name"),
			restricted and ReadText(1001, 2617) or ReadText(1001, 2618)
		}, {"ware", ware}, {2, 1})
	end
	--Hinzugefügt ende--
	setup:addFillRows(15)
	
	local selectdesc = setup:createCustomWidthTable({Helper.standardButtonWidth, 0, 300}, false, false, true, 1, 0, 0, Helper.tableCharacterOffsety, 463)

	-- button table
	setup = Helper.createTableSetup(menu)
	setup:addSimpleRow({ 
		Helper.getEmptyCellDescriptor(),
		Helper.createButton(Helper.createButtonText(ReadText(1001, 2669), "center", Helper.standardFont, 11, 255, 255, 255, 100), nil, false, true, 0, 0, 150, 25, nil, Helper.createButtonHotkey("INPUT_STATE_DETAILMONITOR_B", true)),
		Helper.getEmptyCellDescriptor(),
		Helper.getEmptyCellDescriptor(),
		Helper.getEmptyCellDescriptor(),
		Helper.getEmptyCellDescriptor(),
		Helper.getEmptyCellDescriptor(),
		Helper.createButton(Helper.createButtonText(ReadText(1001, 3105), "center", Helper.standardFont, 11, 255, 255, 255, 100), nil, false, true, 0, 0, 150, 25, nil, Helper.createButtonHotkey("INPUT_STATE_DETAILMONITOR_X", true)),
		Helper.getEmptyCellDescriptor()
	}, nil, nil, false, menu.transparent)
	local buttondesc = setup:createCustomWidthTable({48, 150, 48, 150, 0, 150, 48, 150, 48}, false, false, true, 2, 1, 0, 555, 0, false)

	-- create tableview
	menu.infotable, menu.selecttable, menu.buttontable = Helper.displayThreeTableView(menu, infodesc, selectdesc, buttondesc, false)

	-- set button scripts
	Helper.setButtonScript(menu, nil, menu.buttontable, 1, 2, function () return menu.onCloseElement("back") end)
	Helper.setButtonScript(menu, nil, menu.buttontable, 1, 8, menu.buttonRestriction)

	-- clear descriptors again
	Helper.releaseDescriptors()

end
-- Note here that I'm using the onUpdate function so I need to set an update interval - I access this via my local copy of the vanilla menu
FC_menu.updateInterval = 1.0
function menu.onUpdate()


end

function Funcs.FC_onRowChanged (row, rowdata)


end

function Funcs.FC_onSelectElement ()

end

 function Funcs.FC_onCloseElement(dueToClose)
  local menu= FC_menu
if menu.interactive then
		if dueToClose == "close" then
			Helper.closeMenuAndCancel(menu)
			menu.cleanup()
		else
			Helper.closeMenuAndReturn(menu)
			menu.cleanup()
		end
	else
		if dueToClose == "close" then
			Helper.closeNonInteractiveMenuAndCancel(menu)
			menu.cleanup()
		else
			Helper.closeNonInteractiveMenuAndReturn(menu)
			menu.cleanup()
		end
	end

end
init()
Auch hier leider kein Ergebniss

stefanEgo
EGOSOFT
EGOSOFT
Posts: 443
Joined: Thu, 11. Apr 13, 14:12

Post by stefanEgo » Wed, 15. Jul 15, 18:32

Da sind leider noch so einige Fehler drin...

Wie oben geschrieben, würde ich empfehlen das lua-script einfach in ein ui-Unterverzeichnis in deinem addon-verzeichnis zu packen. Es gibt keinen Grund, weswegen du da nochmal ein addon/ego_detailmonitor verzeichnis erstellst.

So könnte das ui.xml-file dann in etwa aussehen:

Code: Select all

<addon name="FC_Traderestriction" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="..\..\core\addon.xsd">
  <environment type="detailmonitor">
    <file name="ui/FC_menu_traderestrictions.lua" />
    <dependency name="ego_detailmonitorHelper" />
  </environment>
</addon>
Wenn du ein Menu ersetzen willst, rufst du Helper.unregisterMenu() mit dem vorhandenen Menu auf, musst dann aber auch dein Menu neu registrieren.

Hier ein Beispiel um das tradeRestrictionsMenu komplett zu ersetzen. Wenn es angezeigt wird, kommt jetzt anstelle des Menus eine Ausgabe im DebugLog:

Code: Select all

local menu = {
	name = "TradeRestrictionsMenu"
}

local function init()
	for _, curmenu in ipairs(Menus) do
		if curmenu.name == "TradeRestrictionsMenu" then
			Helper.unregisterMenu(curmenu)
			break
		end
	end

	Helper.registerMenu(menu)
end

function menu.onShowMenu()
	DebugError("Menu displayed...")
end

init() 
Stefan Hett, UI Engine Architect

stefanEgo
EGOSOFT
EGOSOFT
Posts: 443
Joined: Thu, 11. Apr 13, 14:12

Post by stefanEgo » Wed, 15. Jul 15, 19:13

Wir haben nun auch einen Bereich in unserem Wikisystem angelegt, in dem jeder Content erstellen kann.

https://www.egosoft.com:8444/confluence ... birth+Wiki

@FindolCaleb: Dort kannst du dann gerne deine eigene Dokumentation zum UI-Modding erstellen, falls du möchtest.
Stefan Hett, UI Engine Architect

FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34

Post by FindolCaleb » Thu, 16. Jul 15, 08:39

Cool danke, dass werde ich dann gerne tun, sobald der MIst funktioniert :wink:
Leider hab ich trotz zu Hilfe Name deiner Tipps und der anderer einfach nichts auf die Reihe bekommen. Es ist faszinierend, dass sich einfach nichts im Spiel tut.
Selbst das löschen des alten menus und das anzeigen im debuglog wie du es oben beschrieben hast funktioniert nicht. Ich habe nun alle Tipps berücksichtigt.
Ich habe sowohl einen eigenen Ordner für die lua Dateien angelegt und das eben in der ui.xml vermerkt.
Ich habe ebenso einfach mal in meiner lua Datei den code den du gepostet hast kopiert.
Dennoch tut sich leider nücht.

EDIT:
Ich habe den Gleichen EIntrag wie bei der Ui.xml noch einmal in der ego_detailmonitorHelper.xml durchgeführt und siehe da, das Menü existiert nicht mehr.
Nun muss ich es nur noch schaffen mein editiertes Menü einzufügen. Ich nehme mal an einfaches kopieren der Daten reicht da nicht aus?

EDIT2:
Ich habe es geschafft auf Basis des von wysiwyg erstellten Minitutorials also mit dem bereits oben geposteten code das Menü zu überschreiben.
Ich hatte auch hier vergessen die Daten in der Ego_detailmonitorHelper.xml zu adden.

Nun zeigt der debuglog folgendes Problem:
[gamestart: 77] - [07/16/15 16:17:21]: Error: C:/Program Files (x86)/Steam/steamapps/common/X Rebirth/extensions/trade_alpha/ui/FC_menu_traderestri...(77): GetComponentData(): Invalid argument 3, got unknown key 'tradeware'
und dazugehörig eben noch dieser
[=ERROR=] Error while executing onEvent script for event: showTradeRestrictionsMenu.
Errormessage: [string "extensions/trade_alpha/ui/FC_menu_traderestri..."]:124: bad argument #1 to 'ipairs' (table expected, got nil)
Der zweite Fehler bezieht sihc auf folgende Zeile:

Code: Select all

 setup:addHeaderRow({
      ReadText(1001, 41),
      ReadText(1001, 4600)
   }, nil, {2, 1})
   for _, ware in ipairs(menu.resources) do
      local restricted
      if next(menu.traderestrictions.overrides) and (menu.traderestrictions.overrides[ware] ~= nil) then
         restricted = menu.traderestrictions.overrides[ware]
      else
         restricted = menu.traderestrictions.faction
      end
      setup:addSimpleRow({
         GetWareData(ware, "name"),
         restricted and ReadText(1001, 2617) or ReadText(1001, 2618)
      }, {"ware", ware}, {2, 1})
   end
da natürlich vorhergehend die Tradewares nicht erkannt werden.
Außerdem gibt es den gleichen Fehler noch mit den Recourcen.

Post Reply

Return to “X Rebirth - Scripts und Modding”