· 7 years ago · Nov 13, 2018, 02:58 PM
1local SWEP={}
2function SWEP:Initialize()
3
4 // other initialize code goes here
5
6 if CLIENT then
7
8 // Create a new table for every weapon instance
9 self.VElements = table.FullCopy( self.VElements )
10 self.WElements = table.FullCopy( self.WElements )
11 self.ViewModelBoneMods = table.FullCopy( self.ViewModelBoneMods )
12
13 self:CreateModels(self.VElements) // create viewmodels
14 self:CreateModels(self.WElements) // create worldmodels
15
16 // init view model bone build function
17 if IsValid(self.Owner) then
18 local vm = self.Owner:GetViewModel()
19 if IsValid(vm) then
20 self:ResetBonePositions(vm)
21
22 // Init viewmodel visibility
23 if (self.ShowViewModel == nil or self.ShowViewModel) then
24 vm:SetColor(Color(255,255,255,255))
25 else
26 // we set the alpha to 1 instead of 0 because else ViewModelDrawn stops being called
27 vm:SetColor(Color(255,255,255,1))
28 // ^ stopped working in GMod 13 because you have to do Entity:SetRenderMode(1) for translucency to kick in
29 // however for some reason the view model resets to render mode 0 every frame so we just apply a debug material to prevent it from drawing
30 vm:SetMaterial("Debug/hsv")
31 end
32 end
33 end
34
35 end
36
37end
38
39function SWEP:Holster()
40
41 if CLIENT and IsValid(self.Owner) then
42 local vm = self.Owner:GetViewModel()
43 if IsValid(vm) then
44 self:ResetBonePositions(vm)
45 end
46 end
47
48 return true
49end
50
51function SWEP:OnRemove()
52 self:Holster()
53end
54
55if CLIENT then
56
57 SWEP.vRenderOrder = nil
58 function SWEP:ViewModelDrawn()
59
60 local vm = self.Owner:GetViewModel()
61 if !IsValid(vm) then return end
62
63 if (!self.VElements) then return end
64
65 self:UpdateBonePositions(vm)
66
67 if (!self.vRenderOrder) then
68
69 // we build a render order because sprites need to be drawn after models
70 self.vRenderOrder = {}
71
72 for k, v in pairs( self.VElements ) do
73 if (v.type == "Model") then
74 table.insert(self.vRenderOrder, 1, k)
75 elseif (v.type == "Sprite" or v.type == "Quad") then
76 table.insert(self.vRenderOrder, k)
77 end
78 end
79
80 end
81
82 for k, name in ipairs( self.vRenderOrder ) do
83
84 local v = self.VElements[name]
85 if (!v) then self.vRenderOrder = nil break end
86 if (v.hide) then continue end
87
88 local model = v.modelEnt
89 local sprite = v.spriteMaterial
90
91 if (!v.bone) then continue end
92
93 local pos, ang = self:GetBoneOrientation( self.VElements, v, vm )
94
95 if (!pos) then continue end
96
97 if (v.type == "Model" and IsValid(model)) then
98
99 model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
100 ang:RotateAroundAxis(ang:Up(), v.angle.y)
101 ang:RotateAroundAxis(ang:Right(), v.angle.p)
102 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
103
104 model:SetAngles(ang)
105 //model:SetModelScale(v.size)
106 local matrix = Matrix()
107 matrix:Scale(v.size)
108 model:EnableMatrix( "RenderMultiply", matrix )
109
110 if (v.material == "") then
111 model:SetMaterial("")
112 elseif (model:GetMaterial() != v.material) then
113 model:SetMaterial( v.material )
114 end
115
116 if (v.skin and v.skin != model:GetSkin()) then
117 model:SetSkin(v.skin)
118 end
119
120 if (v.bodygroup) then
121 for k, v in pairs( v.bodygroup ) do
122 if (model:GetBodygroup(k) != v) then
123 model:SetBodygroup(k, v)
124 end
125 end
126 end
127
128 if (v.surpresslightning) then
129 render.SuppressEngineLighting(true)
130 end
131
132 render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
133 render.SetBlend(v.color.a/255)
134 model:DrawModel()
135 render.SetBlend(1)
136 render.SetColorModulation(1, 1, 1)
137
138 if (v.surpresslightning) then
139 render.SuppressEngineLighting(false)
140 end
141
142 elseif (v.type == "Sprite" and sprite) then
143
144 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
145 render.SetMaterial(sprite)
146 render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
147
148 elseif (v.type == "Quad" and v.draw_func) then
149
150 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
151 ang:RotateAroundAxis(ang:Up(), v.angle.y)
152 ang:RotateAroundAxis(ang:Right(), v.angle.p)
153 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
154
155 cam.Start3D2D(drawpos, ang, v.size)
156 v.draw_func( self )
157 cam.End3D2D()
158
159 end
160
161 end
162
163 end
164
165 SWEP.wRenderOrder = nil
166 function SWEP:DrawWorldModel()
167
168 if (self.ShowWorldModel == nil or self.ShowWorldModel) then
169 self:DrawModel()
170 end
171
172 if (!self.WElements) then return end
173
174 if (!self.wRenderOrder) then
175
176 self.wRenderOrder = {}
177
178 for k, v in pairs( self.WElements ) do
179 if (v.type == "Model") then
180 table.insert(self.wRenderOrder, 1, k)
181 elseif (v.type == "Sprite" or v.type == "Quad") then
182 table.insert(self.wRenderOrder, k)
183 end
184 end
185
186 end
187
188 if (IsValid(self.Owner)) then
189 bone_ent = self.Owner
190 else
191 // when the weapon is dropped
192 bone_ent = self
193 end
194
195 for k, name in pairs( self.wRenderOrder ) do
196
197 local v = self.WElements[name]
198 if (!v) then self.wRenderOrder = nil break end
199 if (v.hide) then continue end
200
201 local pos, ang
202
203 if (v.bone) then
204 pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent )
205 else
206 pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent, "ValveBiped.Bip01_R_Hand" )
207 end
208
209 if (!pos) then continue end
210
211 local model = v.modelEnt
212 local sprite = v.spriteMaterial
213
214 if (v.type == "Model" and IsValid(model)) then
215
216 model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
217 ang:RotateAroundAxis(ang:Up(), v.angle.y)
218 ang:RotateAroundAxis(ang:Right(), v.angle.p)
219 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
220
221 model:SetAngles(ang)
222 //model:SetModelScale(v.size)
223 local matrix = Matrix()
224 matrix:Scale(v.size)
225 model:EnableMatrix( "RenderMultiply", matrix )
226
227 if (v.material == "") then
228 model:SetMaterial("")
229 elseif (model:GetMaterial() != v.material) then
230 model:SetMaterial( v.material )
231 end
232
233 if (v.skin and v.skin != model:GetSkin()) then
234 model:SetSkin(v.skin)
235 end
236
237 if (v.bodygroup) then
238 for k, v in pairs( v.bodygroup ) do
239 if (model:GetBodygroup(k) != v) then
240 model:SetBodygroup(k, v)
241 end
242 end
243 end
244
245 if (v.surpresslightning) then
246 render.SuppressEngineLighting(true)
247 end
248
249 render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
250 render.SetBlend(v.color.a/255)
251 model:DrawModel()
252 render.SetBlend(1)
253 render.SetColorModulation(1, 1, 1)
254
255 if (v.surpresslightning) then
256 render.SuppressEngineLighting(false)
257 end
258
259 elseif (v.type == "Sprite" and sprite) then
260
261 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
262 render.SetMaterial(sprite)
263 render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
264
265 elseif (v.type == "Quad" and v.draw_func) then
266
267 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
268 ang:RotateAroundAxis(ang:Up(), v.angle.y)
269 ang:RotateAroundAxis(ang:Right(), v.angle.p)
270 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
271
272 cam.Start3D2D(drawpos, ang, v.size)
273 v.draw_func( self )
274 cam.End3D2D()
275
276 end
277
278 end
279
280 end
281function SWEP:GetBoneOrientation( basetab, tab, ent, bone_override )
282
283 local bone, pos, ang
284 if (tab.rel and tab.rel != "") then
285
286 local v = basetab[tab.rel]
287
288 if (!v) then return end
289
290 // Technically, if there exists an element with the same name as a bone
291 // you can get in an infinite loop. Let's just hope nobody's that stupid.
292 pos, ang = self:GetBoneOrientation( basetab, v, ent )
293
294 if (!pos) then return end
295
296 pos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
297 ang:RotateAroundAxis(ang:Up(), v.angle.y)
298 ang:RotateAroundAxis(ang:Right(), v.angle.p)
299 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
300
301 else
302
303 bone = ent:LookupBone(bone_override or tab.bone)
304
305 if (!bone) then return end
306
307 pos, ang = Vector(0,0,0), Angle(0,0,0)
308 local m = ent:GetBoneMatrix(bone)
309 if (m) then
310 pos, ang = m:GetTranslation(), m:GetAngles()
311 end
312
313 if (IsValid(self.Owner) and self.Owner:IsPlayer() and
314 ent == self.Owner:GetViewModel() and self.ViewModelFlip) then
315 ang.r = -ang.r // Fixes mirrored models
316 end
317
318 end
319
320 return pos, ang
321 end
322function SWEP:CreateModels( tab )
323
324 if (!tab) then return end
325
326 // Create the clientside models here because Garry says we can't do it in the render hook
327 for k, v in pairs( tab ) do
328 if (v.type == "Model" and v.model and v.model != "" and (!IsValid(v.modelEnt) or v.createdModel != v.model) and
329 string.find(v.model, ".mdl") and file.Exists (v.model, "GAME") ) then
330
331 v.modelEnt = ClientsideModel(v.model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
332 if (IsValid(v.modelEnt)) then
333 v.modelEnt:SetPos(self:GetPos())
334 v.modelEnt:SetAngles(self:GetAngles())
335 v.modelEnt:SetParent(self)
336 v.modelEnt:SetNoDraw(true)
337 v.createdModel = v.model
338 else
339 v.modelEnt = nil
340 end
341
342 elseif (v.type == "Sprite" and v.sprite and v.sprite != "" and (!v.spriteMaterial or v.createdSprite != v.sprite)
343 and file.Exists ("materials/"..v.sprite..".vmt", "GAME")) then
344
345 local name = v.sprite.."-"
346 local params = { ["$basetexture"] = v.sprite }
347 // make sure we create a unique name based on the selected options
348 local tocheck = { "nocull", "additive", "vertexalpha", "vertexcolor", "ignorez" }
349 for i, j in pairs( tocheck ) do
350 if (v[j]) then
351 params["$"..j] = 1
352 name = name.."1"
353 else
354 name = name.."0"
355 end
356 end
357
358 v.createdSprite = v.sprite
359 v.spriteMaterial = CreateMaterial(name,"UnlitGeneric",params)
360
361 end
362 end
363
364 end
365local allbones
366 local hasGarryFixedBoneScalingYet = false
367function SWEP:UpdateBonePositions(vm)
368
369 if self.ViewModelBoneMods then
370
371 if (!vm:GetBoneCount()) then return end
372
373 // !! WORKAROUND !! //
374 // We need to check all model names :/
375 local loopthrough = self.ViewModelBoneMods
376 if (!hasGarryFixedBoneScalingYet) then
377 allbones = {}
378 for i=0, vm:GetBoneCount() do
379 local bonename = vm:GetBoneName(i)
380 if (self.ViewModelBoneMods[bonename]) then
381 allbones[bonename] = self.ViewModelBoneMods[bonename]
382 else
383 allbones[bonename] = {
384 scale = Vector(1,1,1),
385 pos = Vector(0,0,0),
386 angle = Angle(0,0,0)
387 }
388 end
389 end
390
391 loopthrough = allbones
392 end
393 // !! ----------- !! //
394
395 for k, v in pairs( loopthrough ) do
396 local bone = vm:LookupBone(k)
397 if (!bone) then continue end
398
399 // !! WORKAROUND !! //
400 local s = Vector(v.scale.x,v.scale.y,v.scale.z)
401 local p = Vector(v.pos.x,v.pos.y,v.pos.z)
402 local ms = Vector(1,1,1)
403 if (!hasGarryFixedBoneScalingYet) then
404 local cur = vm:GetBoneParent(bone)
405 while(cur >= 0) do
406 local pscale = loopthrough[vm:GetBoneName(cur)].scale
407 ms = ms * pscale
408 cur = vm:GetBoneParent(cur)
409 end
410 end
411
412 s = s * ms
413 // !! ----------- !! //
414
415 if vm:GetManipulateBoneScale(bone) != s then
416 vm:ManipulateBoneScale( bone, s )
417 end
418 if vm:GetManipulateBoneAngles(bone) != v.angle then
419 vm:ManipulateBoneAngles( bone, v.angle )
420 end
421 if vm:GetManipulateBonePosition(bone) != p then
422 vm:ManipulateBonePosition( bone, p )
423 end
424 end
425 else
426 self:ResetBonePositions(vm)
427 end
428
429 end
430
431 function SWEP:ResetBonePositions(vm)
432
433 if (!vm:GetBoneCount()) then return end
434 for i=0, vm:GetBoneCount() do
435 vm:ManipulateBoneScale( i, Vector(1, 1, 1) )
436 vm:ManipulateBoneAngles( i, Angle(0, 0, 0) )
437 vm:ManipulateBonePosition( i, Vector(0, 0, 0) )
438 end
439
440 end
441
442 /**************************
443 Global utility code
444 **************************/
445
446 // Fully copies the table, meaning all tables inside this table are copied too and so on (normal table.Copy copies only their reference).
447 // Does not copy entities of course, only copies their reference.
448 // WARNING: do not use on tables that contain themselves somewhere down the line or you'll get an infinite loop
449 function table.FullCopy( tab )
450
451 if (!tab) then return nil end
452
453 local res = {}
454 for k, v in pairs( tab ) do
455 if (type(v) == "table") then
456 res[k] = table.FullCopy(v) // recursion ho!
457 elseif (type(v) == "Vector") then
458 res[k] = Vector(v.x, v.y, v.z)
459 elseif (type(v) == "Angle") then
460 res[k] = Angle(v.p, v.y, v.r)
461 else
462 res[k] = v
463 end
464 end
465
466 return res
467
468 end
469
470end
471
472SWEP.Primary={}
473SWEP.Primary.ClipSize = 1000
474SWEP.Primary.DefaultClip = 1000
475SWEP.Primary.Automatic = true
476SWEP.Primary.Ammo = "none"
477
478SWEP.Secondary={}
479SWEP.Secondary.ClipSize = -1
480SWEP.Secondary.DefaultClip = -1
481SWEP.Secondary.Automatic = false
482SWEP.Secondary.Ammo = "none"
483
484SWEP.HoldType = "crossbow"
485SWEP.ViewModelFOV = 70
486SWEP.ViewModelFlip = false
487SWEP.UseHands = true
488SWEP.ViewModel = "models/weapons/c_crossbow.mdl"
489SWEP.WorldModel = "models/weapons/w_crossbow.mdl"
490SWEP.ShowViewModel = false
491SWEP.ShowWorldModel = false
492SWEP.ViewModelBoneMods = {
493 ["ValveBiped.Crossbow_base"] = { scale = Vector(0.009, 0.009, 0.009), pos = Vector(0, 0, 0), angle = Angle(0, 0, 0) },
494 ["ValveBiped.Base"] = { scale = Vector(0.009, 0.009, 0.009), pos = Vector(0.342, 0, 0), angle = Angle(0, 0, 0) },
495 ["ValveBiped.Bip01_R_Hand"] = { scale = Vector(1, 1, 1), pos = Vector(-0.343, 0, 0), angle = Angle(0, 0, 0) }
496}
497SWEP.IronSightsPos = Vector(0, 0, -3.12)
498SWEP.IronSightsAng = Vector(0, 0, 0)
499
500SWEP.VElements = {
501 ["wire+"] = { type = "Model", model = "models/combine_room/combine_wire002.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "zap", pos = Vector(-3.636, -1.558, -6.753), angle = Angle(-146.105, 26.882, 64.286), size = Vector(0.1, 0.09, 0.367), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
502 ["energybox"] = { type = "Model", model = "models/Items/car_battery01.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "stick", pos = Vector(0.518, 0, 2.596), angle = Angle(0, 90, 0), size = Vector(0.15, 0.15, 0.15), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
503 ["stick"] = { type = "Model", model = "models/props_foliage/driftwood_02a.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(-45.202, 27.78, -5.2), angle = Angle(-12.915, 37.13, 0), size = Vector(0.09, 0.09, 0.09), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
504 ["button"] = { type = "Model", model = "models/dav0r/buttons/button.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "stick", pos = Vector(11.947, 0.05, 1.258), angle = Angle(0, -12.858, -90), size = Vector(0.18, 0.18, 0.18), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
505 ["protect"] = { type = "Model", model = "models/props_phx/construct/glass/glass_dome360.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "shard", pos = Vector(0, 0, 0.43), angle = Angle(0, 0, 0), size = Vector(0.034, 0.034, 0.05), color = Color(255, 0, 255, 255), surpresslightning = true, material = "", skin = 0, bodygroup = {} },
506 ["tube"] = { type = "Model", model = "models/hunter/tubes/tube2x2xt.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(-37.8, 22, -6), angle = Angle(78.311, 36.234, 78.311), size = Vector(0.025, 0.025, 0.029), color = Color(255, 122, 0, 255), surpresslightning = false, material = "models/shiny", skin = 0, bodygroup = {} },
507 ["zapp"] = { type = "Model", model = "models/props_c17/utilityconnecter006c.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "zap", pos = Vector(0, 0, -2.901), angle = Angle(0, 0, 0), size = Vector(0.15, 0.15, 0.15), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
508 ["wire"] = { type = "Model", model = "models/combine_room/combine_wire002.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "protect", pos = Vector(-4.637, 2.596, -4.676), angle = Angle(-1.17, -38.571, 0), size = Vector(0.041, 0.041, 0.172), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
509 ["zap"] = { type = "Model", model = "models/props_c17/substation_circuitbreaker01a.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "stick", pos = Vector(-22, -2.201, 2), angle = Angle(0, 84, -90), size = Vector(0.019, 0.019, 0.019), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
510 ["shard"] = { type = "Model", model = "models/props_lab/cactus.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(-39, 19.26, -6), angle = Angle(1.169, 29.221, -90), size = Vector(0.33, 0.33, 0.33), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
511 ["Ready"] = { type = "Sprite", sprite = "particle/particle_glow_02", bone = "ValveBiped.Bip01_Spine4", rel = "zapp", pos = Vector(-18.182, -16.643, 80), size = { x = 0, y = 0 }, color = Color(255, 255, 255, 255), nocull = true, additive = true, vertexalpha = true, vertexcolor = true, ignorez = false}
512}
513SWEP.WElements = {
514 ["energybox"] = { type = "Model", model = "models/Items/car_battery01.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "stick", pos = Vector(0.518, 0, 2.596), angle = Angle(0, 90, 0), size = Vector(0.15, 0.15, 0.15), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
515 ["shard"] = { type = "Model", model = "models/props_lab/cactus.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "tube", pos = Vector(0, 0, -2.597), angle = Angle(180, 0, 0), size = Vector(0.33, 0.33, 0.33), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
516 ["button"] = { type = "Model", model = "models/dav0r/buttons/button.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "stick", pos = Vector(11.947, 0.05, 1.258), angle = Angle(0, -12.858, -90), size = Vector(0.18, 0.18, 0.18), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
517 ["zap"] = { type = "Model", model = "models/props_c17/substation_circuitbreaker01a.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "stick", pos = Vector(-27.532, -0.519, 0.3), angle = Angle(-1.17, 97.013, -97.014), size = Vector(0.019, 0.019, 0.019), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
518 ["tube"] = { type = "Model", model = "models/hunter/tubes/tube2x2xt.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "stick", pos = Vector(8.73, -0.258, 0.919), angle = Angle(90, 75.973, 0), size = Vector(0.025, 0.025, 0.029), color = Color(255, 122, 0, 255), surpresslightning = false, material = "models/shiny", skin = 0, bodygroup = {} },
519 ["zapp"] = { type = "Model", model = "models/props_c17/utilityconnecter006c.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "zap", pos = Vector(0, 0, -2.901), angle = Angle(0, 0, 0), size = Vector(0.15, 0.15, 0.15), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
520 ["sprite"] = { type = "Sprite", sprite = "particle/particle_glow_02", bone = "ValveBiped.Bip01_R_Hand", rel = "zap", pos = Vector(0, -0.201, 3.635), size = { x = 0, y = 0 }, color = Color(255, 255, 255, 255), nocull = true, additive = true, vertexalpha = true, vertexcolor = true, ignorez = true},
521 ["protect"] = { type = "Model", model = "models/props_phx/construct/glass/glass_dome360.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "shard", pos = Vector(0, 0, 0.43), angle = Angle(0, 0, 0), size = Vector(0.034, 0.034, 0.05), color = Color(255, 0, 255, 255), surpresslightning = true, material = "", skin = 0, bodygroup = {} },
522 ["stick"] = { type = "Model", model = "models/props_foliage/driftwood_02a.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(22.337, -1.558, 0.518), angle = Angle(-10.52, 180, -90), size = Vector(0.09, 0.09, 0.09), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
523}
524function SWEP:ShootEffects()
525self.Weapon:SetHoldType("crossbow")
526 self.Weapon:SendWeaponAnim( ACT_VM_PRIMARYATTACK ) -- View model animation
527 self.Owner:MuzzleFlash() -- Crappy muzzle light
528 self.Owner:SetAnimation( PLAYER_ATTACK1 ) -- 3rd Person Animation
529
530end
531function SWEP:ShootBullet( damage, num_bullets, aimcone )
532
533 local bullet = {}
534local bpos,bang=self.Owner:GetBonePosition(self.Owner:LookupBone("ValveBiped.Bip01_R_Hand"))
535 bullet.Num = num_bullets
536 bullet.Src = LocalToWorld(Vector(58.337, 2.558, 6),Angle(-10.52, 180, -90),bpos,bang) -- Source
537 bullet.Dir = self.Owner:GetAimVector() -- Dir of bullet
538 bullet.Spread = Vector( aimcone, aimcone, 0 ) -- Aim Cone
539 bullet.Tracer = 1 -- Show a tracer on every x bullets
540 bullet.Force = 1 -- Amount of force to give to phys objects
541 bullet.Damage = damage
542 bullet.AmmoType = "Pistol"
543 bullet.TracerName = "ToolTracer"
544
545 self.Owner:FireBullets( bullet )
546
547 self:ShootEffects()
548
549end
550sound.Add( {
551 name = "wepon",
552 channel = CHAN_WEAPON,
553 volume = 1.0,
554 level = 80,
555 pitch = { 110},
556 sound = "ambient/energy/force_field_loop1.wav"
557} )
558
559function SWEP:PrimaryAttack()
560
561 -- Make sure we can shoot first
562 if ( !self:CanPrimaryAttack() ) then return end
563
564 -- Play shoot sound
565 self.Weapon:EmitSound( "weapons/airboat/airboat_gun_energy1.wav", 41, math.random(200,215), 1, CHAN_STATIC)
566 self.Weapon:EmitSound( "wepon" )
567 -- Shoot 1 bullet, 150 damage, 0.01 aimcone
568
569 self:ShootBullet( 150, 1, 0 )
570
571 -- Remove 1 bullet from our clip
572 self:TakePrimaryAmmo( 1 )
573
574 -- Punch the player's view
575 self.Owner:ViewPunch( Angle(-0.5, 0, 0 ) )
576 self.atak=true
577 self.Weapon:SetNextPrimaryFire(CurTime()+0.05)
578
579end
580function SWEP:Think()
581if self.Owner:KeyDown(IN_ATTACK) then
582if ( !self:CanPrimaryAttack() ) then self.Weapon:StopSound("wepon")
583self.atak=false
584end
585else
586if self.atak==true then
587
588self.Weapon:StopSound("wepon")
589self.atak=false
590end
591end
592local sprite_cl=self.VElements.Ready
593local sprite_sv=self.WElements.sprite
594if self.atak==true then
595local random=math.random(20,25)
596sprite_cl.size.x=random
597sprite_cl.size.y=random
598sprite_sv.size.x=random-5
599sprite_sv.size.y=random-5
600else
601sprite_cl.size.x=Lerp(0.1,sprite_cl.size.x,0)
602sprite_cl.size.y=Lerp(0.1,sprite_cl.size.y,0)
603sprite_sv.size.x=Lerp(0.1,sprite_sv.size.x,0)
604sprite_sv.size.y=Lerp(0.1,sprite_sv.size.y,0)
605end
606end
607weapons.Register(SWEP,"stick_weapon")