Yakuzashi Posted September 18, 2018 Share Posted September 18, 2018 (edited) Hello. I have tried to make followers based on Maxwell's copies. Game doesn't crash. My followers after spawn are just idle. They can die but won't move or act in any way. I coppied maxwell's copies SG and brain so it is not problem. I also modified character and creature prefab files, so they could be troublemakers. I will appreciate every help. Character local MakePlayerCharacter = require "prefabs/player_common" local assets = { Asset("SCRIPT", "scripts/prefabs/player_common.lua"), } local prefabs = { "shadow_despawn", "statue_transition_2", } -- Custom starting items local start_inv = { } -------------GRUNTS local function squadleader(inst) if inst.components.leader then for k,v in pairs(inst.grunts) do if v:IsValid() then if v.components.follower then inst.components.leader:AddFollower(v, true) end else inst.grunts[k] = nil end end end end local function DoEffects(pet) local x, y, z = pet.Transform:GetWorldPosition() SpawnPrefab("shadow_despawn").Transform:SetPosition(x, y, z) SpawnPrefab("statue_transition_2").Transform:SetPosition(x, y, z) end local function KillPet(pet) pet.components.health:Kill() end local function OnSpawnPet(inst, pet) if pet:HasTag("grunt") then pet:DoTaskInTime(0, DoEffects) if not (inst.components.health:IsDead() or inst:HasTag("playerghost")) then inst.components.sanity:AddSanityPenalty(pet, TUNING.SHADOWWAXWELL_SANITY_PENALTY[string.upper(pet.prefab)]) inst:ListenForEvent("onremove", inst._onpetlost, pet) elseif pet._killtask == nil then pet._killtask = pet:DoTaskInTime(math.random(), KillPet) end elseif inst._OnSpawnPet ~= nil then inst:_OnSpawnPet(pet) end end local function OnDespawnPet(inst, pet) if pet:HasTag("grunt") then DoEffects(pet) pet:Remove() elseif inst._OnDespawnPet ~= nil then inst:_OnDespawnPet(pet) end end local function OnDeath(inst) for k, v in pairs(inst.components.petleash:GetPets()) do if v:HasTag("grunt") and v._killtask == nil then v._killtask = v:DoTaskInTime(math.random(), KillPet) end end end -------------------------- -- When the character is revived from human local function onbecamehuman(inst) -- Set speed when reviving from ghost (optional) inst.components.locomotor:SetExternalSpeedMultiplier(inst, "taern_speed_mod", 1.4) end local function onbecameghost(inst) -- Remove speed modifier when becoming a ghost inst.components.locomotor:RemoveExternalSpeedMultiplier(inst, "taern_speed_mod") end -- When loading or spawning the character local function onload(inst) inst:ListenForEvent("ms_respawnedfromghost", onbecamehuman) inst:ListenForEvent("ms_becameghost", onbecameghost) if inst:HasTag("playerghost") then onbecameghost(inst) else onbecamehuman(inst) end end -- This initializes for both the server and client. Tags can be added here. local common_postinit = function(inst) -- Minimap icon inst.MiniMapEntity:SetIcon( "taern.tex" ) end -- This initializes for the server only. Components are added here. local master_postinit = function(inst) -- choose which sounds this character will play inst.soundsname = "wolfgang" -- Uncomment if "wathgrithr"(Wigfrid) or "webber" voice is used --inst.talker_path_override = "dontstarve_DLC001/characters/" -- Stats inst.components.health:SetMaxHealth(100) inst.components.hunger:SetMax(200) inst.components.sanity:SetMax(200) -- Damage multiplier (optional) inst.components.combat.damagemultiplier = 1.5 -- Hunger rate (optional) inst.components.hunger.hungerrate = 0.65 * TUNING.WILSON_HUNGER_RATE -----GRUNTS inst:AddComponent("petleash") inst.components.petleash:SetOnSpawnFn(OnSpawnPet) inst.components.petleash:SetOnDespawnFn(OnDespawnPet) inst.components.petleash:SetMaxPets(3) --Campfire made by K1NGT1GER609 <- this guy is amazing ! local function fireheal(inst) local x,y,z = inst.Transform:GetWorldPosition() local max_rad = 3 --you have to be close to heal from the fire local ents = TheSim:FindEntities(x,y,z, max_rad, nil, nil, {"campfire"}) --only look for campfires not forest fires for k,v in pairs(ents) do inst.components.health:DoDelta(1,1) --heal 1 end end inst:DoPeriodicTask(0.5, fireheal, nil, inst) --do the heal every 2 seconds inst.OnLoad = onload inst.OnNewSpawn = onload return inst end return MakePlayerCharacter("taern", prefabs, assets, common_postinit, master_postinit, start_inv) Creature require "brains/shadowwaxwellbrain" require "stategraphs/SGshadowwaxwell" local assets = { Asset("ANIM", "anim/swap_pickaxe.zip"), Asset("ANIM", "anim/swap_axe.zip"), Asset("ANIM", "anim/swap_nightmaresword.zip"), } local prefabs = { "shadow_despawn", "statue_transition_2", "nightmarefuel", } local brain = require "brains/shadowwaxwellbrain" local stategraph = require "stategraphs/SGshadowwaxwell" local function linktoplayer(inst, player) -- inst.components.lootdropper:SetLoot(LOOT) inst.persists = false inst._playerlink = player player.grunt = inst player.components.leader:AddFollower(inst) for k, v in pairs(player.grunt) do k:Refresh() end player:ListenForEvent("onremove", unlink, inst) end local function OnAttacked(inst, data) if inst.components.follower.leader == data.attacker then if data.attacker.components.petleash ~= nil and data.attacker.components.petleash:IsPet(inst) then if inst.components.lootdropper == nil then inst:AddComponent("lootdropper") end inst.components.lootdropper:SpawnLootPrefab("nightmarefuel", inst:GetPosition()) data.attacker.components.petleash:DespawnPet(inst) elseif data.attacker.components.combat ~= nil then inst.components.combat:SuggestTarget(data.attacker) end end end local function retargetfn(inst) --Find things attacking leader local leader = inst.components.follower:GetLeader() return leader ~= nil and FindEntity( leader, TUNING.SHADOWWAXWELL_TARGET_DIST, function(guy) return guy ~= inst and (guy.components.combat:TargetIs(leader) or guy.components.combat:TargetIs(inst)) and inst.components.combat:CanTarget(guy) end, { "_combat" }, -- see entityreplica.lua { "playerghost", "INLIMBO" } ) or nil end local function keeptargetfn(inst, target) --Is your leader nearby and your target not dead? Stay on it. --Match KEEP_WORKING_DIST in brain return inst.components.follower:IsNearLeader(14) and inst.components.combat:CanTarget(target) end local function spearfn(inst) inst.components.health:SetMaxHealth(100) inst.components.health:StartRegen(TUNING.SHADOWWAXWELL_HEALTH_REGEN, TUNING.SHADOWWAXWELL_HEALTH_REGEN_PERIOD) inst.components.combat:SetDefaultDamage(50) inst.components.combat:SetAttackPeriod(TUNING.SHADOWWAXWELL_ATTACK_PERIOD) inst.components.combat:SetRetargetFunction(2, retargetfn) --Look for target. inst.components.combat:SetKeepTargetFunction(keeptargetfn) --Keep attacking while leader is near. return inst end local function nodebrisdmg(inst, amount, overtime, cause, ignore_invincible, afflicter, ignore_absorb) return afflicter ~= nil and afflicter:HasTag("quakedebris") end local function NoHoles(pt) return not TheWorld.Map:IsPointNearHole(pt) end local function onbuilt(inst, builder) local theta = math.random() * 2 * PI local pt = builder:GetPosition() local radius = math.random(3, 6) local offset = FindWalkableOffset(pt, theta, radius, 12, true, true, NoHoles) if offset ~= nil then pt.x = pt.x + offset.x pt.z = pt.z + offset.z end builder.components.petleash:SpawnPetAt(pt.x, 0, pt.z, inst.pettype) inst:Remove() end local function MakeBuilder(prefab) --These shadows are summoned this way because petleash needs to --be the component that summons the pets, not the builder. local function fn() local inst = CreateEntity() inst.entity:AddTransform() inst:AddTag("CLASSIFIED") --[[Non-networked entity]] inst.persists = false --Auto-remove if not spawned by builder inst:DoTaskInTime(0, inst.Remove) if not TheWorld.ismastersim then return inst end inst.pettype = prefab inst.OnBuiltFn = onbuilt return inst end return Prefab(prefab.."_builder", fn, nil, { prefab }) end local function MakeMinion(prefab, tool, hat, master_postinit) local assets = { Asset("ANIM", "anim/taern.zip"), Asset("SOUND", "sound/maxwell.fsb"), Asset("ANIM", "anim/"..tool..".zip"), } local function fn() local inst = CreateEntity() inst.entity:AddTransform() inst.entity:AddAnimState() inst.entity:AddSoundEmitter() inst.entity:AddNetwork() MakeGhostPhysics(inst, 1, 0.5) inst.Transform:SetFourFaced(inst) inst.AnimState:SetBank("wilson") inst.AnimState:SetBuild("taern") inst.AnimState:PlayAnimation("idle") -- inst.AnimState:SetMultColour(0, 0, 0, .5) if tool ~= nil then inst.AnimState:OverrideSymbol("swap_object", tool, tool) inst.AnimState:Hide("ARM_normal") else inst.AnimState:Hide("ARM_carry") end if hat ~= nil then inst.AnimState:OverrideSymbol("swap_hat", hat, "swap_hat") inst.AnimState:Hide("HAIR_NOHAT") inst.AnimState:Hide("HAIR") else inst.AnimState:Hide("HAT") inst.AnimState:Hide("HAIR_HAT") end inst:AddTag("scarytoprey") inst:AddTag("grunt") inst:AddTag("NOBLOCK") inst:SetPrefabNameOverride("grunt") inst.entity:SetPristine() if not TheWorld.ismastersim then return inst end inst:AddComponent("locomotor") inst.components.locomotor.runspeed = TUNING.SHADOWWAXWELL_SPEED inst.components.locomotor.pathcaps = { ignorecreep = true } inst.components.locomotor:SetSlowMultiplier(.6) inst:AddComponent("health") inst.components.health:SetMaxHealth(1) inst.components.health.nofadeout = true inst.components.health.redirect = nodebrisdmg inst:AddComponent("combat") inst.components.combat.hiteffectsymbol = "torso" inst.components.combat:SetRange(2) inst:AddComponent("follower") inst.components.follower:KeepLeaderOnAttacked() inst.components.follower.keepdeadleader = true --inst:SetBrain("shadowwaxwellbrain") inst:SetBrain(brain) inst:SetStateGraph("SGshadowwaxwell") inst:ListenForEvent("attacked", OnAttacked) ---- inst.LinkToPlayer = linktoplayer -- inst:ListenForEvent("onbuilt", OnBuilt) ---inst:DoTaskInTime(0.1, function() if inst.components.follower and not inst.components.follower.leader then inst:Remove() end end) if master_postinit ~= nil then master_postinit(inst) end return inst end return Prefab(prefab, fn, assets, prefabs) end return MakeMinion("grunt", "swap_spear", nil, spearfn), MakeBuilder("grunt") followers.zip Edited September 18, 2018 by Yakuzashi Link to comment https://forums.kleientertainment.com/forums/topic/95669-follower-creature-doesnt-move/ 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