Jump to content

Recommended Posts

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 by Gobbel

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

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

 

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 by Gobbel

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. :)

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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
  • Create New...