factoriolib / flib

A set of high-quality, commonly-used utilities for creating Factorio mods.
https://mods.factorio.com/mod/flib
MIT License
61 stars 15 forks source link

i Test flib, and Factorio Crash #35

Closed 1Jonny closed 2 years ago

1Jonny commented 3 years ago

hallo, dein flib mod funktioniert bei mir nicht!

Beispiel von https://factoriolib.github.io/flib/modules/gui.html:

MeinMod.lua local gui = require("__flib__.gui") gui.build(player.gui.screen, { {type="frame", direction="vertical", handlers="window", save_as="window", children={ -- titlebar {type="flow", save_as="titlebar_flow", children={ {type="label", style="frame_title", caption="Menu", elem_mods={ignored_by_interaction=true}}, {type="empty-widget", style="flib_titlebar_drag_handle", elem_mods={ignored_by_interaction=true}}, {type="condition", condition=(not is_dialog_frame), children={ {template="frame_action_button", sprite="utility/close_white", handlers="titlebar.close_button", save_as="titlebar.close_button" } }} }}, {type="frame", style="inside_shallow_frame_with_padding", children={ {type="table", style="slot_table", column_count=10, save_as="content.slot_table"} }}, {type="condition", condition=is_dialog_frame, children={ {type="flow", style="dialog_buttons_horizontal_flow", children={ {type="button", style="back_button", caption={"gui.back"}, handlers="footer.back_button"}, {type="empty-widget", style="flib_dialog_footer_drag_handle", style_mods={right_margin=0}, save_as="footer.drag_handle" } }} }} }} }) Factorio crasht sofort, weil die variable "player" nicht existiert. (denn sie wurde nicht mit require eingebunden)

ich hab mir mal dein Mod angesehen, wieso hat eine funktions datenbank eine ❌ data.lua?❌ dein mod ist in einer Zip, und wird immer erst nach meinem mod geladen, außerdem sind variablen nicht außerhalb eines Zip mods verfügbar. in meinem KlartextTestModOrdner gibt es deine vars nicht mehr. alle funktionen die ich benötige sollten ausschlißlich durch die ✔️require✔️ funktion aktiviert werden.

simpel: local gui = require("flib.gui") -- = ok✔️ gui.build() -- = ok✔️ gui.build(player.gui.screen, {}) -- = Factorio Crash by ❌player❌

raiguard commented 3 years ago

Have you added flib as a dependency? It needs to load first in order for everything to work.

Add "flib >= 0.7.0" to the dependencies list in your mod's info.json.

As for why it has a data.lua, that is so it can load styles and sprites that you can use (such as flib_dialog_footer_drag_handle). I suppose I could change it so you have to require those, but that's not a huge issue.

Lastly, I'd recommend using gui-beta instead of gui, as it is much better designed and more performant. I intend to deprecate the old gui module very soon.

Also please, next time you get a crash, actually post what the crash said.

JanSharp commented 3 years ago

I'm assuming you got an error saying "unable to index global variable player a nil value" or something along those lines.

That means you most likely never got the player. There are several ways to get a LuaPlayer but the one you'd probaby need is getting it by index which is provided in the event data. A common thing you might come accross is

local player = game.get_player(event.player_index)

where event is the parameter name of the event handler and the given event actually has the player_index field.

If you are confused by terms, variables, scoping or just in general anything Lua related i'd recommend either reading the manual (control+F is your friend, chapter 3 might be a good place to start, then 1 and 2, all depends on your previous experience) or look up Lua tutorials if those are better for you. But always keep factorio's modifications to Lua in mind.

1Jonny commented 3 years ago

Sorry, die Fehlermeldung ist: 1.649 Error ModManager.cpp:1514: Fehler beim Laden der Mod „Jonnys-Stimmen“: Jonnys-Stimmen/data-updates.lua:13: attempt to index global 'player' (a nil value) stack traceback: Jonnys-Stimmen/data-updates.lua:13: in main chunk

eigentlich wollte ich dein Mod nur Testen, deswegen wollte ich ihn nicht extra zu den dependency hinzufügen. wenn das so wichtig ist, dann pack es auf jeder Seite an die spitze in die Tutorial Beschreibung: Add "flib >= 0.7.0" to the dependencies list in your mod's info.json. jetzt klappt alles einwandfrei.

