SHOW:
|
|
- or go back to the newest paste.
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 | - | end |
311 | + | |
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 ) |