diff options
Diffstat (limited to 'gamemode/shared/itemsystem')
| -rw-r--r-- | gamemode/shared/itemsystem/weapons/rustyaxe.lua | 209 | ||||
| -rw-r--r-- | gamemode/shared/itemsystem/weapons/scraphammer.lua | 134 | ||||
| -rw-r--r-- | gamemode/shared/itemsystem/weapons/seratedknife.lua | 46 | ||||
| -rw-r--r-- | gamemode/shared/itemsystem/weapons_common.lua | 19 |
4 files changed, 259 insertions, 149 deletions
diff --git a/gamemode/shared/itemsystem/weapons/rustyaxe.lua b/gamemode/shared/itemsystem/weapons/rustyaxe.lua index 735c3da..b26597c 100644 --- a/gamemode/shared/itemsystem/weapons/rustyaxe.lua +++ b/gamemode/shared/itemsystem/weapons/rustyaxe.lua @@ -49,62 +49,54 @@ item.Shape = { --Optional, If this item can be equiped in any player slots, put them here. item.Equipable = "Right" ---[[ returns the direction the player swung]] -local function playermovedir(player) - local vel = player:GetVelocity():GetNormalized() - vel.z = 0 - local swings = { - {player:GetForward(),"forward"}, - {-player:GetForward(),"backward"}, - {player:GetRight(),"right"}, - {-player:GetRight(),"left"} - } - table.sort(swings,function(a,b) - return vel:Dot(a[1]) > vel:Dot(b[1]) - end) - return swings[1][2] -end - -local positionset = {} - ---[[ -local function swingarc(player,times,positions,onhit) - local positionpoints = {} - table.insert(positionset,positionpoints) - local hitents = {} - for k,v in ipairs(times) do - timer.Simple(v,function() - local weaponpos = positions[k] + player:GetPos() - table.insert(positionpoints,weaponpos) - if #positionpoints > 1 then - local tr = util.TraceLine({ - start = positionpoints[#positionpoints-1], - endpos = positionpoints[#positionpoints], - }) - if tr.Hit then - onhit(tr) - end - end - end) - end - timer.Simple(times[#times],function() - print("Inserted swing, drawn positions are now:") - PrintTable(positionset) - end) -end - -hook.Add( "HUDPaint", "weaponswings", function() - cam.Start3D() -- Start the 3D function so we can draw onto the screen. - for k,v in pairs(positionset) do - for i = 1,#v-1 do - render.DrawLine( v[i], v[i+1], Color(255,0,0,255), false ) - end - end - --render.SetMaterial( material ) -- Tell render what material we want, in this case the flash from the gravgun - --render.DrawSprite( pos, 16, 16, white ) -- Draw the sprite in the middle of the map, at 16x16 in it's original colour with full alpha. - cam.End3D() -end ) -]] +local swingdata = { + ["fwd"] = { + {0.011,Vector(-25,-3,-11)}, + {0.020,Vector(-25,-1,-3)}, + {0.031,Vector(-21,0,7)}, + {0.040,Vector(-13,-1,16)}, + {0.051,Vector(0,-5,22)}, + {0.060,Vector(17,-12,19)}, + {0.069,Vector(27,-18,11)}, + {0.077,Vector(31,-22,2)}, + {0.087,Vector(32,-26,-6)}, + {0.098,Vector(32,-28,-12)}, + {0.107,Vector(31,-29,-16)}, + {0.117,Vector(31,-29,-17)}, + {0.128,Vector(31,-29,-16)}, + {0.141,Vector(31,-29,-16)}, + }, + ["lft"] = { + {0.009,Vector(-34,-25,3)}, + {0.021,Vector(-29,-33,3)}, + {0.031,Vector(-21,-41,2)}, + {0.042,Vector(-9,-47,0)}, + {0.053,Vector(5,-48,-2)}, + {0.064,Vector(20,-44,-6)}, + {0.075,Vector(31,-34,-10)}, + {0.086,Vector(37,-24,-15)}, + {0.095,Vector(39,-16,-17)}, + {0.106,Vector(39,-10,-19)}, + {0.116,Vector(39,-8,-20)}, + {0.126,Vector(39,-8,-19)}, + {0.134,Vector(39,-9,-19)}, + {0.146,Vector(39,-10,-18)}, + }, + ["rig"] = { + {0.021,Vector(-2,9,11)}, + {0.031,Vector(5,10,10)}, + {0.042,Vector(12,8,9)}, + {0.053,Vector(19,4,6)}, + {0.062,Vector(26,-4,2)}, + {0.072,Vector(29,-12,-4)}, + {0.083,Vector(29,-21,-12)}, + {0.093,Vector(25,-27,-18)}, + {0.102,Vector(22,-30,-22)}, + {0.113,Vector(20,-31,-25)}, + {0.123,Vector(19,-32,-25)}, + {0.133,Vector(19,-32,-25)}, + }, +} --Optional, what to do when the player clicks, and this item is in the slot in inventory. only works for items equipable in left and right item.lastSwing = {} @@ -114,65 +106,98 @@ item.onClick = function(self,owner) print("returning because item.lastSwing is " .. item.lastSwing[owner], "but Curtime is",CurTime()) return end item.lastSwing[owner] = CurTime()+1.33 - local dir = playermovedir(owner) - local fow,rig,up = owner:GetForward(),owner:GetRight(),owner:GetUp() + local fwd,rig,up = owner:GetForward(),owner:GetRight(),owner:GetUp() local movementtbl = { ["forward"] = function() owner:SetLuaAnimation("axe_swing_up") - timer.Simple(2.33,function() owner:StopLuaAnimation("axe_swing_up") end) - local hits = ART.swingarc(owner,{ - 1,1.1,1.2,1.3 - },{ - fow*20 + up*26, - fow*45 + up*6, - fow*35 + up*-13, - fow*20 + up*-34, - },function(tr) - if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + timer.Simple(2.33,function() + owner:StopLuaAnimation("axe_swing_up") + end) + timer.Simple(1,function() + ART.TraceWeapon = true + end) + timer.Simple(1.33,function() + ART.TraceWeapon = false + end) + + local times,pos = {},{} + for k,v in ipairs(swingdata["fwd"]) do + times[k] = 1 + v[1] + pos[k] = Vector(v[2]) + pos[k]:Rotate(owner:GetAimVector():Angle()) + end + if pos[1] == nil then return end + local hits = ART.swingarc(owner,times,pos,function(tr) + if not tr.Hit then return end + if tr.Entity.Blocking ~= nil and tr.Entity.Blocking == "forward" then + ART.ApplyEffect(owner,"weapon_blocked") + elseif tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) end - print("Hit",tr.Entity) end) + end, ["backward"] = function() end, ["left"] = function() owner:SetLuaAnimation("axe_swing_left") - timer.Simple(2.33,function() owner:StopLuaAnimation("axe_swing_left") end) - local hits = ART.swingarc(owner,{ - 1,1.1,1.2,1.3 - },{ - rig*30 + up*-5, - rig*10 + fow*30 + up*-9, - rig*-10 + fow*30 + up*-10, - rig*-30 + up*-15, - },function(tr) - if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + timer.Simple(2.33,function() + owner:StopLuaAnimation("axe_swing_left") + end) + timer.Simple(1,function() + ART.TraceWeapon = true + end) + timer.Simple(1.33,function() + ART.TraceWeapon = false + end) + + local times,pos = {},{} + for k,v in ipairs(swingdata["lft"]) do + times[k] = 1 + v[1] + pos[k] = Vector(v[2]) + pos[k]:Rotate(owner:GetAimVector():Angle()) + end + if pos[1] == nil then return end + local hits = ART.swingarc(owner,times,pos,function(tr) + if not tr.Hit then return end + if tr.Entity.Blocking ~= nil and tr.Entity.Blocking == "left" then + ART.ApplyEffect(owner,"weapon_blocked") + elseif tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) end - print("Hit",tr.Entity) end) end, ["right"] = function() owner:SetLuaAnimation("axe_swing_right") - timer.Simple(2.33,function() owner:StopLuaAnimation("axe_swing_right") end) - local hits = ART.swingarc(owner,{ - 1,1.1,1.2,1.3 - },{ - rig*-30 + up*-5, - rig*-10 + fow*30 + up*-9, - rig*10 + fow*30 + up*-10, - rig*30 + up*-15, - },function(tr) - if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + timer.Simple(2.33,function() + owner:StopLuaAnimation("axe_swing_right") + end) + timer.Simple(1,function() + ART.TraceWeapon = true + end) + timer.Simple(1.33,function() + ART.TraceWeapon = false + end) + + local times,pos = {},{} + for k,v in ipairs(swingdata["rig"]) do + times[k] = 1 + v[1] + pos[k] = Vector(v[2]) + pos[k]:Rotate(owner:GetAimVector():Angle()) + end + if pos[1] == nil then return end + local hits = ART.swingarc(owner,times,pos,function(tr) + if not tr.Hit then return end + if tr.Entity.Blocking ~= nil and tr.Entity.Blocking == "right" then + ART.ApplyEffect(owner,"weapon_blocked") + elseif tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) end - print("Hit",tr.Entity) end) end, } - movementtbl[playermovedir(owner)]() + movementtbl[ART.playermovedir(owner)]() end --Optional, if we should do something special on equip(like draw the PAC for this weapon) diff --git a/gamemode/shared/itemsystem/weapons/scraphammer.lua b/gamemode/shared/itemsystem/weapons/scraphammer.lua index 9ec7ac9..299d4e2 100644 --- a/gamemode/shared/itemsystem/weapons/scraphammer.lua +++ b/gamemode/shared/itemsystem/weapons/scraphammer.lua @@ -26,6 +26,7 @@ function item.GetOptions(self) local options = {} options["test"] = function() print("You pressed test!") end options["toste"] = function() print("You pressed toste!") end + options["Drop"] = ART.DropItem(self) return options end @@ -60,7 +61,64 @@ item.Shape = { --Optional, If this item can be equiped in any player slots, put them here. item.Equipable = "Right" - +local swingdata = { + ["fwd"] = { + {0.007,Vector(-27,1,9)}, + {0.014,Vector(-20,3,16)}, + {0.020,Vector(-11,6,22)}, + {0.027,Vector(0,7,26)}, + {0.032,Vector(15,7,25)}, + {0.039,Vector(28,6,21)}, + {0.045,Vector(38,4,14)}, + {0.052,Vector(46,0,3)}, + {0.059,Vector(50,-3,-6)}, + {0.065,Vector(52,-6,-15)}, + {0.072,Vector(52,-8,-22)}, + {0.078,Vector(51,-10,-28)}, + {0.084,Vector(50,-11,-31)}, + {0.091,Vector(50,-11,-32)}, + {0.097,Vector(50,-11,-32)} + }, + ["lft"] = { + {0.007,Vector(-6,24,2)}, + {0.014,Vector(-1,26,2)}, + {0.020,Vector(5,28,1)}, + {0.027,Vector(12,28,-1)}, + {0.035,Vector(19,27,-4)}, + {0.042,Vector(27,24,-7)}, + {0.048,Vector(37,17,-13)}, + {0.055,Vector(42,12,-17)}, + {0.061,Vector(45,5,-20)}, + {0.068,Vector(48,-2,-23)}, + {0.075,Vector(49,-8,-25)}, + {0.084,Vector(49,-14,-26)}, + {0.091,Vector(49,-19,-27)}, + {0.097,Vector(48,-22,-27)}, + {0.104,Vector(48,-25,-27)}, + {0.110,Vector(48,-26,-27)}, + {0.117,Vector(48,-27,-27)}, + {0.123,Vector(48,-26,-27)}, + {0.131,Vector(48,-26,-27)} + }, + ["rig"] = { + {0.009,Vector(-3,25,2)}, + {0.017,Vector(3,27,1)}, + {0.025,Vector(11,28,-1)}, + {0.032,Vector(20,27,-4)}, + {0.040,Vector(28,24,-7)}, + {0.051,Vector(36,19,-12)}, + {0.059,Vector(42,11,-17)}, + {0.067,Vector(47,2,-22)}, + {0.075,Vector(49,-5,-25)}, + {0.083,Vector(49,-13,-27)}, + {0.090,Vector(49,-19,-28)}, + {0.098,Vector(48,-24,-28)}, + {0.106,Vector(48,-27,-28)}, + {0.114,Vector(48,-28,-28)}, + {0.121,Vector(48,-27,-28)}, + {0.129,Vector(48,-27,-27)} + }, +} --Optional, what to do when the player clicks, and this item is in the slot in inventory. only works for items equipable in left and right item.lastSwing = {} @@ -70,26 +128,30 @@ item.onClick = function(self,owner) print("returning because item.lastSwing is " .. item.lastSwing[owner], "but Curtime is",CurTime()) return end item.lastSwing[owner] = CurTime()+1.33 - local fow,rig,up = owner:GetForward(),owner:GetRight(),owner:GetUp() + local fwd,rig,up = owner:GetForward(),owner:GetRight(),owner:GetUp() local movementtbl = { ["forward"] = function() owner:SetLuaAnimation("hammer_swing_up") timer.Simple(2.33,function() owner:StopLuaAnimation("hammer_swing_up") end) - local hits = ART.swingarc(owner,{ - 1,1.1,1.2,1.3 - },{ - fow*40 + up*26, - fow*60 + up*6, - fow*55 + up*-13, - fow*40 + up*-34, - },function(tr) - if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + + local times,pos = {},{} + for k,v in ipairs(swingdata["fwd"]) do + times[k] = 1 + v[1] + pos[k] = Vector(v[2]) + pos[k]:Rotate(owner:GetAimVector():Angle()) + end + if pos[1] == nil then return end + local hits = ART.swingarc(owner,times,pos,function(tr) + if not tr.Hit then return end + if tr.Entity.Blocking ~= nil and tr.Entity.Blocking == "forward" then + ART.ApplyEffect(owner,"weapon_blocked") + elseif tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) end - print("Hit",tr.Entity) end) + end, ["backward"] = function() @@ -99,18 +161,21 @@ item.onClick = function(self,owner) timer.Simple(2.33,function() owner:StopLuaAnimation("hammer_swing_left") end) - local hits = ART.swingarc(owner,{ - 1,1.1,1.2,1.3 - },{ - rig*30 + up*-5, - rig*20 + fow*40 + up*-9, - rig*-20 + fow*40 + up*-10, - rig*-30 + up*-15, - },function(tr) - if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then - tr.Entity:TakeDamage(10, owner, owner:GetActiveWeapon()) + + local times,pos = {},{} + for k,v in ipairs(swingdata["lft"]) do + times[k] = 1 + v[1] + pos[k] = Vector(v[2]) + pos[k]:Rotate(owner:GetAimVector():Angle()) + end + if pos[1] == nil then return end + local hits = ART.swingarc(owner,times,pos,function(tr) + if not tr.Hit then return end + if tr.Entity.Blocking ~= nil and tr.Entity.Blocking == "left" then + ART.ApplyEffect(owner,"weapon_blocked") + elseif tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) end - print("Hit",tr.Entity) end) end, ["right"] = function() @@ -118,18 +183,21 @@ item.onClick = function(self,owner) timer.Simple(2.33,function() owner:StopLuaAnimation("hammer_swing_right") end) - local hits = ART.swingarc(owner,{ - 1,1.1,1.2,1.3 - },{ - rig*-30 + up*-5, - rig*-10 + fow*40 + up*-9, - rig*10 + fow*40 + up*-10, - rig*30 + up*-15, - },function(tr) - if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + + local times,pos = {},{} + for k,v in ipairs(swingdata["rig"]) do + times[k] = 1 + v[1] + pos[k] = Vector(v[2]) + pos[k]:Rotate(owner:GetAimVector():Angle()) + end + if pos[1] == nil then return end + local hits = ART.swingarc(owner,times,pos,function(tr) + if not tr.Hit then return end + if tr.Entity.Blocking ~= nil and tr.Entity.Blocking == "right" then + ART.ApplyEffect(owner,"weapon_blocked") + elseif tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) end - print("Hit",tr.Entity) end) end, } diff --git a/gamemode/shared/itemsystem/weapons/seratedknife.lua b/gamemode/shared/itemsystem/weapons/seratedknife.lua index e57351d..2daec36 100644 --- a/gamemode/shared/itemsystem/weapons/seratedknife.lua +++ b/gamemode/shared/itemsystem/weapons/seratedknife.lua @@ -26,6 +26,7 @@ function item.GetOptions(self) local options = {} options["test"] = function() print("You pressed test!") end options["toste"] = function() print("You pressed toste!") end + options["Drop"] = ART.DropItem(self) return options end @@ -58,6 +59,14 @@ item.Shape = { --Optional, If this item can be equiped in any player slots, put them here. item.Equipable = "Right" +local function attacktrace(tr,owner) + if not tr.Hit then return end + if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) + end +end + + --Optional, what to do when the player clicks, and this item is in the slot in inventory. only works for items equipable in left and right item.lastSwing = {} local animationtime = 1.833333 @@ -82,10 +91,14 @@ item.onClick = function(self,owner) fow*35 + up*45, fow*20 + up*30, },function(tr) - if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then - tr.Entity:TakeDamage(4, owner, owner:GetActiveWeapon()) + if not tr.Hit then return end + if tr.Entity.Blocking ~= nil and tr.Entity.Blocking == "forward" then + print("Entity blocked!") + ART.ApplyEffect(owner,"weapon_blocked") + elseif tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + print("Got past blocking, it was",tr.Entity.Blocking) + tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) end - print("Hit",tr.Entity) end) end, ["backward"] = function() @@ -101,10 +114,13 @@ item.onClick = function(self,owner) fow*25 + up*70, fow*15 + up*90, },function(tr) - if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then - tr.Entity:TakeDamage(4, owner, owner:GetActiveWeapon()) + if not tr.Hit then return end + if tr.Entity.Blocking ~= nil and tr.Entity.Blocking == "backward" then + print("Entity blocked!") + elseif tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + print("Got past blocking, it was",tr.Entity.Blocking) + tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) end - print("Hit",tr.Entity) end) end, ["left"] = function() @@ -120,10 +136,13 @@ item.onClick = function(self,owner) rig*-10 + fow*30 + up*54, rig*-30 + up*50, },function(tr) - if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then - tr.Entity:TakeDamage(4, owner, owner:GetActiveWeapon()) + if not tr.Hit then return end + if tr.Entity.Blocking ~= nil and tr.Entity.Blocking == "left" then + print("Entity blocked!") + elseif tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + print("Got past blocking, it was",tr.Entity.Blocking) + tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) end - print("Hit",tr.Entity) end) end, ["right"] = function() @@ -139,10 +158,13 @@ item.onClick = function(self,owner) rig*10 + fow*30 + up*54, rig*30 + up*50, },function(tr) - if tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then - tr.Entity:TakeDamage(4, owner, owner:GetActiveWeapon()) + if not tr.Hit then return end + if tr.Entity.Blocking ~= nil and tr.Entity.Blocking == "right" then + print("Entity blocked!") + elseif tr.Entity.TakeDamage ~= nil and tr.Entity ~= owner then + print("Got past blocking, it was",tr.Entity.Blocking) + tr.Entity:TakeDamage(5, owner, owner:GetActiveWeapon()) end - print("Hit",tr.Entity) end) end, } diff --git a/gamemode/shared/itemsystem/weapons_common.lua b/gamemode/shared/itemsystem/weapons_common.lua index a7679a9..6f553fa 100644 --- a/gamemode/shared/itemsystem/weapons_common.lua +++ b/gamemode/shared/itemsystem/weapons_common.lua @@ -29,34 +29,28 @@ local positionset = {} -- @param onhit A function to call on any entities that were hit in the swing of the weapon. function ART.swingarc(player,times,positions,onhit) local positionpoints = {} - --[[ - local ea = player:EyeAngles() - for k,v in pairs(positions) do - print("Position that was at ", positions[k]) - positions[k].z = positions[k].z * math.sin(ea.pitch+90) - print("Is now at",positions[k]) - end - ]] table.insert(positionset,positionpoints) - local hitents = {} for k,v in ipairs(times) do timer.Simple(v,function() + ART.TraceWeapon = true + ART.TraceStart = CurTime() + print("positions[k]",positions[k],"playerpos",player:GetPos(),"add",Vector(0,0,64)) local weaponpos = positions[k] + player:GetPos() + Vector(0,0,64) table.insert(positionpoints,weaponpos) if #positionpoints > 1 then + --print("Trace from ", positionpoints[#positionpoints-1], " to ", positionpoints[#positionpoints]) local tr = util.TraceLine({ start = positionpoints[#positionpoints-1], endpos = positionpoints[#positionpoints], }) - if tr.Hit then - onhit(tr) - end + onhit(tr) end end) end timer.Simple(times[#times],function() print("Inserted swing, drawn positions are now:") PrintTable(positionset) + ART.TraceWeapon = false end) end @@ -65,6 +59,7 @@ hook.Add( "HUDPaint", "weaponswings", function() for k,v in pairs(positionset) do for i = 1,#v-1 do render.DrawLine( v[i], v[i+1], Color(255,0,0,255), false ) + render.DrawLine( v[i], v[i]+Vector(0,0,20),Color(0,255,0,255),false) end end --render.SetMaterial( material ) -- Tell render what material we want, in this case the flash from the gravgun |
