dontstarver.wiki Posted June 24, 2013 Share Posted June 24, 2013 guys, i realize don't bother you but help me please XD Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-218117 Share on other sites More sharing options...
no_signal Posted June 24, 2013 Share Posted June 24, 2013 (edited) I've already posted all current script...it does not crash without error if i changeAsset("ANIM", "anim/welly.zip"),tooAsset("ANIM", "anim/wilson.zip"),I can't test any further if i don't have you're mod folder. Edited June 25, 2013 by no_signal Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-218122 Share on other sites More sharing options...
Developer Ipsquiggle Posted June 25, 2013 Author Developer Share Posted June 25, 2013 [MENTION=10327]Gotheran[/MENTION] After it crashes, copy your logfile (My Documents/Klei/DoNotStarve/log.txt) so we can see the specific error that's happening. Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-218842 Share on other sites More sharing options...
Developer Ipsquiggle Posted June 25, 2013 Author Developer Share Posted June 25, 2013 hey guys, is there someone?i need some help here. i tried to load a custom texture for piglight mod. if i build the light ingame it dosen't appear, i mean you can see just fire on ground. in craftingtabmenu works the inventoryimages well. i think, i mistaken something in .zip file. and i got an error like this:-------------------------------------------------------------------------------------GUID 109205: Unknown animation idle for camplight_focus in cAnimStateComponent-------------------------------------------------------------------------------------i tried to using the nightmare_torch renamed the build.bin to camplight_focus and replaced the atlas-0.tex with texture of maxwelllight(atlasfile). same error. sounds like dontstarve does not find the "idle", "loop", "play".mod:http://www.sendspace.com/file/i8hqtxI haven't had a chance to look at the mod, but one thing to remember is that the bank name is whatever the anim name you originally copied was, you've only updated the build name using the build tool.SetBank("nightmare_torch")SetBuild("camplight_focus")If that doesn't work I'll have a deeper look into it. Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-218848 Share on other sites More sharing options...
dontstarver.wiki Posted June 26, 2013 Share Posted June 26, 2013 I haven't had a chance to look at the mod, but one thing to remember is that the bank name is whatever the anim name you originally copied was, you've only updated the build name using the build tool.SetBank("nightmare_torch")SetBuild("camplight_focus")If that doesn't work I'll have a deeper look into it. ok thanks, i will check it. maybe i was confused.regards Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-220603 Share on other sites More sharing options...
chromiumboy Posted June 29, 2013 Share Posted June 29, 2013 I like the new mod loader. I do have a suggestion for it though: including the option for mods to have a list of toggle / numeric options pop up when the mod is loaded, so the player doesn't need to open up modmain.lua to tweak an aspect of the mod the author wants the player to have control over. For example in my Nimble Followers mod, I wanted to give the player the option of preventing only followers from setting off traps or preventing all mobs who are able to follow you from setting off traps, so I included an obvious boolean in modmain.lua and instructions on how to toggle it. What do you think? Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-223796 Share on other sites More sharing options...
_Q_ Posted July 1, 2013 Share Posted July 1, 2013 [MENTION=55]Ipsquiggle[/MENTION]If I add options like:- Bats- Spilagmites- Slurtle mounds- Rock lobsters- Bunnymen- Earthquakes- Tentapillars- Monkey barrelsAnd so on to the world customization screen, the changes would be saved and used upon actual cave generation or they wont have any effect on cave gen? Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-226808 Share on other sites More sharing options...
simplex Posted July 1, 2013 Share Posted July 1, 2013 I like the new mod loader. I do have a suggestion for it though: including the option for mods to have a list of toggle / numeric options pop up when the mod is loaded, so the player doesn't need to open up modmain.lua to tweak an aspect of the mod the author wants the player to have control over. For example in my Nimble Followers mod, I wanted to give the player the option of preventing only followers from setting off traps or preventing all mobs who are able to follow you from setting off traps, so I included an obvious boolean in modmain.lua and instructions on how to toggle it. What do you think?I agree. But on a side note, have you checked out the configuration system I use for my mod? I feel it's considerably more user friendly than instructing users to tweak modmain. Not as user friendly as a game-supported GUI method, but it's a start. Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-226894 Share on other sites More sharing options...
ggolddragonn Posted July 2, 2013 Share Posted July 2, 2013 Now, I need it for Strange New Powers version.. Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-227836 Share on other sites More sharing options...
squeek Posted July 2, 2013 Share Posted July 2, 2013 (edited) A few things about prefab and component PostInit functions:First, and most importantly, prefab PostInit functions get called before the entity's Transform get its position set. This is a huge problem and I couldn't find anywhere in the Lua where the Transform is initially set, so I assume it's somewhere in the C++. On a related note, prefabs can not get their own position inside their fn function, which also seems undesirable (let's say you wanted to set some variable depending on which tile it was spawning on).Secondly, the prefab PostInit function calls are weirdly placed inside the SpawnPrefabFromSim function (mainfunctions.lua). They get called before inst:SetPrefabName(inst.prefab or name) is called, before the "highlight" component is added, and before the inst ~= nil check (so it could be calling PostInit functions on prefabs that failed to spawn). The italicized part means that in prefab PostInit functions, inst.prefab can be nil (and usually is except for some cases where SetPrefabName is called in the prefab's fn function). This should really be corrected and shouldn't be a huge change at all. Here's the fixed code:mainfunctions.lua -> SpawnPrefabFromSim... local inst = prefab.fn(TheSim) [color=blue]if inst ~= nil then inst:SetPrefabName(inst.prefab or name) if inst.AnimState then inst:AddComponent("highlight") end for k,mod in pairs(prefab.modfns) do mod(inst) end[/color] return inst.entity:GetGUID() else print( "Failed to spawn", name ) return -1 end...Third, and more subjectively, component PostInit functions are currently called inside EntityScript:AddComponent(), which means that the parameters that component PostInit functions are receiving are: 1) a blank component, because all the initialization of components comes after the AddComponent function in prefab fn's; 2) the prefab that is not yet fully initialized (not all components have been added, its prefab variable is almost certainly not set, the prefab PostInit functions have not been called on it, etc).While I can see the potential use for this in very specific situations (altering a function of a component immediately so that any future calls are affected; say, growable.StartGrowing which gets called by most prefabs in their fn that add the growable component), I think for it to be named ComponentPostInit is misleading and it would be far more useful if it were called after the prefab's PostInit functions were called, meaning that both the component and the prefab that the component was added to would then be fully initialized when the component PostInit was called. The code changes for this would be:mainfunctions.lua -> SpawnPrefabFromSim [note: this code assumes the changes in the above spoiler were made]... for k,mod in pairs(prefab.modfns) do mod(inst) end [color=green]for compname,comp in pairs(inst.components) do local postinitfns = ModManager:GetComponentPostInitFns(compname) for k,fn in ipairs(postinitfns) do fn(comp,inst) end end[/color] return inst.entity:GetGUID()...entityscript.lua -> EntityScript:AddComponent... local loadedcmp = cmp(self) self.components[name] = loadedcmp[s] [color=red]local postinitfns = ModManager:GetComponentPostInitFns(name) for k,fn in ipairs(postinitfns) do fn(loadedcmp,self) end[/color][/s]...Furthermore, to retain the potential usefulness of the current implementation of ComponentPostInit (that it acts on the component before it's initialized), I'd also suggest creating ComponentPreInit to take its place, which would get called exactly where ComponentPostInit does currently. Edited July 2, 2013 by squeek Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-227863 Share on other sites More sharing options...
_Q_ Posted July 2, 2013 Share Posted July 2, 2013 (edited) [MENTION=56977]squeek[/MENTION]ComponentPostInit acts after component was initialized. I used ComponentPostInit editing values inside the component and component was still using default data. It got updated to my edited data after making some action in game that calls that component.So I was wrong with that. ComponentPostInit runs first, my functions to change data are called after component is initialized. Is there any way to force update of the component after calling functions that alter its data? Edited July 2, 2013 by _Q_ Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-227881 Share on other sites More sharing options...
squeek Posted July 2, 2013 Share Posted July 2, 2013 (edited) [MENTION=56977]squeek[/MENTION]ComponentPostInit acts after component was initialized. I used ComponentPostInit editing values inside the component and component was still using default data. It got updated to my edited data after making some action in game that calls that component.So I was wrong with that. ComponentPostInit runs first, my functions to change data are called after component is initialized. Is there any way to force update of the component after calling functions that alter its data?Not sure what you're asking. I'll try to make it more clear how and when component PostInit functions are called right now. Take prefab/evergreen.lua: when you create an "evergreen" prefab, in it's fn function, it adds a growable component like so: inst:AddComponent("growable") [color=blue]-- "growable" ComponentPostInit will be called inside inst:AddComponent, before the next lines are executed[/color] inst.components.growable.stages = growth_stages inst.components.growable:SetStage(l_stage) [b]inst.components.growable.loopstages = true[/b] inst.components.growable:StartGrowing()This means that in a "growable" ComponentPostInit, the only member variables that would be initialized in the component would be the things in the component's constructor:local Growable = Class(function(self, inst) self.inst = inst self.stages = nil self.stage = 1 [b]self.loopstages = false[/b] self.growonly = falseend)So, for example, in a "growable" ComponentPostInit for an "evergreen" prefab, the "growable" member variable loopstages would be false, even though it gets set to true by the "evergreen" prefab. If you alter loopstages in a "growable" ComponentPostInit like so:function compGrowablePostInit( comp, inst ) [color=blue]-- also note that inst.prefab would be nil here[/color] print("Growable loopstages is: "..tostring(comp.loopstages)..", setting to false") comp.loopstages = falseendAddComponentPostInit( "growable", compGrowablePostInit )it would then be overwritten by the prefab afterwards, verifiable by this code:function prefabEvergreenPostInit( inst ) if inst.components.growable then print("Evergreen loopstages is: "..tostring(inst.components.growable.loopstages)) endendAddPrefabPostInit( "evergreen", prefabEvergreenPostInit ) Edited July 2, 2013 by squeek bolded relevant loopstages lines Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-228213 Share on other sites More sharing options...
_Q_ Posted July 2, 2013 Share Posted July 2, 2013 [MENTION=56977]squeek[/MENTION]That is for components called in prefabs. Lets take lureplant spawner component.I insert my functions into that component by using ComponentPostInit, component is initialized with default data from tuning.lua file then my added functions are called and change the data, but since component was already initialized it still uses default data until it goes to update state, that happens after 9 in game days for lureplant spawner component. Now I would like to be able to update component after altering its data with my functions without waiting 9 ingame days. Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-228280 Share on other sites More sharing options...
squeek Posted July 2, 2013 Share Posted July 2, 2013 (edited) [MENTION=5551]_Q_[/MENTION]All components are added by prefabs. The lureplantspawner is added to the "forest" prefab, which is essentially the (non-cave) world. There is no initialization of the lureplantspawner component inside the forest prefab's fn, though, so the ComponentPostInit problem I'm talking about doesn't affect it too much.To do what you want, the code would be:function compLurePlantSpawnerPostInit( comp, inst ) -- note that inst.prefab [i]is set[/i] to "forest" here, because it is explicitly set at the start of the prefab's fn -- do some sort of altering comp.spawntime = comp.spawntime / 10 comp.spawntimevariance = comp.spawntimevariance / 10 -- modify the StartNextSpawn function so that it will cancel the previously scheduled spawn if it exists local StartNextSpawn_base = comp.StartNextSpawn -- the self parameter is implicit in member functions comp.StartNextSpawn = function( self ) -- cancel the task if it exists if self.task then self.task:Cancel() self.task = nil end -- call the original function StartNextSpawn_base( self ) end -- restart the spawn to use the new values comp:StartNextSpawn()endAddComponentPostInit("lureplantspawner", compLurePlantSpawnerPostInit)This also shows an inconsistency, because usually the StartNextSpawn call would be in the prefab's fn, not the components constructor. Note that you'd also need to make sure that the code above doesn't interfere with ResumeSpawn in OnLoad, which I haven't tested and don't know much about when OnLoad is executed.EDIT: Just tested: OnLoad is called after the PostInit functions are called (even the prefab PostInits), so no worries there. Edited July 2, 2013 by squeek Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-228337 Share on other sites More sharing options...
simplex Posted July 2, 2013 Share Posted July 2, 2013 (edited) First, and most importantly, prefab PostInit functions get called before the entity's Transform get its position set. This is a huge problem and I couldn't find anywhere in the Lua where the Transform is initially set, so I assume it's somewhere in the C++. On a related note, prefabs can not get their own position inside their fn function, which also seems undesirable (let's say you wanted to set some variable depending on which tile it was spawning on).Yeah, Transform is defined in the engine side. It's an userdata, which basically means it's a (garbage-collectable) dynamically allocated chunk of memory (passed to the engine as a pointer) with a metatable attached. But the issue you mentioned can be worked around. The standard "Don't Starve way" of doing that is setting a callback with zero delay to do the work. Kevin actually mentioned this technique here. Just beware of pitfalls, such as the one that caused the bug mentioned in the linked thread. Edited July 2, 2013 by simplex Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-228347 Share on other sites More sharing options...
squeek Posted July 2, 2013 Share Posted July 2, 2013 Yeah, Transform is defined in the engine side. It's an userdata, which basically means it's a (garbage-collectable) dynamically allocated chunk of memory (passed to the engine as a pointer) with a metatable attached. But the issue you mentioned can be worked around. The standard "Don't Starve way" of doing that is setting a callback with zero delay to do the work. Kevin actually mentioned this technique here. Just beware of pitfalls, such as the one that caused the bug mentioned in the linked thread.Ah, thanks for that. That's a really unintuitive solution, but it'll do. Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-228385 Share on other sites More sharing options...
ucauka Posted July 2, 2013 Share Posted July 2, 2013 wtf is that curse mod!!! explain please Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-228552 Share on other sites More sharing options...
Developer Ipsquiggle Posted July 2, 2013 Author Developer Share Posted July 2, 2013 @IpsquiggleIf I add options like:- Bats- Spilagmites- Slurtle mounds- Rock lobsters- Bunnymen- Earthquakes- Tentapillars- Monkey barrelsAnd so on to the world customization screen, the changes would be saved and used upon actual cave generation or they wont have any effect on cave gen?I don't think these will carry forward yet.As mentioned previously, the worldgen modding is just not really up-to-par at the moment as it hasn't had any real mod support built into it. It's turn will come though, don't you worry! Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-228596 Share on other sites More sharing options...
eLe Posted July 4, 2013 Share Posted July 4, 2013 Any idea whyBackground Tint Codelocal function classPostInit(name, postInit) local class = GLOBAL[name] local constructor = class._ctor class._ctor = function (self, ...) constructor(self, ...) postInit(self, ...) end mt = GLOBAL.getmetatable(class) mt.__call = function(class_tbl, ...) local obj = {} GLOBAL.setmetatable(obj, class) if class._ctor then class._ctor(obj, ...) end return obj endendlocal function InvSlotPostInit(self, num, bgim, owner, container) if container.widgetbgimagetint then self.bgimage:SetTint( container.widgetbgimagetint.r, container.widgetbgimagetint.g, container.widgetbgimagetint.b, container.widgetbgimagetint.a ) endendGLOBAL.require "widgets/inventoryslot"classPostInit("InvSlot", InvSlotPostInit)doesn't work for the powers update? Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-230720 Share on other sites More sharing options...
no_signal Posted July 4, 2013 Share Posted July 4, 2013 (edited) Any idea whyBackground Tint Codelocal function classPostInit(name, postInit) local class = GLOBAL[name] local constructor = class._ctor class._ctor = function (self, ...) constructor(self, ...) postInit(self, ...) end mt = GLOBAL.getmetatable(class) mt.__call = function(class_tbl, ...) local obj = {} GLOBAL.setmetatable(obj, class) if class._ctor then class._ctor(obj, ...) end return obj endendlocal function InvSlotPostInit(self, num, bgim, owner, container) if container.widgetbgimagetint then self.bgimage:SetTint( container.widgetbgimagetint.r, container.widgetbgimagetint.g, container.widgetbgimagetint.b, container.widgetbgimagetint.a ) endendGLOBAL.require "widgets/inventoryslot"classPostInit("InvSlot", InvSlotPostInit)doesn't work for the powers update?I tested this code and it works finelocal function classPostInit(name, postInit) local class = GLOBAL[name] local constructor = class._ctor class._ctor = function (self, ...) constructor(self, ...) postInit(self, ...) end mt = GLOBAL.getmetatable(class) mt.__call = function(class_tbl, ...) local obj = {} GLOBAL.setmetatable(obj, class) if class._ctor then class._ctor(obj, ...) end return obj endendlocal function InvSlotPostInit(self, num, bgim, owner, container) self.bgimage:SetTint( 0, 0, 1, 1 ) endGLOBAL.require "widgets/inventoryslot"classPostInit("InvSlot", InvSlotPostInit)It must be something wrong with the widgetbgimagetintit may not have been added to the container Edited July 4, 2013 by no_signal Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-230893 Share on other sites More sharing options...
eLe Posted July 4, 2013 Share Posted July 4, 2013 Ok, that works for tinting everything; how would I go about making it a variable?Such as:container.widgetbgimagetint.r,container.widgetbgimagetint.g,container.widgetbgimagetint.b, container.widgetbgimagetint.aPutting part of containerwidget.lua into modmain.lua works the way I want it to; but I would prefer something that didn't overwrite whole bits of game code. :/local function TintingPostInit(inst) GLOBAL.ContainerWidget.Open = function(self, container, doer) self:Close() if container.components.container.widgetbgatlas and container.components.container.widgetbgimage then self.bgimage:SetTexture( container.components.container.widgetbgatlas, container.components.container.widgetbgimage ) end if container.components.container.widgetanimbank then self.bganim:GetAnimState():SetBank(container.components.container.widgetanimbank) end if container.components.container.widgetanimbuild then self.bganim:GetAnimState():SetBuild(container.components.container.widgetanimbuild) end if container.components.container.widgetpos then self:SetPosition(container.components.container.widgetpos) end if container.components.container.widgetbuttoninfo then self.button = self:AddChild(GLOBAL.AnimButton("button_small")) self.button:SetPosition(container.components.container.widgetbuttoninfo.position) self.button:SetText(container.components.container.widgetbuttoninfo.text) self.button:SetOnClick( function() container.components.container.widgetbuttoninfo.fn(container, doer) end ) self.button:SetFont(GLOBAL.BUTTONFONT) self.button:SetTextSize(35) self.button.text:SetVAlign(GLOBAL.ANCHOR_MIDDLE) self.button.text:SetColour(0,0,0,1) if container.components.container.widgetbuttoninfo.validfn then if container.components.container.widgetbuttoninfo.validfn(container, doer) then self.button:Enable() else self.button:Disable() end end end self.isopen = true self:Show() if self.bgimage.texture then self.bgimage:Show() else self.bganim:GetAnimState():PlayAnimation("open") end self.onitemlosefn = function(inst, data) self:OnItemLose(data) end self.inst:ListenForEvent("itemlose", self.onitemlosefn, container) self.onitemgetfn = function(inst, data) self:OnItemGet(data) end self.inst:ListenForEvent("itemget", self.onitemgetfn, container) local num_slots = math.min( container.components.container:GetNumSlots(), #container.components.container.widgetslotpos) local n = 1 for k,v in ipairs(container.components.container.widgetslotpos) do local slot = GLOBAL.InvSlot(n,"data/images/hud.xml", "inv_slot.tex", self.owner, container.components.container) self.inv[n] = self:AddChild(slot) slot:SetPosition(v) -- Slot Tinting --> if container.components.container.widgetbgimagetint then slot.bgimage:SetTint( container.components.container.widgetbgimagetint.r, container.components.container.widgetbgimagetint.g, container.components.container.widgetbgimagetint.b, container.components.container.widgetbgimagetint.a) end -- Slot Tinting <-- slot:SetLeftMouseDown(function() self:ClickInvSlot(slot) end) slot:SetRightMouseDown(function() self:RightClickInvSlot(slot) end) local obj = container.components.container:GetItemInSlot(n) if obj then local tile = GLOBAL.ItemTile(obj, self) slot:SetTile(tile) end n = n + 1 end self.container = container endend Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-230934 Share on other sites More sharing options...
no_signal Posted July 4, 2013 Share Posted July 4, 2013 (edited) Any idea whyBackground Tint Codelocal function classPostInit(name, postInit) local class = GLOBAL[name] local constructor = class._ctor class._ctor = function (self, ...) constructor(self, ...) postInit(self, ...) end mt = GLOBAL.getmetatable(class) mt.__call = function(class_tbl, ...) local obj = {} GLOBAL.setmetatable(obj, class) if class._ctor then class._ctor(obj, ...) end return obj endendlocal function InvSlotPostInit(self, num, bgim, owner, container) if container.widgetbgimagetint then self.bgimage:SetTint( container.widgetbgimagetint.r, container.widgetbgimagetint.g, container.widgetbgimagetint.b, container.widgetbgimagetint.a ) endendGLOBAL.require "widgets/inventoryslot"classPostInit("InvSlot", InvSlotPostInit)doesn't work for the powers update?I just figured out why it is not workingthe arguments for InvSlotPostInit are wrong.change thislocal function InvSlotPostInit(self, num, bgim, owner, container)to thislocal function InvSlotPostInit(self, num, atlas, bgim, owner, container)edit: they must have added the new argument with the update Edited July 4, 2013 by no_signal Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-231031 Share on other sites More sharing options...
eLe Posted July 4, 2013 Share Posted July 4, 2013 Ok, that fixed it. Now to update and sleep. :U Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-231066 Share on other sites More sharing options...
loganater12 Posted July 4, 2013 Share Posted July 4, 2013 Where on earth is the mods folder? Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-232294 Share on other sites More sharing options...
simplex Posted July 5, 2013 Share Posted July 5, 2013 (edited) Ipsquiggle,Could you add the possibility of specifying a vanilla game texture as the mod icon? I'd like to avoid repackaging textures that are already in the game, especially to not have to make license exceptions to them. Edited July 5, 2013 by simplex Link to comment https://forums.kleientertainment.com/forums/topic/18801-modders-your-new-friend-at-klei/page/14/#findComment-232398 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