aber für meinen Mod benötige ich nur Eine Kopie oder Neue Gui Oberfläche für Mein Programmierbaren Lautsprecher v2 ich muss also nur irgendwie ein Gui Oberflächen Type für alle Prototype zur Verfügung stellen so das ich das bei meinem Lautsprecher auswählen kann. wenn dann dafür in deinem Mod jedes mal alle Gui-Oberflächen zur Verfügung gestellt werden, obwohl ich sie nicht benötigt werden, dann erhöht sich die Ladezeit viel zu stark.

deswegen werde ich dein mod vielleicht nicht benutzen, oder mir die Benötigten Teile einfach Rauskopieren, oder es selbst programmieren.

dein Mod ist eine 50% Aktive Bibliothek! :( Ps: ich hoffe du verwandelst dein Mod möglichst schnell in eine 100% Passive Bibliothek die keine data.lua hat, und mit require() nur dann arbeitet wenn die Teile Benötigt werden.

vielen dank für Den Schnellen Support

Mit freundlichen Grüßen Jonny

1Jonny commented 3 years ago

es wahr doch nicht die Lösung, "flib >= 0.7.0" hat nur mein mod deaktiviert, weil ich eine ältere Version auf Factorio 1.0.0 hab.

denn ich entwickle mein Mod Parallel kompatible zu allen Versionen: Factorio 0.18.x = 018.0.5 --> 018.0.6 --> 018.0.7 Factorio 1.0.x = 100.0.5 --> 100.0.6 --> 100.0.7 Factorio 1.1.x = 110.0.5 --> 110.0.6 --> 110.0.7 Meine Versionen = 0.5 --> 0.6 --> 0.7

die erste Zahl Gibt die Factorio Version an, und die 2 und 3 gibt meine Version an. so ist meine Modbeschreibung Kompatible zu allen Versionen.

ich Modde für Factorio 1.0. ich hab es also zu "flib >= 0.5.0" geändert, und mein Mod hat wieder funktioniert. aber jetzt Crasht es auch wieder mit der selben Fehlermeldung: 1.276 Error ModManager.cpp:1514: Fehler beim Laden der Mod „Jonnys-Stimmen“: __Jonnys-Stimmen__/data.lua:16: attempt to index global 'player' (a nil value) stack traceback: __Jonnys-Stimmen__/data.lua:16: in main chunk

kannst du auch ein Tutorial für dein flib für Factorio 1.0 machen? denn ich entwickle auf 1.0 und update immer nur zu 1.1.

Der Grund ist das ich immer für die Letzte Factorio Hauptversion Mit entwickeln möchte, denn ich hab zb seit 1 Jahr ein Spielstand auf 1.0 und spiele da weiter, wenn ich updaten würde Müsste ich alle 6 Monate neu anfangen da es da viele mods nicht mehr gibt. Deswegen spiele ich immer nur auf den Letzten Großen Hauptversion von Factorio. Sobald Factorio 2.0 oder 1.5 Rauskommt dann fang ich da neu an. deswegen entwickle ich alle versionen ab 1.0 paralel. (und solange es Möglich ist entwickle ich sogar komplett alle Versionen Parallel)

Alternativ kannst du ja auch ein Tutorial.txt in deine Älteren versionen packen, das würde mir auch helfen.

JanSharp commented 3 years ago

(Ich schreibe jetzt in deutsch obwohl ich besser bin in english wenns ums programmieren geht um übersätzungs fehler zu verringern. Verzeihe meiner schlechten rechtschreibung)

Ich bin ein bisschen verwundert weil einersetz klingt es so als ob du schon modding erfahrung hättest aber gleichzeitig gibt es sachen wo es so scheint als ob du ganz neu wärst. Also nehme ich einfach an dass du neu bist.

Erstens den fehler den du hier hast ist kein problem mit der bibliothek. Ich habe schon in meinem ersten kommentar erklärt was das problem ist allerdings hier ist es nochmal in deutsch: Du hast dir nicht eine instanz von LuaPlayer geholt und die wahrscheinlichkeit ist hoch dass du in einem event bist wo das Feld player_index existiert. Dh: du möchtest etwas wie dies: (nicht getested)

local gui = require("__flib__.gui-beta")

script.on_event(defines.events.on_player_created, function(event)
  local player = game.get_player(event.player_index)
  gui.build(player.gui.screen, {
    {
      type = "frame",
      direction = "vertical",
      elem_mods = {auto_center = true},
      caption = "Hello World!",
    },
  })
end)

(edit: for anyone in the future reading this, this example is incomplete. See this page which is currently an example, or just in general refer to the docs)

Allerdings sehe ich auch in deiner zweiten nachricht dass du in data.lua bist. Das bedeutet dass du versuchst control stage code in data stage auszuführen. Das funktioniert gar nicht, ich würde dir raten Data-Lifecycle durch zu lesen und eine weitere potenzielle gute Ressource ist dieses tutorial.

Ich würde dich auch bitten dich zuerst besser zu informieren bevor du die bibliothek schlecht machst weil Sie ist weit entfernt von "50% aktiv". Alles was sie macht ist ein paar hilfreiche sprites und styles für guis in data stage und ein einziges setting hinzuzufügen. In einem schellen test mit 19 mods den ich gerade gemacht habe hat flib 5ms in settings stage gebraucht und 253ms in data stage. Das ist kaum merkbar und nur beim starten vom ganzen Spiel. Außerdem werden diese sachen auch von den mods verwendet, es is nicht komplet sinnlos, und raiguard hat schon gesagt er kann diese sachen optional machen. Vielleicht macht er das.

Ich würde dir auch empfehlen nur für die neueste version zu entwikeln da 1.1 schon seit einer weile die "latest stable" ist und der großteil der mods ist mitlerweile aktualisiert. Aber schlussendlich wenn du dich doch entscheidest mods für 1.0 zu schreiben dann musst du dir auch erwarten dass andere mods - inklusive bibliotheken - nicht mehr für diese version aktualisiert werden. Aber ich bin nicht raiguard - also nicht der author von flib - also kann ich nicht sagen was der plan mit Abwärtskompatibilität ist.

Docs/Tutorials für gui-beta sind glaub ich geplant allerdings ist das modul nicht super complex also kann man in der zwischenzeit auch den source code ("Quelltext") und mods die dieses modul schon verwenden lesen. raiguard's gui mods verwenden es zum beispiel.

And lastly, @raiguard if you want me to also this message to english let me know. Just know that i'm actually not great at translating :P

raiguard commented 3 years ago

There are docs and an example for gui-beta on the flib documentation site.

As for English, Google Translate was surprisingly effective for this.

JanSharp commented 3 years ago

Oh docs are already up! i was not up to date, my appologies.

1Jonny commented 3 years ago

@JanSharp Bitte Schreibe nur in deiner Muttersprache! z.b. Enlisch. denn deinen Deutschen Text kann ich kaum entziffern. wenn ich etwas Nicht verstehe, dan nutze ich den Google Übersetzer. @JanSharp Please write onli in youre Languetsch! z.b. English. youre German Text can i not identify. i have the Google Translator for me. then the Google Translator is Verry better than you.

@JanSharp My English extra for you: i have the version flib_0.5.0 for Factorio 1.0! the Version flib_0.5.0 have no gui-beta, the gui-beta is in flib >= 0.7.0! sorry, your code can i not Test on Factorio 1.0. (your code is only for 1.1) your Factorio Speedtest is nice, my flib have 7ms, for only my mod in my Test-Client, and i aktivete NO flib-funktions. 7ms? why not 0ms? 0 Function aktivations is not 0ms? 0 Funktionactivations is 7ms? mathe Logic? and i can not update to 1.1, i have in my base Factorio 1.0 a MegaNice SaveMap white 100 Mods, this is not compatible to 1.1. i wait to version 1.2! this is the point why i vote vor a New 😍flib_0.5.1😍 Version to 1.0.

@raiguard hallo, ich hab das Getestet: (simple funktion ohne vars) und ich hab nix anderes in meinem code.

local gui = require("flib.gui") gui.init() = Chrash and Error: 😭 1.401 Error ModManager.cpp:1514: Fehler beim Laden der Mod „Jonnys-Stimmen“: flib/gui.lua:103: attempt to index global 'global' (a nil value) stack traceback: flib/gui.lua:103: in function 'init'

die Funktion ist:

function gui.init() if not global.flib then global.flib = {gui={}} else global._flib.gui = {} for , data in pairs(handler_lookup) do data.filters = {} end end end

bitte füge überall eine if not abfrage für alle globalen variablen ein: beispiel:

function gui.init() if not global then global = {} end if not global.flib then global.flib = {gui={}} else global._flib.gui = {} for , data in pairs(handler_lookup) do data.filters = {} end end end

allerdings ist es nicht gut Globale variablen im Modpack zu haben, denn:

  1. bei dieser Funktion gui.init() weiß der Benutzer nicht was die funktion genau macht, denn sie benötigt keine Variablen, und hat auch kein return das das fertige ergibnis zurück gibt.

  2. Globale vars sind nicht Gut! denn wen sie im ganzen modpack verfügbar sind, dann können Probleme entstehen wenn mehr als ein mod auf die selben vars zugreifen muss:

    flib create Vars mod 1 updete/edit/Delate Vars mod 2 error, vars buggy

  3. alle Modder müssen die volle Kontrolle über ihre vars und funktionen haben, hier ein beispiel wo der Modder dann auch weiß was benötigt wird, und was diese funktion Tut: (außerdem hat er dann selbst die volle kontrolle über die vars die benötigt werden, und die vars die erstellt wurden)

    my_return = gui.init(var_global)

  4. außerdem muss im tut ein beispiel code stehen wo man sieht was davor noch für diese Funktion benötigt wird. (ein beispiel code mit meinen wunsch funktionen die die var Global erstellt.) für die funktion init wird die Gui Lib benötigt, und die funktion die die var Global erstellt.

    local gui = require("flib.gui") var_global = gui.CreateGlobal() my_return = gui.init(var_global)

    Ps: Entschuldige, ich hab wieder viel zu viel geschrieben. achja, wenn du nicht willst das weiter mods mit altem code entwickelt werden, dann soltest du den alten code einfach beim update zu F 1.2 entfernen. du kannst den alten code auch schon in F 1.1 entfernen, dann musst du nur alle mods die du kennst die dein Mod verwenden in die dependencies eintragen: (das solltest du aber erst machen wenn die gui-beta komplett fertig ist.)

    mod_1 v 0.1.0 mod_2 v 0.3.1 usw.

    "dependencies": [ "base", "! mod_1 <= 0.1.0", "! mod_2 <= 0.3.1" ]

das bedeutet das alle Alten versionen deiner Modder incompatible zu zu dieser neuen version von dir sind. so könntest du auch ohne Factorio Update Sachen wieder entfernen. (bitte nur einmalig verwenden wenn die gui-beta fertig ist, und die standart gui nicht mehr benötigt wird.) denn die modder werden genau wie beim update zu einer Neuen Factorio version überprüfen müssen ob ihr mod mit der neuen Version noch funktioniert. mod_2 Update to 0.3.2 = compatible

(die beschriebenen Probleme existieren in der 1.1 immer noch.) 🙄so das wars jetzt aber wirklich.😵

Ps: ich vote für die 😍flib Version 0.5.1😍 für Factorio 1.0😍 (dann erhalte ich vielleicht auch die Gui-beta)

Mit freundlichen Grüßen 1Jonny

JanSharp commented 3 years ago

Alright. I am deeply sorry that my german - my mothertongue - was hard for you to decipher. I tried my best to stick to facts or make it clear that i'm stating my personal opinion when i was stating my opinion and to remain as nice as possible in order to keep this conversation productive however i have noticed that i am simply unable to have such a conversation with you which is unfortunate. I will leave it to others to handle.

Lastly, to show that i am not upset - just dissappointed - i'll tell you that i understand that you'd like an flib version for 1.0 with the newest features backported. I also never disagreed with you if it came accross that way, i merely tried to explain that there are a lot of mod authors who do not make their mods backwards compatible.

raiguard commented 3 years ago

I will not create an updated version of flib for Factorio 1.0. Factorio 1.0 is no longer supported in any way. If you wish to use updated features, you will need to update to Factorio 1.1. gui-beta simply will not work on Factorio 1.0 because it makes use of APIs that were added in Factorio 1.1.

As for your crash, it appears that you are missing some fundamental knowledge about how Factorio modding works. global is provided by Factorio itself, and only appears in event handlers. I would recommend reading up on the Data Lifecycle for Factorio mods.

This is how you use gui.init():

local gui = require("__flib__.gui")

script.on_init(function()
  gui.init()
end)

Here is a fully functional example of a GUI made using the gui module.

raiguard commented 2 years ago

The old gui module is now gone entirely, so I'm closing this.