Advertisement
Geovanii7

weapon_lightsaber_trainingsaber.lua

Jun 17th, 2019
478
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. --[[-------------------------------------------------------------------
  3.     Modified Lightsaber:
  4.         Runs on the intuitive wOS Lightsaber Base
  5.             Powered by
  6.                           _ _ _    ___  ____  
  7.                 __      _(_) | |_ / _ \/ ___|
  8.                 \ \ /\ / / | | __| | | \___ \
  9.                  \ V  V /| | | |_| |_| |___) |
  10.                   \_/\_/ |_|_|\__|\___/|____/
  11.                                              
  12.  _____         _                 _             _          
  13. |_   _|__  ___| |__  _ __   ___ | | ___   __ _(_) ___  ___
  14.   | |/ _ \/ __| '_ \| '_ \ / _ \| |/ _ \ / _` | |/ _ \/ __|
  15.   | |  __/ (__| | | | | | | (_) | | (_) | (_| | |  __/\__ \
  16.   |_|\___|\___|_| |_|_| |_|\___/|_|\___/ \__, |_|\___||___/
  17.                                          |___/            
  18. ----------------------------- Copyright 2017, David "King David" Wiltos ]]--[[
  19.                              
  20.     Lua Developer: King David
  21.     Contact: http://steamcommunity.com/groups/wiltostech
  22.        
  23. -- Copyright 2017, David "King David" Wiltos ]]--
  24.  
  25. AddCSLuaFile()
  26.  
  27. SWEP.Base = "weapon_lightsaber"
  28. SWEP.WeaponSynched = true
  29.  
  30. SWEP.PrintName = "Training Saber"
  31. SWEP.Author = "Robotboy655 + King David"
  32. SWEP.Category = "wiltOS Technologies"
  33. SWEP.Contact = ""
  34. SWEP.Purpose = "To train in the ways of lightsaber combat."
  35. SWEP.Instructions = "Harden your drive."
  36. SWEP.RenderGroup = RENDERGROUP_BOTH
  37.  
  38. SWEP.Slot = 0
  39. SWEP.SlotPos = 4
  40.  
  41. SWEP.Spawnable = true
  42. SWEP.DrawAmmo = false
  43. SWEP.DrawCrosshair = false
  44. SWEP.AutoSwitchTo = false
  45. SWEP.AutoSwitchFrom = false
  46. SWEP.DrawWeaponInfoBox = false
  47.  
  48. SWEP.ViewModel = "models/weapons/v_crowbar.mdl"
  49. SWEP.WorldModel = "models/sgg/starwars/weapons/w_anakin_ep2_saber_hilt.mdl"
  50. SWEP.ViewModelFOV = 55
  51.  
  52. SWEP.Primary.ClipSize = -1
  53. SWEP.Primary.DefaultClip = -1
  54. SWEP.Primary.Automatic = false
  55. SWEP.Primary.Ammo = "none"
  56.  
  57. SWEP.Secondary.ClipSize = -1
  58. SWEP.Secondary.DefaultClip = -1
  59. SWEP.Secondary.Automatic = true
  60. SWEP.Secondary.Ammo = "none"
  61.  
  62. SWEP.HoldType = "bs-arrogant-balanced"
  63.  
  64. SWEP.IsLightsaber = true
  65. SWEP.ForceSelectEnabled = false
  66.  
  67. function SWEP:PrimaryAttack()
  68.     if ( !IsValid( self.Owner ) ) then return end
  69.  
  70.     self:SetNextAttack( 1 )
  71.  
  72.     if ( !self.Owner:IsNPC() && self:GetEnabled() ) then
  73.         self.Owner:AnimResetGestureSlot( GESTURE_SLOT_CUSTOM )
  74.         self.Owner:SetAnimation( PLAYER_ATTACK1 )
  75.     end
  76. end
  77.  
  78. function SWEP:GetTargetHoldType()
  79.  
  80.     return "bs-arrogant-balanced"
  81.    
  82. end
  83.  
  84. if SERVER then return end
  85.  
  86. local rb655_lightsaber_hud_blur = CreateClientConVar( "rb655_lightsaber_hud_blur", "0" )
  87.  
  88. local grad = Material( "gui/gradient_up" )
  89. local matBlurScreen = Material( "pp/blurscreen" )
  90. matBlurScreen:SetFloat( "$blur", 3 )
  91. matBlurScreen:Recompute()
  92.  
  93. local function DrawHUDBox( x, y, w, h, b )
  94.  
  95.     x = math.floor( x )
  96.     y = math.floor( y )
  97.     w = math.floor( w )
  98.     h = math.floor( h )
  99.  
  100.     surface.SetMaterial( matBlurScreen )
  101.     surface.SetDrawColor( 255, 255, 255, 255 )
  102.  
  103.     if ( rb655_lightsaber_hud_blur:GetBool() ) then
  104.         render.SetScissorRect( x, y, w + x, h + y, true )
  105.             for i = 0.33, 1, 0.33 do
  106.                 matBlurScreen:SetFloat( "$blur", 5 * i )
  107.                 matBlurScreen:Recompute()
  108.                 render.UpdateScreenEffectTexture()
  109.                 surface.DrawTexturedRect( 0, 0, ScrW(), ScrH() )
  110.             end
  111.         render.SetScissorRect( 0, 0, 0, 0, false )
  112.     else
  113.         draw.NoTexture()
  114.         surface.SetDrawColor( Color( 0, 0, 0, 128 ) )
  115.         surface.DrawTexturedRect( x, y, w, h )
  116.     end
  117.  
  118.     surface.SetDrawColor( Color( 0, 0, 0, 128 ) )
  119.     surface.DrawRect( x, y, w, h )
  120.  
  121.     if ( b ) then
  122.         surface.SetMaterial( grad )
  123.         surface.SetDrawColor( Color( 0, 128, 255, 4 ) )
  124.         surface.DrawTexturedRect( x, y, w, h )
  125.     end
  126.  
  127. end
  128.  
  129.  
  130. local ForceBar = 100
  131. function SWEP:DrawHUD()
  132.     if ( !IsValid( self.Owner ) or self.Owner:GetViewEntity() != self.Owner or self.Owner:InVehicle() ) then return end
  133.  
  134.     -----------------------------------
  135.  
  136.     local icon = 52
  137.     local gap = 5
  138.  
  139.     local bar = 4
  140.     local bar2 = 16
  141.  
  142.     if ( self.ForceSelectEnabled ) then
  143.         icon = 128
  144.         bar = 8
  145.         bar2 = 24
  146.     end
  147.  
  148.     local ForcePowers = self:GetActiveForcePowers()
  149.  
  150.     if ( #ForcePowers < 1 ) then self:DrawHUDTargetSelection() return end
  151.  
  152.     ----------------------------------- Force Bar -----------------------------------
  153.  
  154.     ForceBar = math.min( 100, Lerp( 0.1, ForceBar, math.floor( self:GetForce() ) ) )
  155.  
  156.     local w = #ForcePowers * icon + ( #ForcePowers - 1 ) * gap
  157.     local h = bar2
  158.     local x = math.floor( ScrW() / 2 - w / 2 )
  159.     local y = ScrH() - gap - bar2
  160.  
  161.     DrawHUDBox( x, y, w, h )
  162.  
  163.     local barW = math.ceil( w * ( ForceBar / 100 ) )
  164.     if ( self:GetForce() <= 1 && barW <= 1 ) then barW = 0 end
  165.     draw.RoundedBox( 0, x, y, barW, h, Color( 0, 128, 255, 255 ) )
  166.  
  167.     draw.SimpleText( math.floor( self:GetForce() ) .. "%", "SelectedForceHUD", x + w / 2, y + h / 2, Color( 255, 255, 255 ), 1, 1 )
  168.  
  169.     ----------------------------------- Force Icons -----------------------------------
  170.  
  171.     local y = y - icon - gap
  172.     local h = icon
  173.  
  174.     for id, t in pairs( ForcePowers ) do
  175.         local x = x + ( id - 1 ) * ( h + gap )
  176.         local x2 = math.floor( x + icon / 2 )
  177.  
  178.         DrawHUDBox( x, y, h, h, self:GetForceType() == id )
  179.         draw.SimpleText( t.icon or "", "SelectedForceType", x2, math.floor( y + icon / 2 ), Color( 255, 255, 255 ), 1, 1 )
  180.         if ( self.ForceSelectEnabled ) then
  181.             draw.SimpleText( ( input.LookupBinding( "slot" .. id ) or "<NOT BOUND>" ):upper(), "SelectedForceHUD", x + gap, y + gap, Color( 255, 255, 255 ) )
  182.         end
  183.         if ( self:GetForceType() == id ) then
  184.             local y = y + ( icon - bar )
  185.             surface.SetDrawColor( 0, 128, 255, 255 )
  186.             draw.NoTexture()
  187.             surface.DrawPoly( {
  188.                 { x = x2 - bar, y = y },
  189.                 { x = x2, y = y - bar },
  190.                 { x = x2 + bar, y = y }
  191.             } )
  192.             draw.RoundedBox( 0, x, y, h, bar, Color( 0, 128, 255, 255 ) )
  193.         end
  194.     end
  195.  
  196.     ----------------------------------- Force Description -----------------------------------
  197.  
  198.     local selectedForcePower = self:GetActiveForcePowerType( self:GetForceType() )
  199.  
  200.     if ( selectedForcePower && self.ForceSelectEnabled ) then
  201.  
  202.         surface.SetFont( "SelectedForceHUD" )
  203.         local tW, tH = surface.GetTextSize( selectedForcePower.description or "" )
  204.  
  205.         --[[local x = x + w + gap
  206.         local y = y]]
  207.         local x = ScrW() / 2 + gap-- - tW / 2
  208.         local y = y - tH - gap * 3
  209.  
  210.         DrawHUDBox( x, y, tW + gap * 2, tH + gap * 2 )
  211.  
  212.         for id, txt in pairs( string.Explode( "\n", selectedForcePower.description or "" ) ) do
  213.             draw.SimpleText( txt, "SelectedForceHUD", x + gap, y + ( id - 1 ) * ScreenScale( 6 ) + gap, Color( 255, 255, 255 ) )
  214.         end
  215.  
  216.     end
  217.  
  218.     ----------------------------------- Force Label -----------------------------------
  219.  
  220.     if ( !self.ForceSelectEnabled ) then
  221.         surface.SetFont( "SelectedForceHUD" )
  222.         local txt = "Press " .. ( input.LookupBinding( "impulse 100" ) or "<NOT BOUND>" ):upper() .. " to toggle Force selection"
  223.         local tW, tH = surface.GetTextSize( txt )
  224.  
  225.         local x = x + w / 2
  226.         local y = y - tH - gap
  227.  
  228.         DrawHUDBox( x - tW / 2 - 5, y, tW + 10, tH )
  229.         draw.SimpleText( txt, "SelectedForceHUD", x, y, Color( 255, 255, 255 ), 1 )
  230.  
  231.  
  232.         if ( self:GetIncorrectPlayerModel() != 0 ) then
  233.             local txt = "Server is missing the player model or missing owner! Send a screenshot of this error to the mod page!\nPlayer model: " .. self.Owner:GetModel() .. " - Error Code: " .. self:GetIncorrectPlayerModel()
  234.             local tW, tH = surface.GetTextSize( txt )
  235.  
  236.             y = y - tH - gap
  237.  
  238.             DrawHUDBox( x - tW / 2 - 5, y, tW + 10, tH )
  239.             for id, str in pairs( string.Explode( "\n", txt ) ) do
  240.                 local _, lineH = surface.GetTextSize( str )
  241.                 draw.SimpleText( str, "SelectedForceHUD", x, y + ( id - 1 ) * lineH, Color( 255, 200, 200 ), 1 )
  242.             end
  243.         end
  244.     end
  245.  
  246.     if ( selectedForcePower && self.ForceSelectEnabled ) then
  247.         surface.SetFont( "SelectedForceType" )
  248.         local txt = selectedForcePower.name or ""
  249.         local tW2, tH2 = surface.GetTextSize( txt )
  250.  
  251.         local x = x + w / 2 - tW2 - gap * 2 --+ w / 2
  252.         local y = y + gap - tH2 - gap * 2
  253.  
  254.         DrawHUDBox( x, y, tW2 + 10, tH2 )
  255.         draw.SimpleText( txt, "SelectedForceType", x + gap, y, Color( 255, 255, 255 ) )
  256.     end
  257.  
  258.     ----------------------------------- Force Target -----------------------------------
  259.  
  260.     self:DrawHUDTargetSelection()
  261.  
  262. end
  263.  
  264. function SWEP:PlayWeaponSound( snd )
  265.     if ( CLIENT ) then return end
  266.     if ( IsValid( self:GetOwner() ) && IsValid( self:GetOwner():GetActiveWeapon() ) && self:GetOwner():GetActiveWeapon() != self ) then return end
  267.     if ( !IsValid( self.Owner ) ) then return self:EmitSound( snd ) end
  268.     self.Owner:EmitSound( snd )
  269. end
  270.  
  271. function SWEP:SelectTargets( num )
  272.     local t = {}
  273.     local dist = 512
  274.  
  275.     --[[local tr = util.TraceLine( {
  276.         start = self.Owner:GetShootPos(),
  277.         endpos = self.Owner:GetShootPos() + self.Owner:GetAimVector() * dist,
  278.         filter = self.Owner
  279.     } )]]
  280.  
  281.     local p = {}
  282.     for id, ply in pairs( ents.GetAll() ) do
  283.         if ( !ply:GetModel() or ply:GetModel() == "" or ply == self.Owner or ply:Health() < 1 ) then continue end
  284.         if ( string.StartWith( ply:GetModel() or "", "models/gibs/" ) ) then continue end
  285.         if ( string.find( ply:GetModel() or "", "chunk" ) ) then continue end
  286.         if ( string.find( ply:GetModel() or "", "_shard" ) ) then continue end
  287.         if ( string.find( ply:GetModel() or "", "_splinters" ) ) then continue end
  288.  
  289.         local tr = util.TraceLine( {
  290.             start = self.Owner:GetShootPos(),
  291.             endpos = ply.GetShootPos && ply:GetShootPos() or ply:GetPos(),
  292.             filter = self.Owner,
  293.         } )
  294.  
  295.         if ( tr.Entity != ply && IsValid( tr.Entity ) or tr.Entity == game.GetWorld() ) then continue end
  296.  
  297.         local pos1 = self.Owner:GetPos() + self.Owner:GetAimVector() * dist
  298.         local pos2 = ply:GetPos()
  299.         local dot = self.Owner:GetAimVector():Dot( ( self.Owner:GetPos() - pos2 ):GetNormalized() )
  300.  
  301.         if ( pos1:Distance( pos2 ) <= dist && ply:EntIndex() > 0 && ply:GetModel() && ply:GetModel() != "" ) then
  302.             table.insert( p, { ply = ply, dist = tr.HitPos:Distance( pos2 ), dot = dot, score = -dot + ( ( dist - pos1:Distance( pos2 ) ) / dist ) * 50 } )
  303.         end
  304.     end
  305.  
  306.     for id, ply in SortedPairsByMemberValue( p, "dist" ) do
  307.         table.insert( t, ply.ply )
  308.         if ( #t >= num ) then return t end
  309.     end
  310.  
  311.     return t
  312. end
  313.  
  314. ----------------------------------- Initialize -----------------------------------
  315.  
  316. function SWEP:LoadToolValues( ply )
  317.     local maxLen = ply:GetInfoNum( "rb655_lightsaber_bladel", 42 )
  318.     local bldWidth = ply:GetInfoNum( "rb655_lightsaber_bladew", 2 )
  319.     local Vector = ply:GetInfoNum( "rb655_lightsaber_red", 255 ), ply:GetInfoNum( "rb655_lightsaber_green", 0 ), ply:GetInfoNum( "rb655_lightsaber_blue", 0 )
  320.     local WorldModel = ply:GetInfoNum ( "rb655_lightsaber_model", "models/training/training.mdl" )
  321.  
  322.     self:SetMaxLength( maxLen )
  323.     self:SetBladeWidth( bldWidth )
  324.     self:SetCrystalColor( Vector( ply:GetInfo( "rb655_lightsaber_red" ), ply:GetInfo( "rb655_lightsaber_green" ), ply:GetInfo( "rb655_lightsaber_blue" ) ) )
  325.     self:SetDarkInner( ply:GetInfo( "rb655_lightsaber_dark" ) == "1" )
  326.     self:SetWorldModel( ply:GetInfo( "rb655_lightsaber_model" ) )
  327.     self:SetModel( self:GetWorldModel() )
  328.     self.WorldModel = self:GetWorldModel()
  329.     --self:PhysicsInit( SOLID_VPHYSICS )
  330.  
  331.     self.LoopSound = ply:GetInfo( "rb655_lightsaber_humsound" )
  332.     self.SwingSound = ply:GetInfo( "rb655_lightsaber_swingsound" )
  333.     self:SetOnSound( ply:GetInfo( "rb655_lightsaber_onsound" ) )
  334.     self:SetOffSound( ply:GetInfo( "rb655_lightsaber_offsound" ) )
  335.     --self:SetEnabled( ply:GetInfo( "rb655_lightsaber_starton" ) )
  336.  
  337.     self.WeaponSynched = true
  338.  
  339.     -- Start it if we spawned it using the spawnmenu!
  340.     if ( !IsValid( self.Owner ) || self.Owner:IsPlayer() ) then
  341.         -- Gotta wait a tick so we don't play double sounds!
  342.         timer.Simple( 0, function() if ( !IsValid( self ) ) then return end self:SetEnabled( false ) end )
  343.     end
  344. end
  345.  
  346. hook.Add( "PlayerSpawnedSWEP", "rb655_lightsaber_swep_sync", function( ply, wep )
  347.     if ( !rb655_IsLightsaber( wep ) ) then return end
  348.  
  349.     wep:LoadToolValues( ply )
  350. end )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement