Jump to content

Recommended Posts

Hello, thank for trying to help! For context, I am making a character mod that has their own craft-able equipment, and this one I'm making just keeps crashing Don't Starve Together whenever I launch it. The Code is basically a miner hat that can be upgraded by inserting gems, with only one upgrade at a time, kind of like cratered moon rocks. I didn't add any condition to enable these effects, but whenever I add this file to the mod it crashes, so I am *sure* I did something wrong. Most of the code was taken from other vanilla DST items, so I feel like maybe in that jigsaw puzzle of a code I added it in wrong. I also feel like the way I implemented how the item checks for the gem type crashes it, but I don't know how to rewrite it correctly. Thank you so much! Here's the code:
This is my first mod, and I have basically minimal experience with DST code and such, so thank you again for any help or tips.

local function projector_turnon(inst)
    local owner = inst.components.inventoryitem ~= nil and inst.components.inventoryitem.owner or nil
    if not inst.components.fueled:IsEmpty() then
        if inst._light == nil or not inst._light:IsValid() then
            inst._light = SpawnPrefab("minerhatlight")
        end
        if owner ~= nil then
            _onequip(inst, owner)
            inst._light.entity:SetParent(owner.entity)
        end
        inst.components.fueled:StartConsuming()
        inst.components.equippable.dapperness = -TUNING.DAPPERNESS_MED
        local soundemitter = owner ~= nil and owner.SoundEmitter or inst.SoundEmitter
        --(Gem conditions)
 
        local assets =
        {
            --Asset("ANIM", "anim/wotzomooneyes.zip"),
            Asset("ANIM", "anim/projector.zip")
        }
 
        local prefabs =
        {
            "wotzopurplemooneye",
            "wotzobluemooneye",
            "wotzoredmooneye",
            "wotzoorangemooneye",
            "wotzoyellowmooneye",
            "wotzogreenmooneye",
        }
 
        local function ItemTradeTest(inst, item)
            if item == nil then
                return false
            elseif string.sub(item.prefab, -3) ~= "gem" then
                return false, "NOTGEM"
            elseif string.sub(item.prefab, -11, -4) == "precious" then
                return false, "WRONGGEM"
            end
            return true
        end
 
        local function OnGemGiven(inst, giver, item)
            local mooneye = SpawnPrefab(string.sub(item.prefab, 1, -4).."mooneye")
            local container = inst.components.inventoryitem:GetContainer()
            if container ~= nil then
                local slot = inst.components.inventoryitem:GetSlotNum()
                inst:Remove()
                container:GiveItem(mooneye, slot)
            else
                local x, y, z = inst.Transform:GetWorldPosition()
                inst:Remove()
                mooneye.Transform:SetPosition(x, y, z)
            end
        end
 
        local function RedActionForWotzo(inst, giver, slot, wotzoredmooneye)
            if slot == wotzoredmooneye then
                inst:AddComponent("insulator")
                inst.components.insulator:SetInsulation(TUNING.INSULATION_MED)
            end
        end
 
        local function BlueActionWotzo(inst, giver, slot, wotzobluemooneye)
            if slot == wotzobluemooneye then
                inst:AddComponent("insulator")
                inst.components.insulator:SetSummer()
                inst.components.insulator:SetInsulation(TUNING.INSULATION_MED)
            end
        end
 
        local function YellowActionWotzo(inst, giver, slot, wotzoyellowmooneye)
            if slot == wotzoyellowmooneye then
                inst.components.equippable.walkspeedmult = TUNING.WALKING_STICK_SPEED_MULT
            end  
        end
 
        local function PurpleActionWotzo(inst, giver, slot, wotzopurplemooneye)
            if slot == wotzopurplemooneye then
                inst.components.equippable.dapperness = TUNING.DAPPERNESS_MED
            end  
        end
 
        local function GreenActionWotzo(inst, giver, slot, wotzogreenmooneye)
            if slot == wotzogreenmooneye then
                if owner.components.builder ~= nil then
                    owner.components.builder.ingredientmod = TUNING.GREENAMULET_INGREDIENTMOD
                end
                inst.onitembuild = function(owner, data)
                    if not (data ~= nil and data.discounted == false) then
                        inst.components.finiteuses:Use(1)
                    end
                end
                inst:ListenForEvent("consumeingredients", inst.onitembuild, owner)
            end  
        end
 
        local function OrangeActionWotzo(inst, giver, slot, wotzoorangemooneye)
            if slot == wotzoorangemooneye then
                local prefabs =
                {
                    "explode_big",
                }
                local function OnExplodeFn(inst)
                    SpawnPrefab("explode_big").Transform:SetPosition(inst.Transform:GetWorldPosition())
                end
                inst:AddComponent("explosive")
                inst.components.explosive:SetOnExplodeFn(OnExplodeFn)
                inst.components.explosive.explosivedamage = TUNING.GUNPOWDER_DAMAGE * 100
                -- Oppenheimer kind of stuff
            end  
        end
 
        -- Gem condition stuff
        -- (Red = Summer, Winter = Winter, Yellow = Speed, Orange = ?!, Purple = sanity, Green = GAmulet effect)
 
        local function onunequip_projector(inst, owner)
            owner.AnimState:ClearOverrideSymbol("swap_body")
        end
 
        local function fn()
            local inst = CreateEntity()
 
            inst.entity:AddTransform()
            inst.entity:AddAnimState()
            inst.entity:AddSoundEmitter()
            inst.entity:AddNetwork()
 
            MakeInventoryPhysics(inst)
 
            inst.AnimState:SetRayTestOnBB(true)
            inst.AnimState:SetBank("mooneyes")
            inst.AnimState:SetBuild("mooneyes")
            inst.AnimState:PlayAnimation("crater")
            inst.scrapbook_anim = "crater"
 
            inst:AddTag("gemsocket")
 
            -- trader (from trader component) added to pristine state for optimization
            inst:AddTag("trader")
            inst:AddTag("give_dolongaction")
 
            inst.entity:SetPristine()
 
            if not TheWorld.ismastersim then
                return inst
            end
 
            inst:AddComponent("inspectable")
 
            inst:AddComponent("inventoryitem")
            inst.components.inventoryitem:SetSinks(true)
 
            inst:AddComponent("trader")
            inst.components.trader:SetAbleToAcceptTest(ItemTradeTest)
            inst.components.trader.onaccept = OnGemGiven
 
            MakeHauntableLaunch(inst)
 
            return inst
        end
 
        return Prefab("projector", fn, assets, prefabs)
    elseif owner ~= nil then
        _onequip(inst, owner, "swap_hat_off")
    end
