Jump to content

How do i check for prefab name?


Recommended Posts

 

Hi! i just started learning how to code in LUA a few days ago and i've figured out how to make spores plantable, however i want to make each spore plant their respective mushroom, and i have no idea how to go about doing that. any help would be appreciated. thank you

 

require "prefabutil"

MUSHTREE_SPORE_BLUE = "spore_tall"
MUSHTREE_SPORE_RED = "spore_medium"
MUSHTREE_SPORE_GREEN = "spore_small"

local assets =
{
    Asset("ANIM", "anim/mushroom_spore.zip"),
    Asset("ANIM", "anim/mushroom_spore_red.zip"),
    Asset("ANIM", "anim/mushroom_spore_blue.zip"),
}

local prefabs =
{
    "red_mushroom",
    "green_mushroom",
    "blue_mushroom",
}

local data =
{
    small =
    { --Green
        build = "mushroom_spore",
        lightcolour = {146/255, 225/255, 146/255},
    },
    medium =
    { --Red
        build = "mushroom_spore_red",
        lightcolour = {197/255, 126/255, 126/255},
    },
    tall =
    { --Blue
        build = "mushroom_spore_blue",
        lightcolour = {111/255, 111/255, 227/255},
    },
}

local brain = require "brains/sporebrain"

local function depleted(inst)
    if inst:IsInLimbo() then
        inst:Remove()
    else
        inst.components.workable:SetWorkable(false)
        inst:PushEvent("death")
        inst:RemoveTag("spore") -- so crowding no longer detects it
        inst.persists = false
        -- clean up when offscreen, because the death event is handled by the SG
        inst:DoTaskInTime(3, inst.Remove)
    end
end

local SPORE_TAGS = {"spore"}
local function checkforcrowding(inst)
    local x, y, z = inst.Transform:GetWorldPosition()
    local spores = TheSim:FindEntities(x,y,z, TUNING.MUSHSPORE_MAX_DENSITY_RAD, SPORE_TAGS)
    if #spores > TUNING.MUSHSPORE_MAX_DENSITY then
        inst.components.perishable:SetPercent(0)
    else
        inst.crowdingtask = inst:DoTaskInTime(TUNING.MUSHSPORE_DENSITY_CHECK_TIME + math.random()*TUNING.MUSHSPORE_DENSITY_CHECK_VAR, checkforcrowding)
    end
end

local function onpickup(inst)
    --These last longer when held
    inst.components.perishable:SetLocalMultiplier( TUNING.SEG_TIME * 3/ TUNING.PERISH_SLOW )
    if inst.crowdingtask ~= nil then
        inst.crowdingtask:Cancel()
        inst.crowdingtask = nil
    end
end

local function ondropped(inst)
    --Disappears faster when floating
    inst.components.perishable:SetLocalMultiplier(1)
    if inst.components.workable ~= nil then
        inst.components.workable:SetWorkLeft(1)
    end

    if inst.components.stackable ~= nil then
        while inst.components.stackable:StackSize() > 1 do
            local item = inst.components.stackable:Get()
            if item ~= nil then
                if item.components.inventoryitem ~= nil then
                    item.components.inventoryitem:OnDropped()
                end
                item.Physics:Teleport(inst.Transform:GetWorldPosition())
            end
        end
    end

    if inst.crowdingtask == nil then
        inst.crowdingtask = inst:DoTaskInTime(TUNING.MUSHSPORE_DENSITY_CHECK_TIME + math.random()*TUNING.MUSHSPORE_DENSITY_CHECK_VAR, checkforcrowding)
    end
end

local function onload(inst)
    -- If we loaded, then just turn the light on
    inst.Light:Enable(true)
    inst.DynamicShadow:Enable(true)
end

