Kzisor Posted December 14, 2014 Share Posted December 14, 2014 This is a very interesting issue I'm having with changing the Childspawner component. Child Spawner Code--[[ CHILDSPAWNER.LUA CHANGES ]]local function ChildSpawnerPostInit(self) self.children = {} function self:AddChild(prefab) self.children[prefab] = prefab end function self:SpawnChild(target, prefab, radius) if not self:CanSpawn() then return end local pos = GLOBAL.Vector3(self.inst.Transform:GetWorldPosition()) local start_angle = math.random()*GLOBAL.PI*2 local rad = radius or 0.5 if self.inst.Physics then rad = rad + self.inst.Physics:GetRadius() end local offset = GLOBAL.FindWalkableOffset(pos, start_angle, rad, 8, false) if offset == nil then return end pos = pos + offset -- Only line changed in this functionality. -- local childtospawn = prefab or self.childname local childtospawn if self.children ~= nil then childtospawn = prefab or GLOBAL.GetRandomKey(self.children) end if self.rarechild and math.random() < self.rarechildchance then childtospawn = self.rarechild -- or GLOBAL.GetRandomKey(self.children) end local child = GLOBAL.SpawnPrefab(childtospawn) if child ~= nil then child.Transform:SetPosition(pos:Get()) self:TakeOwnership(child) if target and child.components.combat then child.components.combat:SetTarget(target) end if self.onspawned then self.onspawned(self.inst, child) end if self.childreninside == 1 and self.onvacate then self:onvacate(self.inst) end self.childreninside = self.childreninside - 1 end return child endendAddComponentPostInit("childspawner", ChildSpawnerPostInit)Add Child Code inst.components.childspawner:AddChild("mosquito") inst.components.childspawner:AddChild("frog")Now my problem seems to be when I pass 'self.children' which is a table to GLOBAL.GetRandomKey Error ...m/steamapps/common/dont_starve/data/scripts/util.lua:230: bad argument #1 to 'random' (interval is empty) Anyone have half a clue why it's not working, any help would be greatly appreciated. Update: This is what happens when I have ROG enabled. In the base game it works flawlessly. Link to comment Share on other sites More sharing options...
simplex Posted December 14, 2014 Share Posted December 14, 2014 @KzisorThis error happens when the table self.children is empty (which is pretty much always, except for your custom prefab or the prefab you're altering). Then the call done internally by GetRandomKey is math.random(0), which raises an error because the argument to math.random must be a positive integer.I also would suggest that you don't overwrite game functions like that, to avoid having your mod incompatible with other mods. So my suggestion is that you remove that part changing the childspawner component in modmain altogether, and instead put this in your custom prefab's fn (if you're modifying a standard prefab instead, put this inside the prefab postinit, excluding the AddComponent call):inst:AddComponent("childspawner")local children = {"mosquito", "frog"}local oldSpawnChild = inst.components.childspawner.SpawnChildfunction inst.components.childspawner:SpawnChild(target, prefab, radius) if not prefab then prefab = children[math.random(#children)] end return oldSpawnChild(self, target, prefab, radius)end Link to comment Share on other sites More sharing options...
Kzisor Posted December 14, 2014 Author Share Posted December 14, 2014 @KzisorThis error happens when the table self.children is empty (which is pretty much always, except for your custom prefab or the prefab you're altering). Then the call done internally by GetRandomKey is math.random(0), which raises an error because the argument to math.random must be a positive integer.I also would suggest that you don't overwrite game functions like that, to avoid having your mod incompatible with other mods. So my suggestion is that you remove that part changing the childspawner component in modmain altogether, and instead put this in your custom prefab's fn (if you're modifying a standard prefab instead, put this inside the prefab postinit, excluding the AddComponent call):inst:AddComponent("childspawner")local children = {"mosquito", "frog"}local oldSpawnChild = inst.components.childspawner.SpawnChildfunction inst.components.childspawner:SpawnChild(target, prefab, radius) if not prefab then prefab = children[math.random(#children)] end return oldSpawnChild(self, target, prefab, radius)end This is exactly what I was trying to accomplish, but couldn't figure out how to overwrite specific functions without overwriting the entire component function. Cheers! Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.
Please be aware that the content of this thread may be outdated and no longer applicable.