PanAzej Posted December 16, 2015 Share Posted December 16, 2015 (edited) I'm making a mod, where a prototyper spawns somewhere in its own setpiece. It should grant new recipes in a new tab when the player is nearby.I got setpiece and new tab working, but I don't know how to make it so the new recipe is unlocked only when I'm near the prototyper. From modmain.lua:PrefabFiles = {"gabenstatue","steampillar","festive_spike","festive_hambat","festive_batbat","festive_spear","hl3confirmed","tf2crate",}Assets = {Asset("ATLAS", "images/hud/gaben.xml" ),Asset("ATLAS", "images/inventoryimages/tf2crate.xml" ),Asset("IMAGE", "images/inventoryimages/tf2crate.tex" ),}local require = GLOBAL.requirelocal Builder = require "components/builder"local Recipe = GLOBAL.Recipelocal RECIPETABS = GLOBAL.RECIPETABSlocal STRINGS = GLOBAL.STRINGSlocal TECH = GLOBAL.TECHgabentab = AddRecipeTab("Gaben", 979, "images/hud/gaben.xml", "gaben.tex", nil)GLOBAL.TECH.NONE.GABENCRAFTER = 0for k,v in pairs(GLOBAL.TUNING.PROTOTYPER_TREES) do GLOBAL.TUNING.PROTOTYPER_TREES[k].GABENCRAFTER = 0end--We define what a "GABENCRAFTER" prototyping machine grants us access to:GLOBAL.TUNING.PROTOTYPER_TREES.GABENCRAFTER = {SCIENCE = 0, MAGIC = 0, ANCIENT = 0, GABENCRAFTER = 1} AddRecipe("tf2crate", {Ingredient("boards",3),Ingredient("goldnugget",3)}, gabentab, {GABENCRAFTER = 1}, nil, -- placernil, -- min_spacingnil, -- nounlocknil, -- numtogivenil, -- builder_tag"images/inventoryimages/tf2crate.xml", -- atlas"tf2crate.tex") --)local function enteringgabenzone(doer)endlocal function leavinggabenzone(doer) if doer and doer.components.builder then doer.components.builder.accessible_tech_trees = GLOBAL.TECH.NONE endendfunction gabenprototyper(inst) inst:AddTag("prototyper") inst:AddComponent("prototyper") inst.components.prototyper.trees = GLOBAL.TUNING.PROTOTYPER_TREES.GABENCRAFTER inst.components.prototyper.onturnoff = leavinggabenzone inst.components.prototyper.onturnon = enteringgabenzoneendAddPrefabPostInit("gabenstatue", gabenprototyper)-----overwrite builder knowsrecipe to not ignore new tech tree------function builderpostinit(inst)local oldKnowsRecipe = inst.KnowsRecipeinst.KnowsRecipe = function(self, recname)local xrecipe = GLOBAL.GetRecipe(recname)if oldKnowsRecipe(self, recname) and not self.freebuildmode thenif xrecipe and xrecipe.level.GABENCRAFTER and xrecipe.level.GABENCRAFTER > 0 thenreturn falseelsereturn trueendendreturn oldKnowsRecipe(self, recname)endendAddComponentPostInit("builder", builderpostinit)I looked into "Summons" mod and tried to replicate what was done, but... Well it doesn't work in DST. Without "KnowsRecipe" Postinit player has unlocked the recipe and the tab right away. Game crashed just after I pick a character (I guess it's because the crafting menu has to load, and there is an error, but GetRecipe is apparently not declared. But it is declared, so either I made a mistake somewhere or DST handles these things in a different way). Crash log:[00:01:03]: [string "../mods/0GABEN/modmain.lua"]:72: variable 'GetRecipe' is not declaredLUA ERROR stack traceback: =[C]:-1 in (global) error (C) <-1--1> scripts/strict.lua:23 in () ? (Lua) <21-26> ../mods/0GABEN/modmain.lua:72 in () ? (Lua) <71-81> =(tail call):-1 in () (tail) <-1--1> scripts/widgets/crafting.lua:172 in (method) UpdateRecipes (Lua) <163-218> scripts/widgets/crafting.lua:47 in (field) _ctor (Lua) <13-48> scripts/widgets/controllercrafting.lua:19 in (field) _ctor (Lua) <18-52> scripts/class.lua:181 in (upvalue) ControllerCrafting (Lua) <171-184> scripts/widgets/crafttabs.lua:64 in (field) _ctor (Lua) <46-205> scripts/class.lua:181 in (upvalue) CraftTabs (Lua) <171-184> scripts/widgets/controls.lua:136 in (field) _ctor (Lua) <30-151> scripts/class.lua:181 in (upvalue) Controls (Lua) <171-184> scripts/screens/playerhud.lua:363 in (method) SetMainCharacter (Lua) <357-389> scripts/prefabs/player_common.lua:331 in (upvalue) ActivateHUD (Lua) <327-332> scripts/prefabs/player_common.lua:536 in (local) fn (Lua) <511-547> scripts/entityscript.lua:962 in (method) PushEvent (Lua) <956-979> scripts/mainfunctions.lua:295 in () ? (Lua) <292-297> =[C]:-1 in (method) SendSpawnRequestToServer (C) <-1--1> scripts/mainfunctions.lua:1247 in (local) cb (Lua) <1245-1248> scripts/frontend.lua:531 in (method) DoFadingUpdate (Lua) <506-535> scripts/frontend.lua:583 in (method) Update (Lua) <543-696> scripts/update.lua:94 in () ? (Lua) <39-127>Any help would be appreciated. Edited December 16, 2015 by PanAzej Link to comment Share on other sites More sharing options...
ZupaleX Posted December 16, 2015 Share Posted December 16, 2015 (edited) GetRecipe do not exists for DST. You should use the table AllRecipes instead. Edited December 16, 2015 by ZupaleX Link to comment Share on other sites More sharing options...
Mobbstar Posted December 17, 2015 Share Posted December 17, 2015 PrefabFiles = { "gabenstatue", "steampillar", "festive_spike", "festive_hambat", "festive_batbat", "festive_spear", "hl3confirmed", "tf2crate", } We'll see the end of the world before the end of developement. Yes, I purposely didn't specifiy what developement. Link to comment Share on other sites More sharing options...
PanAzej Posted December 18, 2015 Author Share Posted December 18, 2015 (edited) GetRecipe do not exists for DST. You should use the table AllRecipes instead.Thank you! So here's what I got so far:PrefabFiles = {"gabenstatue","steampillar","festive_spike","festive_hambat","festive_batbat","festive_spear","hl3confirmed","tf2crate",}Assets = {Asset("ATLAS", "images/hud/gaben.xml" ),Asset("ATLAS", "images/inventoryimages/tf2crate.xml" ),Asset("IMAGE", "images/inventoryimages/tf2crate.tex" ),}local require = GLOBAL.requirelocal Builder = require "components/builder"local Recipe = GLOBAL.Recipelocal RECIPETABS = GLOBAL.RECIPETABSlocal STRINGS = GLOBAL.STRINGSlocal TECH = GLOBAL.TECHlocal AllRecipes = GLOBAL.AllRecipes gabentab = AddRecipeTab("Gaben", 979, "images/hud/gaben.xml", "gaben.tex", nil) GLOBAL.TECH.NONE.GABENCRAFTER = 0for k,v in pairs(GLOBAL.TUNING.PROTOTYPER_TREES) do GLOBAL.TUNING.PROTOTYPER_TREES[k].GABENCRAFTER = 0end--We define what a "GABENCRAFTER" prototyping machine grants us access to:GLOBAL.TUNING.PROTOTYPER_TREES.GABENCRAFTER = {SCIENCE = 0, MAGIC = 0, ANCIENT = 0, GABENCRAFTER = 1} AddRecipe("tf2crate", {Ingredient("boards",3),Ingredient("goldnugget",3)}, gabentab, {GABENCRAFTER = 1}, nil, -- placernil, -- min_spacingnil, -- nounlocknil, -- numtogivenil, -- builder_tag"images/inventoryimages/tf2crate.xml", -- atlas"tf2crate.tex") --)local function enteringgabenzone(doer) end local function leavinggabenzone(doer) if GLOBAL.ThePlayer then -- will checking "ThePlayer" work properly? Not sure GLOBAL.ThePlayer.components.builder.accessible_tech_trees = GLOBAL.TECH.NONE end end function gabenprototyper(inst) inst:AddTag("prototyper") inst:AddComponent("prototyper") inst.components.prototyper.trees = GLOBAL.TUNING.PROTOTYPER_TREES.GABENCRAFTER inst.components.prototyper.onturnoff = leavinggabenzone inst.components.prototyper.onturnon = enteringgabenzoneendAddPrefabPostInit("gabenstatue", gabenprototyper)-----overwrite builder knowsrecipe to not ignore new tech tree------function builderpostinit(inst) local oldKnowsRecipe = inst.KnowsRecipe inst.KnowsRecipe = function(self, recname) if oldKnowsRecipe(self, recname) and not self.freebuildmode then if AllRecipes[recname] and AllRecipes[recname].level.GABENCRAFTER and AllRecipes[recname].level.GABENCRAFTER > 0 then return false else return true end end return oldKnowsRecipe(self, recname) endendAddComponentPostInit("builder", builderpostinit)1. "leavinggabenzone" - I'd need to check the player leaving the prototyper's area. Not too sure if 'ThePlayer' will work with multiple players though, and 'doer' either doesn't refer to the player or is something completely different I don't know about; calling it 'doers[doer]' didn't change anything too... 2. Another big problem is that prototyper grants access to a new recipetab to the player, but when I'm leaving its 'prototype radius' recipe is no longer usable but recipetab icon is still visible and clickable.But! When picking up an item/moving around something in my inventory - it disappears.I guess it's because widget gets updated after we use our inventory or something? No idea how to fix that.Tab should disappear right away as we move out of prototyper's area.Even if we know recipes (basically how ancient_altar does it, but... yeah. No idea how to do that. But even if this isn't possible to do, as long as tab icon acts properly it's fine). I'm no good coder, but still trying to get this to work... I'm getting pretty stumped on this one, I gotta say.Any help would be appreciated! Edited December 18, 2015 by PanAzej Link to comment Share on other sites More sharing options...
ZupaleX Posted December 18, 2015 Share Posted December 18, 2015 (edited) So I never did a prototyper before but I don't think that the way you're doing it is right. Firstif GLOBAL.ThePlayer then dostuffsendis not doing what you want it to do.In DST, ThePlayer refers to the host, always or nothing if it's a dedicated server. So this just checks if the host exists, which is obviously not what you want to do. As far as I saw, from commentary of Klei themselves in the constant.lua where they define the tech levels, they put MAGIC_ONE = 2, with the comment that it starts at 2 to not be spoiled from the beginning.So a level of something (science, magic, ancient, myownfancytechlevel, ...) equal to 1 means that it will appear on the craft bar right from the beginning. You just need to put your reciepes to require at least a level 2 in GABENTECH (or however you called it), so it's not appearing when not standing next to a prototyper which grants at least 2 GABENTECH.Then everything you did to check the proximity and everything is useless. At least that's my interpretation of what I saw so far. Edited December 18, 2015 by ZupaleX Link to comment Share on other sites More sharing options...
PanAzej Posted December 18, 2015 Author Share Posted December 18, 2015 (edited) Thank you for the response!So I never did a prototyper before but I don't think that the way you're doing it is right. Firstif GLOBAL.ThePlayer then dostuffsendis not doing what you want it to do.In DST, ThePlayer refers to the host, always or nothing if it's a dedicated server. So this just checks if the host exists, which is obviously not what you want to do. As far as I saw, from commentary of Klei themselves in the constant.lua where they define the tech levels, they put MAGIC_ONE = 2, with the comment that it starts at 2 to not be spoiled from the beginning.So a level of something (science, magic, ancient, myownfancytechlevel, ...) equal to 1 means that it will appear on the craft bar right from the beginning. You just need to put your reciepes to require at least a level 2 in GABENTECH (or however you called it), so it's not appearing when not standing next to a prototyper which grants at least 2 GABENTECH.Then everything you did to check the proximity and everything is useless. At least that's my interpretation of what I saw so far.Setting GABENCRAFTER to 2 crashed the game after moving away from the prototyper and clicking on its recipetab icon (I guess it was because the game freaked out, since it had to generate a new, bigger background for crafttab icons, because it unloaded the tab completely? not completely sure, though) Being how it is at the moment doesn't show "gabentab" at the start, just after we get close to the prototyper. I don't know how to check for the "prototyper-area leaving player", so I used ThePlayer to test it further anyways. Another problem is this, and I have no idea how to fix it (image below)I want the menu to update instantly as we leave the prototyper. But it updates only after we iterate with inventory. Edited December 18, 2015 by PanAzej Link to comment Share on other sites More sharing options...
ZupaleX Posted December 18, 2015 Share Posted December 18, 2015 I made a custom crafting tab which doesn't show up when not next to at least a science machine and it doesn't crash the game when moving away from the machine. Could you post the crash log and your complete mod because I think the issue is in some of the functions you put which are not necessary. Link to comment Share on other sites More sharing options...
PanAzej Posted December 18, 2015 Author Share Posted December 18, 2015 (edited) Huh, seems that I have screwed something up, because it didn't crash this time.But the tab is always usable with "ThePlayer" part disabled. After we leave prototyper. And it acts as if we're learning a new recipe everytime we have ingredients. I changed the GABENCRAFTER to 2, and commented out 'ThePlayer's. Download link (since I'm not permitted to attach my file for some reason):https://drive.google.com/file/d/0B5Qj-AlmLzq-T1ZERGY0VmcwM2c/view?usp=sharing (mod is still in development so many things have unfinished things, like some items sharing the same icon and stuff) Edited December 18, 2015 by PanAzej Link to comment Share on other sites More sharing options...
ZupaleX Posted December 18, 2015 Share Posted December 18, 2015 (edited) Why do you add a PrefabPostInit to a prefab you created yourself in this very mod? (line 57) I advise you to look at the scienceprototyper.lua as a template for your gabenstatue.lua EDIT: I'm not convinced by your builder postinit also. I'll check it a bit closer.EDIT2: Indeed, look a bit a the builder.lua component you will see you're missing some stuffs to define a new tech tree. Try to follow how the science is made for instance and apply it to your gaben. Edited December 18, 2015 by ZupaleX 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