Assets = { Asset("IMAGE", "images/friendlybearger.tex"), Asset("ATLAS", "images/friendlybearger.xml"), Asset("IMAGE", "images/friendlydeerclops.tex"), Asset("ATLAS", "images/friendlydeerclops.xml"), Asset("IMAGE", "images/friendlydragonfly.tex"), Asset("ATLAS", "images/friendlydragonfly.xml"), Asset("IMAGE", "images/friendlymoose.tex"), Asset("ATLAS", "images/friendlymoose.xml"), } PrefabFiles = { "friendlybearger", "friendlydeerclops", "friendlydragonfly", "friendlymoose", } AddMinimapAtlas("images/friendlybearger.xml") AddMinimapAtlas("images/friendlydeerclops.xml") AddMinimapAtlas("images/friendlydragonfly.xml") AddMinimapAtlas("images/friendlymoose.xml") require = GLOBAL.require local TUNING = GLOBAL.TUNING local GetPlayer = GLOBAL.GetPlayer local Combat = require "components/combat" local follower = require "components/follower" local harvestable = require "components/harvestable" local ccanattack = Combat.CanAttack local GetPlayer = GLOBAL.GetPlayer local STRINGS = GLOBAL.STRINGS local RECIPETABS = GLOBAL.RECIPETABS local Recipe = GLOBAL.Recipe local Ingredient = GLOBAL.Ingredient local TECH = GLOBAL.TECH local ACTIONS = GLOBAL.ACTIONS local Vector3 = GLOBAL.Vector3 local distsq = GLOBAL.distsq local GetWorld = GLOBAL.GetWorld local Prefabs = GLOBAL.Prefabs local Transform = GLOBAL.Transform local Physics = GLOBAL.Physics local AnimState = GLOBAL.AnimState local FRAMES = GLOBAL.FRAMES local DEGREES = GLOBAL.DEGREES local SpawnPrefab = GLOBAL.SpawnPrefab local TheCamera = GLOBAL.TheCamera local seg_time = 30 local day_segs = 10 local dusk_segs = 4 local night_segs = 2 local day_time = seg_time * day_segs local dusk_time = seg_time * dusk_segs local night_time = seg_time * night_segs local total_day_time = seg_time*16 local TheSim = GLOBAL.TheSim local SpawnPrefab = GLOBAL.SpawnPrefab local GetSeasonManager = GLOBAL.GetSeasonManager local SEASONS = GLOBAL.SEASONS local GetClock = GLOBAL.GetClock local GetWorld = GLOBAL.GetWorld local Rbearger = Recipe("friendlybearger",{Ingredient("nightmarefuel",48),Ingredient("beardhair",16),Ingredient("purplegem",8),Ingredient("bearger_fur",2)},RECIPETABS.ANCIENT,TECH.ANCIENT_FOUR,nil,nil,true) Rbearger.atlas = "images/friendlybearger.xml" Rbearger.image = "friendlybearger.tex" Rbearger.sortkey = 2 local Rdeerclops = Recipe("friendlydeerclops",{Ingredient("nightmarefuel",48),Ingredient("beardhair",16),Ingredient("purplegem",8),Ingredient("deerclops_eyeball",2)},RECIPETABS.ANCIENT,TECH.ANCIENT_FOUR,nil,nil,true) Rdeerclops.atlas = "images/friendlydeerclops.xml" Rdeerclops.image = "friendlydeerclops.tex" Rdeerclops.sortkey = 2 local Rdragonfly = Recipe("friendlydragonfly",{Ingredient("nightmarefuel",48),Ingredient("beardhair",16),Ingredient("purplegem",8),Ingredient("dragon_scales",2)},RECIPETABS.ANCIENT,TECH.ANCIENT_FOUR,nil,nil,true) Rdragonfly.atlas = "images/friendlydragonfly.xml" Rdragonfly.image = "friendlydragonfly.tex" Rdragonfly.sortkey = 2 local Rmoose = Recipe("friendlymoose",{Ingredient("nightmarefuel",48),Ingredient("beardhair",16),Ingredient("purplegem",8),Ingredient("goose_feather",18)},RECIPETABS.ANCIENT,TECH.ANCIENT_FOUR,nil,nil,true) Rmoose.atlas = "images/friendlymoose.xml" Rmoose.image = "friendlymoose.tex" Rmoose.sortkey = 2 local default_inv = {"twigs"} local function setStarterInventory(inst, custom_inv) local st_inv = inst.components.inventory.starting_inventory if (st_inv) then for k,v in pairs(default_inv) do table.insert(st_inv, v) end else inst.components.inventory.starting_inventory = default_inv end if (custom_inv) then for k,v in pairs(custom_inv) do table.insert(inst.components.inventory.starting_inventory, v) end end end local function makePostInit(custom_inv) return function (inst) setStarterInventory(inst, custom_inv) end end local giant_inv1 = {"friendlybearger"} local giant_inv2 = {"friendlydeerclops"} local giant_inv3 = {"friendlymoose"} local giant_inv4 = {"friendlydragonfly"} if GetModConfigData("giant_start") == 1 then AddPrefabPostInit("wilson",makePostInit(giant_inv1)) AddPrefabPostInit("willow",makePostInit(giant_inv1)) AddPrefabPostInit("wendy",makePostInit(giant_inv1)) AddPrefabPostInit("wolfgang",makePostInit(giant_inv1)) AddPrefabPostInit("wickerbottom",makePostInit(giant_inv1)) AddPrefabPostInit("woodie",makePostInit(giant_inv1)) AddPrefabPostInit("wx78",makePostInit(giant_inv1)) AddPrefabPostInit("wes",makePostInit(giant_inv1)) AddPrefabPostInit("waxwell",makePostInit(giant_inv1)) AddPrefabPostInit("wathgrithr",makePostInit(giant_inv1)) AddPrefabPostInit("webber",makePostInit(giant_inv1)) AddPrefabPostInit("walani",makePostInit(giant_inv1)) AddPrefabPostInit("wilbur",makePostInit(giant_inv1)) AddPrefabPostInit("warly",makePostInit(giant_inv1)) AddPrefabPostInit("woodlegs",makePostInit(giant_inv1)) elseif GetModConfigData("giant_start") == 2 then AddPrefabPostInit("wilson",makePostInit(giant_inv2)) AddPrefabPostInit("willow",makePostInit(giant_inv2)) AddPrefabPostInit("wendy",makePostInit(giant_inv2)) AddPrefabPostInit("wolfgang",makePostInit(giant_inv2)) AddPrefabPostInit("wickerbottom",makePostInit(giant_inv2)) AddPrefabPostInit("woodie",makePostInit(giant_inv2)) AddPrefabPostInit("wx78",makePostInit(giant_inv2)) AddPrefabPostInit("wes",makePostInit(giant_inv2)) AddPrefabPostInit("waxwell",makePostInit(giant_inv2)) AddPrefabPostInit("wathgrithr",makePostInit(giant_inv2)) AddPrefabPostInit("webber",makePostInit(giant_inv2)) AddPrefabPostInit("walani",makePostInit(giant_inv2)) AddPrefabPostInit("wilbur",makePostInit(giant_inv2)) AddPrefabPostInit("warly",makePostInit(giant_inv2)) AddPrefabPostInit("woodlegs",makePostInit(giant_inv2)) elseif GetModConfigData("giant_start") == 3 then AddPrefabPostInit("wilson",makePostInit(giant_inv3)) AddPrefabPostInit("willow",makePostInit(giant_inv3)) AddPrefabPostInit("wendy",makePostInit(giant_inv3)) AddPrefabPostInit("wolfgang",makePostInit(giant_inv3)) AddPrefabPostInit("wickerbottom",makePostInit(giant_inv3)) AddPrefabPostInit("woodie",makePostInit(giant_inv3)) AddPrefabPostInit("wx78",makePostInit(giant_inv3)) AddPrefabPostInit("wes",makePostInit(giant_inv3)) AddPrefabPostInit("waxwell",makePostInit(giant_inv3)) AddPrefabPostInit("wathgrithr",makePostInit(giant_inv3)) AddPrefabPostInit("webber",makePostInit(giant_inv3)) AddPrefabPostInit("walani",makePostInit(giant_inv3)) AddPrefabPostInit("wilbur",makePostInit(giant_inv3)) AddPrefabPostInit("warly",makePostInit(giant_inv3)) AddPrefabPostInit("woodlegs",makePostInit(giant_inv3)) elseif GetModConfigData("giant_start") == 4 then AddPrefabPostInit("wilson",makePostInit(giant_inv4)) AddPrefabPostInit("willow",makePostInit(giant_inv4)) AddPrefabPostInit("wendy",makePostInit(giant_inv4)) AddPrefabPostInit("wolfgang",makePostInit(giant_inv4)) AddPrefabPostInit("wickerbottom",makePostInit(giant_inv4)) AddPrefabPostInit("woodie",makePostInit(giant_inv4)) AddPrefabPostInit("wx78",makePostInit(giant_inv4)) AddPrefabPostInit("wes",makePostInit(giant_inv4)) AddPrefabPostInit("waxwell",makePostInit(giant_inv4)) AddPrefabPostInit("wathgrithr",makePostInit(giant_inv4)) AddPrefabPostInit("webber",makePostInit(giant_inv4)) AddPrefabPostInit("walani",makePostInit(giant_inv4)) AddPrefabPostInit("wilbur",makePostInit(giant_inv4)) AddPrefabPostInit("warly",makePostInit(giant_inv4)) AddPrefabPostInit("woodlegs",makePostInit(giant_inv4)) end STRINGS.ACTIONS.SITCOMMAND = "Order to Stay" STRINGS.ACTIONS.SITCOMMAND_CANCEL = "Order to Follow" STRINGS.CHARACTERS.GENERIC.ANNOUNCE_SITCOMMAND = "Stay there." STRINGS.CHARACTERS.GENERIC.ANNOUNCE_SITCOMMAND_CANCEL = "Come here." STRINGS.CHARACTERS.WX78.ANNOUNCE_SITCOMMAND = "STAY" STRINGS.CHARACTERS.WX78.ANNOUNCE_SITCOMMAND_CANCEL = "FOLLOW" --credits to Questionable Intent for the code here. ACTIONS.SITCOMMAND = GLOBAL.Action(2, true, true) ACTIONS.SITCOMMAND.fn = function(act) local targ = act.target if targ and targ.components.followersitcommand then act.doer.components.locomotor:Stop() act.doer.components.talker:Say(GLOBAL.GetString(act.doer.prefab, "ANNOUNCE_SITCOMMAND")) if not targ.components.unteleportable then targ:AddComponent("unteleportable") end targ.components.followersitcommand:SetStaying(true) targ.components.followersitcommand:RememberSitPos("currentstaylocation", GLOBAL.Point(targ.Transform:GetWorldPosition())) return true end end ACTIONS.SITCOMMAND.str = STRINGS.ACTIONS.SITCOMMAND ACTIONS.SITCOMMAND.id = "SITCOMMAND" ACTIONS.SITCOMMAND_CANCEL = GLOBAL.Action(2, true, true) ACTIONS.SITCOMMAND_CANCEL.fn = function(act) local targ = act.target if targ and targ.components.followersitcommand then act.doer.components.locomotor:Stop() act.doer.components.talker:Say(GLOBAL.GetString(act.doer.prefab, "ANNOUNCE_SITCOMMAND_CANCEL")) targ:RemoveComponent("unteleportable") targ.components.followersitcommand:SetStaying(false) return true end end ACTIONS.SITCOMMAND_CANCEL.str = STRINGS.ACTIONS.SITCOMMAND_CANCEL ACTIONS.SITCOMMAND_CANCEL.id = "SITCOMMAND_CANCEL" -- --examine trap first + auto reset AddSimPostInit(function(inst) GLOBAL.TheInput:AddControlHandler(GLOBAL.CONTROL_ACTION, function(down) local pt = GLOBAL.GetPlayer():GetPosition() local ents = TheSim:FindEntities(pt.x, pt.y, pt.z, 50) for k,ent in pairs(ents) do if ent and ent.components.inventoryitem then if ent:HasTag("summonedbyplayer") then ent.components.inventoryitem.canbepickedup = false end end end end) GLOBAL.TheInput:AddControlHandler(GLOBAL.CONTROL_PRIMARY, function(down) local ents=GLOBAL.TheInput:GetAllEntitiesUnderMouse() for k,ent in pairs(ents) do if ent and ent.components.inventoryitem then if ent:HasTag("summonedbyplayer") then ent.components.inventoryitem.canbepickedup = true end end end end) end) function TeleportCheck(self,inst) function self:StartLeashing() self.inst.portnearleader = function() if not self.leader or (self.leader and self.leader:IsAsleep()) then return end local init_pos = self.inst:GetPosition() local leader_pos = self.leader:GetPosition() local angle = self.leader:GetAngleToPoint(init_pos) local offset = GLOBAL.FindWalkableOffset(leader_pos, angle*DEGREES, 30, 10) or Vector3(0,0,0) if distsq(leader_pos, init_pos) > 1600 and not self.inst.components.unteleportable then local pos = leader_pos + offset if self.inst.components.combat then self.inst.components.combat:SetTarget(nil) end self.inst:DoTaskInTime(.1, function() self.inst.Transform:SetPosition(pos:Get()) end) end end self.inst:ListenForEvent("entitysleep", self.inst.portnearleader) end end AddComponentPostInit("follower", TeleportCheck) if not GLOBAL.IsDLCEnabled(GLOBAL.CAPY_DLC) then ACTIONS.HACK = GLOBAL.Action(2, true, true) end local function OnAttackedSkeletonHelp(inst, data) inst.components.combat:ShareTarget(data.attacker, 65, function(dude) return dude:HasTag("summonedbyplayer") and not dude.components.health:IsDead() and not dude:HasTag("player") end, 10) end local function AlertSkeletons(inst) inst:ListenForEvent("attacked",OnAttackedSkeletonHelp) end AddPrefabPostInit("wilson",AlertSkeletons) AddPrefabPostInit("willow",AlertSkeletons) AddPrefabPostInit("wendy",AlertSkeletons) AddPrefabPostInit("wolfgang",AlertSkeletons) AddPrefabPostInit("wickerbottom",AlertSkeletons) AddPrefabPostInit("woodie",AlertSkeletons) AddPrefabPostInit("wx78",AlertSkeletons) AddPrefabPostInit("wes",AlertSkeletons) AddPrefabPostInit("waxwell",AlertSkeletons) AddPrefabPostInit("wathgrithr",AlertSkeletons) AddPrefabPostInit("webber",AlertSkeletons) AddPrefabPostInit("walani",AlertSkeletons) AddPrefabPostInit("wilbur",AlertSkeletons) AddPrefabPostInit("warly",AlertSkeletons) AddPrefabPostInit("woodlegs",AlertSkeletons) local function SkeletonDoesntTarget(inst) inst:AddTag("structure") end AddPrefabPostInit("slurtlehole", SkeletonDoesntTarget)