• util.Effect only works clientside?
    9 replies, posted
I've got this trigger entity giving players an effect upon entering it, but the effect refuses to show up. This is the code in the trigger entity upon touching: [lua]function ENT:StartTouch( ent ) --Serverside if ( ent:IsPlayer() and ent:Team() == TEAM_RUNNER ) then local efdata = EffectData() efdata:SetEntity( ent ) util.Effect( "player_launch", efdata ) --I'm sure this gets executed, I added a print() and it successfully printed end end[/lua] And this is the effect: [lua]function EFFECT:Init( data ) self.Ent = data:GetEntity() self.DieTime = CurTime() + 2 print( "Effect created! Die Time: " .. self.DieTime, "CurTime: " .. CurTime(), "Entity: " .. self.Ent ) end function EFFECT:Think( ) local vPos = self.Ent:GetPos() local emitter = ParticleEmitter( vPos ) for i = 0, 100 do local randdsir = VectorRand() local particle = emitter:Add( "effects/spark", vPos ) if ( particle ) then particle:SetVelocity( randdir * math.Rand( 5, 15 ) ) particle:SetLifeTime( 0 ) particle:SetDieTime( math.Rand( 0.4, 1.6 ) ) particle:SetStartAlpha( math.Rand( 200, 255 ) ) particle:SetEndAlpha( 0 ) particle:SetStartSize( 2 ) particle:SetEndSize( 0 ) particle:SetRoll( math.Rand( 0, 360 ) ) particle:SetColor( math.Rand( 150, 240 ), 50, 20, 200 ) particle:SetAirResistance( 0 ) particle:SetGravity( Vector( 0, 0, 0 ) ) //-700 end end emitter:Finish() print( "Removed:", ( self.DieTime > CurTime() ) ) return ( self.DieTime > CurTime() ) end function EFFECT:Render() end [/lua] The effect doesn't show up and the print functions don't print anything. Any assistance here?
[lua]util.Effect( "player_launch", efdata, true, true )[/lua] You could also have looked at the code for the emitter entity, the one that gets created by the emitter tool.
[QUOTE=_Kilburn;19934714][lua]util.Effect( "player_launch", efdata, true, true )[/lua] You could also have looked at the code for the emitter entity, the one that gets created by the emitter tool.[/QUOTE] Still appears to do nothing :saddowns:
If the map origin (0,0,0) is outside the world then the effect won't even bother sending to the client as it is deemed not visible. Set the origin of the effect to the entity's origin. [lua]efdata:SetOrigin( ent:GetPos() );[/lua]
[QUOTE=Jinto;19937388]If the map origin (0,0,0) is outside the world then the effect won't even bother sending to the client as it is deemed not visible. Set the origin of the effect to the entity's origin. [lua]efdata:SetOrigin( ent:GetPos() );[/lua][/QUOTE] It worked! Many thanks :fuckyou:
It appears that there's a bug with the LookupBone and GetBonePosition functions. I have this in my effect's think hook. [lua]function EFFECT:Think( ) local lbone = self.Ent:LookupBone( "ValveBiped.Bip01_L_Foot" ) local rbone = self.Ent:LookupBone( "ValveBiped.Bip01_R_Foot" ) local lbonepos, lboneang = self.Ent:GetBonePosition( lbone ) local rbonepos, rboneang = self.Ent:GetBonePosition( rbone ) self:EmitEffect( lbonepos ) self:EmitEffect( rbonepos ) return ( self.DieTime > CurTime() ) end[/lua] In game, when the effect is active, it appears to make the player enable full rotation and rotates the whole body to the direction you're looking in, see this picture: [img]http://filesmelt.com/dl/gmaster_hot0018.png[/img] Disabling the effect eliminates this bug and the player keeps being upright, see this picture: [img]http://filesmelt.com/dl/gmaster_hot0018+.png[/img] Any workaround or fix for this?
Try using [b][url=wiki.garrysmod.com/?title=Player.SetAllowFullRotation]Player.SetAllowFullRotation [img]http://wiki.garrysmod.com/favicon.ico[/img][/url][/b].
[QUOTE=Entoros;19947903]Try using [b][url=wiki.garrysmod.com/?title=Player.SetAllowFullRotation]Player.SetAllowFullRotation [img]http://wiki.garrysmod.com/favicon.ico[/img][/url][/b].[/QUOTE] I figured I'd rather not use this, because I'd need to execute this function every frame after using the bone functions to make the player stay upright. But if there's no other solution, I'll use this as a last resort.
[QUOTE=Dlaor;19944475]Any workaround or fix for this?[/QUOTE] If I remember correctly, calling self.Ent:InvalidateBoneCache() before or after doing all your bone operations fixes that. Not sure though.
Also, there's another problem: SetAllowFullRotation is serverside, so I can't use it in the effect... :frown: [editline]01:11PM[/editline] [QUOTE=_Kilburn;19953610]If I remember correctly, calling self.Ent:InvalidateBoneCache() before or after doing all your bone operations fixes that. Not sure though.[/QUOTE] I'll try this. [editline]01:17PM[/editline] It works, wohoo! :buddy:
Sorry, you need to Log In to post a reply to this thread.