Bigfootmech Posted February 7, 2021 Share Posted February 7, 2021 (edited) [EDIT] Found a solution to my original question. The new environment actually is GLOBAL. So instead of GLOBAL.TheNet:Say() In the modmain.lua You'd just do TheNet:Say() In another file (ie: printer). No passing of GLOBAL required. Just import as local Printer = require("util/printer") [Original question] Hey, So I've made my own util class in Lua called "Printer", and am requiring it from my modmain local Printer = require("util/printer") It's a collection of all the things I'm using to display ingame data in some way shape or form. (read: crude debug tool) ie, approximately: Printer.Print(...) = print(...) Printer.CharacterSay(...) = TheNet:Say(...) Printer.Talker(...) = ThePlayer.components.talker:Say(...) -- protected from crashing Printer.TablePrint(...) = something similar to the Util table readers (I haven't fully digested them yet, and only found them after writing mine), but with a "max depth" built in to the recursive function, and a workaround for the print() character length limit of 4083. For TheNet and ThePayer, I need GLOBAL however. And if I try to use it directly from inside the Printer class, it appears as a nil So I'm currently using something like a Factory paradigm to build it in the require line local Printer = require("util/printer"):WithGlobal(GLOBAL) And I've recently figured out that if I leverage Class file properly, I might be able to do something like this instead local Printer = require("util/printer")(GLOBAL) I also tried to dig up to how the modmain "environment" is set. But it looks like it'd be messier than these solutions. Correct me if I'm wrong. So I was wondering if anyone had anything better? Am I just missing something obvious? Edited February 18, 2021 by Bigfootmech Solved Link to comment https://forums.kleientertainment.com/forums/topic/126825-solved-is-there-an-easy-way-to-access-global-from-my-own-classes/ Share on other sites More sharing options...
penguin0616 Posted February 7, 2021 Share Posted February 7, 2021 (edited) GLOBAL is accessible from all mod environments, and doesn't/shouldn't be passed in through a function. Klei scripts have their environment set directly to global. Mods do not, in order to prevent accidental tainting of important globals. Environment is set up in mods.lua:267 in function CreateEnvironment. Personally, this is what I do to avoid needing GLOBAL (and to avoid dealing with strict.lua). do local GLOBAL = GLOBAL local modEnv = GLOBAL.getfenv(1) local rawget, setmetatable = GLOBAL.rawget, GLOBAL.setmetatable setmetatable(modEnv, { __index = function(self, index) return rawget(GLOBAL, index) end -- lack of __newindex means it defaults to modEnv, so we don't mess up globals. }) _G = GLOBAL end Edited February 7, 2021 by penguin0616 2 Link to comment https://forums.kleientertainment.com/forums/topic/126825-solved-is-there-an-easy-way-to-access-global-from-my-own-classes/#findComment-1426519 Share on other sites More sharing options...
Bigfootmech Posted February 7, 2021 Author Share Posted February 7, 2021 Ah, this isn't exactly what I meant, but it has helped me move forward, thank you I don't actually mind using GLOBAL.ThePlayer instead of ThePlayer in my modmain. What I want to do is to use GLOBAL.ThePlayer, and GLOBAL.TheNet inside my /<mod folder>/scripts/util/printer.lua , But currently GLOBAL is a nil there. So I thought maybe it was possible to attach an "environment" to my Printer class cleanly. Except the only thing I can find that runs something in an environment is /scripts/util.lua:721 "RunInEnvironment" and "RunInEnvironmentSafe" For them though, I need /scripts/mods.lua:515 kleiloadlua(modMainFileFullPath) Which I can't find declared anywhere, so I'm assuming that it's on the C side. Which possibly means RunInEnvironment isn't what I'm looking for. Also, I totally forgot about how metatables work. So re figuring that out now But I think from the stuff you posted about how to get the mod environment, as well as the class file having a potential for setting __index should be enough to keep me busy for a bit. I actually went down a coding rabbit hole to make a slightly prettier version of my printer, so I can see what a default Class looks like exactly. In a reader-friendly manner. Link to comment https://forums.kleientertainment.com/forums/topic/126825-solved-is-there-an-easy-way-to-access-global-from-my-own-classes/#findComment-1426663 Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now