SenL Posted January 16, 2015 Share Posted January 16, 2015 Hi, I put a basic config in the modinfo.lua but game crashes when I put GetModConfigData(...) in mycharacter.lua. Does it only work if it's in modmain.lua? How does one create configurable starting inventory? Thanks. Link to comment Share on other sites More sharing options...
Developer Diabu Posted January 16, 2015 Developer Share Posted January 16, 2015 Hello,Why are you trying to write a mod for that ? Do you wanna learn how to mods, or you just need this mod ? ^^If you just need a mod for Starting Inventory, see Start Item If you want to write your own mod, yes all Mod code must be in Modmain.lua, the modinfo file is for "info" about the mod Link to comment Share on other sites More sharing options...
Silentdarkness1 Posted January 16, 2015 Share Posted January 16, 2015 Modinfo.lua only matters to the mod screen itself. Name of your mod, description, author name, so on so forth. Link to comment Share on other sites More sharing options...
SenL Posted January 16, 2015 Author Share Posted January 16, 2015 I guess I didn't ask correctly.Ok I'm learning to write a mod.I want it to be able to have "config" button. This I put in modinfo.lua.Inside config, let's say I want "Starting Inv"Option 1 = "None"Option 2 = "Sword only"Option 3 = "A lot!" Now when user selects option 1, starting inv would be empty.For option 2 --> starts with a sword (I made one, let's call it "mysword")For option 3 --> starts with a sword, flint, and so on Is this possible?Thanks again. Link to comment Share on other sites More sharing options...
Ryuushu Posted January 16, 2015 Share Posted January 16, 2015 @SenLAs far as I know yes, GetModConfigData() only works in modmain.If you want to have a configurable starting inventory you can modify the OnNewSpawn function of, let's say, Wilson, and give him his new starting inventory there, like so: local starting_inventory ={}local inv_option = 1 --GetModConfigData("inv_option")local prefabs = {}if inv_option == 1 then starting_inventory = {"carrot","carrot","carrot"}else starting_inventory = {"berries","berries","berries"}endif starting_inventory ~= nil then for i, v in ipairs(starting_inventory) do table.insert(prefabs, v) endendAddPrefabPostInit("wilson", function(inst) if inst.OnNewSpawn then inst.old_OnNewSpawn = inst.OnNewSpawn end inst.OnNewSpawn = function(inst) if inst.components.inventory ~= nil then inst.components.inventory.ignoresound = true for i, v in ipairs(starting_inventory) do inst.components.inventory:GiveItem(GLOBAL.SpawnPrefab(v)) end inst.components.inventory.ignoresound = false end if inst.old_OnNewSpawn then return inst:old_OnNewSpawn(inst) end endend) Link to comment Share on other sites More sharing options...
Kzisor Posted January 17, 2015 Share Posted January 17, 2015 @SenL, while Ryuushu's method is good it is not as efficient as you can make it. The most efficient way to do this is by doing the following: modmain.lualocal starting_inventory = GetModConfigData("inv_start")local function StartInv(inst) if inst.OnNewSpawn then inst.old_OnNewSpawn = inst.OnNewSpawn end inst.OnNewSpawn = function(inst) if inst.components.inventory ~= nil then inst.components.inventory.ignoresound = true for i, v in ipairs(starting_inventory.split(starting_inventory, ',')) do inst.components.inventory:GiveItem(GLOBAL.SpawnPrefab(v)) end inst.components.inventory.ignoresound = false end if inst.old_OnNewSpawn then return inst:old_OnNewSpawn(inst) end end return instendfor _, v in ipairs(CHARACTERLIST) do AddPrefabPostInit(v, StartInv)end modinfo.luaconfiguration_options = { { name = "inv_start", label = "Startng Inventory", options = { {description = "None", data = ""}, {description = "Flint", data = "flint,flint"}, }, default = "", },} Simply put the prefab name separated by a comma and the code in the modmain.lua file will do the rest. ~Kzisor/Ysovuka Link to comment Share on other sites More sharing options...
SenL Posted January 17, 2015 Author Share Posted January 17, 2015 Wow amazing. How did you guys come up with this... I'm looking at the code and couldn't understand some of them.1) What are (or how do these work) "inst.OnNewSpawn" and "inst.old_OnNewSpawn" work? 2) In "for _, v in ipairs(CHARACTERLIST) do" ...2a) what does _ mean?2b) what is CHARACTERLIST? Thanks again, I'll try yours Kzisor. Link to comment Share on other sites More sharing options...
SenL Posted January 17, 2015 Author Share Posted January 17, 2015 Hm something's missing from my code. It's not working. Maybe missing CHARACTERLIST? Link to comment Share on other sites More sharing options...
Kzisor Posted January 17, 2015 Share Posted January 17, 2015 (edited) Wow amazing. How did you guys come up with this... I'm looking at the code and couldn't understand some of them.1) What are (or how do these work) "inst.OnNewSpawn" and "inst.old_OnNewSpawn" work? 2) In "for _, v in ipairs(CHARACTERLIST) do" ...2a) what does _ mean?2b) what is CHARACTERLIST? Thanks again, I'll try yours Kzisor. 1) The code provided will only work on newly generated servers, upon initial login to the server.2a) _ is a dummy variable which is not meant to be used; it's the key variable from the ipairs (key, value)2b) CHARACTERLIST is the variable for the default characters. This will add the starting inventory to all the default characters. See blow on how to make it only work for specific characters or for all characters. Hm something's missing from my code. It's not working. Maybe missing CHARACTERLIST? If you're trying this on a specific character, use the following line. AddPrefabPostInit("ENTER CHARACTER PREFAB NAME HERE", StartInv) To make this work for all mod characters use the following: for _,v in ipairs(MODCHARACTERLIST) do AddPrefabPostInit(v, StartInv)end If you want to make it work for all characters period, use both for-do loops which includes CHARACTERLIST and MODCHARACTERLIST and anytime a character is spawned in the world it will be given the starting inventory. EDIT:In order to make sure this works properly you must generate a new world every time you make changes to the code. Edited January 17, 2015 by Kzisor Link to comment Share on other sites More sharing options...
SenL Posted January 17, 2015 Author Share Posted January 17, 2015 I got crash error "bad argument #1 to 'ipairs' (table expected, got nil)" Code I have:for _, v in ipairs(MODCHARACTERLIST) do AddPrefabPostInit(v, StartInv)end Link to comment Share on other sites More sharing options...
Kzisor Posted January 17, 2015 Share Posted January 17, 2015 I got crash error "bad argument #1 to 'ipairs' (table expected, got nil)" Code I have:for _, v in ipairs(MODCHARACTERLIST) do AddPrefabPostInit(v, StartInv)end Did you put the configuration options in your modinfo.lua? Did you also set it in the configuration menu? Link to comment Share on other sites More sharing options...
SenL Posted January 17, 2015 Author Share Posted January 17, 2015 Yes. Modinfo:configuration_options ={ { name="BK_StartingInventory" ,label="Starting Equip" ,options = { {data="bksword,bkgoblinsack",description="Default"} ,{data="bksword,bkgoblinsack,flint",description="Basic"} ,{data="bksword,bkgoblinsack,flint,torch,trap,goldnugget,twigs,cutgrass,dragonfruit_cooked",description="More!"} } ,default="Basic" },}Modmain:local starting_inventory = GetModConfigData("BK_StartingInventory") local function StartInv(inst) if inst.OnNewSpawn then inst.old_OnNewSpawn = inst.OnNewSpawn end inst.OnNewSpawn = function(inst) if inst.components.inventory ~= nil then inst.components.inventory.ignoresound = true for i, v in ipairs(starting_inventory.split(starting_inventory, ',')) do inst.components.inventory:GiveItem(GLOBAL.SpawnPrefab(v)) end inst.components.inventory.ignoresound = false end if inst.old_OnNewSpawn then return inst:old_OnNewSpawn(inst) end end return instend for _, v in ipairs(MODCHARACTERLIST) do AddPrefabPostInit(v, StartInv)end Link to comment Share on other sites More sharing options...
Ryuushu Posted January 17, 2015 Share Posted January 17, 2015 (edited) @SenL@KzisorInstead using CHARACTERLIST and MODCHARACTERLIST you should be using AddPlayerPostInit, the mod loading order affects MODCHARACTERLIST.modmain.lualocal starting_inventory = GetModConfigData("inv_start")AddPrefabPostInit("wilson", function(inst) -- AddPlayerPostInit(function(inst) if you want to add it to all characters if inst.OnNewSpawn then inst.old_OnNewSpawn = inst.OnNewSpawn end inst.OnNewSpawn = function(inst) if inst.components.inventory ~= nil then inst.components.inventory.ignoresound = true for i, v in ipairs(starting_inventory.split(starting_inventory,",")) do inst.components.inventory:GiveItem(GLOBAL.SpawnPrefab(v)) end inst.components.inventory.ignoresound = false end if inst.old_OnNewSpawn then return inst:old_OnNewSpawn(inst) end endend)modinfo.luaconfiguration_options ={ { name = "inv_start", label = "Starting inventory", options = { {description = "Carrots", data = "carrot,carrot,carrot"}, {description = "Berries", data = "berries,berries,berries"}, }, default = "carrot,carrot,carrot" }}I'll stick to tables rather than string splitting >>;Edit: Tables don't work, split does. Code modified to reflect the change. Edited January 17, 2015 by Ryuushu Link to comment Share on other sites More sharing options...
Kzisor Posted January 17, 2015 Share Posted January 17, 2015 (edited) *snip* Your modinfo.lua is not correct. Syntax is important in all programming languages. Try this in your modinfo.lua file:configuration_options ={ { name="BK_StartingInventory",label="Starting Equip",options = { {data="bksword,bkgoblinsack",description="Default"}, {data="bksword,bkgoblinsack,flint",description="Basic"}, {data="bksword,bkgoblinsack,flint,torch,trap,goldnugget,twigs,cutgrass,dragonfruit_cooked",description="More!"}, }, default="bksword,bkgoblinsack", },}Note: Default is the actual default value, not the default description you want it to have. @Ryuushu, tables did not save properly whenever I tested using them, otherwise I would have stuck with the simpler approach. Did you test this before posting it or is this just theory code? On a secondary note, I had no issue with split working without requiring util. Edited January 17, 2015 by Kzisor Link to comment Share on other sites More sharing options...
SenL Posted January 17, 2015 Author Share Posted January 17, 2015 Ok it works!!Thanks a lot both of you! Link to comment Share on other sites More sharing options...
Kzisor Posted January 17, 2015 Share Posted January 17, 2015 @SenL, you're welcome, mind sharing the working code so others may see it? Link to comment Share on other sites More sharing options...
Ryuushu Posted January 17, 2015 Share Posted January 17, 2015 (edited) @Kzisor .. On a second look, tables aren't working. And split is working now. ... *shrugs* Edited January 17, 2015 by Ryuushu Link to comment Share on other sites More sharing options...
SenL Posted January 17, 2015 Author Share Posted January 17, 2015 I used Ryuushu's. It works for me.I'm now trying to use your's. Changed modinfo to configuration_options ={ { name="BK_StartingInventory" ,label="Starting Equip" ,options = { {description="Default",data="bksword,bkgoblinsack"} ,{description="Basic",data="bksword,bkgoblinsack,flint"} ,{description="More!",data="bksword,bkgoblinsack,flint,torch,trap,goldnugget,twigs,cutgrass,dragonfruit_cooked"} } ,default="bksword,bkgoblinsack" },}but it crashes at load. Same error "bad argument #1 to 'ipairs' (table expected, got nil)". Here is more to modmain:AddMinimapAtlas("images/map_icons/barbarianking.xml")AddModCharacter("mycharacterbk")AddPrefabPostInit("bksword")AddPrefabPostInit("bkgoblinsack")--AddPrefabPostInit("bkpekkapiece")local starting_inventory = GetModConfigData("BK_StartingInventory")local function StartInv(inst) if inst.OnNewSpawn then inst.old_OnNewSpawn = inst.OnNewSpawn end inst.OnNewSpawn = function(inst) if inst.components.inventory ~= nil then inst.components.inventory.ignoresound = true for i, v in ipairs(starting_inventory.split(starting_inventory, ',')) do inst.components.inventory:GiveItem(GLOBAL.SpawnPrefab(v)) end inst.components.inventory.ignoresound = false end if inst.old_OnNewSpawn then return inst:old_OnNewSpawn(inst) end end return instend for _, v in ipairs(MODCHARACTERLIST) do AddPrefabPostInit(v, StartInv)end Link to comment Share on other sites More sharing options...
SenL Posted January 17, 2015 Author Share Posted January 17, 2015 Changed the comma placement in modinfo... not sure why it requires to be at the end.configuration_options ={ { name="BK_StartingInventory", label="Starting Equip", options = { {description="Default",data="bksword,bkgoblinsack"}, {description="Basic",data="bksword,bkgoblinsack,flint"}, {description="More!",data="bksword,bkgoblinsack,flint,torch,trap,goldnugget,twigs,cutgrass,dragonfruit_cooked"}, }, default="bksword,bkgoblinsack", },}Testing now... Link to comment Share on other sites More sharing options...
SenL Posted January 17, 2015 Author Share Posted January 17, 2015 Crashed. Error is "[00:00:41]: [string "../mods/DST_BarbarianKing/modmain.lua"]:92: bad argument #1 to 'ipairs' (table expected, got nil)" Line 92 is "for _, v in ipairs(MODCHARACTERLIST) do" Link to comment Share on other sites More sharing options...
Kzisor Posted January 17, 2015 Share Posted January 17, 2015 @SenL, that is really strange that MODCHARACTERLIST isn't working for you. You can always just use the AddPrefabPostInit or the AddPlayerPostInit method that Ryuushu gave. Either way, if Ryuushu's code works and saves the selection properly that is all that matters. I will need to do more testing to see if I can figure out why it doesn't work on my end. Link to comment Share on other sites More sharing options...
SenL Posted January 17, 2015 Author Share Posted January 17, 2015 Curses, I broke it lol.I went back to Ryuushu's style and it crashes on "for i, v in ipairs(starting_inventory) do" Modmain: local starting_inventory = GetModConfigData("BK_StartingInventory")AddPrefabPostInit("mycharacterbk", function(inst)if inst.OnNewSpawn then inst.old_OnNewSpawn = inst.OnNewSpawn endinst.OnNewSpawn = function(inst) if inst.components.inventory ~= nil then inst.components.inventory.ignoresound = true for i, v in ipairs(starting_inventory) do -----------------crashes here inst.components.inventory:GiveItem(GLOBAL.SpawnPrefab(v)) end inst.components.inventory.ignoresound = false end if inst.old_OnNewSpawn then return inst:old_OnNewSpawn(inst) end endend)Modinfo:configuration_options ={ { name="BK_StartingInventory", label="Starting Equip", options = { {description="Default", data={"bksword","bkgoblinsack"}}, {description="Basic", data={"bksword","bkgoblinsack","flint"}}, {description="More!", data={"bksword","bkgoblinsack","flint","torch","trap","goldnugget","twigs","cutgrass","dragonfruit_cooked"}}, }, default={"bksword","bkgoblinsack"}, },} Link to comment Share on other sites More sharing options...
SenL Posted January 17, 2015 Author Share Posted January 17, 2015 I didn't change anything and it works again.Confused... Link to comment Share on other sites More sharing options...
rezecib Posted January 18, 2015 Share Posted January 18, 2015 @Kzisor,@SenL, Aren't MODCHARACTERLIST, etc in the GLOBAL space? (e.g. GLOBAL.MODCHARACTERLIST). Last I tried tables in mod config, they worked really strangely, so I'd avoid them. I think the issue is with saving them, but I'm not sure about that. Link to comment Share on other sites More sharing options...
SenL Posted January 18, 2015 Author Share Posted January 18, 2015 Yes I encountered issue with this when playing with friend (same character). So far I've commented them out and just use regular start_inv table in the mycharacter.lua Side question: I added "backpack" in start_inv but it didn't give me backpack when I host a new server. Why? Link to comment 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