· 6 years ago · Apr 27, 2019, 11:38 PM
1/*---------------------------------------------------------
2Think
3---------------------------------------------------------*/
4function SWEP:Think()
5 if self.Owner:KeyDown(IN_SPEED) then
6 self:SetHoldType("normal")
7 else
8 self:SetHoldType(self.HoldType)
9 end
10 if self.MoveTime and self.MoveTime < CurTime() and SERVER then
11 self.MoveTime = nil
12 end
13end
14
15
16local ActIndex = {
17 [ "pistol" ] = ACT_HL2MP_IDLE_PISTOL,
18 [ "revolver" ] = ACT_HL2MP_IDLE_REVOLVER,
19 [ "smg" ] = ACT_HL2MP_IDLE_SMG1,
20 [ "grenade" ] = ACT_HL2MP_IDLE_GRENADE,
21 [ "ar2" ] = ACT_HL2MP_IDLE_AR2,
22 [ "shotgun" ] = ACT_HL2MP_IDLE_SHOTGUN,
23 [ "rpg" ] = ACT_HL2MP_IDLE_RPG,
24 [ "physgun" ] = ACT_HL2MP_IDLE_PHYSGUN,
25 [ "crossbow" ] = ACT_HL2MP_IDLE_CROSSBOW,
26 [ "melee" ] = ACT_HL2MP_IDLE_MELEE,
27 [ "slam" ] = ACT_HL2MP_IDLE_SLAM,
28 [ "normal" ] = ACT_HL2MP_IDLE,
29 [ "fist" ] = ACT_HL2MP_IDLE_FIST,
30 [ "melee2" ] = ACT_HL2MP_IDLE_MELEE2,
31 [ "passive" ] = ACT_HL2MP_IDLE_PASSIVE,
32 [ "knife" ] = ACT_HL2MP_IDLE_KNIFE
33}
34
35/*---------------------------------------------------------
36Initialize
37---------------------------------------------------------*/
38function SWEP:Initialize()
39self:SetHoldType( self.HoldType )
40end
41
42
43function SWEP:SetHoldType( t )
44 local index = ActIndex[ t ]
45 if (index == nil) then
46 Msg( "SWEP:SetHoldType - ActIndex[ \""..t.."\" ] isn't set! (defaulting to normal)\n" )
47 t = "normal"
48 end
49 if (index ~= nil) then
50 self.ActivityTranslate = {}
51 self.ActivityTranslate [ ACT_MP_STAND_IDLE ] = index
52 self.ActivityTranslate [ ACT_MP_WALK ] = index+1
53 self.ActivityTranslate [ ACT_MP_RUN ] = index+2
54 self.ActivityTranslate [ ACT_MP_CROUCH_IDLE ] = index+3
55 self.ActivityTranslate [ ACT_MP_CROUCHWALK ] = index+4
56 self.ActivityTranslate [ ACT_MP_ATTACK_STAND_PRIMARYFIRE ] = index+5
57 self.ActivityTranslate [ ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ] = index+5
58 self.ActivityTranslate [ ACT_MP_RELOAD_STAND ] = index+6
59 self.ActivityTranslate [ ACT_MP_RELOAD_CROUCH ] = index+6
60 self.ActivityTranslate [ ACT_MP_JUMP ] = index+7
61 self.ActivityTranslate [ ACT_RANGE_ATTACK1 ] = index+8
62 end
63 if t == "normal" then
64 self.ActivityTranslate [ ACT_MP_JUMP ] = ACT_HL2MP_JUMP_SLAM
65 end
66 if t == "passive" then
67 self.ActivityTranslate [ ACT_MP_CROUCH_IDLE ] = ACT_HL2MP_CROUCH_IDLE
68 end
69 if t == "knife" || t == "melee2" then
70 self.ActivityTranslate [ ACT_MP_CROUCH_IDLE ] = nil
71 end
72 self:SetupWeaponHoldTypeForAI( t )
73 self._InternalHoldType = t
74end
75
76
77function SWEP:Think()
78 if self.Owner:KeyDown(IN_SPEED) then
79 self:SetHoldType("normal")
80 else
81 self:SetHoldType(self.HoldType)
82 end
83 if self.MoveTime and self.MoveTime < CurTime() and SERVER then
84 self.MoveTime = nil
85 end
86end
87
88
89
90
91
92
93
94
95if ( CLIENT ) then
96SWEP.VElements = {
97 ["element_name"] = { type = "Model", model = "models/Halokiller38/fallout/weapons/Melee/supersledgeunique.mdl", bone = "Bip01 R Hand", rel = "", pos = Vector(3.536, -2.277, -11.804), angle = Angle(-7.768, -75.276, 0), size = Vector(1, 1, 1), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
98}
99SWEP.WElements = {
100 ["element_name"] = { type = "Model", model = "models/Halokiller38/fallout/weapons/Melee/supersledgeunique.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(2.798, 1.957, 13.668), angle = Angle(180, -109.561, 0), size = Vector(1, 1, 1), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
101}
102 SWEP.Slot = 0
103 SWEP.SlotPos = 1
104 SWEP.DrawAmmo = false
105 SWEP.IconLetter = "w"
106 killicon.AddFont( "weapon_crowbar", "HL2MPTypeDeath", "6", Color( 255, 80, 0, 255 ) )
107end
108
109SWEP.PrintName = "Oh, Baby!"
110SWEP.Author = "Moon"
111SWEP.Category = "Fallout Sweps - Blunt Weapons"
112
113SWEP.Base = "weapon_base"
114
115SWEP.Spawnable = true
116SWEP.AdminSpawnable = true
117SWEP.DrawCrosshair = true
118
119SWEP.HoldType = "melee2"
120SWEP.ViewModelFOV = 69.842519685039
121SWEP.ViewModelFlip = false
122SWEP.ViewModel = "models/weapons/v_stunbaton.mdl"
123SWEP.WorldModel = "models/Halokiller38/fallout/weapons/Melee/supersledgeunique.mdl"
124SWEP.ShowViewModel = true
125SWEP.ShowWorldModel = false
126SWEP.ViewModelBoneMods = {
127 ["Dummy15"] = { scale = Vector(0.009, 0.009, 0.009), pos = Vector(0, 0, 0), angle = Angle(0, 0, 0) },
128 ["Bip01"] = { scale = Vector(1, 1, 1), pos = Vector(7.649, 2.443, -1.45), angle = Angle(-18.705, 0, 0) },
129 ["Dummy14"] = { scale = Vector(0.009, 0.009, 0.009), pos = Vector(0, 0, 0), angle = Angle(0, 0, 0) }
130}
131
132SWEP.Weight = 1
133SWEP.AutoSwitchTo = true
134SWEP.AutoSwitchFrom = false
135SWEP.CSMuzzleFlashes = false
136
137SWEP.Primary.Damage = 90
138SWEP.Primary.ClipSize = -1
139SWEP.Primary.Delay = 0.5
140SWEP.Primary.DefaultClip = 1
141SWEP.Primary.Automatic = true
142SWEP.Primary.Ammo = "none"
143
144SWEP.Secondary.ClipSize = -1
145SWEP.Secondary.DefaultClip = -1
146SWEP.Secondary.Damage = 0
147SWEP.Secondary.Automatic = false
148SWEP.Secondary.Ammo = "none"
149
150function SWEP:Initialize()
151
152 self:SetHoldType( "melee" )
153
154end
155
156
157SWEP.MissSound = Sound("weapons/props_dane/rebarclub/swing0.wav")
158SWEP.WallSound = Sound("weapons/props_dane/rebarclub/impact0.wav")
159
160/*---------------------------------------------------------
161PrimaryAttack
162---------------------------------------------------------*/
163function SWEP:PrimaryAttack()
164
165 local tr = {}
166 tr.start = self.Owner:GetShootPos()
167 tr.endpos = self.Owner:GetShootPos() + ( self.Owner:GetAimVector() * 75 )
168 tr.filter = self.Owner
169 tr.mask = MASK_SHOT
170 local trace = util.TraceLine( tr )
171
172 self.Weapon:SetNextPrimaryFire(CurTime() + self.Primary.Delay)
173 self.Owner:SetAnimation( PLAYER_ATTACK1 )
174
175 if ( trace.Hit ) then
176
177 if trace.Entity:IsPlayer() or string.find(trace.Entity:GetClass(),"npc") or string.find(trace.Entity:GetClass(),"prop_ragdoll") then
178 self.Weapon:SendWeaponAnim(ACT_VM_HITCENTER)
179 bullet = {}
180 bullet.Num = 1
181 bullet.Src = self.Owner:GetShootPos()
182 bullet.Dir = self.Owner:GetAimVector()
183 bullet.Spread = Vector(0, 0, 0)
184 bullet.Tracer = 0
185 bullet.Force = 1
186 bullet.Damage = self.Primary.Damage
187 self.Owner:FireBullets(bullet)
188 else
189 self.Weapon:SendWeaponAnim(ACT_VM_HITCENTER)
190 bullet = {}
191 bullet.Num = 1
192 bullet.Src = self.Owner:GetShootPos()
193 bullet.Dir = self.Owner:GetAimVector()
194 bullet.Spread = Vector(0, 0, 0)
195 bullet.Tracer = 0
196 bullet.Force = 1
197 bullet.Damage = self.Primary.Damage
198 self.Owner:FireBullets(bullet)
199 self.Weapon:EmitSound( self.WallSound )
200 util.Decal("ManhackCut", trace.HitPos + trace.HitNormal, trace.HitPos - trace.HitNormal)
201 end
202 else
203 self.Weapon:EmitSound(self.MissSound,100,math.random(90,120))
204 self.Weapon:SendWeaponAnim(ACT_VM_MISSCENTER)
205 end
206
207 timer.Simple( 0.05, function()
208 self.Owner:ViewPunch( Angle( 0, 05, 0 ) )
209 end )
210
211 timer.Simple( 0.2, function()
212 self.Owner:ViewPunch( Angle( 4, -05, 0 ) )
213 end )
214end
215
216/*---------------------------------------------------------
217Reload
218---------------------------------------------------------*/
219function SWEP:Reload()
220
221 return false
222end
223
224/*---------------------------------------------------------
225OnRemove
226---------------------------------------------------------*/
227function SWEP:OnRemove()
228
229return true
230end
231
232/*---------------------------------------------------------
233Holster
234---------------------------------------------------------*/
235function SWEP:Holster()
236
237 return true
238end
239
240
241
242
243
244/*---------------------------------------------------------
245 Name: SWEP:TranslateActivity()
246 Desc: Translate a player's activity into a weapon's activity.
247 So for example, ACT_HL2MP_RUN becomes ACT_HL2MP_RUN_PISTOL
248 depending on how you want the player to be holding the weapon.
249---------------------------------------------------------*/
250function SWEP:TranslateActivity(act)
251
252 if (self.Owner:IsNPC()) then
253 if (self.ActivityTranslateAI[act]) then
254 return self.ActivityTranslateAI[act]
255 end
256
257 return -1
258 end
259
260 if (self.ActivityTranslate[act] != nil) then
261 return self.ActivityTranslate[act]
262 end
263
264 return -1
265end
266
267
268function SWEP:Initialize()
269
270 // other initialize code goes here
271
272 if CLIENT then
273
274 // Create a new table for every weapon instance
275 self.VElements = table.FullCopy( self.VElements )
276 self.WElements = table.FullCopy( self.WElements )
277 self.ViewModelBoneMods = table.FullCopy( self.ViewModelBoneMods )
278
279 self:CreateModels(self.VElements) // create viewmodels
280 self:CreateModels(self.WElements) // create worldmodels
281
282 // init view model bone build function
283 if IsValid(self.Owner) then
284 local vm = self.Owner:GetViewModel()
285 if IsValid(vm) then
286 self:ResetBonePositions(vm)
287
288 // Init viewmodel visibility
289 if (self.ShowViewModel == nil or self.ShowViewModel) then
290 vm:SetColor(Color(255,255,255,255))
291 else
292 // we set the alpha to 1 instead of 0 because else ViewModelDrawn stops being called
293 vm:SetColor(Color(255,255,255,1))
294 // ^ stopped working in GMod 13 because you have to do Entity:SetRenderMode(1) for translucency to kick in
295 // 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
296 vm:SetMaterial("Debug/hsv")
297 end
298 end
299 end
300
301 end
302
303end
304
305function SWEP:Holster()
306
307 if CLIENT and IsValid(self.Owner) then
308 local vm = self.Owner:GetViewModel()
309 if IsValid(vm) then
310 self:ResetBonePositions(vm)
311 end
312 end
313
314 return true
315end
316
317function SWEP:OnRemove()
318 self:Holster()
319end
320
321if CLIENT then
322
323 SWEP.vRenderOrder = nil
324 function SWEP:ViewModelDrawn()
325
326 local vm = self.Owner:GetViewModel()
327 if !IsValid(vm) then return end
328
329 if (!self.VElements) then return end
330
331 self:UpdateBonePositions(vm)
332
333 if (!self.vRenderOrder) then
334
335 // we build a render order because sprites need to be drawn after models
336 self.vRenderOrder = {}
337
338 for k, v in pairs( self.VElements ) do
339 if (v.type == "Model") then
340 table.insert(self.vRenderOrder, 1, k)
341 elseif (v.type == "Sprite" or v.type == "Quad") then
342 table.insert(self.vRenderOrder, k)
343 end
344 end
345
346 end
347
348 for k, name in ipairs( self.vRenderOrder ) do
349
350 local v = self.VElements[name]
351 if (!v) then self.vRenderOrder = nil break end
352 if (v.hide) then continue end
353
354 local model = v.modelEnt
355 local sprite = v.spriteMaterial
356
357 if (!v.bone) then continue end
358
359 local pos, ang = self:GetBoneOrientation( self.VElements, v, vm )
360
361 if (!pos) then continue end
362
363 if (v.type == "Model" and IsValid(model)) then
364
365 model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
366 ang:RotateAroundAxis(ang:Up(), v.angle.y)
367 ang:RotateAroundAxis(ang:Right(), v.angle.p)
368 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
369
370 model:SetAngles(ang)
371 //model:SetModelScale(v.size)
372 local matrix = Matrix()
373 matrix:Scale(v.size)
374 model:EnableMatrix( "RenderMultiply", matrix )
375
376 if (v.material == "") then
377 model:SetMaterial("")
378 elseif (model:GetMaterial() != v.material) then
379 model:SetMaterial( v.material )
380 end
381
382 if (v.skin and v.skin != model:GetSkin()) then
383 model:SetSkin(v.skin)
384 end
385
386 if (v.bodygroup) then
387 for k, v in pairs( v.bodygroup ) do
388 if (model:GetBodygroup(k) != v) then
389 model:SetBodygroup(k, v)
390 end
391 end
392 end
393
394 if (v.surpresslightning) then
395 render.SuppressEngineLighting(true)
396 end
397
398 render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
399 render.SetBlend(v.color.a/255)
400 model:DrawModel()
401 render.SetBlend(1)
402 render.SetColorModulation(1, 1, 1)
403
404 if (v.surpresslightning) then
405 render.SuppressEngineLighting(false)
406 end
407
408 elseif (v.type == "Sprite" and sprite) then
409
410 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
411 render.SetMaterial(sprite)
412 render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
413
414 elseif (v.type == "Quad" and v.draw_func) then
415
416 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
417 ang:RotateAroundAxis(ang:Up(), v.angle.y)
418 ang:RotateAroundAxis(ang:Right(), v.angle.p)
419 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
420
421 cam.Start3D2D(drawpos, ang, v.size)
422 v.draw_func( self )
423 cam.End3D2D()
424
425 end
426
427 end
428
429 end
430
431 SWEP.wRenderOrder = nil
432 function SWEP:DrawWorldModel()
433
434 if (self.ShowWorldModel == nil or self.ShowWorldModel) then
435 self:DrawModel()
436 end
437
438 if (!self.WElements) then return end
439
440 if (!self.wRenderOrder) then
441
442 self.wRenderOrder = {}
443
444 for k, v in pairs( self.WElements ) do
445 if (v.type == "Model") then
446 table.insert(self.wRenderOrder, 1, k)
447 elseif (v.type == "Sprite" or v.type == "Quad") then
448 table.insert(self.wRenderOrder, k)
449 end
450 end
451
452 end
453
454 if (IsValid(self.Owner)) then
455 bone_ent = self.Owner
456 else
457 // when the weapon is dropped
458 bone_ent = self
459 end
460
461 for k, name in pairs( self.wRenderOrder ) do
462
463 local v = self.WElements[name]
464 if (!v) then self.wRenderOrder = nil break end
465 if (v.hide) then continue end
466
467 local pos, ang
468
469 if (v.bone) then
470 pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent )
471 else
472 pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent, "ValveBiped.Bip01_R_Hand" )
473 end
474
475 if (!pos) then continue end
476
477 local model = v.modelEnt
478 local sprite = v.spriteMaterial
479
480 if (v.type == "Model" and IsValid(model)) then
481
482 model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
483 ang:RotateAroundAxis(ang:Up(), v.angle.y)
484 ang:RotateAroundAxis(ang:Right(), v.angle.p)
485 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
486
487 model:SetAngles(ang)
488 //model:SetModelScale(v.size)
489 local matrix = Matrix()
490 matrix:Scale(v.size)
491 model:EnableMatrix( "RenderMultiply", matrix )
492
493 if (v.material == "") then
494 model:SetMaterial("")
495 elseif (model:GetMaterial() != v.material) then
496 model:SetMaterial( v.material )
497 end
498
499 if (v.skin and v.skin != model:GetSkin()) then
500 model:SetSkin(v.skin)
501 end
502
503 if (v.bodygroup) then
504 for k, v in pairs( v.bodygroup ) do
505 if (model:GetBodygroup(k) != v) then
506 model:SetBodygroup(k, v)
507 end
508 end
509 end
510
511 if (v.surpresslightning) then
512 render.SuppressEngineLighting(true)
513 end
514
515 render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
516 render.SetBlend(v.color.a/255)
517 model:DrawModel()
518 render.SetBlend(1)
519 render.SetColorModulation(1, 1, 1)
520
521 if (v.surpresslightning) then
522 render.SuppressEngineLighting(false)
523 end
524
525 elseif (v.type == "Sprite" and sprite) then
526
527 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
528 render.SetMaterial(sprite)
529 render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
530
531 elseif (v.type == "Quad" and v.draw_func) then
532
533 local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
534 ang:RotateAroundAxis(ang:Up(), v.angle.y)
535 ang:RotateAroundAxis(ang:Right(), v.angle.p)
536 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
537
538 cam.Start3D2D(drawpos, ang, v.size)
539 v.draw_func( self )
540 cam.End3D2D()
541
542 end
543
544 end
545
546 end
547
548 function SWEP:GetBoneOrientation( basetab, tab, ent, bone_override )
549
550 local bone, pos, ang
551 if (tab.rel and tab.rel != "") then
552
553 local v = basetab[tab.rel]
554
555 if (!v) then return end
556
557 // Technically, if there exists an element with the same name as a bone
558 // you can get in an infinite loop. Let's just hope nobody's that stupid.
559 pos, ang = self:GetBoneOrientation( basetab, v, ent )
560
561 if (!pos) then return end
562
563 pos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
564 ang:RotateAroundAxis(ang:Up(), v.angle.y)
565 ang:RotateAroundAxis(ang:Right(), v.angle.p)
566 ang:RotateAroundAxis(ang:Forward(), v.angle.r)
567
568 else
569
570 bone = ent:LookupBone(bone_override or tab.bone)
571
572 if (!bone) then return end
573
574 pos, ang = Vector(0,0,0), Angle(0,0,0)
575 local m = ent:GetBoneMatrix(bone)
576 if (m) then
577 pos, ang = m:GetTranslation(), m:GetAngles()
578 end
579
580 if (IsValid(self.Owner) and self.Owner:IsPlayer() and
581 ent == self.Owner:GetViewModel() and self.ViewModelFlip) then
582 ang.r = -ang.r // Fixes mirrored models
583 end
584
585 end
586
587 return pos, ang
588 end
589
590 function SWEP:CreateModels( tab )
591
592 if (!tab) then return end
593
594 // Create the clientside models here because Garry says we can't do it in the render hook
595 for k, v in pairs( tab ) do
596 if (v.type == "Model" and v.model and v.model != "" and (!IsValid(v.modelEnt) or v.createdModel != v.model) and
597 string.find(v.model, ".mdl") and file.Exists (v.model, "GAME") ) then
598
599 v.modelEnt = ClientsideModel(v.model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
600 if (IsValid(v.modelEnt)) then
601 v.modelEnt:SetPos(self:GetPos())
602 v.modelEnt:SetAngles(self:GetAngles())
603 v.modelEnt:SetParent(self)
604 v.modelEnt:SetNoDraw(true)
605 v.createdModel = v.model
606 else
607 v.modelEnt = nil
608 end
609
610 elseif (v.type == "Sprite" and v.sprite and v.sprite != "" and (!v.spriteMaterial or v.createdSprite != v.sprite)
611 and file.Exists ("materials/"..v.sprite..".vmt", "GAME")) then
612
613 local name = v.sprite.."-"
614 local params = { ["$basetexture"] = v.sprite }
615 // make sure we create a unique name based on the selected options
616 local tocheck = { "nocull", "additive", "vertexalpha", "vertexcolor", "ignorez" }
617 for i, j in pairs( tocheck ) do
618 if (v[j]) then
619 params["$"..j] = 1
620 name = name.."1"
621 else
622 name = name.."0"
623 end
624 end
625
626 v.createdSprite = v.sprite
627 v.spriteMaterial = CreateMaterial(name,"UnlitGeneric",params)
628
629 end
630 end
631
632 end
633
634 local allbones
635 local hasGarryFixedBoneScalingYet = false
636
637 function SWEP:UpdateBonePositions(vm)
638
639 if self.ViewModelBoneMods then
640
641 if (!vm:GetBoneCount()) then return end
642
643 // !! WORKAROUND !! //
644 // We need to check all model names :/
645 local loopthrough = self.ViewModelBoneMods
646 if (!hasGarryFixedBoneScalingYet) then
647 allbones = {}
648 for i=0, vm:GetBoneCount() do
649 local bonename = vm:GetBoneName(i)
650 if (self.ViewModelBoneMods[bonename]) then
651 allbones[bonename] = self.ViewModelBoneMods[bonename]
652 else
653 allbones[bonename] = {
654 scale = Vector(1,1,1),
655 pos = Vector(0,0,0),
656 angle = Angle(0,0,0)
657 }
658 end
659 end
660
661 loopthrough = allbones
662 end
663 // !! ----------- !! //
664
665 for k, v in pairs( loopthrough ) do
666 local bone = vm:LookupBone(k)
667 if (!bone) then continue end
668
669 // !! WORKAROUND !! //
670 local s = Vector(v.scale.x,v.scale.y,v.scale.z)
671 local p = Vector(v.pos.x,v.pos.y,v.pos.z)
672 local ms = Vector(1,1,1)
673 if (!hasGarryFixedBoneScalingYet) then
674 local cur = vm:GetBoneParent(bone)
675 while(cur >= 0) do
676 local pscale = loopthrough[vm:GetBoneName(cur)].scale
677 ms = ms * pscale
678 cur = vm:GetBoneParent(cur)
679 end
680 end
681
682 s = s * ms
683 // !! ----------- !! //
684
685 if vm:GetManipulateBoneScale(bone) != s then
686 vm:ManipulateBoneScale( bone, s )
687 end
688 if vm:GetManipulateBoneAngles(bone) != v.angle then
689 vm:ManipulateBoneAngles( bone, v.angle )
690 end
691 if vm:GetManipulateBonePosition(bone) != p then
692 vm:ManipulateBonePosition( bone, p )
693 end
694 end
695 else
696 self:ResetBonePositions(vm)
697 end
698
699 end
700
701 function SWEP:ResetBonePositions(vm)
702
703 if (!vm:GetBoneCount()) then return end
704 for i=0, vm:GetBoneCount() do
705 vm:ManipulateBoneScale( i, Vector(1, 1, 1) )
706 vm:ManipulateBoneAngles( i, Angle(0, 0, 0) )
707 vm:ManipulateBonePosition( i, Vector(0, 0, 0) )
708 end
709
710 end
711
712 /**************************
713 Global utility code
714 **************************/
715
716 // Fully copies the table, meaning all tables inside this table are copied too and so on (normal table.Copy copies only their reference).
717 // Does not copy entities of course, only copies their reference.
718 // WARNING: do not use on tables that contain themselves somewhere down the line or you'll get an infinite loop
719 function table.FullCopy( tab )
720
721 if (!tab) then return nil end
722
723 local res = {}
724 for k, v in pairs( tab ) do
725 if (type(v) == "table") then
726 res[k] = table.FullCopy(v) // recursion ho!
727 elseif (type(v) == "Vector") then
728 res[k] = Vector(v.x, v.y, v.z)
729 elseif (type(v) == "Angle") then
730 res[k] = Angle(v.p, v.y, v.r)
731 else
732 res[k] = v
733 end
734 end
735
736 return res
737
738 end
739
740end