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

Post Reply
stefanEgo
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

UI modding - support thread

Post by stefanEgo »

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://wiki.egosoft.com:1337/X%20Rebir ... 20support/ )
- im X Rebirth Wiki system reinschaust (English) (https://wiki.egosoft.com:1337/X%20Rebirth%20Wiki/)
- 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.

Direkte Links zu einigen Seiten im Wiki system:
UI Modding Changelog (English): https://wiki.egosoft.com:1337/X%20Rebir ... Changelog/
Last edited by stefanEgo on Fri, 24. Jul 15, 16:58, edited 5 times in total.
Stefan Hett
stefanEgo
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

Post by stefanEgo »

Detailed UI modding changes in 3.50 Beta 2: http://www.egosoft.com:8282/jira/issues ... ity%20DESC
Stefan Hett
stefanEgo
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

Post by stefanEgo »

UI Modding Versionsinformationen können jetzt direkt hier eingesehen werden: https://wiki.egosoft.com:1337/X%20Rebir ... Changelog/
Stefan Hett
FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

UI Modding

Post by FindolCaleb »

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: 25043
Joined: Sun, 2. Apr 06, 16:38
x4

Post by X2-Illuminatus »

***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.
Nun verfügbar! X3: Farnham's Legacy - Ein neues Kapitel für einen alten Favoriten

Die komplette X-Roman-Reihe jetzt als Kindle E-Books! (Farnhams Legende, Nopileos, X3: Yoshiko, X3: Hüter der Tore, X3: Wächter der Erde)

Neuauflage der fünf X-Romane als Taschenbuch

The official X-novels Farnham's Legend, Nopileos, X3: Yoshiko as Kindle e-books!
stefanEgo
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

Post by stefanEgo »

@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
stefanEgo
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

Post by stefanEgo »

@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
FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

Post by FindolCaleb »

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
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

Post by stefanEgo »

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
FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

Post by FindolCaleb »

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
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

Post by stefanEgo »

@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
FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

Post by FindolCaleb »

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
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

Post by stefanEgo »

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
stefanEgo
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

Post by stefanEgo »

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
FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

Post by FindolCaleb »

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.
FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

Post by FindolCaleb »

Ich habe das Handesbeschränkungsmenu (traderestrictions menu) endlich zum laufen bekommen.
Ich werde den Code entsprechend in dem Wiki ablegen, damit es nachvollziebar wird.

Bekannte Probleme:
- Nach ändern der Beschräkungen von ja auf nein oder umgekehrt, muss das Menu einmal geschlossen werden, damit dies Angezeigt wird.
- Das MIndesbuget des Handelsmanagers wird nicht gesenkt obwohl alle Waren als Beschränkt eingestellt waren


@stefan
Gilt die Änderung der tradewares auch für das priceoverridesystem ? Ich würde dieses auch sehr gerne mit den Handelswaren ergänzen.
stefanEgo
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

Post by stefanEgo »

@FindolCaleb: Freut mich, dass es bei dir jetzt klappt.
Eine Übersicht der unterstützten Funktionen findest du hier:
https://wiki.egosoft.com:1337/X%20Rebir ... 0overview/
https://wiki.egosoft.com:1337/X%20Rebir ... 0overview/

Schau mal ob du mit dem vorhandenen zurecht kommst um die Änderungen am priceoverridesystem zu machen. Wenn etwas feld, kannst du hier gerne bescheid geben.

Du kannst auch die Anzeige eines Menus aktualisieren, ohne dass die geschlossen und wieder geoeffnet werden muss. Die map (menu_map.lua) macht das z.B. um die Tabelle der gefundenen Objekte zu aktualisieren.

Habe auch gerade dein Tutorial im Wiki system angesehen. Vielen Dank für's Zusammenfassen. :-)
Ich war so frei und habe die Artikel im Wikisystem in Sprachbereiche (Deutsch/Englisch) aufgeteilt und deinen Artikel entsprechend aufgesplittet.
Btw. wenn du in Confluence "{code" (ohne Anführungszeichen) schreibst und das Code-Makro auswählst kannst du einen Code-Bereich erstellen (habe das für deine Code-Beispiele mal gemacht).
Stefan Hett
FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

Post by FindolCaleb »

Das priceoverridemenu funktioniert nun auch einwandfrei.

@Stefan:
Danke das du das ganze noch etwas sortiert hast, und danke für die Links. Ich werde mich auch noch weiter mit den Lua beschäftigen, aber jetzt hab ich erstmal probleme mit dem Handel der Abbaufunktion von Schiffen die sich der Station angeschlossen haben. :D

Hast du vll eine Idee woran es liegen kann, dass das Mindesbuget nicht gesenkt wird ?
stefanEgo
Posts: 545
Joined: Thu, 11. Apr 13, 14:12
x4

Post by stefanEgo »

Nicht direkt. Vielleicht fragst du in diesem Forum mal in einem separaten Thread. Könnte sein, dass da jemand anderes was weiss.
Stefan Hett
FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

Post by FindolCaleb »

Ja ich hab ja schon ne Ahnung, aber ist halt immer etwas arbeit es genau rauszufinden :D.
Post Reply

Return to “X Rebirth - Scripts und Modding”