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