Gobbel Posted December 10, 2018 Share Posted December 10, 2018 (edited) Hi, so this is another thing I am working on. A new prototyper. In the end this thing should make two new recipes under the REFINE tab available when standing near it! So far, I haven`t implemented these functions yet, because I cannot make it to a point where my game is stable, when placing the thing. I looked at old threads about prototypers, I even used one as an almost exact base for this one, but still, it crashes to the desktop without any error log. require "prefabutil" require "recipe" require "modutil" local assets = { Asset("ANIM", "anim/quagmire_mealingstone.zip"), Asset( "IMAGE", "images/inventoryimages/mealingstone.tex" ), Asset( "ATLAS", "images/inventoryimages/mealingstone.xml" ), } local prefabs = { "collapse_small", } local function onbuilt(inst) inst.AnimState:PlayAnimation("place") inst.AnimState:PushAnimation("idle") inst.SoundEmitter:PlaySound("dontstarve/common/cook_pot_craft") local fx = SpawnPrefab("collapse_small") fx.Transform:SetPosition(inst.Transform:GetWorldPosition()) fx:SetMaterial("stone") end local function doonact(inst) if inst._activecount > 1 then inst._activecount = inst._activecount - 1 else inst._activecount = 0 inst.SoundEmitter:KillSound("sound") end inst.SoundEmitter:PlaySound("dontstarve/common/researchmachine_lvl3_ding") end local function doneact(inst) inst._activetask = nil if not inst:HasTag("burnt") then if inst.components.prototyper.on then OnTurnOn(inst) else OnTurnOff(inst) end end end function OnTurnOn(inst) if inst.AnimState:IsCurrentAnimation("proximity_loop") then --NOTE: push again even if already playing, in case an idle was also pushed inst.AnimState:PushAnimation("proximity_loop", true) else inst.AnimState:PlayAnimation("proximity_loop", true) end if not inst.SoundEmitter:PlayingSound("dontstarve/creatures/together/clayhound/stone_shake") then inst.SoundEmitter:PlaySound("dontstarve/creatures/together/clayhound/stone_shake") end end function OnTurnOff(inst) inst.AnimState:PushAnimation("idle") end local function onactivate(inst) if not inst:HasTag("burnt") then inst.AnimState:PlayAnimation("proximity_loop") inst.AnimState:PushAnimation("idle", false) if not inst.SoundEmitter:PlayingSound("dontstarve/creatures/together/clayhound/stone_shake") then inst.SoundEmitter:PlaySound("dontstarve/creatures/together/clayhound/stone_shake") end inst._activecount = inst._activecount + 1 inst:DoTaskInTime(1.5, doonact) if inst._activetask ~= nil then inst._activetask:Cancel() end inst._activetask = inst:DoTaskInTime(inst.AnimState:GetCurrentAnimationLength() + 2 * FRAMES, doneact) end end ---------------------------------- local function onpreload(inst, data) --if data ~= nil and data.is_already_built ~= nil and inst.is_already_built == nil then -- inst.is_already_built = data.is_already_built --end end local function onsave(inst, data) --if data and inst.is_already_built ~= nil then -- data.is_already_built = inst.is_already_built --end -- if inst:HasTag("burnt") or (inst.components.burnable ~= nil and inst.components.burnable:IsBurning()) then -- data.burnt = true -- end end local function onload(inst, data) -- if data ~= nil and data.burnt then -- inst.components.burnable.onburnt(inst) -- end end ---------------------------------- local function onhammered(inst, worker) if inst.components.burnable ~= nil and inst.components.burnable:IsBurning() then inst.components.burnable:Extinguish() end inst.components.lootdropper:DropLoot() local fx = SpawnPrefab("collapse_small") fx.Transform:SetPosition(inst.Transform:GetWorldPosition()) fx:SetMaterial("stone") inst:Remove() end local function onhit(inst, worker) end ----------------------------------- local function fn() local inst = CreateEntity() inst.entity:AddTransform() inst.entity:AddAnimState() inst.entity:AddMiniMapEntity() inst.entity:AddSoundEmitter() inst.entity:AddNetwork() MakeObstaclePhysics(inst, .4) inst.MiniMapEntity:SetPriority(5) inst.MiniMapEntity:SetIcon("quagmire_mealingstone.png") inst.AnimState:SetBank("quagmire_mealingstone") inst.AnimState:SetBuild("quagmire_mealingstone") inst.AnimState:PlayAnimation("idle") inst:AddTag("structure") --prototyper (from prototyper component) added to pristine state for optimization inst:AddTag("prototyper") MakeSnowCoveredPristine(inst) inst.entity:SetPristine() if not TheWorld.ismastersim then return inst end inst:AddComponent("inspectable") inst:AddComponent("workable") inst.components.workable:SetWorkAction(ACTIONS.HAMMER) inst.components.workable:SetWorkLeft(4) inst.components.workable:SetOnFinishCallback(onhammered) inst.components.workable:SetOnWorkCallback(onhit) inst:AddComponent("prototyper") inst.components.prototyper.trees = TUNING.PROTOTYPER_TREES.TECH.SCIENCE_ONE inst.components.prototyper.onturnon = OnTurnOn inst.components.prototyper.onturnoff = OnTurnOff inst.components.prototyper.onactivate = onactivate inst:ListenForEvent("onbuilt", onbuilt) inst.OnSave = onsave inst.OnLoad = onload inst.OnPreLoad = onpreload return inst end return Prefab("mealingstone", fn, assets, prefabs), MakePlacer("mealingstone_placer", "quagmire_mealingstone", "quagmire_mealingstone", "idle") Could anyone please have a look at it? Thank you very much! I don`t know what`s wrong there Edited December 10, 2018 by Gobbel Link to comment Share on other sites More sharing options...
Ultroman Posted December 10, 2018 Share Posted December 10, 2018 (edited) Please include a log file with the error, and preferably the whole mod in a zip. Edited December 10, 2018 by Ultroman Link to comment Share on other sites More sharing options...
Gobbel Posted December 10, 2018 Author Share Posted December 10, 2018 Sure, zip file coming right up. Unfortunately, there is no error log. I tried the mod on a new server, but it crashes before it can save anything (before day 1). Is there a way to still produce an error log? Dont Starve Together Mod.zip Link to comment Share on other sites More sharing options...
Ultroman Posted December 10, 2018 Share Posted December 10, 2018 If there are no server logs yet, neither in the Master or Caves folder, then the client_log.txt might still have some information of what's happening. I'll try it out myself right now, though. I got an error in my server_log.txt, so I could discern the error. Line 165 in mealingstone.lua needs to be: inst.components.prototyper.trees = TECH.SCIENCE_ONE Link to comment Share on other sites More sharing options...
Gobbel Posted December 10, 2018 Author Share Posted December 10, 2018 (edited) Thank you so much, I love you man! I`ll change that immediately. Such a simple mistake drove me nuts and I couldn`t figure it out. QQ Can I ask you one more thing? If I want the new recipes to only be available when the player is near the new prototyper I don`t have to add any new code, do I? Because the inst.components.prototyper.onturnon = OnTurnOn inst.components.prototyper.onturnoff = OnTurnOff inst.components.prototyper.onactivate = onactivate already does that, as far as I understood. Because after adding inst:AddTag("mealermealer") to the prototyper and adding that tag in the two new recipes local flour_recipe = Recipe("flour",{ Ingredient("wheat", 2) }, RECIPETABS.REFINE, {SCIENCE = 0}, nil, nil, true, nil, "mealermealer") flour_recipe.atlas = "images/inventoryimages/flour.xml" local turnip_sugar_recipe = Recipe("sugar",{ Ingredient("turnip", 2) }, RECIPETABS.REFINE, {SCIENCE = 0}, nil, nil, true, nil, "mealermealer") turnip_sugar_recipe.atlas = "images/inventoryimages/turnip_sugar.xml" , it crashes when it opens the crafting menu when standing near the prototyper. [00:02:24]: [string "scripts/components/builder.lua"]:193: attempt to index field 'accessible_tech_trees' (a nil value) LUA ERROR stack traceback: scripts/components/builder.lua:193 in (method) EvaluateTechTrees (Lua) <137-245> scripts/components/builder.lua:110 in (method) OnUpdate (Lua) <109-111> scripts/update.lua:192 in () ? (Lua) <149-228> [00:02:24]: Warning: Widget:SetFocusFromChild is happening on a widget outside of the screen/widget hierachy. This will cause focus moves to fail. Is ScriptErrorWidget not a screen? [00:02:24]: stack traceback: scripts/widgets/widget.lua:602 in (method) SetFocusFromChild (Lua) <599-624> scripts/widgets/widget.lua:621 in (method) SetFocusFromChild (Lua) <599-624> scripts/widgets/widget.lua:621 in (method) SetFocusFromChild (Lua) <599-624> scripts/widgets/widget.lua:649 in (method) SetFocus (Lua) <626-658> scripts/widgets/menu.lua:83 in (method) SetFocus (Lua) <74-85> scripts/widgets/scripterrorwidget.lua:109 in (method) OnUpdate (Lua) <102-119> scripts/update.lua:90 in () ? (Lua) <33-129> EDIT: let me guess, it is something with the tech tree cannot be 0, right? Edited December 10, 2018 by Gobbel Link to comment Share on other sites More sharing options...
Ultroman Posted December 10, 2018 Share Posted December 10, 2018 That should be taken care of already, I believe. It should also be compatible with my "Long-range Research" mod, adhering to the "Miscellaneous" setting Link to comment Share on other sites More sharing options...
Gobbel Posted December 10, 2018 Author Share Posted December 10, 2018 Ah, great. Thanks a lot for confirming that! Link to comment Share on other sites More sharing options...
Ultroman Posted December 10, 2018 Share Posted December 10, 2018 You're welcome. If it doesn't work, you'll find out soon Link to comment Share on other sites More sharing options...
Gobbel Posted December 10, 2018 Author Share Posted December 10, 2018 Could you help me out one more time please? As I wrote above I added the tags to both the prototyper and the new recipes. ("mealermealer") But, even if there is no crash at all now, because I set all the tech trees to 1 instead of 0, the recipes won`t show up. I guess it is because of the tags. How is it possible to have these new recipes linked to the new prototyper only without creating a new tech tree? Or do I absolutely have to create one? Sorry for being such a trouble, but your knowledge is just too great a temptation to ask you. Link to comment Share on other sites More sharing options...
Ultroman Posted December 10, 2018 Share Posted December 10, 2018 Well, I'm no expert, but as far as I understand it, the recipes are always tied to a TECH. If they're supposed to always be available, that TECH is TECH.NONE. Just add a new TECH with a custom (uppercase) name, which has a value for your custom tech-type (which you will need to add to AVAILABLE_TECH), and use your TECH in your recipes. Look in the game file techtree.lua, which has the vanilla techtree types in a list called AVAILABLE_TECH, and look at constants.lua, which sets up the TECH dictionary. Just add to those, before creating your recipes. Link to comment Share on other sites More sharing options...
Gobbel Posted December 10, 2018 Author Share Posted December 10, 2018 (edited) Alright, then I guess I have to create a custom tech tree. I thought I could do without, but well. Thank you very much indeed for the help! Edited December 10, 2018 by Gobbel Link to comment Share on other sites More sharing options...
Ultroman Posted December 10, 2018 Share Posted December 10, 2018 You are welcome! I hope you get it working. Link to comment Share on other sites More sharing options...
Gobbel Posted December 12, 2018 Author Share Posted December 12, 2018 Okay, so I got it working fully. I used Felix Alchemy Potions as a base. Link to comment Share on other sites More sharing options...
Ultroman Posted December 12, 2018 Share Posted December 12, 2018 Great idea, looking at a similar mod. One can learn so much and quickly from doing that. 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