• [Lua] Bone Merged Models Cause Memory Leaks
    7 replies, posted
I'm having some problems with bone merging a prop to a player model and removing it. When I attach it it causes memory leaking until the frame rate drops to 1. Here's the code I'm using: [lua] local function MaskToggle() if CLIENT then local MaskMDL = ClientsideModel( "models/jessev92/stalker/items/devices/gas_mask_sunrise_w.mdl", RENDERGROUP_BOTH) if self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == true then MaskMDL:SetParent(self.Owner) MaskMDL:AddEffects(EF_BONEMERGE) if self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == false then MaskMDL:Remove() end end end [/lua] Am I doing this correctly? The wiki isn't very detailed on how to do bone merged models so I'm running off what I see in an add-on I have downloaded.
ClientsideModel() creates a new clientside model everytime, you should assign a variable to the owner. [code] self.Owner.MaskMDL = self.Owner.MaskMDL or ClientsideModel( "models/jessev92/stalker/items/devices/gas_mask_sunrise_w.mdl", RENDERGROUP_BOTH) local MaskMDL = self.Owner.MaskMDL [/code] EDIT: also, saw a syntax error in your code, after every [code] if ( blah ) then end [/code] OR [code] if ( blah ) then elseif ( blah ) then end [/code] OR [code] if ( blah ) then else end [/code] NOT [code] if ( blah ) then if ( blah ) then [/code]
That didn't work, now it's complaining about SetParent not being valid. [code][ERROR] addons/stalker_gasmask_sent/lua/weapons/stalker_gas_mask_sunrise.lua:107: Tried to use a NULL entity! 1. SetParent - [C]:-1 2. SunriseMaskToggle - addons/stalker_gasmask_sent/lua/weapons/stalker_gas_mask_sunrise.lua:107 3. unknown - addons/stalker_gasmask_sent/lua/weapons/stalker_gas_mask_sunrise.lua:79 [/code] Here's the full code I'm using: [lua] function SWEP:Think() if self.Owner:KeyPressed(IN_RELOAD) and ActionDelay <= CurTime() then local MaskMDL = self.Owner.MaskMDL if self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == false then if CLIENT then self.Owner:ViewPunch(Angle(-35,0,0)) surface.PlaySound( "jessev92/items/gas_mask_on.wav" ) RunConsoleCommand( "pp_mat_overlay", "jessev92/ui/overlays/mask_gas01" ) self.Owner.MaskMDL = self.Owner.MaskMDL or ClientsideModel( "models/jessev92/stalker/items/devices/gas_mask_sunrise_w.mdl", RENDERGROUP_BOTH) MaskMDL:SetParent(self.Owner) MaskMDL:AddEffects(EF_BONEMERGE) end if SERVER then self.Owner:SetNWBool( "STALKER_PlyGasMaskOn", true ) end ActionDelay = CurTime() + 3 elseif self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == true then if CLIENT then self.Owner:ViewPunch(Angle(-35,0,0)) surface.PlaySound( "jessev92/items/gas_mask_off.wav" ) RunConsoleCommand( "pp_mat_overlay", "" ) MaskMDL:Remove() end if SERVER then self.Owner:SetNWBool( "STALKER_PlyGasMaskOn", false ) end ActionDelay = CurTime() + 3 end end end [/lua] I'm not sure why the code is giving an error for SetParent now when it worked before. The memory leaks are gone but the mask doesn't appear now.
that self.Owner.MaskMDL = blah has to be set before the local MaskMDL [code] function SWEP:Think() if self.Owner:KeyPressed(IN_RELOAD) and ActionDelay <= CurTime() then self.Owner.MaskMDL = self.Owner.MaskMDL or ClientsideModel( "models/jessev92/stalker/items/devices/gas_mask_sunrise_w.mdl", RENDERGROUP_BOTH) local MaskMDL = self.Owner.MaskMDL if self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == false then if CLIENT then self.Owner:ViewPunch(Angle(-35,0,0)) surface.PlaySound( "jessev92/items/gas_mask_on.wav" ) RunConsoleCommand( "pp_mat_overlay", "jessev92/ui/overlays/mask_gas01" ) MaskMDL:SetParent(self.Owner) MaskMDL:AddEffects(EF_BONEMERGE) end if SERVER then self.Owner:SetNWBool( "STALKER_PlyGasMaskOn", true ) end ActionDelay = CurTime() + 3 elseif self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == true then if CLIENT then self.Owner:ViewPunch(Angle(-35,0,0)) surface.PlaySound( "jessev92/items/gas_mask_off.wav" ) RunConsoleCommand( "pp_mat_overlay", "" ) MaskMDL:Remove() end if SERVER then self.Owner:SetNWBool( "STALKER_PlyGasMaskOn", false ) end ActionDelay = CurTime() + 3 end end end [/code]
When I put that in it will complain about the ClientsideModel line not being on the client, so I put that line into an if CLIENT then block and it's still complaining about SetParent.
Ah, you are right, because ClientsideModel is a client function. [code] function SWEP:Think() if self.Owner:KeyPressed(IN_RELOAD) and ActionDelay <= CurTime() then if self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == false then if CLIENT then self.Owner.MaskMDL = self.Owner.MaskMDL or ClientsideModel( "models/jessev92/stalker/items/devices/gas_mask_sunrise_w.mdl", RENDERGROUP_BOTH) local MaskMDL = self.Owner.MaskMDL self.Owner:ViewPunch(Angle(-35,0,0)) surface.PlaySound( "jessev92/items/gas_mask_on.wav" ) RunConsoleCommand( "pp_mat_overlay", "jessev92/ui/overlays/mask_gas01" ) MaskMDL:SetParent(self.Owner) MaskMDL:AddEffects(EF_BONEMERGE) end if SERVER then self.Owner:SetNWBool( "STALKER_PlyGasMaskOn", true ) end ActionDelay = CurTime() + 3 elseif self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == true then if CLIENT then self.Owner:ViewPunch(Angle(-35,0,0)) surface.PlaySound( "jessev92/items/gas_mask_off.wav" ) RunConsoleCommand( "pp_mat_overlay", "" ) MaskMDL:Remove() end if SERVER then self.Owner:SetNWBool( "STALKER_PlyGasMaskOn", false ) end ActionDelay = CurTime() + 3 end end [/code]
Same error. This is what the current code looks like: [lua] function SWEP:Think() if self.Owner:KeyPressed(IN_RELOAD) and ActionDelay <= CurTime() then local MaskMDL = self.Owner.MaskMDL if self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == false then if CLIENT then self.Owner.MaskMDL = self.Owner.MaskMDL or ClientsideModel( "models/jessev92/stalker/items/devices/gas_mask_sunrise_w.mdl", RENDERGROUP_BOTH) self.Owner:ViewPunch(Angle(-35,0,0)) surface.PlaySound( "jessev92/items/gas_mask_on.wav" ) RunConsoleCommand( "pp_mat_overlay", "jessev92/ui/overlays/mask_gas01" ) MaskMDL:SetParent(self.Owner) MaskMDL:AddEffects(EF_BONEMERGE) end if SERVER then self.Owner:SetNWBool( "STALKER_PlyGasMaskOn", true ) end ActionDelay = CurTime() + 3 elseif self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == true then if CLIENT then self.Owner:ViewPunch(Angle(-35,0,0)) surface.PlaySound( "jessev92/items/gas_mask_off.wav" ) RunConsoleCommand( "pp_mat_overlay", "" ) MaskMDL:Remove() end if SERVER then self.Owner:SetNWBool( "STALKER_PlyGasMaskOn", false ) end ActionDelay = CurTime() + 3 end end end [/lua] Is SetParent able to be run on client? It says it's shared on the wiki so it should be able to. It's complaining about the player (self.Owner) not being valid on the client. [editline]22nd February 2016[/editline] Okay so I've got it all working except the parenting. I don't think SetParent likes me passing it self.Owner as the parent to attach to.
Okay, I figured it out. Here's the final code: [lua] function SWEP:Think() if self.Owner:KeyPressed(IN_RELOAD) and ActionDelay <= CurTime() then if self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == false then if CLIENT then self.Owner.MaskMDL = ClientsideModel( "models/jessev92/stalker/items/devices/gas_mask_sunrise_w.mdl", RENDERGROUP_BOTH) local MaskMDL = self.Owner.MaskMDL MaskMDL:SetParent( self.Owner ) MaskMDL:AddEffects(EF_BONEMERGE) surface.PlaySound( "jessev92/items/gas_mask_on.wav" ) RunConsoleCommand( "pp_mat_overlay", "jessev92/ui/overlays/mask_gas01" ) end if SERVER then self.Owner:ViewPunch(Angle(35,0,0)) self.Owner:SetNWBool( "STALKER_PlyGasMaskOn", true ) end elseif self.Owner:GetNWBool( "STALKER_PlyGasMaskOn" ) == true then if CLIENT then surface.PlaySound( "jessev92/items/gas_mask_off.wav" ) RunConsoleCommand( "pp_mat_overlay", "" ) self.Owner.MaskMDL = self.Owner.MaskMDL or ClientsideModel( "models/jessev92/stalker/items/devices/gas_mask_sunrise_w.mdl", RENDERGROUP_BOTH) local MaskMDL = self.Owner.MaskMDL MaskMDL:Remove() end if SERVER then self.Owner:ViewPunch(Angle(35,0,0)) self.Owner:SetNWBool( "STALKER_PlyGasMaskOn", false ) end end ActionDelay = CurTime() + 3 end end [/lua]
Sorry, you need to Log In to post a reply to this thread.