local function makespore(data)

    local function onworked(inst, worker)
        if worker.components.inventory ~= nil then
            worker.components.inventory:GiveItem(inst, nil, inst:GetPosition())
            worker.SoundEmitter:PlaySound("dontstarve/common/butterfly_trap")
        end
    end

    local function CanDeploy(inst)
        return true
    end

    local function OnDeploy(inst, pt, deployer)
        local mushroom = SpawnPrefab("green_mushroom")
        if mushroom then
            mushroom.Transform:SetPosition(pt:Get())
            inst.components.stackable:Get():Remove()
            if deployer and deployer.SoundEmitter then
            deployer.SoundEmitter:PlaySound("dontstarve/common/plant")
             end
         end
    end

	local function fn()
        local inst = CreateEntity()

        inst.entity:AddTransform()
        inst.entity:AddAnimState()
        inst.entity:AddSoundEmitter()
    	inst.entity:AddDynamicShadow()
        inst.entity:AddLight()
        inst.entity:AddNetwork()

    	MakeCharacterPhysics(inst, 1, .5)

        inst.AnimState:SetBuild(data.build)
        inst.AnimState:SetBank("mushroom_spore")
        inst.AnimState:PlayAnimation("flight_cycle", true)

        inst.DynamicShadow:Enable(false)

	    inst.Light:SetColour(unpack(data.lightcolour))
	    inst.Light:SetIntensity(0.75)
	    inst.Light:SetFalloff(0.5)
	    inst.Light:SetRadius(2)
	    inst.Light:Enable(false)

	    inst.DynamicShadow:SetSize(.8, .5)

        inst:AddTag("show_spoilage")
        inst:AddTag("spore")

        inst.entity:SetPristine()

        if not TheWorld.ismastersim then
            return inst
        end

        inst.scrapbook_anim = "flight_cycle"
        inst.scrapbook_animoffsety = 65
        inst.scrapbook_animpercent = 0.36

        inst:AddComponent("inspectable")

        inst:AddComponent("knownlocations")
		inst:AddComponent("tradable")

	    inst:AddComponent("locomotor") -- locomotor must be constructed before the stategraph
	    inst.components.locomotor:EnableGroundSpeedMultiplier(false)
	    inst.components.locomotor:SetTriggersCreep(false)
	    inst.components.locomotor.walkspeed = 2

        inst:AddComponent("inventoryitem")
        inst.components.inventoryitem.canbepickedup = false

        inst:AddComponent("workable")
        inst.components.workable:SetWorkAction(ACTIONS.NET)
        inst.components.workable:SetWorkLeft(1)
        inst.components.workable:SetOnFinishCallback(onworked)

        inst:AddComponent("perishable")
        inst.components.perishable:SetPerishTime(TUNING.SEG_TIME * 3)
        inst.components.perishable:StartPerishing()
        inst.components.perishable:SetOnPerishFn(depleted)

        inst:AddComponent("stackable")

        inst:AddComponent("burnable")
        inst.components.burnable:SetFXLevel(1)
        inst.components.burnable:SetBurnTime(1)
        inst.components.burnable:AddBurnFX("fire", Vector3(0, 0, 0), "spore")
        inst.components.burnable:SetOnIgniteFn(DefaultBurnFn)
        inst.components.burnable:SetOnBurntFn(DefaultBurntFn)
        inst.components.burnable:SetOnExtinguishFn(DefaultExtinguishFn)

        inst:AddComponent("propagator")
        inst.components.propagator.acceptsheat = true
        inst.components.propagator:SetOnFlashPoint(DefaultIgniteFn)
        inst.components.propagator.flashpoint = 1
        inst.components.propagator.decayrate = 0.5
        inst.components.propagator.damages = false

        inst:AddComponent("deployable")
        inst.components.deployable.ondeploy = OnDeploy
        inst.components.deployable:SetDeployMode(DEPLOYMODE.PLANT)
        

        MakeHauntablePerish(inst, .5)

        inst:ListenForEvent("onputininventory", onpickup)
        inst:ListenForEvent("ondropped", ondropped)

	    inst:SetStateGraph("SGspore")
	    inst:SetBrain(brain)

        -- note: the first check is faster, because this might be from dropping a stack
        inst.crowdingtask = inst:DoTaskInTime(1 + math.random()*TUNING.MUSHSPORE_DENSITY_CHECK_VAR, checkforcrowding)

        inst.OnLoad = onload

        return inst
	end

	return fn
end

return Prefab(MUSHTREE_SPORE_BLUE, makespore(data.tall), assets),
    Prefab(MUSHTREE_SPORE_RED, makespore(data.medium), assets),
    Prefab(MUSHTREE_SPORE_GREEN, makespore(data.small), assets)

 

Edited by Tin Can
Link to comment
Share on other sites

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
 Share

×
  • Create New...