end
 
local function projector_turnoff(inst)
    local owner = inst.components.inventoryitem ~= nil and inst.components.inventoryitem.owner or nil
    if owner ~= nil and inst.components.equippable ~= nil and inst.components.equippable:IsEquipped() then
        _onequip(inst, owner, "swap_hat_off")
    end
    inst.components.fueled:StopConsuming()
    if inst._light ~= nil then
        if inst._light:IsValid() then
            inst._light:Remove()
        end
        inst._light = nil
        local soundemitter = owner ~= nil and owner.SoundEmitter or inst.SoundEmitter
        soundemitter:PlaySound("dontstarve/common/minerhatOut")
    end
end
 
local function projector_unequip(inst, owner)
    _onunequip(inst, owner)
    projector_turnoff(inst)
end
 
fns.projector_onequiptomodel = function(inst, owner, from_ground)
    fns.simple_onequiptomodel(inst, owner, from_ground)
    projector_turnoff(inst)
end
 
local function projector_custom_init(inst)
    inst.entity:AddSoundEmitter()
    -- waterproofer (from waterproofer component) added to pristine state for optimization
    inst:AddTag("waterproofer")
end
 
local function projector_onremove(inst)
    if inst._light ~= nil and inst._light:IsValid() then
        inst._light:Remove()
    end
end
 
fns.projector = function()
    local inst = simple(projector_custom_init)
 
    inst.components.floater:SetSize("med")
    inst.components.floater:SetScale(0.2)
 
    if not TheWorld.ismastersim then
        return inst
    end
 
    inst.components.inventoryitem:SetOnDroppedFn(projector_turnoff)
    inst.components.equippable:SetOnEquip(projector_turnon)
    inst.components.equippable:SetOnUnequip(projector_unequip)
    inst.components.equippable:SetOnEquipToModel(fns.projector_onequiptomodel)
 
    inst:AddComponent("waterproofer")
    inst.components.waterproofer:SetEffectiveness(TUNING.WATERPROOFNESS_SMALL)
 
    inst._light = nil
    inst.OnRemoveEntity = projector_onremove
 
    return inst
end
Edited by CubezertThing
Fixed Issue, but new related problem came up.

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