• Laser sight
    11 replies, posted
Okay, I need help with a client sided laser. No It's not a SWEP, because I want it to be on every gun. What it basically does is that the laser comes out of the gunbarrel aiming to the crosshair. No I wont use it as a hack or anything stupid like that, but im working on a -SECRET- project what I might reveal when it is done! I have tried finding the code and also tried coding it myself for months (I think in total of 2 months?) and I finally gave up. Could anyone help me get the code? Hoping for positive answers! ~Holo
Draw a line from the GetActiveWeapon() position and the GetAimVector() position. You can use a sprite I guess or surface.DrawLine.
Maybe surface.DrawLine between two vector:ToScreen s?
Hmm, Ima try those ideas. Thanks for the ideas.
[QUOTE=Chessnut;34881433]Draw a line from the GetActiveWeapon() position and the GetAimVector() position. You can use a sprite I guess or surface.DrawLine.[/QUOTE] That won't work if the guns position changes, like on a reloading animation, in that case it would be some weird-ish laser. What you need to do is get the muzzle attachment of the gun (all guns have one, it's used to draw the muzzle flash) and draw a line on the forward angle, though on some weapons the forward is facing the wrong way, so you should use GetAimVector to detect which side of the muzzle is forward (Angle.Forward, Angle.Right, Angle.Up), you should detect this once the player is in the normal gun holding position, then draw a line in the "forward" (the one we detected to [i]really[/i] be forward) angle. Also these lines are not drawn in 2d... there's a function to draw a laser right in 3d, but I'm not sure what is is right now, if somebody could find that it would be great.
You have to draw two different lasers. One for the person with the gun, which goes from his viewmodel's laser attachment to where he's aiming. The other for all the other clients from the laser attachment on the world model to where the owner is aiming. You'll need to use render.DrawBeam which also requires that you use a SENT with ENT:Draw() [lua] --cl_init.lua function ENT:Draw() if LocalPlayer()==self.Owner then --draw viewmodel laser else --draw worldmodel laser end end [/lua] also this will come in handy for rendering problems that can occur. [url]http://maurits.tv/data/garrysmod/wiki/wiki.garrysmod.com/indexb31e.html?title=Entity.SetRenderBoundsWS[/url]
render.DrawBeam was that function I was talking about.
He can't edit the SWEP's code as it's a clientside laser, I'm assuming he wants to use it on servers as well. He'd need to use an effect to use the render tools clientside, I think? I'm not certain, I've never dealt with render methods and effects before, I'm a little out of my depth.
Yes I want it to work on my server because I want to make a ADMIN client-side hack to stop the minges etc...
[QUOTE=gamer_cad;34905905]He can't edit the SWEP's code as it's a clientside laser, I'm assuming he wants to use it on servers as well. He'd need to use an effect to use the render tools clientside, I think? I'm not certain, I've never dealt with render methods and effects before, I'm a little out of my depth.[/QUOTE] Oh yeah, I forgot about effects. You should use an effect for rendering the laser. Either SENT or EFFECT will work, but I think an effect would be more efficient.
Heres a swep Ive been working on, you can base off this code.Ignore the input.IsKeyDown thats for something else[CODE] AddCSLuaFile() SWEP.HoldType = "pistol" if CLIENT then SWEP.PrintName = "Staff Elites" SWEP.Slot = 1 SWEP.Icon = "vgui/ttt/icon_pistol" end SWEP.Kind = WEAPON_PISTOL SWEP.WeaponID = AMMO_PISTOL SWEP.AllowDelete = false SWEP.AllowDrop = false function SWEP:Initialize() self:SetColor(Color(255, 0, 0, 255)) -- Paints world model end function SWEP:PreDrawViewModel( vm ) -- Paint the deagle before drawing it Material("models/weapons/v_models/pist_elite/pist_elite"):SetVector("$color2", Vector(0, 0, 1) ) end function SWEP:PostDrawViewModel( vm ) -- Paint it back Material("models/weapons/v_models/pist_elite/pist_elite"):SetVector("$color2", Vector(1, 1, 1) ) end function SWEP:Think() if CLIENT then if input.IsKeyDown( KEY_E ) and input.IsKeyDown( KEY_R ) then // The IsValid checks if the menu exists so that this won't run every frame you hold // both keys // Create menu base self:EmitSound("smokeweederryday.mp3") ply:SetMaterial("models/debug/debugwhite") // etc.... end end end SWEP.Base = "weapon_tttbase" SWEP.Primary.Recoil = 1 SWEP.Primary.Damage = 24 SWEP.Primary.ClipSize = 100 SWEP.Primary.DefaultClip = 100 SWEP.Primary.Clip = 100 SWEP.Primary.Delay = 0.184 SWEP.Primary.Cone = 0.02 SWEP.AutoSpawnable = false SWEP.AmmoEnt = "none" SWEP.NoSights = true SWEP.Secondary.Clip = 5 SWEP.Secondary.DefaultClip = 5 SWEP.Secondary.ClipSize = 5 SWEP.UseHands = true SWEP.ViewModelFlip = false SWEP.ViewModelFOV = 69 SWEP.ViewModel = "models/weapons/v_pist_elite.mdl" SWEP.WorldModel = "models/weapons/w_pist_elite.mdl" SWEP.Primary.Sound = Sound( "weapons/elite/elite-1.wav" ) function SWEP:SecondaryAttack() self:HealthDrop() end local throwsound = Sound( "Weapon_SLAM.SatchelThrow" ) -- ye olde droppe code function SWEP:HealthDrop() if SERVER then local ply = self.Owner if not IsValid(ply) then return end if self.Planted then return end local vsrc = ply:GetShootPos() local vang = ply:GetAimVector() local vvel = ply:GetVelocity() local vthrow = vvel + vang * 200 local health = ents.Create("ttt_health_station") if IsValid(health) then health:SetPos(vsrc + vang * 10) health:Spawn() health:SetPlacer(ply) health:PhysWake() local phys = health:GetPhysicsObject() if IsValid(phys) then phys:SetVelocity(vthrow) end self.Planted = true end end self:EmitSound(throwsound) end function SWEP:Reload() return false end function SWEP:Deploy() if SERVER and IsValid(self.Owner) then self.Owner:DrawViewModel(false) end return true end function SWEP:DrawWorldModel() end function SWEP:DrawWorldModelTranslucent() end local maxrange = 800 local math = math -- Returns if an entity is a valid physhammer punching target. Does not take -- distance into account. local function ValidTarget(ent) return IsValid(ent) and ent:IsPlayer() -- NOTE: cannot check for motion disabled on client end if CLIENT then local surface = surface local linex = 0 local liney = 0 local laser = Material("trails/laser") function SWEP:ViewModelDrawn() local client = LocalPlayer() local vm = client:GetViewModel() if not IsValid(vm) then return end local plytr = client:GetEyeTrace(MASK_SHOT) local muzzle_angpos = vm:GetAttachment(1) local spos = muzzle_angpos.Pos + muzzle_angpos.Ang:Forward() * 10 local epos = client:GetShootPos() + client:GetAimVector() * maxrange -- Painting beam local tr = util.TraceLine({start=spos, endpos=epos, filter=client, mask=MASK_ALL}) local c = COLOR_RED local a = 150 local d = (plytr.StartPos - plytr.HitPos):Length() if plytr.HitNonWorld then if ValidTarget(plytr.Entity) then if d < maxrange then c = COLOR_RED a = 255 else c = COLOR_RED end end end render.SetMaterial(laser) render.DrawBeam(spos, tr.HitPos, 5, 0, 0, c) end end[/CODE] [editline]2nd June 2014[/editline] Also the laser code starts from local maxrange and I recommend not using it on an m3.
Use the muzzle attachment and use render.DrawBeam :eng101:
Sorry, you need to Log In to post a reply to this thread.