Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.31 KB | None | 0 0
  1. SWEP.Spawnable = true
  2. SWEP.AdminSpawnable = true
  3. SWEP.UseHands = true
  4.  
  5.  
  6.  
  7. SWEP.Author = "Deika, Stephano, Druddigon, Frodo"
  8. SWEP.Contact = ""
  9. SWEP.Purpose = ""
  10. SWEP.Instructions = "Survive with this"
  11.  
  12. if CLIENT then
  13.  
  14. SWEP.HoldType = "physgun"
  15. SWEP.PrintName = "Lkr37"
  16. SWEP.Slot = 3
  17. SWEP.SlotPos = 1
  18. SWEP.ViewModelFlip = false
  19. SWEP.ViewModelFOV = 61
  20.  
  21.  
  22. SWEP.DrawAmmo = false
  23. SWEP.DrawCrosshair = true
  24. SWEP.CSMuzzleFlashes = false
  25.  
  26. SWEP.IconLetter = "."
  27.  
  28.  
  29. SWEP.VElements = {
  30. ["hands"] = { type = "Model", model = "", bone = "ValveBiped.Bip01_Spine4", rel = "", pos = Vector(0, 0, 0), angle = Angle(0, 0, 0), size = Vector(0.5, 0.5, 0.5), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  31. ["batteries++"] = { type = "Model", model = "models/items/combine_rifle_cartridge01.mdl", bone = "Base", rel = "", pos = Vector(6.817, 5.908, 38.636), angle = Angle(176.932, 150.341, 180), size = Vector(1.116, 1.116, 1.116), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  32. ["nrg cell"] = { type = "Model", model = "models/items/combine_rifle_ammo01.mdl", bone = "Base", rel = "", pos = Vector(-0.456, 3.181, 23.181), angle = Angle(1.023, -93.069, 1.023), size = Vector(1.51, 1.51, 1.51), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  33. ["element_name"] = { type = "Model", model = "models/Items/battery.mdl", bone = "Base", rel = "", pos = Vector(1.363, -1.093, 10.454), angle = Angle(180, -90.969, -1.328), size = Vector(1.009, 1.009, 1.009), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  34. ["batteries"] = { type = "Model", model = "models/items/combine_rifle_cartridge01.mdl", bone = "Base", rel = "", pos = Vector(-3.182, 5, 33.181), angle = Angle(-17.386, -127.842, 3.068), size = Vector(1.116, 1.116, 1.116), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  35. ["batteries+"] = { type = "Model", model = "models/items/combine_rifle_cartridge01.mdl", bone = "Base", rel = "", pos = Vector(-0.456, -3.182, 40.455), angle = Angle(13.295, 93.068, 7.158), size = Vector(1.116, 1.116, 1.116), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  36. ["element_name+"] = { type = "Model", model = "models/Items/battery.mdl", bone = "Base", rel = "", pos = Vector(4.091, 0.455, 10.454), angle = Angle(180, -131.933, -1.328), size = Vector(1.009, 1.009, 1.009), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  37. ["element_name++"] = { type = "Model", model = "models/Items/battery.mdl", bone = "Base", rel = "", pos = Vector(5, 3.181, 10.454), angle = Angle(180, -178.978, -1.328), size = Vector(1.009, 1.009, 1.009), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
  38. }
  39.  
  40. SWEP.WElements = {
  41. ["claw+"] = { type = "Model", model = "models/Items/combine_rifle_cartridge01.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(32.152, -2.267, -6.27), angle = Angle(11.116, -37.39, -113.472), size = Vector(0.688, 0.688, 0.688), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  42. ["ergcell++"] = { type = "Model", model = "models/Items/battery.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(14.22, -1.061, -8.096), angle = Angle(-87.996, 97.915, 90.912), size = Vector(0.685, 0.685, 0.685), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  43. ["ergcell"] = { type = "Model", model = "models/Items/battery.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(13.588, -3.562, -6.698), angle = Angle(-124.028, -71.3, -78.931), size = Vector(0.704, 0.704, 0.704), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  44. ["element_name"] = { type = "Model", model = "models/Items/combine_rifle_ammo01.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(21.075, -2.638, -4.709), angle = Angle(-98.711, 14.529, 0), size = Vector(1.001, 1.001, 1.001), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  45. ["claw++"] = { type = "Model", model = "models/Items/combine_rifle_cartridge01.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(32.458, -6.479, -3.988), angle = Angle(40.909, 29.221, 162.468), size = Vector(0.684, 0.684, 0.684), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  46. ["ergcell+++"] = { type = "Model", model = "models/Items/battery.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(12.675, -4.038, -3.767), angle = Angle(14.835, 97.915, 90.912), size = Vector(0.726, 0.726, 0.726), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  47. ["ergcell+"] = { type = "Model", model = "models/Items/battery.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(14.142, 1.281, -6.152), angle = Angle(-153.236, 97.013, 87.662), size = Vector(0.739, 0.739, 0.739), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
  48. ["claw"] = { type = "Model", model = "models/Items/combine_rifle_cartridge01.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(31.118, -6.196, -9.198), angle = Angle(-114.159, -106.54, -113.377), size = Vector(0.711, 0.711, 0.711), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
  49. }
  50.  
  51.  
  52. end
  53. game.AddAmmoType( {
  54. name = "Arc Fusion",
  55. dmgtype = DMG_BULLET,
  56. tracer = TRACER_LINE,
  57. plydmg = 0,
  58. npcdmg = 0,
  59. force = 2000,
  60. minsplash = 10,
  61. maxsplash = 5
  62. } )
  63. SWEP.ViewModel = "models/weapons/c_physcannon.mdl"
  64. SWEP.WorldModel = "models/weapons/w_physics.mdl"
  65. SWEP.ShowViewmodel = true
  66. SWEP.ShowWorldModel = true
  67.  
  68. SWEP.Category = "Half-Life Z"
  69.  
  70. SWEP.Primary.Sound = Sound("ambient/energy/zap7.wav")
  71. SWEP.Primary.Recoil = 0
  72. SWEP.Primary.Damage = 9000
  73. SWEP.Primary.NumShots = 1
  74. SWEP.Primary.Delay = 1
  75. SWEP.Primary.Ammo = "ArcFusion"
  76. SWEP.Primary.Force = 15
  77. SWEP.Primary.Ignite = false
  78.  
  79. SWEP.Primary.ClipSize = 100
  80. SWEP.Primary.DefaultClip = 100
  81. SWEP.Primary.NextGen = 3
  82.  
  83.  
  84. SWEP.Primary.Automatic = true
  85.  
  86. SWEP.Secondary.Sound = Sound("")
  87.  
  88. SWEP.IronSightsPos = Vector(0, 0, 0)
  89. SWEP.IronSightsAng = Vector(0, 0, 0)
  90.  
  91. if CLIENT then
  92. language.Add( "Arc_Fusion_ammo", "Arc Fusion" )
  93. local AmmoDisplay = {}
  94. function SWEP:CustomAmmoDisplay()
  95.  
  96.  
  97. AmmoDisplay.Draw = true
  98. AmmoDisplay.PrimaryClip = self.Weapon:Clip1()
  99. AmmoDisplay.PrimaryAmmo = -1
  100. AmmoDisplay.SecondaryClip = -1
  101. AmmoDisplay.SecondaryAmmo = -1
  102.  
  103. return AmmoDisplay
  104.  
  105. end
  106. end
  107.  
  108. game.AddParticles("particles/rail_particles.pcf")
  109. for _, particle in pairs({
  110. "Weapon_Gunship_Ultras_Rail"
  111. }) do
  112. PrecacheParticleSystem("")
  113. end
  114.  
  115.  
  116. function SWEP:DispatchEffect(EFFECTSTR)
  117. local pPlayer=self.Owner;
  118. //if !pPlayer then return end
  119. local view;
  120. if CLIENT then view=GetViewEntity() else view=pPlayer:GetViewEntity() end
  121. if ( !pPlayer:IsNPC() && view:IsPlayer() ) then
  122. ParticleEffectAttach( EFFECTSTR, PATTACH_POINT_FOLLOW, pPlayer:GetViewModel(), pPlayer:GetViewModel():LookupAttachment( "muzzle" ) );
  123. else
  124. ParticleEffectAttach( EFFECTSTR, PATTACH_POINT_FOLLOW, pPlayer, pPlayer:LookupAttachment( "anim_attachment_rh" ) );
  125. end
  126. end
  127.  
  128. function SWEP:ShootEffect(EFFECTSTR,startpos,endpos)
  129. local pPlayer=self.Owner;
  130. //if !pPlayer then return end
  131. local view;
  132. if CLIENT then view=GetViewEntity() else view=pPlayer:GetViewEntity() end
  133. if ( !pPlayer:IsNPC() && view:IsPlayer() ) then
  134. util.ParticleTracerEx( EFFECTSTR, self.Weapon:GetAttachment( self.Weapon:LookupAttachment( "muzzle" ) ).Pos,endpos, true, pPlayer:GetViewModel():EntIndex(), pPlayer:GetViewModel():LookupAttachment( "muzzle" ) );
  135. else
  136. util.ParticleTracerEx( EFFECTSTR, pPlayer:GetAttachment( pPlayer:LookupAttachment( "anim_attachment_rh" ) ).Pos,endpos, true,pPlayer:EntIndex(), pPlayer:LookupAttachment( "anim_attachment_rh" ) );
  137. end
  138. end
  139.  
  140.  
  141.  
  142.  
  143. function SWEP:PrimaryAttack()
  144. self.Weapon:SetNextPrimaryFire(CurTime() +self.Primary.Delay)
  145. self:TakePrimaryAmmo(1)
  146. self.Weapon:SetNextPrimaryFire( CurTime() + self.Primary.Delay )
  147. self.Weapon:SetNextSecondaryFire( CurTime() + self.Primary.Delay )
  148. self.Weapon:SendWeaponAnim(ACT_VM_PRIMARYATTACK)
  149. self.Owner:MuzzleFlash()
  150. self.Owner:SetAnimation(PLAYER_ATTACK1)
  151. self.Primary.NextGen = CurTime()+ 2
  152. self.Owner:SetVelocity(self.Owner:GetForward() * -1 )
  153.  
  154. self.Owner:ViewPunch(Angle( -2, -2, 0 ))
  155.  
  156.  
  157.  
  158. local trace = {}
  159. trace.start = self.Owner:GetShootPos()
  160. trace.endpos = self.Owner:GetShootPos() + self.Owner:GetAimVector() * 20^14
  161. trace.filter = self.Owner
  162. local tr = util.TraceLine(trace)
  163.  
  164. local vAng = (tr.HitPos-self.Owner:GetShootPos()):GetNormal():Angle()
  165.  
  166. local dmginfo = DamageInfo();
  167. dmginfo:SetDamage( self.Primary.Damage );
  168. dmginfo:SetAttacker( self:GetOwner() );
  169. dmginfo:SetInflictor( self );
  170.  
  171. if( dmginfo.SetDamageType ) then
  172. dmginfo:SetDamagePosition( tr.HitPos );
  173. dmginfo:SetDamageType( DMG_DISSOLVE,DMG_SHOCK );
  174. end
  175.  
  176. tr.Entity:DispatchTraceAttack( dmginfo, tr.HitPos, tr.HitPos - vAng:Forward() * 20 );
  177.  
  178. tr.Entity:SetKeyValue("targetname", "disTarg")
  179. local dis = ents.Create("env_entity_dissolver")
  180. dis:SetKeyValue("magnitude", "5")
  181. dis:SetKeyValue("dissolvetype", "")
  182. dis:SetKeyValue("target", "disTarg")
  183. dis:Spawn()
  184. self:ShootEffect(effect or "Weapon_Gunship_Ultras_Rail",self.Owner:EyeAngles(),tr.HitPos) //shoop da whoop
  185.  
  186. local bullet = {}
  187. bullet.Num = self.Primary.NumShots
  188. bullet.Src = self.Owner:GetShootPos()
  189. bullet.Dir = self.Owner:GetAimVector()
  190. bullet.Spread = Vector( self.Primary.Cone , self.Primary.Cone, 0)
  191. bullet.Tracer = 0
  192. bullet.TracerName = ""
  193. bullet.Force = self.Primary.Force
  194. bullet.Damage = 0
  195. bullet.AmmoType = (self.Primary.Ammo)
  196. util.BlastDamage(self.Weapon,self.Owner,tr.HitPos,85,70)
  197. local hit1, hit2 = tr.HitPos + tr.HitNormal, tr.HitPos - tr.HitNormal
  198. util.Decal("", hit1, hit2)
  199. util.Decal("", hit1, hit2)
  200.  
  201.  
  202. local effect = EffectData()
  203. effect:SetOrigin(tr.HitPos)
  204. util.Effect("TeslaZap", effect)
  205. self:ShootEffects()
  206. self.Owner:FireBullets( bullet )
  207. self.Owner:EmitSound("weapons/lkr_fire.wav")
  208.  
  209.  
  210. local effect = EffectData()
  211. effect:SetStart(self.Owner:GetShootPos()+self.Owner:EyeAngles():Forward()*22+self.Owner:EyeAngles():Up()*-6+self.Owner:EyeAngles():Right()*5)
  212. effect:SetOrigin(tr.HitPos)
  213. local effect2 = EffectData()
  214. effect2:SetStart(tr.HitPos)
  215. effect2:SetNormal(tr.HitNormal)
  216.  
  217. end
  218.  
  219.  
  220. function SWEP:Think()
  221. if self.Primary.NextGen <= CurTime() then
  222. if self.Weapon:Clip1() < self.Primary.ClipSize then
  223. self.Weapon:SetClip1( self.Weapon:Clip1() + 1 )
  224. self.Primary.NextGen = CurTime() + 1
  225. end
  226. end
  227. end
  228.  
  229. function SWEP:SecondaryAttack()
  230. return true
  231. end
  232.  
  233.  
  234. function SWEP:Initialize()
  235.  
  236. // other initialize code goes here
  237.  
  238. if CLIENT then
  239.  
  240. // Create a new table for every weapon instance
  241. self.VElements = table.FullCopy( self.VElements )
  242. self.WElements = table.FullCopy( self.WElements )
  243. self.ViewModelBoneMods = table.FullCopy( self.ViewModelBoneMods )
  244.  
  245. self:CreateModels(self.VElements) // create viewmodels
  246. self:CreateModels(self.WElements) // create worldmodels
  247. self:SetWeaponHoldType( self.HoldType )
  248.  
  249. // init view model bone build function
  250. if IsValid(self.Owner) then
  251. local vm = self.Owner:GetViewModel()
  252. if IsValid(vm) then
  253. self:ResetBonePositions(vm)
  254.  
  255. // Init viewmodel visibility
  256. if (self.ShowViewModel == nil or self.ShowViewModel) then
  257. vm:SetColor(Color(255,255,255,255))
  258. else
  259. // we set the alpha to 1 instead of 0 because else ViewModelDrawn stops being called
  260. vm:SetColor(Color(255,255,255,1))
  261. // ^ stopped working in GMod 13 because you have to do Entity:SetRenderMode(1) for translucency to kick in
  262. // 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
  263. vm:SetMaterial("Debug/hsv")
  264. end
  265. end
  266. end
  267.  
  268. end
  269.  
  270. end
  271.  
  272. function SWEP:Holster()
  273.  
  274. if CLIENT and IsValid(self.Owner) then
  275. local vm = self.Owner:GetViewModel()
  276. if IsValid(vm) then
  277. self:ResetBonePositions(vm)
  278. end
  279. end
  280.  
  281. return true
  282. end
  283.  
  284. function SWEP:OnRemove()
  285. self:Holster()
  286. end
  287.  
  288. if CLIENT then
  289.  
  290. SWEP.vRenderOrder = nil
  291. function SWEP:ViewModelDrawn()
  292.  
  293. local vm = self.Owner:GetViewModel()
  294. if !IsValid(vm) then return end
  295.  
  296. if (!self.VElements) then return end
  297.  
  298. self:UpdateBonePositions(vm)
  299.  
  300. if (!self.vRenderOrder) then
  301.  
  302. // we build a render order because sprites need to be drawn after models
  303. self.vRenderOrder = {}
  304.  
  305. for k, v in pairs( self.VElements ) do
  306. if (v.type == "Model") then
  307. table.insert(self.vRenderOrder, 1, k)
  308. elseif (v.type == "Sprite" or v.type == "Quad") then
  309. table.insert(self.vRenderOrder, k)
  310. end
  311. end
  312.  
  313. end
  314.  
  315. for k, name in ipairs( self.vRenderOrder ) do
  316.  
  317. local v = self.VElements[name]
  318. if (!v) then self.vRenderOrder = nil break end
  319. if (v.hide) then continue end
  320.  
  321. local model = v.modelEnt
  322. local sprite = v.spriteMaterial
  323.  
  324. if (!v.bone) then continue end
  325.  
  326. local pos, ang = self:GetBoneOrientation( self.VElements, v, vm )
  327.  
  328. if (!pos) then continue end
  329.  
  330. if (v.type == "Model" and IsValid(model)) then
  331.  
  332. model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
  333. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  334. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  335. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  336.  
  337. model:SetAngles(ang)
  338. //model:SetModelScale(v.size)
  339. local matrix = Matrix()
  340. matrix:Scale(v.size)
  341. model:EnableMatrix( "RenderMultiply", matrix )
  342.  
  343. if (v.material == "") then
  344. model:SetMaterial("")
  345. elseif (model:GetMaterial() != v.material) then
  346. model:SetMaterial( v.material )
  347. end
  348.  
  349. if (v.skin and v.skin != model:GetSkin()) then
  350. model:SetSkin(v.skin)
  351. end
  352.  
  353. if (v.bodygroup) then
  354. for k, v in pairs( v.bodygroup ) do
  355. if (model:GetBodygroup(k) != v) then
  356. model:SetBodygroup(k, v)
  357. end
  358. end
  359. end
  360.  
  361. if (v.surpresslightning) then
  362. render.SuppressEngineLighting(true)
  363. end
  364.  
  365. render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
  366. render.SetBlend(v.color.a/255)
  367. model:DrawModel()
  368. render.SetBlend(1)
  369. render.SetColorModulation(1, 1, 1)
  370.  
  371. if (v.surpresslightning) then
  372. render.SuppressEngineLighting(false)
  373. end
  374.  
  375. elseif (v.type == "Sprite" and sprite) then
  376.  
  377. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  378. render.SetMaterial(sprite)
  379. render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
  380.  
  381. elseif (v.type == "Quad" and v.draw_func) then
  382.  
  383. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  384. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  385. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  386. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  387.  
  388. cam.Start3D2D(drawpos, ang, v.size)
  389. v.draw_func( self )
  390. cam.End3D2D()
  391.  
  392. end
  393.  
  394. end
  395.  
  396. end
  397.  
  398. SWEP.wRenderOrder = nil
  399. function SWEP:DrawWorldModel()
  400.  
  401. if (self.ShowWorldModel == nil or self.ShowWorldModel) then
  402. self:DrawModel()
  403. end
  404.  
  405. if (!self.WElements) then return end
  406.  
  407. if (!self.wRenderOrder) then
  408.  
  409. self.wRenderOrder = {}
  410.  
  411. for k, v in pairs( self.WElements ) do
  412. if (v.type == "Model") then
  413. table.insert(self.wRenderOrder, 1, k)
  414. elseif (v.type == "Sprite" or v.type == "Quad") then
  415. table.insert(self.wRenderOrder, k)
  416. end
  417. end
  418.  
  419. end
  420.  
  421. if (IsValid(self.Owner)) then
  422. bone_ent = self.Owner
  423. else
  424. // when the weapon is dropped
  425. bone_ent = self
  426. end
  427.  
  428. for k, name in pairs( self.wRenderOrder ) do
  429.  
  430. local v = self.WElements[name]
  431. if (!v) then self.wRenderOrder = nil break end
  432. if (v.hide) then continue end
  433.  
  434. local pos, ang
  435.  
  436. if (v.bone) then
  437. pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent )
  438. else
  439. pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent, "ValveBiped.Bip01_R_Hand" )
  440. end
  441.  
  442. if (!pos) then continue end
  443.  
  444. local model = v.modelEnt
  445. local sprite = v.spriteMaterial
  446.  
  447. if (v.type == "Model" and IsValid(model)) then
  448.  
  449. model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
  450. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  451. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  452. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  453.  
  454. model:SetAngles(ang)
  455. //model:SetModelScale(v.size)
  456. local matrix = Matrix()
  457. matrix:Scale(v.size)
  458. model:EnableMatrix( "RenderMultiply", matrix )
  459.  
  460. if (v.material == "") then
  461. model:SetMaterial("")
  462. elseif (model:GetMaterial() != v.material) then
  463. model:SetMaterial( v.material )
  464. end
  465.  
  466. if (v.skin and v.skin != model:GetSkin()) then
  467. model:SetSkin(v.skin)
  468. end
  469.  
  470. if (v.bodygroup) then
  471. for k, v in pairs( v.bodygroup ) do
  472. if (model:GetBodygroup(k) != v) then
  473. model:SetBodygroup(k, v)
  474. end
  475. end
  476. end
  477.  
  478. if (v.surpresslightning) then
  479. render.SuppressEngineLighting(true)
  480. end
  481.  
  482. render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
  483. render.SetBlend(v.color.a/255)
  484. model:DrawModel()
  485. render.SetBlend(1)
  486. render.SetColorModulation(1, 1, 1)
  487.  
  488. if (v.surpresslightning) then
  489. render.SuppressEngineLighting(false)
  490. end
  491.  
  492. elseif (v.type == "Sprite" and sprite) then
  493.  
  494. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  495. render.SetMaterial(sprite)
  496. render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
  497.  
  498. elseif (v.type == "Quad" and v.draw_func) then
  499.  
  500. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  501. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  502. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  503. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  504.  
  505. cam.Start3D2D(drawpos, ang, v.size)
  506. v.draw_func( self )
  507. cam.End3D2D()
  508.  
  509. end
  510.  
  511. end
  512.  
  513. end
  514.  
  515. function SWEP:GetBoneOrientation( basetab, tab, ent, bone_override )
  516.  
  517. local bone, pos, ang
  518. if (tab.rel and tab.rel != "") then
  519.  
  520. local v = basetab[tab.rel]
  521.  
  522. if (!v) then return end
  523.  
  524. // Technically, if there exists an element with the same name as a bone
  525. // you can get in an infinite loop. Let's just hope nobody's that stupid.
  526. pos, ang = self:GetBoneOrientation( basetab, v, ent )
  527.  
  528. if (!pos) then return end
  529.  
  530. pos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  531. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  532. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  533. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  534.  
  535. else
  536.  
  537. bone = ent:LookupBone(bone_override or tab.bone)
  538.  
  539. if (!bone) then return end
  540.  
  541. pos, ang = Vector(0,0,0), Angle(0,0,0)
  542. local m = ent:GetBoneMatrix(bone)
  543. if (m) then
  544. pos, ang = m:GetTranslation(), m:GetAngles()
  545. end
  546.  
  547. if (IsValid(self.Owner) and self.Owner:IsPlayer() and
  548. ent == self.Owner:GetViewModel() and self.ViewModelFlip) then
  549. ang.r = -ang.r // Fixes mirrored models
  550. end
  551.  
  552. end
  553.  
  554. return pos, ang
  555. end
  556.  
  557. function SWEP:CreateModels( tab )
  558.  
  559. if (!tab) then return end
  560.  
  561. // Create the clientside models here because Garry says we can't do it in the render hook
  562. for k, v in pairs( tab ) do
  563. if (v.type == "Model" and v.model and v.model != "" and (!IsValid(v.modelEnt) or v.createdModel != v.model) and
  564. string.find(v.model, ".mdl") and file.Exists (v.model, "GAME") ) then
  565.  
  566. v.modelEnt = ClientsideModel(v.model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
  567. if (IsValid(v.modelEnt)) then
  568. v.modelEnt:SetPos(self:GetPos())
  569. v.modelEnt:SetAngles(self:GetAngles())
  570. v.modelEnt:SetParent(self)
  571. v.modelEnt:SetNoDraw(true)
  572. v.createdModel = v.model
  573. else
  574. v.modelEnt = nil
  575. end
  576.  
  577. elseif (v.type == "Sprite" and v.sprite and v.sprite != "" and (!v.spriteMaterial or v.createdSprite != v.sprite)
  578. and file.Exists ("materials/"..v.sprite..".vmt", "GAME")) then
  579.  
  580. local name = v.sprite.."-"
  581. local params = { ["$basetexture"] = v.sprite }
  582. // make sure we create a unique name based on the selected options
  583. local tocheck = { "nocull", "additive", "vertexalpha", "vertexcolor", "ignorez" }
  584. for i, j in pairs( tocheck ) do
  585. if (v[j]) then
  586. params["$"..j] = 1
  587. name = name.."1"
  588. else
  589. name = name.."0"
  590. end
  591. end
  592.  
  593. v.createdSprite = v.sprite
  594. v.spriteMaterial = CreateMaterial(name,"UnlitGeneric",params)
  595.  
  596. end
  597. end
  598.  
  599. end
  600.  
  601. local allbones
  602. local hasGarryFixedBoneScalingYet = false
  603.  
  604. function SWEP:UpdateBonePositions(vm)
  605.  
  606. if self.ViewModelBoneMods then
  607.  
  608. if (!vm:GetBoneCount()) then return end
  609.  
  610. // !! WORKAROUND !! //
  611. // We need to check all model names :/
  612. local loopthrough = self.ViewModelBoneMods
  613. if (!hasGarryFixedBoneScalingYet) then
  614. allbones = {}
  615. for i=0, vm:GetBoneCount() do
  616. local bonename = vm:GetBoneName(i)
  617. if (self.ViewModelBoneMods[bonename]) then
  618. allbones[bonename] = self.ViewModelBoneMods[bonename]
  619. else
  620. allbones[bonename] = {
  621. scale = Vector(1,1,1),
  622. pos = Vector(0,0,0),
  623. angle = Angle(0,0,0)
  624. }
  625. end
  626. end
  627.  
  628. loopthrough = allbones
  629. end
  630. // !! ----------- !! //
  631.  
  632. for k, v in pairs( loopthrough ) do
  633. local bone = vm:LookupBone(k)
  634. if (!bone) then continue end
  635.  
  636. // !! WORKAROUND !! //
  637. local s = Vector(v.scale.x,v.scale.y,v.scale.z)
  638. local p = Vector(v.pos.x,v.pos.y,v.pos.z)
  639. local ms = Vector(1,1,1)
  640. if (!hasGarryFixedBoneScalingYet) then
  641. local cur = vm:GetBoneParent(bone)
  642. while(cur >= 0) do
  643. local pscale = loopthrough[vm:GetBoneName(cur)].scale
  644. ms = ms * pscale
  645. cur = vm:GetBoneParent(cur)
  646. end
  647. end
  648.  
  649. s = s * ms
  650. // !! ----------- !! //
  651.  
  652. if vm:GetManipulateBoneScale(bone) != s then
  653. vm:ManipulateBoneScale( bone, s )
  654. end
  655. if vm:GetManipulateBoneAngles(bone) != v.angle then
  656. vm:ManipulateBoneAngles( bone, v.angle )
  657. end
  658. if vm:GetManipulateBonePosition(bone) != p then
  659. vm:ManipulateBonePosition( bone, p )
  660. end
  661. end
  662. else
  663. self:ResetBonePositions(vm)
  664. end
  665.  
  666. end
  667.  
  668. function SWEP:ResetBonePositions(vm)
  669.  
  670. if (!vm:GetBoneCount()) then return end
  671. for i=0, vm:GetBoneCount() do
  672. vm:ManipulateBoneScale( i, Vector(1, 1, 1) )
  673. vm:ManipulateBoneAngles( i, Angle(0, 0, 0) )
  674. vm:ManipulateBonePosition( i, Vector(0, 0, 0) )
  675. end
  676.  
  677. end
  678.  
  679. /**************************
  680. Global utility code
  681. **************************/
  682.  
  683. // Fully copies the table, meaning all tables inside this table are copied too and so on (normal table.Copy copies only their reference).
  684. // Does not copy entities of course, only copies their reference.
  685. // WARNING: do not use on tables that contain themselves somewhere down the line or you'll get an infinite loop
  686. function table.FullCopy( tab )
  687.  
  688. if (!tab) then return nil end
  689.  
  690. local res = {}
  691. for k, v in pairs( tab ) do
  692. if (type(v) == "table") then
  693. res[k] = table.FullCopy(v) // recursion ho!
  694. elseif (type(v) == "Vector") then
  695. res[k] = Vector(v.x, v.y, v.z)
  696. elseif (type(v) == "Angle") then
  697. res[k] = Angle(v.p, v.y, v.r)
  698. else
  699. res[k] = v
  700. end
  701. end
  702.  
  703. return res
  704.  
  705. end
  706.  
  707. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement