rons0n Posted June 26, 2015 Share Posted June 26, 2015 (edited) Edit: Opps, a friend reminded me of something I forgot awhile ago and found the problem. Im silly. Well regardless the problem is solved now but I'll continue bumping this thread for my custom chester problems. The inventoryimages: The custom eyebone:local assets ={ Asset("ANIM", "anim/dogoo_eyebone.zip"), Asset("ANIM", "anim/dogoo_eyebone_build.zip"), Asset("ANIM", "anim/dogoo_eyebone_snow_build.zip"), Asset("ANIM", "anim/dogoo_eyebone_shadow_build.zip"),}local SPAWN_DIST = 30local function OpenEye(inst) inst.isOpenEye = true inst.components.inventoryitem:ChangeImageName(inst.openEye)endlocal function CloseEye(inst) inst.isOpenEye = nil inst.components.inventoryitem:ChangeImageName(inst.closedEye)endlocal function RefreshEye(inst) if inst.isOpenEye then OpenEye(inst) else CloseEye(inst) endendlocal function MorphShadowEyebone(inst) inst.AnimState:SetBuild("dogoo_eyebone_shadow_build") inst.openEye = "dogoo_eyebone_shadow" inst.closedEye = "dogoo_eyebone_closed_shadow" RefreshEye(inst) inst.EyeboneState = "SHADOW"endlocal function MorphSnowEyebone(inst) inst.AnimState:SetBuild("dogoo_eyebone_snow_build") inst.openEye = "dogoo_eyebone_snow" inst.closedEye = "dogoo_eyebone_closed_snow" RefreshEye(inst) inst.EyeboneState = "SNOW"end--[[local function MorphNormalEyebone(inst) inst.AnimState:SetBuild("dogoo_eyebone_build") inst.openEye = "dogoo_eyebone" inst.closedEye = "dogoo_eyebone_closed" RefreshEye(inst) inst.EyeboneState = "NORMAL"end]]local function GetSpawnPoint(pt) local theta = math.random() * 2 * PI local radius = SPAWN_DIST local offset = FindWalkableOffset(pt, theta, radius, 12, true) return offset ~= nil and (pt + offset) or nilendlocal function SpawnDogoo(inst) if not inst.owner then print("Error: Eyebone has no linked player!") return end --print("dogoo_eyebone - SpawnDogoo") local pt = inst:GetPosition() --print(" near", pt) local spawn_pt = GetSpawnPoint(pt) if spawn_pt ~= nil then --print(" at", spawn_pt) local dogoo = SpawnPrefab("personal_dogoo") if dogoo ~= nil then dogoo.Physics:Teleport(spawn_pt:Get()) dogoo:FacePoint(pt:Get()) if inst.owner then inst.owner.dogoo = dogoo end return dogoo end --else -- this is not fatal, they can try again in a new location by picking up the bone again --print("dogoo_eyebone - SpawnDogoo: Couldn't find a suitable spawn point for dogoo") endendlocal StartRespawnlocal function StopRespawn(inst) --print("dogoo_eyebone - StopRespawn") if inst.respawntask ~= nil then inst.respawntask:Cancel() inst.respawntask = nil inst.respawntime = nil endendlocal function RebindDogoo(inst, dogoo) dogoo = dogoo or (inst.owner and inst.owner.dogoo) if dogoo ~= nil then if inst.owner then dogoo.components.named:SetName(inst.owner.name.."'s Dogoo") end inst.AnimState:PlayAnimation("idle_loop", true) OpenEye(inst) inst:ListenForEvent("death", function() if inst.owner then inst.owner.dogoo = nil end StartRespawn(inst, TUNING.CHESTER_RESPAWN_TIME) end, dogoo) if dogoo.components.follower.leader ~= inst then dogoo.components.follower:SetLeader(inst) end return true endendlocal function RespawnDogoo(inst) --print("dogoo_eyebone - RespawnDogoo") StopRespawn(inst) RebindDogoo(inst, (inst.owner and inst.owner.dogoo) or SpawnDogoo(inst))endStartRespawn = function(inst, time) StopRespawn(inst) time = time or 0 inst.respawntask = inst:DoTaskInTime(time, RespawnDogoo) inst.respawntime = GetTime() + time inst.AnimState:PlayAnimation("dead", true) CloseEye(inst)endlocal function FixDogoo(inst) inst.fixtask = nil --take an existing dogoo if there is one if not RebindDogoo(inst) then inst.AnimState:PlayAnimation("dead", true) CloseEye(inst) if inst.components.inventoryitem.owner ~= nil then local time_remaining = 0 local time = GetTime() if inst.respawntime and inst.respawntime > time then time_remaining = inst.respawntime - time end StartRespawn(inst, time_remaining) end endendlocal function OnPutInInventory(inst) if inst.fixtask == nil then inst.fixtask = inst:DoTaskInTime(1, FixDogoo) endendlocal function OnSave(inst, data) --print("dogoo_eyebone - OnSave") --data.EyeboneState = inst.EyeboneState if inst.respawntime ~= nil then local time = GetTime() if inst.respawntime > time then data.respawntimeremaining = inst.respawntime - time end endendlocal function OnLoad(inst, data) if data == nil then return end if data.EyeboneState == "SHADOW" then MorphShadowEyebone(inst) elseif data.EyeboneState == "SNOW" then MorphSnowEyebone(inst) end if data.respawntimeremaining ~= nil then inst.respawntime = data.respawntimeremaining + GetTime() endendlocal function GetStatus(inst) --print("smallbird - GetStatus") if inst.respawntask ~= nil then return "WAITING" endendlocal function fn() local inst = CreateEntity() inst.entity:AddTransform() inst.entity:AddAnimState() inst.entity:AddNetwork() --so I can find the thing while testing --inst.entity:AddMiniMapEntity() --inst.MiniMapEntity:SetIcon("treasure.png") MakeInventoryPhysics(inst) inst:AddTag("personal_dogoo_eyebone") inst:AddTag("irreplaceable") inst:AddTag("nonpotatable") inst:AddTag("_named") inst.AnimState:SetBank("eyebone") inst.AnimState:SetBuild("dogoo_eyebone_build") inst.AnimState:PlayAnimation("idle_loop", true) inst.entity:SetPristine() if not TheWorld.ismastersim then return inst end -- Dogoo will not be saved normally. He is saved with the player. inst.persists = false inst:AddComponent("inventoryitem") inst.components.inventoryitem:SetOnPutInInventoryFn(OnPutInInventory) inst.EyeboneState = "NORMAL" inst.openEye = "dogoo_eyebone" inst.closedEye = "dogoo_eyebone_closed" inst.isOpenEye = nil OpenEye(inst) inst:AddComponent("inspectable") inst.components.inspectable.getstatus = GetStatus inst.components.inspectable:RecordViews() inst.components.inspectable.nameoverride = "dogoo_eyebone" inst:AddComponent("leader") inst:AddComponent("named") MakeHauntableLaunch(inst) --inst.MorphNormalEyebone = MorphNormalEyebone inst.MorphSnowEyebone = MorphSnowEyebone inst.MorphShadowEyebone = MorphShadowEyebone inst.OnLoad = OnLoad inst.OnSave = OnSave inst.fixtask = inst:DoTaskInTime(1, FixDogoo) inst.RebindDogoo = RebindDogoo return instendreturn Prefab("common/inventory/personal_dogoo_eyebone", fn, assets) dogoo inventory.zip Edited June 26, 2015 by rons0n Link to comment Share on other sites More sharing options...
DarkXero Posted June 27, 2015 Share Posted June 27, 2015 (edited) @rons0n,local assets ={ Asset("ANIM", "anim/dogoo_eyebone.zip"), Asset("ANIM", "anim/dogoo_eyebone_build.zip"), Asset("ANIM", "anim/dogoo_eyebone_snow_build.zip"), Asset("ANIM", "anim/dogoo_eyebone_shadow_build.zip"), Asset("ATLAS", "images/inventoryimages/dogoo_eyebone.xml"), Asset("ATLAS", "images/inventoryimages/dogoo_eyebone_closed.xml"), Asset("ATLAS", "images/inventoryimages/dogoo_eyebone_snow.xml"), Asset("ATLAS", "images/inventoryimages/dogoo_eyebone_closed_snow.xml"), Asset("ATLAS", "images/inventoryimages/dogoo_eyebone_shadow.xml"), Asset("ATLAS", "images/inventoryimages/dogoo_eyebone_closed_shadow.xml"),} local SPAWN_DIST = 30 local function OpenEye(inst) inst.isOpenEye = true inst.components.inventoryitem.atlasname = "images/inventoryimages/"..inst.openEye..".xml" inst.components.inventoryitem:ChangeImageName(inst.openEye)end local function CloseEye(inst) inst.isOpenEye = nil inst.components.inventoryitem.atlasname = "images/inventoryimages/"..inst.closedEye..".xml" inst.components.inventoryitem:ChangeImageName(inst.closedEye)end local function RefreshEye(inst) if inst.isOpenEye then OpenEye(inst) else CloseEye(inst) endend local function MorphShadowEyebone(inst) inst.AnimState:SetBuild("dogoo_eyebone_shadow_build") inst.openEye = "dogoo_eyebone_shadow" inst.closedEye = "dogoo_eyebone_closed_shadow" RefreshEye(inst) inst.EyeboneState = "SHADOW"end local function MorphSnowEyebone(inst) inst.AnimState:SetBuild("dogoo_eyebone_snow_build") inst.openEye = "dogoo_eyebone_snow" inst.closedEye = "dogoo_eyebone_closed_snow" RefreshEye(inst) inst.EyeboneState = "SNOW"end --[[local function MorphNormalEyebone(inst) inst.AnimState:SetBuild("dogoo_eyebone_build") inst.openEye = "dogoo_eyebone" inst.closedEye = "dogoo_eyebone_closed" RefreshEye(inst) inst.EyeboneState = "NORMAL"end]] local function GetSpawnPoint(pt) local theta = math.random() * 2 * PI local radius = SPAWN_DIST local offset = FindWalkableOffset(pt, theta, radius, 12, true) return offset ~= nil and (pt + offset) or nilend local function SpawnDogoo(inst) if not inst.owner then print("Error: Eyebone has no linked player!") return end --print("dogoo_eyebone - SpawnDogoo") local pt = inst:GetPosition() --print(" near", pt) local spawn_pt = GetSpawnPoint(pt) if spawn_pt ~= nil then --print(" at", spawn_pt) local dogoo = SpawnPrefab("personal_dogoo") if dogoo ~= nil then dogoo.Physics:Teleport(spawn_pt:Get()) dogoo:FacePoint(pt:Get()) if inst.owner then inst.owner.dogoo = dogoo end return dogoo end --else -- this is not fatal, they can try again in a new location by picking up the bone again --print("dogoo_eyebone - SpawnDogoo: Couldn't find a suitable spawn point for dogoo") endend local StartRespawn local function StopRespawn(inst) --print("dogoo_eyebone - StopRespawn") if inst.respawntask ~= nil then inst.respawntask:Cancel() inst.respawntask = nil inst.respawntime = nil endend local function RebindDogoo(inst, dogoo) dogoo = dogoo or (inst.owner and inst.owner.dogoo) if dogoo ~= nil then if inst.owner then dogoo.components.named:SetName(inst.owner.name.."'s Dogoo") end inst.AnimState:PlayAnimation("idle_loop", true) OpenEye(inst) inst:ListenForEvent("death", function() if inst.owner then inst.owner.dogoo = nil end StartRespawn(inst, TUNING.CHESTER_RESPAWN_TIME) end, dogoo) if dogoo.components.follower.leader ~= inst then dogoo.components.follower:SetLeader(inst) end return true endend local function RespawnDogoo(inst) --print("dogoo_eyebone - RespawnDogoo") StopRespawn(inst) RebindDogoo(inst, (inst.owner and inst.owner.dogoo) or SpawnDogoo(inst))end StartRespawn = function(inst, time) StopRespawn(inst) time = time or 0 inst.respawntask = inst:DoTaskInTime(time, RespawnDogoo) inst.respawntime = GetTime() + time inst.AnimState:PlayAnimation("dead", true) CloseEye(inst)end local function FixDogoo(inst) inst.fixtask = nil --take an existing dogoo if there is one if not RebindDogoo(inst) then inst.AnimState:PlayAnimation("dead", true) CloseEye(inst) if inst.components.inventoryitem.owner ~= nil then local time_remaining = 0 local time = GetTime() if inst.respawntime and inst.respawntime > time then time_remaining = inst.respawntime - time end StartRespawn(inst, time_remaining) end endend local function OnPutInInventory(inst) if inst.fixtask == nil then inst.fixtask = inst:DoTaskInTime(1, FixDogoo) endend local function OnSave(inst, data) --print("dogoo_eyebone - OnSave") --data.EyeboneState = inst.EyeboneState if inst.respawntime ~= nil then local time = GetTime() if inst.respawntime > time then data.respawntimeremaining = inst.respawntime - time end endend local function OnLoad(inst, data) if data == nil then return end if data.EyeboneState == "SHADOW" then MorphShadowEyebone(inst) elseif data.EyeboneState == "SNOW" then MorphSnowEyebone(inst) end if data.respawntimeremaining ~= nil then inst.respawntime = data.respawntimeremaining + GetTime() endend local function GetStatus(inst) --print("smallbird - GetStatus") if inst.respawntask ~= nil then return "WAITING" endend local function fn() local inst = CreateEntity() inst.entity:AddTransform() inst.entity:AddAnimState() inst.entity:AddNetwork() --so I can find the thing while testing --inst.entity:AddMiniMapEntity() --inst.MiniMapEntity:SetIcon("treasure.png") MakeInventoryPhysics(inst) inst:AddTag("personal_dogoo_eyebone") inst:AddTag("irreplaceable") inst:AddTag("nonpotatable") inst:AddTag("_named") inst.AnimState:SetBank("eyebone") inst.AnimState:SetBuild("dogoo_eyebone_build") inst.AnimState:PlayAnimation("idle_loop", true) inst.entity:SetPristine() if not TheWorld.ismastersim then return inst end -- Dogoo will not be saved normally. He is saved with the player. inst.persists = false inst:AddComponent("inventoryitem") inst.components.inventoryitem.atlasname = "images/inventoryimages/dogoo_eyebone.xml" inst.components.inventoryitem:ChangeImageName("dogoo_eyebone") inst.components.inventoryitem:SetOnPutInInventoryFn(OnPutInInventory) inst.EyeboneState = "NORMAL" inst.openEye = "dogoo_eyebone" inst.closedEye = "dogoo_eyebone_closed" inst.isOpenEye = nil OpenEye(inst) inst:AddComponent("inspectable") inst.components.inspectable.getstatus = GetStatus inst.components.inspectable:RecordViews() inst.components.inspectable.nameoverride = "dogoo_eyebone" inst:AddComponent("leader") inst:AddComponent("named") MakeHauntableLaunch(inst) --inst.MorphNormalEyebone = MorphNormalEyebone inst.MorphSnowEyebone = MorphSnowEyebone inst.MorphShadowEyebone = MorphShadowEyebone inst.OnLoad = OnLoad inst.OnSave = OnSave inst.fixtask = inst:DoTaskInTime(1, FixDogoo) inst.RebindDogoo = RebindDogoo return instend return Prefab("common/inventory/personal_dogoo_eyebone", fn, assets) Edited June 27, 2015 by DarkXero Link to comment Share on other sites More sharing options...
rons0n Posted June 27, 2015 Author Share Posted June 27, 2015 (edited) @DarkXero, Thanks, I actually did mess up one step and your solution fixed it. Thanks! I've made some progress making it only follow my specific charatcer only. Along the way I've hit a few snags: Whenever I do LongUpdate() to fast forward time the client crashes.Error log: [00:05:26]: [string "../mods/plutia/modmain.lua"]:105: attempt to call upvalue 'OnSave_prev' (a nil value)LUA ERROR stack traceback:../mods/plutia/modmain.lua:105 in (field) OnSave (Lua) <104-133> inst = 100078 - plutia (valid:true) data = table: 180E5320scripts/entityscript.lua:1405 in (method) GetPersistData (Lua) <1373-1422> self (valid:true) = GUID = 100078 inlimbo = false GetMoistureRateScale = function - scripts/prefabs/player_common.lua:97 ghostenabled = true EnableMovementPrediction = function - scripts/prefabs/player_common.lua:407 ReturnEyebone = function - ../mods/plutia/modmain.lua:197 playercolour = table: 1408E178 AnimState = AnimState (3EDD5CC0) Light = Light (3EDD5D80) Network = Network (3EDD5BC0) OnRemoveEntity = function - scripts/prefabs/player_common.lua:530 GetMoisture = function - scripts/prefabs/player_common.lua:77 pendingtasks = table: 1408DD18 LightWatcher = LightWatcher (3EDD5DA0) DetachClassified = function - scripts/prefabs/player_common.lua:525 sg = sg="wilson_client", state="idle", time=32.97, tags = "idle," spawntime = 18.400000959635 ondetachclassified = function - scripts/prefabs/player_common.lua:521 player_classified = 100659 - player_classified (valid:true) SetGhostMode = function - scripts/prefabs/player_common.lua:446 CanExamine = function - scripts/prefabs/player_common.lua:20 HUD = HUD inherentactions = table: 2304C450 Transform = Transform (3EDD5B40) userid = KU_Gl4sTPnP IsActionsVisible = function - scripts/prefabs/player_common.lua:1020 actionreplica = table: 1408D9D0 event_listening = table: 1408D728 OnLoad = function - ../mods/plutia/modmain.lua:137 actioncomponents = table: 2304C518 OnSave = function - ../mods/plutia/modmain.lua:104 lower_components_shadow = table: 1408D390 GetMaxMoisture = function - scripts/prefabs/player_common.lua:87 OnNewSpawn = function - ../mods/plutia/modmain.lua:174 entity = Entity (0B9E5360) name = Silhh prefab = plutia updatecomponents = table: 2E60C1E8 AttachClassified = function - scripts/prefabs/player_common.lua:519 OnDespawn = function - ../mods/plutia/modmain.lua:63 Physics = Physics (3EDD5A80) ShakeCamera = function - scripts/prefabs/player_common.lua:1056 MiniMapEntity = MiniMapEntity (3EDD5B20) event_listeners = table: 1408D750 DynamicShadow = DynamicShadow (3EDD5DC0) IsOverheating = function - scripts/prefabs/player_common.lua:67 IsFreezing = function - scripts/prefabs/player_common.lua:57 persists = true SoundEmitter = SoundEmitter (3EDD5E00) replica = table: 1408D200 components = table: 1408D228 GetTemperature = function - scripts/prefabs/player_common.lua:47 references = nil data = table: 180E5320scripts/entityscript.lua:269 in (method) GetSaveRecord (Lua) <234-272> self (valid:true) = GUID = 100078 inlimbo = false GetMoistureRateScale = function - scripts/prefabs/player_common.lua:97 ghostenabled = true EnableMovementPrediction = function - scripts/prefabs/player_common.lua:407 ReturnEyebone = function - ../mods/plutia/modmain.lua:197 playercolour = table: 1408E178 AnimState = AnimState (3EDD5CC0) Light = Light (3EDD5D80) Network = Network (3EDD5BC0) OnRemoveEntity = function - scripts/prefabs/player_common.lua:530 GetMoisture = function - scripts/prefabs/player_common.lua:77 pendingtasks = table: 1408DD18 LightWatcher = LightWatcher (3EDD5DA0) DetachClassified = function - scripts/prefabs/player_common.lua:525 sg = sg="wilson_client", state="idle", time=32.97, tags = "idle," spawntime = 18.400000959635 ondetachclassified = function - scripts/prefabs/player_common.lua:521 player_classified = 100659 - player_classified (valid:true) SetGhostMode = function - scripts/prefabs/player_common.l[00:05:26]: [string "../mods/plutia/modmain.lua"]:105: attempt to call upvalue 'OnSave_prev' (a nil value)LUA ERROR stack traceback: ../mods/plutia/modmain.lua:105 in (field) OnSave (Lua) <104-133> scripts/entityscript.lua:1405 in (method) GetPersistData (Lua) <1373-1422> scripts/entityscript.lua:269 in (method) GetSaveRecord (Lua) <234-272> scripts/networking.lua:125 in (global) SerializeUserSession (Lua) <122-129> scripts/components/autosaver.lua:59 in (upvalue) OnSave (Lua) <46-61> scripts/components/autosaver.lua:90 in (local) fn (Lua) <78-93> scripts/entityscript.lua:938 in (method) PushEvent (Lua) <932-955> scripts/mainfunctions.lua:284 in () ? (Lua) <281-286> [00:05:26]: SCRIPT ERROR! Showing error screen [00:05:39]: Force aborting... And secondly, my Dogoo chester performs the transformation scene chester does but does not transform into the desired dogoo chester. If you have the time and if you dont mind, can you look at this code? I can't provide the files to the public as of yet, but I can post code here if you want. Push comes to shove, I'll PM you the files. Modmain:PrefabFiles = { "plutia", "personal_dogoo_eyebone", "personal_dogoo",}Assets = { Asset( "IMAGE", "images/saveslot_portraits/plutia.tex" ), Asset( "ATLAS", "images/saveslot_portraits/plutia.xml" ), Asset( "IMAGE", "images/selectscreen_portraits/plutia.tex" ), Asset( "ATLAS", "images/selectscreen_portraits/plutia.xml" ), Asset( "IMAGE", "images/selectscreen_portraits/plutia_silho.tex" ), Asset( "ATLAS", "images/selectscreen_portraits/plutia_silho.xml" ), Asset( "IMAGE", "bigportraits/plutia.tex" ), Asset( "ATLAS", "bigportraits/plutia.xml" ), Asset( "IMAGE", "images/map_icons/plutia.tex" ), Asset( "ATLAS", "images/map_icons/plutia.xml" ), Asset( "IMAGE", "images/avatars/avatar_plutia.tex" ), Asset( "ATLAS", "images/avatars/avatar_plutia.xml" ), Asset( "IMAGE", "images/avatars/avatar_ghost_plutia.tex" ), Asset( "ATLAS", "images/avatars/avatar_ghost_plutia.xml" ),}local require = GLOBAL.requirelocal STRINGS = GLOBAL.STRINGS-- Custom itemsSTRINGS.NAMES.PERSONAL_DOGOO = "Personal Dogoo"STRINGS.NAMES.PERSONAL_DOGOO_EYEBONE = "Personal Dogoo Bone"-- An eyebone is given every time player is spawned/loaded. It's not savedlocal function GiveEyebone(inst) local eyebone = GLOBAL.SpawnPrefab("personal_dogoo_eyebone") if eyebone then eyebone.owner = inst inst.eyebone = eyebone inst.components.inventory.ignoresound = true inst.components.inventory:GiveItem(eyebone) inst.components.inventory.ignoresound = false eyebone.components.named:SetName(inst.name.."'s Dogoo Bone") return eyebone endendlocal function GetSpawnPoint(pt) local theta = math.random() * 2 * GLOBAL.PI local radius = 4 local offset = GLOBAL.FindWalkableOffset(pt, theta, radius, 12, true) return offset ~= nil and (pt + offset) or nilendlocal function PersonalDogoo(inst) if not inst:HasTag("specialdogooowner") then return end local OnDespawn_prev = inst.OnDespawn local OnDespawn_new = function(inst) -- Remove dogoo if inst.dogoo then -- Don't allow dogoo to despawn with irreplaceable items inst.dogoo.components.container:DropEverythingWithTag("irreplaceable") -- We need time to save before despawning. inst.dogoo:DoTaskInTime(0.1, function(inst) if inst and inst:IsValid() then inst:Remove() end end) end if inst.eyebone then -- Eyebone drops from whatever its in local owner = inst.eyebone.components.inventoryitem.owner if owner then if owner.components.container then owner.components.container:DropItem(inst.eyebone) elseif owner.components.inventory then owner.components.inventory:DropItem(inst.eyebone) end end -- Remove eyebone inst.eyebone:DoTaskInTime(0.1, function(inst) if inst and inst:IsValid() then inst:Remove() end end) else print("Error: Player has no linked eyebone!") end if OnDespawn_prev then return OnDespawn_prev(inst) end end inst.OnDespawn = OnDespawn_new local OnSave_prev = inst.OnSave local OnSave_new = function(inst, data) local references = OnSave_prev(inst, data) if inst.dogoo then -- Save dogoo local refs = {} if not references then references = {} end data.dogoo, refs = inst.dogoo:GetSaveRecord() if refs then for k,v in pairs(refs) do table.insert(references, v) end end end if inst.eyebone then -- Save eyebone local refs = {} if not references then references = {} end data.eyebone, refs = inst.eyebone:GetSaveRecord() if refs then for k,v in pairs(refs) do table.insert(references, v) end end end return references end inst.OnSave = OnSave_new local OnLoad_prev = inst.OnLoad local OnLoad_new = function(inst, data, newents) if data.dogoo ~= nil then -- Load dogoo inst.dogoo = GLOBAL.SpawnSaveRecord(data.dogoo, newents) else --print("Warning: No dogoo was loaded from save file!") end if data.eyebone ~= nil then -- Load dogoo inst.eyebone = GLOBAL.SpawnSaveRecord(data.eyebone, newents) -- Look for eyebone at spawn point and re-equip inst:DoTaskInTime(0, function(inst) if inst.eyebone and inst:IsNear(inst.eyebone,4) then inst.components.inventory:GiveItem(inst.eyebone) end end) else print("Warning: No eyebone was loaded from save file!") end -- Create new eyebone if none loaded if not inst.eyebone then GiveEyebone(inst) end inst.eyebone.owner = inst if OnLoad_prev then return OnLoad_prev(inst, data, newents) end end inst.OnLoad = OnLoad_new local OnNewSpawn_prev = inst.OnNewSpawn local OnNewSpawn_new = function(inst) -- Give new eyebone. Let dogoo spawn naturally. GiveEyebone(inst) if OnNewSpawn_prev then return OnNewSpawn_prev(inst) end end inst.OnNewSpawn = OnNewSpawn_new if GLOBAL.TheNet:GetServerGameMode() == "wilderness" then local function ondeath(inst, data) -- Kill player's dogoo in wilderness mode if inst.dogoo then inst.dogoo.components.health:Kill() end if inst.eyebone then inst.eyebone:Remove() end end inst:ListenForEvent("death", ondeath) end -- Debug function to return eyebone inst.ReturnEyebone = function() if inst.eyebone and inst.eyebone:IsValid() then if inst.eyebone.components.inventoryitem.owner ~= inst then inst.components.inventory:GiveItem(inst.eyebone) end else GiveEyebone(inst) end if inst.dogoo and not inst:IsNear(inst.dogoo, 20) then local pt = inst:GetPosition() local spawn_pt = GetSpawnPoint(pt) if spawn_pt ~= nil then inst.dogoo.Physics:Teleport(spawn_pt:Get()) inst.dogoo:FacePoint(pt:Get()) end end endendGLOBAL.c_returneyebone = function(inst) if not inst then inst = GLOBAL.ThePlayer or GLOBAL.AllPlayers[1] end if not inst or not inst.ReturnEyebone then print("Error: Cannot return eyebone") return end inst:ReturnEyebone()endAddPlayerPostInit(PersonalDogoo)-- The character select screen linesSTRINGS.CHARACTER_TITLES.plutia = "The Sample Character"STRINGS.CHARACTER_NAMES.plutia = "Esc"STRINGS.CHARACTER_DESCRIPTIONS.plutia = "*Perk 1\n*Perk 2\n*Perk 3"STRINGS.CHARACTER_QUOTES.plutia = "\"Quote\""-- Custom speech stringsSTRINGS.CHARACTERS.PLUTIA = require "speech_plutia"-- The character's name as appears in-game STRINGS.NAMES.PLUTIA = "Esc"-- The default responses of examining the characterSTRINGS.CHARACTERS.GENERIC.DESCRIBE.PLUTIA = { GENERIC = "It's Esc!", ATTACKER = "That Esc looks shifty...", MURDERER = "Murderer!", REVIVER = "Esc, friend of ghosts.", GHOST = "Esc could use a heart.",}AddMinimapAtlas("images/map_icons/plutia.xml")-- Add mod character to mod character list. Also specify a gender. Possible genders are MALE, FEMALE, ROBOT, NEUTRAL, and PLURAL.AddModCharacter("plutia", "FEMALE") Custom chesters prefab filerequire "prefabutil"local brain = require "brains/chesterbrain"local WAKE_TO_FOLLOW_DISTANCE = 14local SLEEP_NEAR_LEADER_DISTANCE = 7local assets ={ Asset("ANIM", "anim/ui_chester_shadow_3x4.zip"), Asset("ANIM", "anim/ui_chest_3x3.zip"), Asset("ANIM", "anim/chester.zip"), Asset("ANIM", "anim/dogoo_build.zip"), Asset("ANIM", "anim/dogoo_shadow_build.zip"), Asset("ANIM", "anim/dogoo_snow_build.zip"), Asset("SOUND", "sound/chester.fsb"),}local prefabs ={ "personal_dogoo_eyebone", "chesterlight"}local function ShouldWakeUp(inst) return DefaultWakeTest(inst) or not inst.components.follower:IsNearLeader(WAKE_TO_FOLLOW_DISTANCE)endlocal function ShouldSleep(inst) --print(inst, "ShouldSleep", DefaultSleepTest(inst), not inst.sg:HasStateTag("open"), inst.components.follower:IsNearLeader(SLEEP_NEAR_LEADER_DISTANCE)) return DefaultSleepTest(inst) and not inst.sg:HasStateTag("open") and inst.components.follower:IsNearLeader(SLEEP_NEAR_LEADER_DISTANCE) and not TheWorld.state.isfullmoonendlocal function ShouldKeepTarget() return false -- dogoo can't attack, and won't sleep if he has a targetendlocal function OnOpen(inst) if not inst.components.health:IsDead() then inst.sg:GoToState("open") endendlocal function OnClose(inst) if not inst.components.health:IsDead() and inst.sg.currentstate.name ~= "transition" then inst.sg:GoToState("close") endend-- eye bone was killed/destroyedlocal function OnStopFollowing(inst) --print("dogoo - OnStopFollowing") inst:RemoveTag("companion")endlocal function OnStartFollowing(inst) --print("dogoo - OnStartFollowing") inst:AddTag("companion")endlocal function MorphShadowDogoo(inst) inst.AnimState:SetBuild("dogoo_shadow_build") inst:AddTag("spoiler") inst.components.container:WidgetSetup("shadowchester") local leader = inst.components.follower.leader if leader ~= nil then inst.components.follower.leader:MorphShadowEyebone() end inst.DogooState = "SHADOW" inst._isshadowdogoo:set(true)endlocal function MorphSnowDogoo(inst) inst.AnimState:SetBuild("dogoo_snow_build") inst:AddTag("fridge") local leader = inst.components.follower.leader if leader ~= nil then inst.components.follower.leader:MorphSnowEyebone() end inst.DogooState = "SNOW" inst._isshadowdogoo:set(false)endlocal function MorphNormalDogoo(inst) inst.AnimState:SetBuild("dogoo_build") inst:RemoveTag("fridge") inst:RemoveTag("spoiler") inst.components.container:WidgetSetup("chester") local leader = inst.components.follower.leader if leader ~= nil then inst.components.follower.leader:MorphNormalEyebone() end inst.DogooState = "NORMAL" inst._isshadowdogoo:set(false)end--local function CanMorph(inst) if inst.DogooState ~= "NORMAL" or not TheWorld.state.isfullmoon then return false, false end local container = inst.components.container if container:IsOpen() then return false, false end local canShadow = true local canSnow = true for i = 1, container:GetNumSlots() do local item = container:GetItemInSlot(i) if item == nil then return false, false end canShadow = canShadow and item.prefab == "nightmarefuel" canSnow = canSnow and item.prefab == "bluegem" if not (canShadow or canSnow) then return false, false end end return canShadow, canSnowendlocal function CheckForMorph(inst) local canShadow, canSnow = CanMorph(inst) if canShadow or canSnow then inst.sg:GoToState("transition") endendlocal function DoMorph(inst, fn) inst.MorphDogoo = nil inst:StopWatchingWorldState("isfullmoon", CheckForMorph) inst:RemoveEventCallback("onclose", CheckForMorph) fn(inst) endlocal function MorphDogoo(inst) local canShadow, canSnow = CanMorph(inst) if not (canShadow or canSnow) then return end local container = inst.components.container for i = 1, container:GetNumSlots() do container:RemoveItem(container:GetItemInSlot(i)):Remove() end DoMorph(inst, canShadow and MorphShadowDogoo or MorphSnowDogoo)endlocal function OnSave(inst, data) data.DogooState = inst.DogooStateendlocal function OnPreLoad(inst, data) if data == nil then return elseif data.DogooState == "SHADOW" then DoMorph(inst, MorphShadowDogoo) elseif data.DogooState == "SNOW" then DoMorph(inst, MorphSnowDogoo) endendlocal function OnIsShadowDogooDirty(inst) if inst._isshadowdogoo:value() ~= inst._clientshadowmorphed then inst._clientshadowmorphed = inst._isshadowdogoo:value() inst.replica.container:WidgetSetup(inst._clientshadowmorphed and "shadowchester" or nil) endendlocal function create_dogoo() --print("dogoo - create_dogoo") local inst = CreateEntity() inst.entity:AddTransform() inst.entity:AddAnimState() inst.entity:AddSoundEmitter() inst.entity:AddDynamicShadow() inst.entity:AddMiniMapEntity() inst.entity:AddNetwork() MakeCharacterPhysics(inst, 75, .5) inst.Physics:SetCollisionGroup(COLLISION.CHARACTERS) inst.Physics:ClearCollisionMask() inst.Physics:CollidesWith(COLLISION.WORLD) inst.Physics:CollidesWith(COLLISION.OBSTACLES) inst.Physics:CollidesWith(COLLISION.CHARACTERS) inst:AddTag("companion") inst:AddTag("character") inst:AddTag("scarytoprey") inst:AddTag("personal_dogoo") inst:AddTag("notraptrigger") inst:AddTag("_named") inst.MiniMapEntity:SetIcon("dogoo.png") inst.MiniMapEntity:SetCanUseCache(false) inst.AnimState:SetBank("dogoo") inst.AnimState:SetBuild("dogoo_build") inst.DynamicShadow:SetSize(2, 1.5) inst.Transform:SetFourFaced() inst._isshadowdogoo = net_bool(inst.GUID, "_isshadowdogoo", "onisshadowdogoodirty") inst.entity:SetPristine() if not TheWorld.ismastersim then inst:DoTaskInTime(0.1, function(inst) inst.replica.container:WidgetSetup(inst._isshadowdogoo:value() and "shadowchester" or "chester") end) inst._clientshadowmorphed = false inst:ListenForEvent("onisshadowdogoodirty", OnIsShadowDogooDirty) return inst end -- Dogoo will not be saved normally. He is saved with the player. inst.persists = false ------------------------------------------ --print(" combat") inst:AddComponent("combat") inst.components.combat.hiteffectsymbol = "dogoo_body" inst.components.combat:SetKeepTargetFunction(ShouldKeepTarget) local self = inst.components.combat local old = self.GetAttacked function self:GetAttacked(attacker, damage, weapon, stimuli) if attacker then return true end return old(self, attacker, damage, weapon, stimuli) end --inst:ListenForEvent("attacked", OnAttacked) --print(" health") inst:AddComponent("health") inst.components.health:SetMaxHealth(TUNING.CHESTER_HEALTH) inst.components.health:StartRegen(TUNING.CHESTER_HEALTH_REGEN_AMOUNT, TUNING.CHESTER_HEALTH_REGEN_PERIOD) inst:AddTag("noauradamage") --print(" inspectable") inst:AddComponent("inspectable") inst.components.inspectable:RecordViews() --inst.components.inspectable.getstatus = GetStatus inst.components.inspectable.nameoverride = "dogoo" --print(" locomotor") inst:AddComponent("locomotor") inst.components.locomotor.walkspeed = 3 inst.components.locomotor.runspeed = 7 --print(" follower") inst:AddComponent("follower") inst:ListenForEvent("stopfollowing", OnStopFollowing) inst:ListenForEvent("startfollowing", OnStartFollowing) --print(" knownlocations") inst:AddComponent("knownlocations") --print(" burnable") MakeSmallBurnableCharacter(inst, "dogoo_body") --(" container") inst:AddComponent("container") inst.components.container:WidgetSetup("chester") inst.components.container.onopenfn = OnOpen inst.components.container.onclosefn = OnClose --print(" sleeper") inst:AddComponent("sleeper") inst.components.sleeper:SetResistance(3) inst.components.sleeper.testperiod = GetRandomWithVariance(6, 2) inst.components.sleeper:SetSleepTest(ShouldSleep) inst.components.sleeper:SetWakeTest(ShouldWakeUp) inst:AddComponent("named") MakeHauntableDropFirstItem(inst) AddHauntableCustomReaction(inst, function(inst, haunter) if math.random() <= TUNING.HAUNT_CHANCE_ALWAYS then inst.components.hauntable.panic = true inst.components.hauntable.panictimer = TUNING.HAUNT_PANIC_TIME_SMALL inst.components.hauntable.hauntvalue = TUNING.HAUNT_SMALL return true end return false end, false, false, true) --print(" sg") inst:SetStateGraph("SGchester") inst.sg:GoToState("idle") --print(" brain") inst:SetBrain(brain) inst.DogooState = "NORMAL" inst.MorphDogoo = MorphDogoo inst:WatchWorldState("isfullmoon", CheckForMorph) inst:ListenForEvent("onclose", CheckForMorph) inst.OnSave = OnSave inst.OnPreLoad = OnPreLoad --print("dogoo - create_dogoo END") return instendreturn Prefab("common/personal_dogoo", create_dogoo, assets, prefabs) Yet again, Its appreciated! Edited June 27, 2015 by rons0n Link to comment Share on other sites More sharing options...
DarkXero Posted June 27, 2015 Share Posted June 27, 2015 (edited) @rons0n,The error is that you are indexing a nil value because apparently there is no prev OnSave in that case. Dolocal references = OnSave_prev and OnSave_prev(inst, data)I see that after that the references is taken care of if it's nil. Also you can PM me for whatever you don't want to disclose. Edited June 27, 2015 by DarkXero Link to comment 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