theDarkFey Posted June 2, 2017 Share Posted June 2, 2017 (edited) Hello! I recently got into Don't Starve Together and am in the process of making a custom character mod. I want to give her a dark energy badge whose level will increase/decrease when she spawns(crafts) a follower. I have been able to get the badge to show up, but haven't been able to get the animations or the number/value to work. Any help is very appreciated!! Code is as follows: modmain: --Dark Energy Badge AddReplicableComponent("darkenergy") local function Makedarkenergybadge(self, badge_name, owner_tag, bank, build, background_build, show_progress, show_remaining, position_normal, position_modded) if self.owner:HasTag("wisteria") then local darkenergybadge = require "badges/darkenergybadge" self.darkenergybadge = self:AddChild(darkenergybadge("darkenergybadge", self.owner)) if GLOBAL.KnownModIndex:IsModEnabled("workshop-376333686") then self.darkenergybadge:SetPosition(-62, -52, 0) else self.darkenergybadge:SetPosition(-80, -40, 0) end local function darkenergydelta(self, data) self.darkenergybadge:SetPercent(data.newpercent, data.currentdarkenergy, data.maxdarkenergy) end local function OnSetPlayerMode( self ) if self.ondarkenergydelta == nil then self.ondarkenergydelta = function( owner, data ) darkenergydelta( data ) end self.inst:ListenForEvent( "darkenergydelta", self.ondarkenergydelta, self.owner ) if self.owner.darkenergy ~= nil then darkenergydelta({newpercent = self.owner.darkenergy:GetPercent(), currentdarkenergy = self.owner.darkenergy:GetPercent(), maxdarkenergy = self.owner.darkenergy:GetMax() }) --darkenergydelta({ newpercent = self.owner.darkenergyCurrent / self.owner.darkenergyMax, --currentdarkenergy = inst.components.darkenergyCurrent, --maxdarkenergy = self.owner.darkenergyMax }) end end end local function OnSetGhostMode(self) if self.ondarkenergydelta ~= nil then self.inst:RemoveEventCallback("darkenergydelta", self.ondarkenergydelta, self.owner) self.ondarkenergydelta = nil end end local _SetGhostMode = self.SetGhostMode function self:SetGhostMode(ghostmode) _SetGhostMode(self, ghostmode) if ghostmode then self.darkenergybadge:Hide() OnSetGhostMode(self) else self.darkenergybadge:Show() OnSetPlayerMode(self) end end OnSetPlayerMode(self) end return self end local function StatusDisplaysPostInit(self) Makedarkenergybadge(self, "darkenergybadge", "wisteria", "darkenergybadge", "darkenergybadge", "darkenergybadge", true, false, {x=40,y=-55,z=0}, {x=-62,y=-52,z=0}) end AddClassPostConstruct("widgets/statusdisplays", StatusDisplaysPostInit) character: local function onspawnpet(inst, food) if food.components.edible and food.components.edible.footype == "MEAT" and inst.components.darkenergy ~= nil then --test with food eaten: later i want to covert this into when spawning/crafting the pet inst.components.darkenergy:GainAmount(-10) inst.SoundEmitter:PlaySound("dontstarve/HUD/sanity_down") inst.HUD.controls.status.darkenergybadge:PulseRed() end if inst.darkenergyCurrent == inst.darkenergyMin then inst.components.health:DoDelta(-40) end inst:PushEvent("darkenergydelta", {newpercent = inst.darkenergyCurrent / inst.darkenergyMax, currentdarkenergy = inst.darkenergyCurrent, maxdarkenergy = inst.darkenergyMax}) end darkenergybadge: local Badge = require "widgets/badge" local UIAnim = require "widgets/uianim" local Text = require "widgets/text" local Widget = require "widgets/widget" local function OnGhostDeactivated(inst) if inst.AnimState:isCurrentAnimation("anim") then inst.widget:Hide() end end local darkenergybadge = Class(Badge, function(self, owner, bank, build, background_build, show_progress, show_remaining) Badge._ctor(self, "darkenergybadge", owner) self.owner = owner self.num = self:AddChild(Text(BODYTEXTFONT, 33)) self.num:SetHAlign(ANCHOR_MIDDLE) self.num:SetPosition(-80, -40, 0) self.num:SetClickable(false) self.num:Hide() --Icon shown self.sanityarrow = self.underNumber:AddChild(UIAnim()) self.sanityarrow:GetAnimState():SetBank(bank) self.sanityarrow:GetAnimState():SetBuild(build) self.sanityarrow:GetAnimState():PlayAnimation("anim") self.sanityarrow:SetClickable(false) --Hide the original frame since it is now overlapped by the topperanim self.anim:GetAnimState():Hide("frame") self.ghostanim = self.underNumber:AddChild(UIAnim()) self.ghostanim:GetAnimState():SetBank(bank) self.ghostanim:GetAnimState():SetBuild(build) self.ghostanim:GetAnimState():PlayAnimation("anim") self.ghostanim:Hide() self.ghostanim:SetClickable(false) self.ghostanim.inst:ListenForEvent("animover", OnGhostDeactivated) self:StartUpdating() function self:OverrideIcon(bank, build) self.overlay:GetAnimState():SetBank("sanity_arrow") self.overlay:GetAnimState():SetBuild("darkenergybadge") self.overlay:GetAnimState():PlayAnimation("anim") end function self:SetPercent(pct, val, max) self.val = val or self.percent self.max = max or 100 self.percent = pct or (self.val/self.max) or 1 --change percentage bar self.anim:GetAnimState():SetPercent("anim", 1 - self.percent) self.overlay:GetAnimState():SetPercent("anim", 1 - ((val or 1) / (max or 100))) self.num:SetString(tostring(math.ceil(self.percent * self.max))) if KnownModIndex:IsModEnabled("workshop-376333686") then if self.show_progress then if self.show_remaining then self.maxnum:SetString(tostring(math.floor((1 - val) * 100)) .. "%") else self.maxnum:SetString(tostring(math.floor(val * 100)) .. "%") end else self.maxnum:SetString(tostring(max or 100)) end end self.percent = val/self end function self:OnUpdate(dt) if self.owner.darkenergy ~= nil then self:SetPercent( self.owner.darkenergy:GetPercent(), self.owner.darkenergy:GetCurrent(), self.owner.darkenergy:GetMax()) end end end) return darkenergybadge Sorry the code is kind of a mess! I tried to piece the code together from a multitude of examples as best I could. If you need any other code, etc. I can provide it. Thank you <3 ~theDarkFey Edited June 2, 2017 by theDarkFey Link to comment https://forums.kleientertainment.com/forums/topic/79480-custom-badge-implementation/ 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