Advertisement
Guest User

aeiou

a guest
Jun 19th, 2012
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.21 KB | None | 0 0
  1. --[[
  2. koyper
  3. --]]
  4.  
  5. if (CLIENT) then
  6. SWEP.Slot = 0;
  7. SWEP.SlotPos = 5;
  8. SWEP.DrawAmmo = false;
  9. SWEP.PrintName = "Battery Charger";
  10. SWEP.DrawCrosshair = true;
  11. end
  12.  
  13. SWEP.Instructions = "Primary Fire: Charge";
  14. SWEP.Purpose = "Charging batteries manually.";
  15. SWEP.Contact = "";
  16. SWEP.Author = "kipder";
  17.  
  18. SWEP.HoldType = "fist"
  19. SWEP.ViewModelFOV = 70
  20. SWEP.ViewModelFlip = true
  21. SWEP.ViewModel = "models/weapons/v_pist_glock18.mdl"
  22. SWEP.WorldModel = "models/weapons/w_pistol.mdl"
  23. SWEP.ShowViewModel = true
  24. SWEP.ShowWorldModel = false
  25. SWEP.ViewModelBoneMods = {
  26. ["v_weapon.Glock_Parent"] = { scale = Vector(0.009, 0.009, 0.009), pos = Vector(0, 0, 0), angle = Angle(0, 0, 0) },
  27. ["v_weapon.Right_Pinky01"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(0, -35.264, 0) },
  28. ["v_weapon.Right_Index01"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(-4.757, -79.5, 0) },
  29. ["v_weapon.Right_Ring02"] = { scale = Vector(1, 1, 1), pos = Vector(-0.494, 0, 0), angle = Angle(-7.369, -18.987, 0) },
  30. ["v_weapon.Left_Hand"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 1.85), angle = Angle(0, 0, 15.911) },
  31. ["v_weapon.Right_Pinky02"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(-6.35, -15.146, 0) },
  32. ["v_weapon.Right_Ring01"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(-6.094, -55.3, 1.531) },
  33. ["v_weapon.Right_Thumb02"] = { scale = Vector(1, 1, 1), pos = Vector(0.079, 0, -0.201), angle = Angle(4.33, 2.151, -48.145) },
  34. ["v_weapon.Right_Middle01"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(3.404, -67.04, -9.65) },
  35. ["v_weapon.Glock_Clip"] = { scale = Vector(0.009, 0.009, 0.009), pos = Vector(0, 0, 0), angle = Angle(0, 0, 0) },
  36. ["v_weapon.Right_Index02"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(-9.577, -34.646, 0) },
  37. ["v_weapon.Right_Arm"] = { scale = Vector(1, 1, 1), pos = Vector(-3.656, 12.932, -0.552), angle = Angle(0, 9, -110) },
  38. ["v_weapon.Right_Pinky03"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(3.085, -31.75, 0) },
  39. ["v_weapon.Right_Thumb03"] = { scale = Vector(1, 1, 1), pos = Vector(0, -0.269, 0), angle = Angle(4.931, 9.793, 20.325) },
  40. ["v_weapon.Right_Thumb01"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(22.731, -6.481, 15.105) },
  41. ["v_weapon.Left_Thumb01"] = { scale = Vector(1, 1, 1), pos = Vector(-0.065, 0.368, 0), angle = Angle(-30.889, 9.63, 19.75) },
  42. ["v_weapon.Left_Middle03"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, -0.26), angle = Angle(0, 0, 0) }
  43. }
  44.  
  45. SWEP.VElements = {
  46. ["some_unique_name"] = { type = "Model", model = "models/avoxgaming/mrp/jake/props/universal_charger.mdl", bone = "v_weapon.Glock_Parent", rel = "", pos = Vector(-0.9, 3.555, -4.206), angle = Angle(195, 90, 93), size = Vector(1, 1, 1), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
  47. }
  48.  
  49. SWEP.WElements = {
  50. ["some_unique_name1"] = { type = "Model", model = "models/avoxgaming/mrp/jake/props/universal_charger.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(6.124, 1.973, -1.183), angle = Angle(-11.125, 20.381, 208), size = Vector(0.699, 0.699, 0.699), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} }
  51. }
  52.  
  53. SWEP.AdminSpawnable = true;
  54. SWEP.Spawnable = true;
  55.  
  56. SWEP.Primary.DefaultClip = 0;
  57. SWEP.Primary.Automatic = false;
  58. SWEP.Primary.ClipSize = -1;
  59. SWEP.Primary.Damage = 8;
  60. SWEP.Primary.Delay = 2;
  61. SWEP.Primary.Ammo = "";
  62.  
  63. SWEP.Secondary.NeverRaised = true;
  64. SWEP.Secondary.DefaultClip = 0;
  65. SWEP.Secondary.Automatic = false;
  66. SWEP.Secondary.ClipSize = -1;
  67. SWEP.Secondary.Delay = 1;
  68. SWEP.Secondary.Ammo = "";
  69.  
  70. SWEP.NoIronSightFovChange = true;
  71. SWEP.NoIronSightAttack = true;
  72. SWEP.IronSightPos = Vector(0, 0, 0);
  73. SWEP.IronSightAng = Vector(0, 0, 0);
  74.  
  75. SWEP.chargeSounds = {
  76. "avoxgaming/charger/charger_pump_1.wav",
  77. "avoxgaming/charger/charger_pump_2.wav",
  78. "avoxgaming/charger/charger_pump_3.wav"
  79. };
  80.  
  81. -- Called when the SWEP is deployed.
  82. function SWEP:Deploy()
  83. self:SendWeaponAnim(ACT_VM_DRAW);
  84. end;
  85.  
  86. -- Called when the SWEP is holstered.
  87. function SWEP:Holster(switchingTo)
  88. self:SendWeaponAnim(ACT_VM_HOLSTER);
  89.  
  90. return true;
  91. end;
  92.  
  93. -- Called when the SWEP is initialized.
  94. function SWEP:Initialize()
  95.  
  96. self:SetWeaponHoldType(self.HoldType);
  97.  
  98.  
  99. if CLIENT then
  100.  
  101. // Create a new table for every weapon instance
  102. self.VElements = table.FullCopy( self.VElements )
  103. self.WElements = table.FullCopy( self.WElements )
  104. self.ViewModelBoneMods = table.FullCopy( self.ViewModelBoneMods )
  105.  
  106. self:CreateModels(self.VElements) // create viewmodels
  107. self:CreateModels(self.WElements) // create worldmodels
  108.  
  109. // init view model bone build function
  110. self.BuildViewModelBones = function( s )
  111. if LocalPlayer():GetActiveWeapon() == self and self.ViewModelBoneMods then
  112. for k, v in pairs( self.ViewModelBoneMods ) do
  113. local bone = s:LookupBone(k)
  114. if (!bone) then continue end
  115. local m = s:GetBoneMatrix(bone)
  116. if (!m) then continue end
  117. m:Scale(v.scale)
  118. m:Rotate(v.angle)
  119. m:Translate(v.pos)
  120. s:SetBoneMatrix(bone, m)
  121. end
  122. end
  123. end
  124.  
  125. end
  126.  
  127. end
  128.  
  129. if CLIENT then
  130.  
  131. SWEP.vRenderOrder = nil
  132. function SWEP:ViewModelDrawn()
  133.  
  134. local vm = self.Owner:GetViewModel()
  135. if !ValidEntity(vm) then return end
  136.  
  137. if (!self.VElements) then return end
  138.  
  139. if vm.BuildBonePositions != self.BuildViewModelBones then
  140. vm.BuildBonePositions = self.BuildViewModelBones
  141. end
  142.  
  143. if (self.ShowViewModel == nil or self.ShowViewModel) then
  144. vm:SetColor(255,255,255,255)
  145. else
  146. // we set the alpha to 1 instead of 0 because else ViewModelDrawn stops being called
  147. vm:SetColor(255,255,255,1)
  148. end
  149.  
  150. if (!self.vRenderOrder) then
  151.  
  152. // we build a render order because sprites need to be drawn after models
  153. self.vRenderOrder = {}
  154.  
  155. for k, v in pairs( self.VElements ) do
  156. if (v.type == "Model") then
  157. table.insert(self.vRenderOrder, 1, k)
  158. elseif (v.type == "Sprite" or v.type == "Quad") then
  159. table.insert(self.vRenderOrder, k)
  160. end
  161. end
  162.  
  163. end
  164.  
  165. for k, name in ipairs( self.vRenderOrder ) do
  166.  
  167. local v = self.VElements[name]
  168. if (!v) then self.vRenderOrder = nil break end
  169.  
  170. local model = v.modelEnt
  171. local sprite = v.spriteMaterial
  172.  
  173. if (!v.bone) then continue end
  174.  
  175. local pos, ang = self:GetBoneOrientation( self.VElements, v, vm )
  176.  
  177. if (!pos) then continue end
  178.  
  179. if (v.type == "Model" and ValidEntity(model)) then
  180.  
  181. model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
  182. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  183. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  184. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  185.  
  186. model:SetAngles(ang)
  187. model:SetModelScale(v.size)
  188.  
  189. if (v.material == "") then
  190. model:SetMaterial("")
  191. elseif (model:GetMaterial() != v.material) then
  192. model:SetMaterial( v.material )
  193. end
  194.  
  195. if (v.skin and v.skin != model:GetSkin()) then
  196. model:SetSkin(v.skin)
  197. end
  198.  
  199. if (v.bodygroup) then
  200. for k, v in pairs( v.bodygroup ) do
  201. if (model:GetBodygroup(k) != v) then
  202. model:SetBodygroup(k, v)
  203. end
  204. end
  205. end
  206.  
  207. if (v.surpresslightning) then
  208. render.SuppressEngineLighting(true)
  209. end
  210.  
  211. render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
  212. render.SetBlend(v.color.a/255)
  213. model:DrawModel()
  214. render.SetBlend(1)
  215. render.SetColorModulation(1, 1, 1)
  216.  
  217. if (v.surpresslightning) then
  218. render.SuppressEngineLighting(false)
  219. end
  220.  
  221. elseif (v.type == "Sprite" and sprite) then
  222.  
  223. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  224. render.SetMaterial(sprite)
  225. render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
  226.  
  227. elseif (v.type == "Quad" and v.draw_func) then
  228.  
  229. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  230. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  231. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  232. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  233.  
  234. cam.Start3D2D(drawpos, ang, v.size)
  235. v.draw_func( self )
  236. cam.End3D2D()
  237.  
  238. end
  239.  
  240. end
  241.  
  242. end
  243.  
  244. SWEP.wRenderOrder = nil
  245. function SWEP:DrawWorldModel()
  246.  
  247. if (self.ShowWorldModel == nil or self.ShowWorldModel) then
  248. self:DrawModel()
  249. end
  250.  
  251. if (!self.WElements) then return end
  252.  
  253. if (!self.wRenderOrder) then
  254.  
  255. self.wRenderOrder = {}
  256.  
  257. for k, v in pairs( self.WElements ) do
  258. if (v.type == "Model") then
  259. table.insert(self.wRenderOrder, 1, k)
  260. elseif (v.type == "Sprite" or v.type == "Quad") then
  261. table.insert(self.wRenderOrder, k)
  262. end
  263. end
  264.  
  265. end
  266.  
  267. if (ValidEntity(self.Owner)) then
  268. bone_ent = self.Owner
  269. else
  270. // when the weapon is dropped
  271. bone_ent = self
  272. end
  273.  
  274. for k, name in pairs( self.wRenderOrder ) do
  275.  
  276. local v = self.WElements[name]
  277. if (!v) then self.wRenderOrder = nil break end
  278.  
  279. local pos, ang
  280.  
  281. if (v.bone) then
  282. pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent )
  283. else
  284. pos, ang = self:GetBoneOrientation( self.WElements, v, bone_ent, "ValveBiped.Bip01_R_Hand" )
  285. end
  286.  
  287. if (!pos) then continue end
  288.  
  289. local model = v.modelEnt
  290. local sprite = v.spriteMaterial
  291.  
  292. if (v.type == "Model" and ValidEntity(model)) then
  293.  
  294. model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
  295. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  296. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  297. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  298.  
  299. model:SetAngles(ang)
  300. model:SetModelScale(v.size)
  301.  
  302. if (v.material == "") then
  303. model:SetMaterial("")
  304. elseif (model:GetMaterial() != v.material) then
  305. model:SetMaterial( v.material )
  306. end
  307.  
  308. if (v.skin and v.skin != model:GetSkin()) then
  309. model:SetSkin(v.skin)
  310. end
  311.  
  312. if (v.bodygroup) then
  313. for k, v in pairs( v.bodygroup ) do
  314. if (model:GetBodygroup(k) != v) then
  315. model:SetBodygroup(k, v)
  316. end
  317. end
  318. end
  319.  
  320. if (v.surpresslightning) then
  321. render.SuppressEngineLighting(true)
  322. end
  323.  
  324. render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
  325. render.SetBlend(v.color.a/255)
  326. model:DrawModel()
  327. render.SetBlend(1)
  328. render.SetColorModulation(1, 1, 1)
  329.  
  330. if (v.surpresslightning) then
  331. render.SuppressEngineLighting(false)
  332. end
  333.  
  334. elseif (v.type == "Sprite" and sprite) then
  335.  
  336. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  337. render.SetMaterial(sprite)
  338. render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
  339.  
  340. elseif (v.type == "Quad" and v.draw_func) then
  341.  
  342. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  343. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  344. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  345. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  346.  
  347. cam.Start3D2D(drawpos, ang, v.size)
  348. v.draw_func( self )
  349. cam.End3D2D()
  350.  
  351. end
  352.  
  353. end
  354.  
  355. end
  356.  
  357. function SWEP:GetBoneOrientation( basetab, tab, ent, bone_override )
  358.  
  359. local bone, pos, ang
  360. if (tab.rel and tab.rel != "") then
  361.  
  362. local v = basetab[tab.rel]
  363.  
  364. if (!v) then return end
  365.  
  366. // Technically, if there exists an element with the same name as a bone
  367. // you can get in an infinite loop. Let's just hope nobody's that stupid.
  368. pos, ang = self:GetBoneOrientation( basetab, v, ent )
  369.  
  370. if (!pos) then return end
  371.  
  372. pos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  373. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  374. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  375. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  376.  
  377. else
  378.  
  379. bone = ent:LookupBone(bone_override or tab.bone)
  380.  
  381. if (!bone) then return end
  382.  
  383. pos, ang = Vector(0,0,0), Angle(0,0,0)
  384. local m = ent:GetBoneMatrix(bone)
  385. if (m) then
  386. pos, ang = m:GetTranslation(), m:GetAngle()
  387. end
  388.  
  389. if (ValidEntity(self.Owner) and self.Owner:IsPlayer() and
  390. ent == self.Owner:GetViewModel() and self.ViewModelFlip) then
  391. ang.r = -ang.r // Fixes mirrored models
  392. end
  393.  
  394. end
  395.  
  396. return pos, ang
  397. end
  398.  
  399. function SWEP:CreateModels( tab )
  400.  
  401. if (!tab) then return end
  402.  
  403. // Create the clientside models here because Garry says we can't do it in the render hook
  404. for k, v in pairs( tab ) do
  405. if (v.type == "Model" and v.model and v.model != "" and (!ValidEntity(v.modelEnt) or v.createdModel != v.model) and
  406. string.find(v.model, ".mdl") and file.Exists ("../"..v.model) ) then
  407.  
  408. v.modelEnt = ClientsideModel(v.model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
  409. if (ValidEntity(v.modelEnt)) then
  410. v.modelEnt:SetPos(self:GetPos())
  411. v.modelEnt:SetAngles(self:GetAngles())
  412. v.modelEnt:SetParent(self)
  413. v.modelEnt:SetNoDraw(true)
  414. v.createdModel = v.model
  415. else
  416. v.modelEnt = nil
  417. end
  418.  
  419. elseif (v.type == "Sprite" and v.sprite and v.sprite != "" and (!v.spriteMaterial or v.createdSprite != v.sprite)
  420. and file.Exists ("../materials/"..v.sprite..".vmt")) then
  421.  
  422. local name = v.sprite.."-"
  423. local params = { ["$basetexture"] = v.sprite }
  424. // make sure we create a unique name based on the selected options
  425. local tocheck = { "nocull", "additive", "vertexalpha", "vertexcolor", "ignorez" }
  426. for i, j in pairs( tocheck ) do
  427. if (v[j]) then
  428. params["$"..j] = 1
  429. name = name.."1"
  430. else
  431. name = name.."0"
  432. end
  433. end
  434.  
  435. v.createdSprite = v.sprite
  436. v.spriteMaterial = CreateMaterial(name,"UnlitGeneric",params)
  437.  
  438. end
  439. end
  440.  
  441. end
  442.  
  443. /**************************
  444. Global utility code
  445. **************************/
  446.  
  447. // Fully copies the table, meaning all tables inside this table are copied too and so on (normal table.Copy copies only their reference).
  448. // Does not copy entities of course, only copies their reference.
  449. // WARNING: do not use on tables that contain themselves somewhere down the line or you'll get an infinite loop
  450. function table.FullCopy( tab )
  451.  
  452. if (!tab) then return nil end
  453.  
  454. local res = {}
  455. for k, v in pairs( tab ) do
  456. if (type(v) == "table") then
  457. res[k] = table.FullCopy(v) // recursion ho!
  458. elseif (type(v) == "Vector") then
  459. res[k] = Vector(v.x, v.y, v.z)
  460. elseif (type(v) == "Angle") then
  461. res[k] = Angle(v.p, v.y, v.r)
  462. else
  463. res[k] = v
  464. end
  465. end
  466.  
  467. return res
  468.  
  469. end
  470.  
  471. end-- A function to do the SWEP's hit effects.
  472.  
  473. function SWEP:DoHitEffects()
  474. end;
  475.  
  476. -- A function to do the SWEP's animations.
  477. function SWEP:DoAnimations(idle)
  478. if (!idle) then
  479. self.Owner:SetAnimation(PLAYER_ATTACK1);
  480. end;
  481. end;
  482.  
  483. function SWEP:PrimaryAttack()
  484. if ( not self.Owner.lastCharge or self.Owner.lastCharge < CurTime() ) then
  485. self.Owner.lastCharge = CurTime() + 1;
  486.  
  487. local battery = self.Owner:GetCharacterData("battery");
  488.  
  489. if ( battery <= 80 ) then
  490. self.Owner:SetCharacterData("battery", battery + 20 );
  491. self.Owner:EmitSound( table.Random( self.chargeSounds), 50, 100 );
  492. end;
  493. end;
  494. end;
  495.  
  496. -- Called when the player attempts to secondary fire.
  497. function SWEP:SecondaryAttack() end;
  498.  
  499. function SWEP:OnRemove()
  500.  
  501. // other onremove code goes here
  502.  
  503. if CLIENT then
  504. self:RemoveModels()
  505. end
  506.  
  507. end
  508.  
  509.  
  510. if CLIENT then
  511.  
  512. SWEP.vRenderOrder = nil
  513. function SWEP:ViewModelDrawn()
  514.  
  515. local vm = self.Owner:GetViewModel()
  516. if !ValidEntity(vm) then return end
  517.  
  518. if (!self.VElements) then return end
  519.  
  520. if vm.BuildBonePositions ~= self.BuildViewModelBones then
  521. vm.BuildBonePositions = self.BuildViewModelBones
  522. end
  523.  
  524. if (self.ShowViewModel == nil or self.ShowViewModel) then
  525. vm:SetColor(255,255,255,255)
  526. else
  527. // we set the alpha to 1 instead of 0 because else ViewModelDrawn stops being called
  528. vm:SetColor(255,255,255,1)
  529. end
  530.  
  531. if (!self.vRenderOrder) then
  532.  
  533. // we build a render order because sprites need to be drawn after models
  534. self.vRenderOrder = {}
  535.  
  536. for k, v in pairs( self.VElements ) do
  537. if (v.type == "Model") then
  538. table.insert(self.vRenderOrder, 1, k)
  539. elseif (v.type == "Sprite" or v.type == "Quad") then
  540. table.insert(self.vRenderOrder, k)
  541. end
  542. end
  543.  
  544. end
  545.  
  546. for k, name in ipairs( self.vRenderOrder ) do
  547.  
  548. local v = self.VElements[name]
  549. if (!v) then self.vRenderOrder = nil break end
  550.  
  551. local model = v.modelEnt
  552. local sprite = v.spriteMaterial
  553.  
  554. if (!v.bone) then continue end
  555. local bone = vm:LookupBone(v.bone)
  556. if (!bone) then continue end
  557.  
  558. local pos, ang = Vector(0,0,0), Angle(0,0,0)
  559. local m = vm:GetBoneMatrix(bone)
  560. if (m) then
  561. pos, ang = m:GetTranslation(), m:GetAngle()
  562. end
  563.  
  564. if (self.ViewModelFlip) then
  565. ang.r = -ang.r // Fixes mirrored models
  566. end
  567.  
  568. if (v.type == "Model" and ValidEntity(model)) then
  569.  
  570. model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
  571. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  572. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  573. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  574.  
  575. model:SetAngles(ang)
  576. model:SetModelScale(v.size)
  577.  
  578. if (v.material == "") then
  579. model:SetMaterial("")
  580. elseif (model:GetMaterial() != v.material) then
  581. model:SetMaterial( v.material )
  582. end
  583.  
  584. if (v.skin and v.skin != model:GetSkin()) then
  585. model:SetSkin(v.skin)
  586. end
  587.  
  588. if (v.bodygroup) then
  589. for k, v in pairs( v.bodygroup ) do
  590. if (model:GetBodygroup(k) != v) then
  591. model:SetBodygroup(k, v)
  592. end
  593. end
  594. end
  595.  
  596. if (v.surpresslightning) then
  597. render.SuppressEngineLighting(true)
  598. end
  599.  
  600. render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
  601. render.SetBlend(v.color.a/255)
  602. model:DrawModel()
  603. render.SetBlend(1)
  604. render.SetColorModulation(1, 1, 1)
  605.  
  606. if (v.surpresslightning) then
  607. render.SuppressEngineLighting(false)
  608. end
  609.  
  610. elseif (v.type == "Sprite" and sprite) then
  611.  
  612. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  613. render.SetMaterial(sprite)
  614. render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
  615.  
  616. elseif (v.type == "Quad" and v.draw_func) then
  617.  
  618. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  619. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  620. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  621. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  622.  
  623. cam.Start3D2D(drawpos, ang, v.size)
  624. v.draw_func( self )
  625. cam.End3D2D()
  626.  
  627. end
  628.  
  629. end
  630.  
  631. end
  632.  
  633. SWEP.wRenderOrder = nil
  634. function SWEP:DrawWorldModel()
  635.  
  636. if (self.ShowWorldModel == nil or self.ShowWorldModel) then
  637. self:DrawModel()
  638. end
  639.  
  640. if (!self.WElements) then return end
  641.  
  642. if (!self.wRenderOrder) then
  643.  
  644. self.wRenderOrder = {}
  645.  
  646. for k, v in pairs( self.WElements ) do
  647. if (v.type == "Model") then
  648. table.insert(self.wRenderOrder, 1, k)
  649. elseif (v.type == "Sprite" or v.type == "Quad") then
  650. table.insert(self.wRenderOrder, k)
  651. end
  652. end
  653.  
  654. end
  655.  
  656. local opos, oang = self:GetPos(), self:GetAngles()
  657. local bone_ent
  658.  
  659. if (ValidEntity(self.Owner)) then
  660. bone_ent = self.Owner
  661. else
  662. // when the weapon is dropped
  663. bone_ent = self
  664. end
  665.  
  666. for k, name in pairs( self.wRenderOrder ) do
  667.  
  668. local v = self.WElements[name]
  669. if (!v) then self.wRenderOrder = nil break end
  670.  
  671. if (v.bone) then
  672. bone = bone_ent:LookupBone(v.bone)
  673. else
  674. bone = bone_ent:LookupBone("ValveBiped.Bip01_R_Hand")
  675. end
  676.  
  677. if (bone) then
  678. local m = bone_ent:GetBoneMatrix(bone)
  679. if (m) then
  680. opos, oang = m:GetTranslation(), m:GetAngle()
  681. end
  682. else
  683. continue
  684. end
  685.  
  686. local model = v.modelEnt
  687. local sprite = v.spriteMaterial
  688.  
  689. local pos, ang = Vector(opos.x, opos.y, opos.z), Angle(oang.p, oang.y, oang.r)
  690.  
  691. if (v.type == "Model" and ValidEntity(model)) then
  692.  
  693. model:SetPos(pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z )
  694. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  695. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  696. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  697.  
  698. model:SetAngles(ang)
  699. model:SetModelScale(v.size)
  700.  
  701. if (v.material == "") then
  702. model:SetMaterial("")
  703. elseif (model:GetMaterial() != v.material) then
  704. model:SetMaterial( v.material )
  705. end
  706.  
  707. if (v.skin and v.skin != model:GetSkin()) then
  708. model:SetSkin(v.skin)
  709. end
  710.  
  711. if (v.bodygroup) then
  712. for k, v in pairs( v.bodygroup ) do
  713. if (model:GetBodygroup(k) != v) then
  714. model:SetBodygroup(k, v)
  715. end
  716. end
  717. end
  718.  
  719. if (v.surpresslightning) then
  720. render.SuppressEngineLighting(true)
  721. end
  722.  
  723. render.SetColorModulation(v.color.r/255, v.color.g/255, v.color.b/255)
  724. render.SetBlend(v.color.a/255)
  725. model:DrawModel()
  726. render.SetBlend(1)
  727. render.SetColorModulation(1, 1, 1)
  728.  
  729. if (v.surpresslightning) then
  730. render.SuppressEngineLighting(false)
  731. end
  732.  
  733. elseif (v.type == "Sprite" and sprite) then
  734.  
  735. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  736. render.SetMaterial(sprite)
  737. render.DrawSprite(drawpos, v.size.x, v.size.y, v.color)
  738.  
  739. elseif (v.type == "Quad" and v.draw_func) then
  740.  
  741. local drawpos = pos + ang:Forward() * v.pos.x + ang:Right() * v.pos.y + ang:Up() * v.pos.z
  742. ang:RotateAroundAxis(ang:Up(), v.angle.y)
  743. ang:RotateAroundAxis(ang:Right(), v.angle.p)
  744. ang:RotateAroundAxis(ang:Forward(), v.angle.r)
  745.  
  746. cam.Start3D2D(drawpos, ang, v.size)
  747. v.draw_func( self )
  748. cam.End3D2D()
  749.  
  750. end
  751.  
  752. end
  753.  
  754. end
  755.  
  756. function SWEP:CreateModels( tab )
  757.  
  758. if (!tab) then return end
  759.  
  760. // Create the clientside models here because Garry says we can't do it in the render hook
  761. for k, v in pairs( tab ) do
  762. if (v.type == "Model" and v.model and v.model != "" and (!ValidEntity(v.modelEnt) or v.createdModel != v.model) and
  763. string.find(v.model, ".mdl") and file.Exists ("../"..v.model) ) then
  764.  
  765. v.modelEnt = ClientsideModel(v.model, RENDER_GROUP_VIEW_MODEL_OPAQUE)
  766. if (ValidEntity(v.modelEnt)) then
  767. v.modelEnt:SetPos(self:GetPos())
  768. v.modelEnt:SetAngles(self:GetAngles())
  769. v.modelEnt:SetParent(self)
  770. v.modelEnt:SetNoDraw(true)
  771. v.createdModel = v.model
  772. else
  773. v.modelEnt = nil
  774. end
  775.  
  776. elseif (v.type == "Sprite" and v.sprite and v.sprite != "" and (!v.spriteMaterial or v.createdSprite != v.sprite)
  777. and file.Exists ("../materials/"..v.sprite..".vmt")) then
  778.  
  779. local name = v.sprite.."-"
  780. local params = { ["$basetexture"] = v.sprite }
  781. // make sure we create a unique name based on the selected options
  782. local tocheck = { "nocull", "additive", "vertexalpha", "vertexcolor", "ignorez" }
  783. for i, j in pairs( tocheck ) do
  784. if (v[j]) then
  785. params["$"..j] = 1
  786. name = name.."1"
  787. else
  788. name = name.."0"
  789. end
  790. end
  791.  
  792. v.createdSprite = v.sprite
  793. v.spriteMaterial = CreateMaterial(name,"UnlitGeneric",params)
  794.  
  795. end
  796. end
  797.  
  798. end
  799.  
  800. function SWEP:RemoveModels()
  801. if (self.VElements) then
  802. for k, v in pairs( self.VElements ) do
  803. if (ValidEntity( v.modelEnt )) then v.modelEnt:Remove() end
  804. end
  805. end
  806. if (self.WElements) then
  807. for k, v in pairs( self.WElements ) do
  808. if (ValidEntity( v.modelEnt )) then v.modelEnt:Remove() end
  809. end
  810. end
  811. self.VElements = nil
  812. self.WElements = nil
  813. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement