From 95792dbc1332fc523058b3dea05d7d47d69273cd Mon Sep 17 00:00:00 2001 From: "Jonny_Bro (Nikita)" Date: Sun, 21 May 2023 01:52:22 +0500 Subject: [PATCH] Cleanup and fixes --- FIXES.md | 24 +- .../entities/entities/br_datacube/shared.lua | 59 +-- .../entities/entities/br_hookpoint/shared.lua | 47 +- .../entities/br_intelmarker/shared.lua | 65 +-- .../entities/entities/br_ladder/shared.lua | 200 +++++---- .../entities/entities/br_laser/shared.lua | 93 ++-- .../entities/entities/br_mat/shared.lua | 21 +- .../entities/br_rabbitfrog/shared.lua | 204 +++++---- .../entities/entities/br_swingbar/shared.lua | 68 +-- .../entities/entities/br_swingpipe/shared.lua | 72 +-- .../entities/entities/br_swingrope/shared.lua | 82 ++-- .../entities/entities/br_zipline/shared.lua | 78 ++-- .../entities/entities/tt_block/shared.lua | 53 ++- .../entities/entities/tt_cp/shared.lua | 94 ++-- .../beatrun/entities/weapons/aewep_357.lua | 415 +++++++++--------- .../beatrun/entities/weapons/aewep_base.lua | 368 ++++++++-------- .../beatrun/entities/weapons/aewep_nt.lua | 371 ++++++++-------- .../entities/weapons/shapedrawer/shared.lua | 16 +- .../entities/weapons/ziplinegun/shared.lua | 67 ++- .../beatrun/gamemode/sh/Checkpoints.lua | 6 +- .../gamemodes/beatrun/gamemode/sh/Sliding.lua | 1 + .../beatrun/gamemode/sh/sh_buildmode.lua | 3 +- .../beatrun/gamemode/sh/sh_freerunsysall.lua | 10 +- lua/bin/gmcl_gdiscord_win64.dll | Bin 0 -> 52224 bytes 24 files changed, 1273 insertions(+), 1144 deletions(-) create mode 100644 lua/bin/gmcl_gdiscord_win64.dll diff --git a/FIXES.md b/FIXES.md index 8b73369..eb39117 100644 --- a/FIXES.md +++ b/FIXES.md @@ -1,13 +1,13 @@ -# Сделанные мной фиксы и добавления +# Добавлено мной * Разрешение Overdrive на сервере - *Beatrun_AllowOvedriveInMultiplayer*. -* Небольшой толчёк камеры при нырянии. -* Discord Rich Presence -* Измение цвета худа - *Beatrun_HUDTextColor*, *Beatrun_HUDCornerColor*, *Beatrun_HUDFloatingXPColor* -
-* Фикс трёх букв из-за которых нихуя не работало. -* Быстрый поворот на земле (ПКМ пока бежишь/стоишь) включён по умолчанию (Beatrun_QuickturnGround). -* Быстрый поворот только с руками бегуна (Фикс поворотов при прицеливании и т.п.). -* Фикс ошибки запуска курса. -* Фикс использования хука (пробел по стене когда вы в воздухе). -* Фикс сортировки таблицы лидеров. -* Убрал ваш SteamID в углу потому что могу. \ No newline at end of file +* Измение цвета худа - *Beatrun_HUDTextColor*, *Beatrun_HUDCornerColor*, *Beatrun_HUDFloatingXPColor*. +* Discord Rich Presence (Нужен модуль из lua/bin) +* Небольшой толчок камеры при нырянии. +* Изменение максимальной скорости - *Beatrun_MaxSpeed* (Спасибо c4nk, я слепой). +* Возможность удалять зиплайны от Zipline Gun на ПКМ. (Завтра доделаю) + +# Фиксы с предыдущей версии +* Выключил обратно быстрый разворот, хуйня (Чтобы откатить напишите **Beatrun_QuickturnGround 0** в консоль). +* Фикс незакрытия меню постройки. +* Фикс сохранения курсов. +* Отключены реплеи до фикса. \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_datacube/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_datacube/shared.lua index d2e1962..b6b8c90 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_datacube/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_datacube/shared.lua @@ -1,56 +1,58 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Data Cube" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Data Cube" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_TRANSLUCENT -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/hunter/blocks/cube05x05x05.mdl" ENT.DataCube = true -local color_green = Color(0,255,0) +local color_green = Color(0, 255, 0) + function ENT:Initialize() - self:SetModel(self.Model) - self:SetSolid(SOLID_VPHYSICS) - self:SetCollisionGroup(COLLISION_GROUP_WEAPON) - self:SetCollisionBounds(Vector(-20,-20,-15), Vector(20,20,30)) + self:SetModel(self.Model) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(COLLISION_GROUP_WEAPON) + self:SetCollisionBounds(Vector(-20, -20, -15), Vector(20, 20, 30)) + if SERVER then self:PhysicsInit(SOLID_VPHYSICS) - local randvec = VectorRand()*200 + + local randvec = VectorRand() * 200 randvec.z = math.abs(randvec.z) + self:SetTrigger(true) self:GetPhysicsObject():SetVelocity(randvec) end + self:SetColor(color_green) self:SetCustomCollisionCheck(true) end -hook.Add( "ShouldCollide", "DataCubeCollisions", function( ent1, ent2 ) - -- If players are about to collide with each other, then they won't collide. - if ( ent1.DataCube and ent2.DataCube ) then return false end +hook.Add("ShouldCollide", "DataCubeCollisions", function(ent1, ent2) + -- If players are about to collide with each other, then they won't collide. + if ent1.DataCube and ent2.DataCube then return false end +end) -end ) +-- local screencolor = Color(64, 0, 0, 64) -local screencolor = Color(64, 0, 0, 64) function ENT:StartTouch(ent) if ent:IsPlayer() then - ent:SetNW2Int("DataCubes", ent:GetNW2Int("DataCubes", 0)+1) - self:EmitSound("A_TT_Stars.wav", 75, 100+math.random(-10,5)) + ent:SetNW2Int("DataCubes", ent:GetNW2Int("DataCubes", 0) + 1) + + self:EmitSound("A_TT_Stars.wav", 75, 100 + math.random(-10, 5)) self:Remove() end end function ENT:Touch(ent) - if ent:IsPlayer() then - - end + if ent:IsPlayer() then return end end function ENT:Think() @@ -58,21 +60,20 @@ function ENT:Think() end function ENT:Use(activator, caller, usetype) - end function ENT:OnRemove() - end -local spinang = Angle(0,1,0) +local spinang = Angle(0, 1, 0) + function ENT:DrawTranslucent() local curang = self:GetRenderAngles() or Angle() curang:Add(spinang) + self:SetRenderAngles(curang) self:DrawModel() end - function ENT:Draw() end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_hookpoint/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_hookpoint/shared.lua index 0994435..2862b1c 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_hookpoint/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_hookpoint/shared.lua @@ -1,63 +1,58 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Hook Point" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Hook Point" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_TRANSLUCENT -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/Roller.mdl" ENT.HookPoint = true -local color_green = Color(0,255,0) +-- local color_green = Color(0, 255, 0) + function ENT:Initialize() - self:SetModel(self.Model) - self:SetSolid(SOLID_VPHYSICS) - self:SetCollisionGroup(COLLISION_GROUP_WEAPON) + self:SetModel(self.Model) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(COLLISION_GROUP_WEAPON) + local mins, maxs = self:GetCollisionBounds() self:PhysicsInitBox(mins, maxs) - - -- Set up solidity and movetype - self:SetMoveType( MOVETYPE_NONE ) + self:SetMoveType(MOVETYPE_NONE) self:GetPhysicsObject():EnableMotion(false) end - function ENT:Think() if SERVER then - self:NextThink(CurTime()+1) + self:NextThink(CurTime() + 1) + return true end - - if ( CLIENT ) then + + if CLIENT then local physobj = self:GetPhysicsObject() - if ( IsValid( physobj ) ) then - physobj:SetPos( self:GetPos() ) - physobj:SetAngles( self:GetAngles() ) + if IsValid(physobj) then + physobj:SetPos(self:GetPos()) + physobj:SetAngles(self:GetAngles()) end end end function ENT:Use(activator, caller, usetype) - end function ENT:OnRemove() - end function ENT:DrawTranslucent() self:DrawModel() end - function ENT:Draw() end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_intelmarker/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_intelmarker/shared.lua index 2a86ca1..1c4bd4d 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_intelmarker/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_intelmarker/shared.lua @@ -1,33 +1,31 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Intel Marker" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Intel Marker" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_TRANSLUCENT -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/hunter/blocks/cube025x025x025.mdl" function ENT:SetupDataTables() - - self:NetworkVar( "Int", 0, "Score" ) - + self:NetworkVar("Int", 0, "Score") end local minb, maxb = Vector(-40, -40, 0), Vector(40, 40, 64) + function ENT:Initialize() - self:SetModel(self.Model) + self:SetModel(self.Model) self:DrawShadow(false) - self:SetMoveType(MOVETYPE_NONE) - self:SetSolid(SOLID_BBOX) - self:SetCollisionGroup(COLLISION_GROUP_IN_VEHICLE) + self:SetMoveType(MOVETYPE_NONE) + self:SetSolid(SOLID_BBOX) + self:SetCollisionGroup(COLLISION_GROUP_IN_VEHICLE) self:SetCollisionBounds(minb, maxb) + if CLIENT then self:SetRenderBounds(minb, maxb) self.offset = 0 @@ -37,8 +35,7 @@ function ENT:Initialize() end function ENT:StartTouch(ent) - if ent:IsPlayer() then - end + if ent:IsPlayer() then return end end function ENT:UpdateTransmitState() @@ -46,37 +43,41 @@ function ENT:UpdateTransmitState() end function ENT:Use(activator, caller, usetype) - end function ENT:OnRemove() - end local radius = 35 local red = Color(100, 255, 0, 125) local circlepos = Vector() -local circleup = Vector(0,0,40) -local msin = math.sin -local mabs = math.abs +local circleup = Vector(0, 0, 40) +-- local msin = math.sin +-- local mabs = math.abs + function ENT:DrawTranslucent() self:SetRenderBounds(minb, maxb) render.SetColorMaterial() - for i=0, 16 do - local angle = i * math.pi*2 / 16 + self.offset - circlepos:SetUnpacked(math.cos(angle)*radius, math.sin(angle)*radius, 0) - local newpos = self:GetPos()+circlepos - render.DrawBeam(newpos, newpos+circleup, 4, 0, 1, red, true) + + for i = 0, 16 do + local angle = i * math.pi * 2 / 16 + self.offset + + circlepos:SetUnpacked(math.cos(angle) * radius, math.sin(angle) * radius, 0) + + local newpos = self:GetPos() + circlepos + + render.DrawBeam(newpos, newpos + circleup, 4, 0, 1, red, true) end - local bmin, bmax = self:GetRenderBounds() - self.offset = self.offset + (0.00075) + + -- local bmin, bmax = self:GetRenderBounds() + self.offset = self.offset + 0.00075 + if self.offset >= 180 then self.offset = 0 end + -- render.DrawWireframeBox(self:GetPos(), angle_zero, bmin, bmax) end - function ENT:Draw() - end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_ladder/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_ladder/shared.lua index 3395132..5a84a13 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_ladder/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_ladder/shared.lua @@ -1,44 +1,47 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Ladder" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Ladder" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_OPAQUE -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/props_c17/metalladder002.mdl" ENT.ModelEnd = "models/props_c17/metalladder002b.mdl" - ENT.NoClimbing = true function ENT:SetupDataTables() - self:NetworkVar( "Float", 0, "LadderHeight" ) + self:NetworkVar("Float", 0, "LadderHeight") end function LadderSpawnDebug() - local p=Entity(1):GetEyeTrace() - a=ents.Create('br_ladder') + local p = Entity(1):GetEyeTrace() + + a = ents.Create("br_ladder") + a:SetAngles(p.HitNormal:Angle()) - a:SetPos(p.HitPos+p.HitNormal*10) + a:SetPos(p.HitPos + p.HitNormal * 10) a:Spawn() - sk=util.QuickTrace(p.HitPos,Vector(0,0,100000)).HitPos-p.HitNormal*10 - a:LadderHeightExact(util.QuickTrace(sk, Vector(0,0,-100000)).HitPos:Distance(a:GetPos())-62) + + sk = util.QuickTrace(p.HitPos, Vector(0, 0, 100000)).HitPos - p.HitNormal * 10 + + a:LadderHeightExact(util.QuickTrace(sk, Vector(0, 0, -100000)).HitPos:Distance(a:GetPos()) - 62) end function ENT:LadderHeight(mul) - local height = 125*mul - self:SetLadderHeight(height-(75)) - local mins, maxs = Vector(5,-14,0), Vector(14, 14,height) - self:SetCollisionBounds(mins,maxs) - self:PhysicsInitBox(mins,maxs) - self:SetSolid(SOLID_VPHYSICS) - self:SetCollisionGroup(SOLID_VPHYSICS) + local height = 125 * mul + self:SetLadderHeight(height - 75) + + local mins, maxs = Vector(5, -14, 0), Vector(14, 14, height) + + self:SetCollisionBounds(mins, maxs) + self:PhysicsInitBox(mins, maxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) self:EnableCustomCollisions(true) self:GetPhysicsObject():EnableMotion(false) end @@ -46,53 +49,58 @@ end function ENT:LadderHeightExact(height) self:SetLadderHeight(height) height = height + 75 - local mins, maxs = Vector(5,-14,0), Vector(14, 14,height) - self:SetCollisionBounds(mins,maxs) - self:PhysicsInitBox(mins,maxs) - self:SetSolid(SOLID_VPHYSICS) - self:SetCollisionGroup(SOLID_VPHYSICS) + + local mins, maxs = Vector(5, -14, 0), Vector(14, 14, height) + + self:SetCollisionBounds(mins, maxs) + self:PhysicsInitBox(mins, maxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) self:EnableCustomCollisions(true) self:GetPhysicsObject():EnableMotion(false) end function ENT:Initialize() local height = 125 + if SERVER then - self:SetLadderHeight(height-(75)) + self:SetLadderHeight(height - 75) end - - self:SetModel(self.Model) + + self:SetModel(self.Model) + local ang = self:GetAngles() - local mins, maxs = Vector(5,-14,0), Vector(14, 14,height) - self:SetCollisionBounds(mins,maxs) + local mins, maxs = Vector(5, -14, 0), Vector(14, 14, height) + + self:SetCollisionBounds(mins, maxs) self:SetAngles(ang) - self:PhysicsInitBox(mins,maxs) - self:SetSolid(SOLID_VPHYSICS) - self:SetCollisionGroup(SOLID_VPHYSICS) + self:PhysicsInitBox(mins, maxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) self:EnableCustomCollisions(true) self:GetPhysicsObject():EnableMotion(false) - + if CLIENT then - self:SetRenderBounds(mins,maxs) + self:SetRenderBounds(mins, maxs) self.CLModel = ClientsideModel(self.Model) self.CLModel:SetPos(self:GetPos()) self.CLModel:SetAngles(self:GetAngles()) - self.CLModelEnd = ClientsideModel(self.ModelEnd) self.CLModelEnd:SetPos(self:GetPos()) self.CLModelEnd:SetAngles(self:GetAngles()) - - local scale = Vector(1,0.85,1) + + local scale = Vector(1, 0.85, 1) local mat = Matrix() + mat:Scale(scale) + self.CLModel:EnableMatrix("RenderMultiply", mat) self.CLModelEnd:EnableMatrix("RenderMultiply", mat) - self.CLModel:SetMaterial("medge/plain/redbrickvertex") self.CLModelEnd:SetMaterial("medge/plain/redbrickvertex") - end - - self:SetPos(self:GetPos()-self:GetAngles():Forward()*10) + end + + self:SetPos(self:GetPos() - self:GetAngles():Forward() * 10) end function ENT:UpdateTransmitState() @@ -103,7 +111,7 @@ function ENT:OnRemove() if IsValid(self.CLModel) then self.CLModel:Remove() end - + if IsValid(self.CLModelEnd) then self.CLModelEnd:Remove() end @@ -115,52 +123,58 @@ end function ENT:Think() if SERVER then local ang = self:GetAngles() - if ang[1] != 0 or ang[3] != 0 then + + if ang[1] ~= 0 or ang[3] ~= 0 then ang.x = 0 ang.z = 0 + self:SetAngles(ang) end - self:NextThink(CurTime()+1) + + self:NextThink(CurTime() + 1) + return true end - - if ( CLIENT ) then + + if CLIENT then local physobj = self:GetPhysicsObject() - - if !IsValid(self.CLModel) then + + if not IsValid(self.CLModel) then self.CLModel = ClientsideModel(self.Model) self.CLModel:SetPos(self:GetPos()) self.CLModel:SetAngles(self:GetAngles()) end - - if !IsValid(self.CLModelEnd) then - + + if not IsValid(self.CLModelEnd) then self.CLModelEnd = ClientsideModel(self.ModelEnd) self.CLModelEnd:SetPos(self:GetPos()) self.CLModelEnd:SetAngles(self:GetAngles()) - - - local scale = Vector(1,0.85,1) + + local scale = Vector(1, 0.85, 1) local mat = Matrix() + mat:Scale(scale) + self.CLModel:EnableMatrix("RenderMultiply", mat) self.CLModelEnd:EnableMatrix("RenderMultiply", mat) - self.CLModel:SetMaterial("medge/plain/redbrickvertex") self.CLModelEnd:SetMaterial("medge/plain/redbrickvertex") end - if ( IsValid( physobj ) ) then - physobj:SetPos( self:GetPos() ) - physobj:SetAngles( self:GetAngles() ) - self.CLModel:SetPos( self:GetPos() ) - self.CLModel:SetAngles( self:GetAngles() ) - self.CLModelEnd:SetPos( self:GetPos() ) - self.CLModelEnd:SetAngles( self:GetAngles() ) - local mins, maxs = physobj:GetAABB() + if IsValid(physobj) then + physobj:SetPos(self:GetPos()) + physobj:SetAngles(self:GetAngles()) + + self.CLModel:SetPos(self:GetPos()) + self.CLModel:SetAngles(self:GetAngles()) + self.CLModelEnd:SetPos(self:GetPos()) + self.CLModelEnd:SetAngles(self:GetAngles()) + + local _, maxs = physobj:GetAABB() local cmins, cmaxs = self:GetCollisionBounds() - if maxs.z != cmaxs.z then - self:PhysicsInitBox(cmins,cmaxs) + + if maxs.z ~= cmaxs.z then + self:PhysicsInitBox(cmins, cmaxs) self:SetSolid(SOLID_VPHYSICS) self:SetCollisionGroup(SOLID_VPHYSICS) self:EnableCustomCollisions(true) @@ -168,7 +182,8 @@ function ENT:Think() end else local cmins, cmaxs = self:GetCollisionBounds() - self:PhysicsInitBox(cmins,cmaxs) + + self:PhysicsInitBox(cmins, cmaxs) self:SetSolid(SOLID_VPHYSICS) self:SetCollisionGroup(SOLID_VPHYSICS) self:EnableCustomCollisions(true) @@ -179,59 +194,64 @@ end function ENT:Draw() local pos = self:GetPos() - local ang = self:GetAngles() + -- local ang = self:GetAngles() local oldz = pos.z local mins, maxs = self:GetCollisionBounds() - maxs.z = self:GetLadderHeight()+75 - local num = maxs.z/125 + maxs.z = self:GetLadderHeight() + 75 + + local num = maxs.z / 125 local numc = math.floor(num) - local extra = num-numc - if !IsValid(self.CLModel) then - self:SetRenderBounds(mins,maxs) + local extra = num - numc + + if not IsValid(self.CLModel) then + self:SetRenderBounds(mins, maxs) self.CLModel = ClientsideModel(self.Model) self.CLModel:SetPos(self:GetPos()) self.CLModel:SetAngles(self:GetAngles()) end - - if !IsValid(self.CLModelEnd) then - + + if not IsValid(self.CLModelEnd) then self.CLModelEnd = ClientsideModel(self.ModelEnd) self.CLModelEnd:SetPos(self:GetPos()) self.CLModelEnd:SetAngles(self:GetAngles()) - - local scale = Vector(1,0.85,1) + local scale = Vector(1, 0.85, 1) local mat = Matrix() + mat:Scale(scale) + self.CLModel:EnableMatrix("RenderMultiply", mat) self.CLModelEnd:EnableMatrix("RenderMultiply", mat) - self.CLModel:SetMaterial("medge/plain/redbrickvertex") self.CLModelEnd:SetMaterial("medge/plain/redbrickvertex") end - - self:SetRenderBounds(mins,maxs) - for i=0, numc do + + self:SetRenderBounds(mins, maxs) + + for i = 0, numc do if num == 1 then self.CLModel:DrawModel() break end - if i==numc then - if i>0 then - pos.z = pos.z+(125*extra) + + if i == numc then + if i > 0 then + pos.z = pos.z + (125 * extra) end + self.CLModel:SetPos(pos) self.CLModel:SetupBones() self.CLModel:DrawModel() else - pos.z = oldz+(125*i) + pos.z = oldz + (125 * i) self.CLModel:SetPos(pos) self.CLModel:SetupBones() self.CLModel:DrawModel() end end - + pos.z = pos.z + 112 + self.CLModelEnd:SetPos(pos) self.CLModelEnd:SetupBones() self.CLModelEnd:DrawModel() diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_laser/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_laser/shared.lua index 8b1a86c..806098c 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_laser/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_laser/shared.lua @@ -1,89 +1,102 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Laser Hazard" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Laser Hazard" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_BOTH -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/maxofs2d/button_02.mdl" - - ENT.NoClimbing = true ENT.LaserLength = 100000 if CLIENT then - language.Add( "br_laser", "Laser Hazard" ) + language.Add("br_laser", "Laser Hazard") end function ENT:SetupDataTables() - self:NetworkVar( "Vector", 1, "EndPos" ) + self:NetworkVar("Vector", 1, "EndPos") end -local spawntr = {} -local spawntrout = {} +-- local spawntr = {} +-- local spawntrout = {} + function ENT:Initialize() local entstable = player.GetAll() local ang = self:GetAngles() - entstable[#entstable+1] = self - self:SetEndPos(util.QuickTrace(self:GetPos(), ang:Up()*self.LaserLength, entstable).HitPos) - self:SetModel(self.Model) - local mins, maxs = Vector(0,-1,-1), Vector(0, 1, self:GetPos():Distance(self:GetEndPos())) + + entstable[#entstable + 1] = self + + self:SetEndPos(util.QuickTrace(self:GetPos(), ang:Up() * self.LaserLength, entstable).HitPos) + self:SetModel(self.Model) + + local mins, maxs = Vector(0, -1, -1), Vector(0, 1, self:GetPos():Distance(self:GetEndPos())) + if SERVER then - self:PhysicsInitBox(mins,maxs) + self:PhysicsInitBox(mins, maxs) self:SetSolid(SOLID_VPHYSICS) self:GetPhysicsObject():EnableMotion(false) end - self.NoPlayerCollisions=true + + self.NoPlayerCollisions = true self:EnableCustomCollisions(true) - + if CLIENT then - self:SetRenderBounds(mins,maxs) - self:SetCollisionBounds(mins,maxs) + self:SetRenderBounds(mins, maxs) + self:SetCollisionBounds(mins, maxs) end end function ENT:OnRemove() - end function ENT:BRCollisionFunc(ent) if CLIENT then return false end if ent:Health() <= 0 or (ent:IsPlayer() and ent:HasGodMode()) then return false end + local ang = self:GetAngles() - if util.QuickTrace(self:GetPos(), ang:Up()*self.LaserLength, self).Entity != ent then return false end + + if util.QuickTrace(self:GetPos(), ang:Up() * self.LaserLength, self).Entity ~= ent then return false end + local dmginfo = DamageInfo() dmginfo:SetAttacker(self) - dmginfo:SetDamage(100) + dmginfo:SetDamage(1000) dmginfo:SetDamageType(DMG_DISSOLVE) + ent:TakeDamageInfo(dmginfo) - ent:EmitSound("bigspark"..math.random(1,2)..".wav") + ent:EmitSound("bigspark" .. math.random(1, 2) .. ".wav") + return false end function ENT:Think() if CLIENT then return end + local entstable = player.GetAll() local ang = self:GetAngles() - entstable[#entstable+1] = self - local tr = util.QuickTrace(self:GetPos(), ang:Up()*self.LaserLength, entstable) + + entstable[#entstable + 1] = self + + local tr = util.QuickTrace(self:GetPos(), ang:Up() * self.LaserLength, entstable) local trpos = tr.HitPos - if trpos != self:GetEndPos() then - local mins, maxs = Vector(0,-1,-1), Vector(0, 1, self:GetPos():Distance(trpos)) + + if trpos ~= self:GetEndPos() then + local mins, maxs = Vector(0, -1, -1), Vector(0, 1, self:GetPos():Distance(trpos)) + self:SetEndPos(trpos) - self:PhysicsInitBox(mins,maxs) + self:PhysicsInitBox(mins, maxs) self:SetSolid(SOLID_VPHYSICS) - self.NoPlayerCollisions=true + self.NoPlayerCollisions = true self:EnableCustomCollisions(true) self:GetPhysicsObject():EnableMotion(false) end - self:NextThink(CurTime()+5) + + self:NextThink(CurTime() + 5) + return true end @@ -92,10 +105,12 @@ function ENT:UpdateTransmitState() end local ropemat = Material("cable/physbeam") -local color_red = Color(255,0,0) +local color_red = Color(255, 0, 0) + function ENT:Draw() local mins, maxs = self:GetCollisionBounds() - self:SetRenderBounds(mins,maxs) + + self:SetRenderBounds(mins, maxs) self:DrawModel() end @@ -106,7 +121,9 @@ end function ENT:DrawLOC() local mins, maxs = self:GetCollisionBounds() - self:SetRenderBounds(mins,maxs) + + self:SetRenderBounds(mins, maxs) + render.SetMaterial(ropemat) render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_red) end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_mat/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_mat/shared.lua index 930a510..0b06ac5 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_mat/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_mat/shared.lua @@ -1,27 +1,24 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Mat" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Mat" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_OPAQUE -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/mechanics/robotics/stand.mdl" function ENT:SetupDataTables() - end function ENT:Initialize() self:SetModel(self.Model) - self:SetMoveType( MOVETYPE_VPHYSICS ) - self:SetSolid( SOLID_VPHYSICS ) + self:SetMoveType(MOVETYPE_VPHYSICS) + self:SetSolid(SOLID_VPHYSICS) self:PhysicsInit(SOLID_VPHYSICS) self:GetPhysicsObject():EnableMotion(false) end diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_rabbitfrog/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_rabbitfrog/shared.lua index c55e364..abc1c9b 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_rabbitfrog/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_rabbitfrog/shared.lua @@ -1,45 +1,48 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Rabbitfrog" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Rabbitfrog" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_OPAQUE -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/nt/props_vehicles/rabbitfrog_dynamic.mdl" ENT.AutomaticFrameAdvance = true function ENT:SetupDataTables() - self:NetworkVar( "Entity", 0, "Passenger1" ) - self:NetworkVar( "Entity", 1, "Passenger2" ) - self:NetworkVar( "Entity", 2, "Passenger3" ) - self:NetworkVar( "Entity", 3, "Passenger4" ) - - self:NetworkVar( "Vector", 0, "DestinationPos" ) - self:NetworkVar( "Angle", 1, "DestinationAngle" ) + self:NetworkVar("Entity", 0, "Passenger1") + self:NetworkVar("Entity", 1, "Passenger2") + self:NetworkVar("Entity", 2, "Passenger3") + self:NetworkVar("Entity", 3, "Passenger4") + self:NetworkVar("Vector", 0, "DestinationPos") + self:NetworkVar("Angle", 1, "DestinationAngle") end -local mins, maxs = Vector(-64, -64, 0), Vector(64, 64, 154) +-- local mins, maxs = Vector(-64, -64, 0), Vector(64, 64, 154) + function ENT:Initialize() - self:SetModel(self.Model) - -- self:SetMoveType(MOVETYPE_NONE) + self:SetModel(self.Model) + -- self:SetMoveType(MOVETYPE_NONE) -- self:SetSolid(SOLID_BBOX) -- self:SetCollisionBounds(mins, maxs) - if SERVER then self:PhysicsInit(SOLID_VPHYSICS) end + + if SERVER then + self:PhysicsInit(SOLID_VPHYSICS) + end + self:SetMoveType(MOVETYPE_VPHYSICS) self:ResetSequence(1) - if SERVER then self:SetUseType( SIMPLE_USE ) end + + if SERVER then + self:SetUseType(SIMPLE_USE) + end end - function ENT:OnRemove() - end function ENT:UpdateTransmitState() @@ -47,43 +50,44 @@ function ENT:UpdateTransmitState() end function ENT:Think() - self:NextThink( CurTime() ) + self:NextThink(CurTime()) + return true end - local blur = Material("pp/blurscreen") -local function draw_blur( a, d ) - surface.SetDrawColor( 255, 255, 255 ) - surface.SetMaterial( blur ) +local function draw_blur(a, d) + surface.SetDrawColor(255, 255, 255) + surface.SetMaterial(blur) + for i = 1, d do - - blur:SetFloat( "$blur", (i / d ) * ( a ) ) + blur:SetFloat("$blur", (i / d) * a) blur:Recompute() + render.UpdateScreenEffectTexture() - surface.DrawTexturedRect( 0, 0, ScrW(), ScrH() ) - + surface.DrawTexturedRect(0, 0, ScrW(), ScrH()) end - end + local blurint = 4 -local rabbitpos, rabbitang = Vector(), Angle() -local landseq = {[1]=true,[4]=true} -local initseq = 1 +-- local rabbitpos, rabbitang = Vector(), Angle() +local landseq = { + [1] = true, + [4] = true +} -local offset = Vector(-30,5,0) -local offsetdraw = Vector(0,70,0) -local angoffset = Angle(0,90,90) - -local lastpos = Vector() -local lastang = Angle() -local endlerp = 0 -local endlerppos = Vector() -local neweye = false - -local fx = false +-- local initseq = 1 +-- local offset = Vector(-30, 5, 0) +-- local offsetdraw = Vector(0, 70, 0) +-- local angoffset = Angle(0, 90, 90) +-- local lastpos = Vector() +-- local lastang = Angle() +-- local endlerp = 0 +-- local endlerppos = Vector() +-- local neweye = false +-- local fx = false local diff = 1 local function IsLanding(ent) @@ -91,10 +95,12 @@ local function IsLanding(ent) end local introalpha = 255 + local function LandingHUDPaint() - introalpha = introalpha-(FrameTime()*50) - surface.SetDrawColor(0,0,0,introalpha) - surface.DrawRect(0,0,ScrW(),ScrH()) + introalpha = introalpha - (FrameTime() * 50) + + surface.SetDrawColor(0, 0, 0, introalpha) + surface.DrawRect(0, 0, ScrW(), ScrH()) if introalpha <= 0 then hook.Remove("HUDPaint", "LandingHUDPaint") @@ -110,7 +116,6 @@ local function LandingIntro() fx = false neweye = false endlerp = 0 - surface.PlaySound("hopperland.mp3") LandingHUDIntro() end @@ -118,68 +123,67 @@ end function ENT:Draw() -- Reset everything to known good - render.SetStencilWriteMask( 0xFF ) - render.SetStencilTestMask( 0xFF ) - render.SetStencilReferenceValue( 0 ) + render.SetStencilWriteMask(0xFF) + render.SetStencilTestMask(0xFF) + render.SetStencilReferenceValue(0) -- render.SetStencilCompareFunction( STENCIL_ALWAYS ) - render.SetStencilPassOperation( STENCIL_KEEP ) + render.SetStencilPassOperation(STENCIL_KEEP) -- render.SetStencilFailOperation( STENCIL_KEEP ) - render.SetStencilZFailOperation( STENCIL_KEEP ) + render.SetStencilZFailOperation(STENCIL_KEEP) render.ClearStencil() - -- Enable stencils - render.SetStencilEnable( true ) - -- Set the reference value to 1. This is what the compare function tests against - render.SetStencilReferenceValue( 1 ) - -- Force everything to fail - render.SetStencilCompareFunction( STENCIL_NEVER ) - -- Save all the things we don't draw - render.SetStencilFailOperation( STENCIL_REPLACE ) + render.SetStencilEnable(true) -- Enable stencils + render.SetStencilReferenceValue(1) -- Set the reference value to 1. This is what the compare function tests against + render.SetStencilCompareFunction(STENCIL_NEVER) -- Force everything to fail + render.SetStencilFailOperation(STENCIL_REPLACE) -- Save all the things we don't draw - -- Fail to draw our entities. - self:DrawModel() - -- Render all pixels that don't have their stencil value as 1 - render.SetStencilCompareFunction( STENCIL_EQUAL ) - -- Don't modify the stencil buffer when things fail - render.SetStencilFailOperation( STENCIL_KEEP ) + self:DrawModel() -- Fail to draw our entities. + + render.SetStencilCompareFunction(STENCIL_EQUAL) -- Render all pixels that don't have their stencil value as 1 + render.SetStencilFailOperation(STENCIL_KEEP) -- Don't modify the stencil buffer when things fail - -- Draw our big entities. They will have holes in them wherever the smaller entities were -- for _, ent in pairs( ents.FindByClass( "sent_stencil_test_big" ) ) do - render.PushFilterMag( TEXFILTER.ANISOTROPIC ) - render.PushFilterMin( TEXFILTER.ANISOTROPIC ) + render.PushFilterMag(TEXFILTER.ANISOTROPIC) -- Draw our big entities. They will have holes in them wherever the smaller entities were + render.PushFilterMin(TEXFILTER.ANISOTROPIC) self:DrawModel() - cam.Start2D(vector_origin,angle_zero) - draw_blur(math.max(blurint*-diff,0),5) - -- DrawBokehDOF(5,0.99,8) - render.PopFilterMag() - render.PopFilterMin() + cam.Start2D(vector_origin, angle_zero) + draw_blur(math.max(blurint * -diff, 0), 5) + -- DrawBokehDOF(5,0.99,8) + render.PopFilterMag() + render.PopFilterMin() cam.End2D() -- end - -- Let everything render normally again - render.SetStencilEnable( false ) + render.SetStencilEnable(false) -- Let everything render normally again end + local function RabbitCalcView(ply, origin, ang) local rabbit = ply:GetRabbit() + if IsValid(rabbit) and rabbit:GetCycle() < 1 and IsLanding(rabbit) then - if rabbit:GetCycle() < 1 then util.ScreenShake( vector_origin, 1, 100, 0.5, 0 ) end + if rabbit:GetCycle() < 1 then + util.ScreenShake(vector_origin, 1, 100, 0.5, 0) + end + local matrix = rabbit:GetBoneMatrix(0) local pos = matrix:GetTranslation() local angles = matrix:GetAngles() - local npos, nang = LocalToWorld(offset, angles, pos, angles) + local npos, _ = LocalToWorld(offset, angles, pos, angles) angles:Sub(angoffset) angles.x = -angles.x - angles.y = angles.y-90 + angles.y = angles.y - 90 angles.z = angles.x + local oldangx = ang.x ang.x = 0 + diff = ang:Forward():Dot(angles:Right()) + local absdiff = math.abs(diff) ang.x = oldangx angles.z = angles.z * absdiff -- angles.x = angles.x * absdiff - -- angles.x = angles.x*ang:Forward():Dot(ang:Forward()) -- angles.z = angles.z*math.abs(ang:Forward():Dot(ang:Forward())) @@ -189,46 +193,52 @@ local function RabbitCalcView(ply, origin, ang) lastpos:Set(origin) lastang:Set(ang) elseif endlerp < 1 then - if !neweye then + if not neweye then lastang.z = 0 + ang:Set(lastang) + ply:SetEyeAngles(lastang) neweye = true - ply:CLViewPunch(Angle(12,0,0)) + + ply:CLViewPunch(Angle(12, 0, 0)) VManip:PlayAnim("vault") end + origin:Set(LerpVector(endlerp, lastpos, origin)) + endlerp = endlerp + (FrameTime() * 4) + endlerppos:Set(origin) end end local function RabbitVM(wep, vm, oldpos, oldang, pos, ang) local rabbit = LocalPlayer():GetRabbit() - local diffpos = pos-oldpos - local diffang = ang-oldang + local diffpos = pos - oldpos + local diffang = ang - oldang + if IsValid(rabbit) and rabbit:GetCycle() < 1 and IsLanding(rabbit) then pos:Set(lastpos) ang:Set(lastang) - pos:Sub(diffpos) ang:Sub(diffang) elseif endlerp < 1 then pos:Set(endlerppos) end end + -- hook.Add("CalcViewModelView", "RabbitVM", RabbitVM) -- hook.Add("BeatrunDrawHUD", "Rabbit", function() - -- if IsValid(rabbit) and rabbit:GetCycle() < 1 and IsLanding(rabbit) then - -- return false - -- end +-- if IsValid(rabbit) and rabbit:GetCycle() < 1 and IsLanding(rabbit) then return false end -- end) - function ENT:Use(ply, caller, usetype, value) - if !ply:IsPlayer() then return end + if not ply:IsPlayer() then return end + print("hi") + ply:SetRabbit(self) ply:SetRabbitSeat(1) end @@ -239,13 +249,15 @@ end local function RabbitPlayerMove(ply, mv, cmd) local rabbit = ply:GetRabbit() + if IsValid(rabbit) then local matrix = rabbit:GetBoneMatrix(0) - local pos = matrix:GetTranslation()-ply:GetViewOffset() + local pos = matrix:GetTranslation() - ply:GetViewOffset() local angles = matrix:GetAngles() - local npos, nang = LocalToWorld(offset, angles, pos, angles) + local npos, _ = LocalToWorld(offset, angles, pos, angles) ply:SetMoveType(MOVETYPE_NOCLIP) mv:SetOrigin(npos) end end + -- hook.Add("SetupMove", "RabbitPlayerMove", RabbitPlayerMove) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_swingbar/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_swingbar/shared.lua index 0d3d3ad..25e2a57 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_swingbar/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_swingbar/shared.lua @@ -1,71 +1,75 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Swingbar" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Swingbar" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_OPAQUE -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/hunter/plates/plate2.mdl" - ENT.NoWallrun = true ENT.NoClimbing = true +local red = Color(255, 0, 0) +-- local spawntr = {} +-- local spawntrout = {} -local red = Color(255,0,0) -local spawntr = {} -local spawntrout = {} function ENT:Initialize() self:DrawShadow(false) self:SetColor(red) - self:SetModel(self.Model) - -- self:SetMoveType(MOVETYPE_NONE) - if SERVER then self:PhysicsInit(SOLID_VPHYSICS) end + self:SetModel(self.Model) + -- self:SetMoveType(MOVETYPE_NONE) + + if SERVER then + self:PhysicsInit(SOLID_VPHYSICS) + end + self:SetSolid(SOLID_VPHYSICS) self:SetCollisionGroup(COLLISION_GROUP_WEAPON) self:SetCustomCollisionCheck(true) self.NoPlayerCollisions = true - - -- local mins, maxs = self:GetCollisionBounds()*4 + + -- local mins, maxs = self:GetCollisionBounds() * 4 + -- spawntr.start = self:GetPos() -- spawntr.endpos = spawntr.start -- spawntr.filter = self -- spawntr.output = spawntrout -- spawntr.mins, spawntr.maxs = mins, maxs + -- util.TraceHull(spawntr) - + -- if spawntrout.Hit then - -- local ang = spawntrout.HitNormal:Angle() - -- ang.x = 0 - -- self:SetAngles(ang) + -- local ang = spawntrout.HitNormal:Angle() + -- ang.x = 0 + -- self:SetAngles(ang) -- end - end function ENT:CollisionFunc(ent) - -- if ent:GetPos().z+64>self:GetPos().z then - -- print("huh") - -- return true - -- else - -- return false - -- end end -function ENT:OnRemove() +-- if ent:GetPos().z + 64 > self:GetPos().z then +-- print("huh") +-- return true +-- else +-- return false +-- end + +function ENT:OnRemove() end function ENT:Think() return true end -local matrix -local vecscale +-- local matrix +-- local vecscale + function ENT:Draw() self:DrawModel() end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_swingpipe/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_swingpipe/shared.lua index 18ee2ff..af93611 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_swingpipe/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_swingpipe/shared.lua @@ -1,15 +1,13 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Swingpipe" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Swingpipe" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_OPAQUE -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/parkoursource/pipe_standard.mdl" @@ -17,53 +15,57 @@ ENT.Model = "models/parkoursource/pipe_standard.mdl" function ENT:SetupDataTables() end -local spawntr = {} -local spawntrout = {} +-- local spawntr = {} +-- local spawntrout = {} + function ENT:Initialize() self:DrawShadow(false) - self:SetModel(self.Model) - self:SetMoveType(MOVETYPE_NONE) - local mins, maxs = Vector(-15,-15,0), Vector(15, 15,180) - self:SetCollisionBounds(mins,maxs) - self:PhysicsInitBox(mins,maxs) - self:SetSolid(SOLID_VPHYSICS) - self:SetCollisionGroup(COLLISION_GROUP_WEAPON) + self:SetModel(self.Model) + self:SetMoveType(MOVETYPE_NONE) + + local mins, maxs = Vector(-15, -15, 0), Vector(15, 15, 180) + + self:SetCollisionBounds(mins, maxs) + self:PhysicsInitBox(mins, maxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(COLLISION_GROUP_WEAPON) self:EnableCustomCollisions(true) + if SERVER then self:GetPhysicsObject():EnableMotion(false) else - -- self:SetRenderOrigin(self:GetPos() - self:GetAngles():Forward()*15) + return end + + -- self:SetRenderOrigin(self:GetPos() - self:GetAngles():Forward() * 15) self:SetMaterial("medge/plain/redbrickvertex") - self.NoPlayerCollisions=true - - -- local mins, maxs = self:GetCollisionBounds()*4 + self.NoPlayerCollisions = true + -- local mins, maxs = self:GetCollisionBounds() * 4 + -- spawntr.start = self:GetPos() -- spawntr.endpos = spawntr.start -- spawntr.filter = self -- spawntr.output = spawntrout -- spawntr.mins, spawntr.maxs = mins, maxs - -- util.TraceHull(spawntr) - - -- if spawntrout.Hit then - -- local ang = spawntrout.HitNormal:Angle() - -- ang.x = 0 - -- self:SetAngles(ang) - -- end - -end + -- util.TraceHull(spawntr) + + -- if spawntrout.Hit then + -- local ang = spawntrout.HitNormal:Angle() + -- ang.x = 0 + -- self:SetAngles(ang) + -- end +end function ENT:OnRemove() - end - function ENT:Think() end -local matrix -local vecscale +-- local matrix +-- local vecscale + function ENT:Draw() self:DrawModel() -- local mins, maxs = self:GetCollisionBounds() diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_swingrope/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_swingrope/shared.lua index 1819c7f..851eb29 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_swingrope/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_swingrope/shared.lua @@ -1,68 +1,71 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Swingrope" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Swingrope" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_OPAQUE -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/parkoursource/pipe_standard.mdl" - - ENT.NoClimbing = true ENT.NoWallrun = true function ENT:SetupDataTables() - self:NetworkVar( "Vector", 0, "StartPos" ) - self:NetworkVar( "Vector", 1, "EndPos" ) + self:NetworkVar("Vector", 0, "StartPos") + self:NetworkVar("Vector", 1, "EndPos") end -local spawntr = {} -local spawntrout = {} +-- local spawntr = {} +-- local spawntrout = {} + function ENT:Initialize() self:SetPos(self:GetStartPos()) - self:SetModel(self.Model) - local ang = (self:GetEndPos()-self:GetStartPos()):Angle() - local mins, maxs = Vector(-8,-8,0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + self:SetModel(self.Model) + + local ang = (self:GetEndPos() - self:GetStartPos()):Angle() + local mins, maxs = Vector(-8, -8, 0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + self:SetAngles(ang) - self:PhysicsInitBox(mins,maxs) - self:SetSolid(SOLID_VPHYSICS) - self.NoPlayerCollisions=true + self:PhysicsInitBox(mins, maxs) + self:SetSolid(SOLID_VPHYSICS) + self.NoPlayerCollisions = true self:EnableCustomCollisions(true) self:GetPhysicsObject():EnableMotion(false) - + if CLIENT then - self:SetRenderBounds(mins,maxs) + self:SetRenderBounds(mins, maxs) end end function ENT:OnRemove() - end - function ENT:Think() - if self:GetPos() != self:GetStartPos() then + if self:GetPos() ~= self:GetStartPos() then self:SetStartPos(self:GetPos()) - local ang = (self:GetEndPos()-self:GetStartPos()):Angle() - local mins, maxs = Vector(-8,-8,0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + + local ang = (self:GetEndPos() - self:GetStartPos()):Angle() + local mins, maxs = Vector(-8, -8, 0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + self:SetAngles(ang) + if CLIENT then self:SetRenderAngles(ang) end - self:PhysicsInitBox(mins,maxs) + + self:PhysicsInitBox(mins, maxs) self:SetSolid(SOLID_VPHYSICS) - self.NoPlayerCollisions=true + self.NoPlayerCollisions = true self:EnableCustomCollisions(true) self:GetPhysicsObject():EnableMotion(false) end - self:NextThink(CurTime()+5) + + self:NextThink(CurTime() + 5) + return true end @@ -71,23 +74,28 @@ function ENT:UpdateTransmitState() end local ropemat = Material("cable/cable2") -local color_red = Color(255,0,0) +local color_red = Color(255, 0, 0) + function ENT:Draw() if LocalPlayer():GetGrappling() then local grapplepos = LocalPlayer():GetGrapplePos() - if grapplepos == self:GetStartPos() or grapplepos == self:GetEndPos() then - return - end + + if grapplepos == self:GetStartPos() or grapplepos == self:GetEndPos() then return end end + local mins, maxs = self:GetCollisionBounds() - self:SetRenderBounds(mins,maxs) + + self:SetRenderBounds(mins, maxs) + render.SetMaterial(ropemat) render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_white) end function ENT:DrawLOC() local mins, maxs = self:GetCollisionBounds() - self:SetRenderBounds(mins,maxs) + + self:SetRenderBounds(mins, maxs) + render.SetMaterial(ropemat) render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_red) end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_zipline/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_zipline/shared.lua index 5bc8596..2392dc4 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/br_zipline/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/br_zipline/shared.lua @@ -1,68 +1,71 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Zipline" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Zipline" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_OPAQUE -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/parkoursource/pipe_standard.mdl" - - ENT.NoClimbing = true function ENT:SetupDataTables() - self:NetworkVar( "Vector", 0, "StartPos" ) - self:NetworkVar( "Vector", 1, "EndPos" ) - self:NetworkVar( "Bool", 0, "TwoWay" ) + self:NetworkVar("Vector", 0, "StartPos") + self:NetworkVar("Vector", 1, "EndPos") + self:NetworkVar("Bool", 0, "TwoWay") end -local spawntr = {} -local spawntrout = {} +-- local spawntr = {} +-- local spawntrout = {} + function ENT:Initialize() self:SetPos(self:GetStartPos()) - self:SetModel(self.Model) - local ang = (self:GetEndPos()-self:GetStartPos()):Angle() - local mins, maxs = Vector(-8,-8,0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + self:SetModel(self.Model) + + local ang = (self:GetEndPos() - self:GetStartPos()):Angle() + local mins, maxs = Vector(-8, -8, 0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + self:SetAngles(ang) - self:PhysicsInitBox(mins,maxs) - self:SetSolid(SOLID_VPHYSICS) - self.NoPlayerCollisions=true + self:PhysicsInitBox(mins, maxs) + self:SetSolid(SOLID_VPHYSICS) + self.NoPlayerCollisions = true self:EnableCustomCollisions(true) self:GetPhysicsObject():EnableMotion(false) - + if CLIENT then - self:SetRenderBounds(mins,maxs) + self:SetRenderBounds(mins, maxs) end end function ENT:OnRemove() - end - function ENT:Think() - if self:GetPos() != self:GetStartPos() then + if self:GetPos() ~= self:GetStartPos() then self:SetStartPos(self:GetPos()) - local ang = (self:GetEndPos()-self:GetStartPos()):Angle() - local mins, maxs = Vector(-8,-8,0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + + local ang = (self:GetEndPos() - self:GetStartPos()):Angle() + local mins, maxs = Vector(-8, -8, 0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + self:SetAngles(ang) + if CLIENT then self:SetRenderAngles(ang) end - self:PhysicsInitBox(mins,maxs) + + self:PhysicsInitBox(mins, maxs) self:SetSolid(SOLID_VPHYSICS) - self.NoPlayerCollisions=true + self.NoPlayerCollisions = true self:EnableCustomCollisions(true) self:GetPhysicsObject():EnableMotion(false) end - self:NextThink(CurTime()+5) + + self:NextThink(CurTime() + 5) + return true end @@ -71,17 +74,22 @@ function ENT:UpdateTransmitState() end local ropemat = Material("cable/cable2") -local color_red = Color(255,0,0) +local color_red = Color(255, 0, 0) + function ENT:Draw() local mins, maxs = self:GetCollisionBounds() - self:SetRenderBounds(mins,maxs) + + self:SetRenderBounds(mins, maxs) + render.SetMaterial(ropemat) render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_white) end function ENT:DrawLOC() local mins, maxs = self:GetCollisionBounds() - self:SetRenderBounds(mins,maxs) + + self:SetRenderBounds(mins, maxs) + render.SetMaterial(ropemat) render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_red) end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/tt_block/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/tt_block/shared.lua index 15fd11e..d34e6b9 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/tt_block/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/tt_block/shared.lua @@ -1,39 +1,38 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Block" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Block" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_OPAQUE -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/hunter/blocks/cube025x025x025.mdl" - local mat -if CLIENT then - mat = CreateMaterial("blockmeasure", "VertexLitGeneric", {["$basetexture"]="dev/dev_measuregeneric01b", ["$basetexturetransform"]="scale 0.5 0.5"}) -end -function ENT:SetupDataTables() +if CLIENT then + mat = CreateMaterial("blockmeasure", "VertexLitGeneric", { + ["$basetexture"] = "dev/dev_measuregeneric01b", + ["$basetexturetransform"] = "scale 0.5 0.5" + }) +end + +function ENT:SetupDataTables() end function ENT:Initialize() self:DrawShadow(false) - self:SetModel(self.Model) - self:SetMoveType(MOVETYPE_NONE) - self:SetSolid(SOLID_BBOX) + self:SetModel(self.Model) + self:SetMoveType(MOVETYPE_NONE) + self:SetSolid(SOLID_BBOX) self:SetCollisionBounds(Vector(-75, -75, 0), Vector(75, 75, 100)) self:AddSolidFlags(FSOLID_CUSTOMRAYTEST) end - function ENT:OnRemove() - end function ENT:DrawTranslucent() @@ -42,25 +41,33 @@ end function ENT:Think() if SERVER then local mins, maxs = self:GetCollisionBounds() + mins:Rotate(self:GetAngles()) maxs:Rotate(self:GetAngles()) + self:SetCollisionBounds(mins, maxs) - self:NextThink(CurTime()+1) + self:NextThink(CurTime() + 1) + return true end end local matrix local vecscale + function ENT:Draw() local mins, maxs = self:GetCollisionBounds() matrix = matrix or Matrix() vecscale = vecscale or Vector() - vecscale:SetUnpacked(maxs.x*0.025, maxs.y*0.025, 0) + + vecscale:SetUnpacked(maxs.x * 0.025, maxs.y * 0.025, 0) matrix:SetScale(vecscale) - mat:SetMatrix("$basetexturetransform",matrix) + + mat:SetMatrix("$basetexturetransform", matrix) + self:SetRenderBounds(mins, maxs) - render.SetColorModulation(1,1,1) + + render.SetColorModulation(1, 1, 1) render.SetMaterial(mat) render.DrawBox(self:GetPos(), self:GetAngles(), mins, maxs, color_white) end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/tt_cp/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/tt_cp/shared.lua index 2a1fb7b..3d70c90 100644 --- a/beatrun/gamemodes/beatrun/entities/entities/tt_cp/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/entities/tt_cp/shared.lua @@ -1,35 +1,32 @@ -ENT.Type = "anim" -ENT.Base = "base_entity" -ENT.PrintName = "Checkpoint" -ENT.Author = "" -ENT.Information = "" - -ENT.Spawnable = true +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Checkpoint" +ENT.Author = "" +ENT.Category = "Beatrun" +ENT.Information = "" +ENT.Spawnable = true ENT.RenderGroup = RENDERGROUP_TRANSLUCENT -ENT.Category = "Beatrun" - AddCSLuaFile() ENT.Model = "models/hunter/blocks/cube025x025x025.mdl" - ENT.IsFinish = false function ENT:SetupDataTables() - - self:NetworkVar( "Int", 0, "CPNum" ) - + self:NetworkVar("Int", 0, "CPNum") end local minb, maxb = Vector(-75, -75, 0), Vector(75, 75, 10000) + function ENT:Initialize() - self:SetModel(self.Model) + self:SetModel(self.Model) self:DrawShadow(false) - self:SetMoveType(MOVETYPE_NONE) - self:SetSolid(SOLID_BBOX) - self:SetCollisionGroup(COLLISION_GROUP_IN_VEHICLE) + self:SetMoveType(MOVETYPE_NONE) + self:SetSolid(SOLID_BBOX) + self:SetCollisionGroup(COLLISION_GROUP_IN_VEHICLE) self:SetCollisionBounds(minb, maxb) + if CLIENT then self:SetRenderBounds(minb, maxb) self.offset = 0 @@ -41,9 +38,11 @@ function ENT:Initialize() end local screencolor = Color(64, 0, 0, 64) + function ENT:StartTouch(ent) - if ent:IsPlayer() and Course_Name != "" and !ent.BuildMode and ent:GetNW2Int("CPNum", 1) == self:GetCPNum() then + if ent:IsPlayer() and Course_Name ~= "" and not ent.BuildMode and ent:GetNW2Int("CPNum", 1) == self:GetCPNum() then ent:SetNW2Int("CPNum", ent:GetNW2Int("CPNum", 1) + 1) + if ent:GetNW2Int("CPNum", 1) > table.Count(Checkpoints) then ReplayStop(ent) FinishCourse(ent) @@ -51,11 +50,14 @@ function ENT:StartTouch(ent) ent.CPSavePos = ent:GetPos() ent.CPSaveAng = ent:EyeAngles() ent.CPSaveVel = ent:GetVelocity() + ent:SaveParkourState() + net.Start("Checkpoint_Hit") net.WriteUInt(ent:GetNW2Int("CPNum", 1), 8) net.Send(ent) end + ent:ScreenFade(SCREENFADE.IN, screencolor, 0.25, 0) end end @@ -65,57 +67,73 @@ function ENT:UpdateTransmitState() end function ENT:Use(activator, caller, usetype) - end function ENT:OnRemove() - end local radius = 75 local red = Color(255, 0, 0, 200) local circlepos = Vector() -local circleup = Vector(0,0,10000) +local circleup = Vector(0, 0, 10000) + function ENT:DrawTranslucent() self:SetRenderBounds(minb, maxb) - if (!BuildMode and CheckpointNumber != self:GetCPNum()) and !LocalPlayer().InReplay then return end + + if (not BuildMode and CheckpointNumber ~= self:GetCPNum()) and not LocalPlayer().InReplay then return end + render.SetColorMaterial() + red.a = math.Clamp(LocalPlayer():GetPos():Distance(self:GetPos()) * 0.2, 25, 200) - for i=0, 16 do - local angle = i * math.pi*2 / 16 + self.offset - circlepos:SetUnpacked(math.cos(angle)*radius, math.sin(angle)*radius, 0) - local newpos = self:GetPos()+circlepos - render.DrawBeam(newpos, newpos+circleup, 8, 0, 1, red, true) + + for i = 0, 16 do + local angle = i * math.pi * 2 / 16 + self.offset + + circlepos:SetUnpacked(math.cos(angle) * radius, math.sin(angle) * radius, 0) + + local newpos = self:GetPos() + circlepos + + render.DrawBeam(newpos, newpos + circleup, 8, 0, 1, red, true) end + -- local bmin, bmax = self:GetRenderBounds() -- render.DrawWireframeBox(self:GetPos(), angle_zero, bmin, bmax) - self.offset = self.offset + (0.00075) + self.offset = self.offset + 0.00075 + if self.offset >= 180 then self.offset = 0 end end - function ENT:Draw() - end -local circlesprite = Material("circle.png","nocull") +local circlesprite = Material("circle.png", "nocull") + function ENT:DrawLOC() - if (!BuildMode and CheckpointNumber != self:GetCPNum()) and !LocalPlayer().InReplay then return end + if (not BuildMode and CheckpointNumber ~= self:GetCPNum()) and not LocalPlayer().InReplay then return end + render.SetMaterial(circlesprite) + red.a = math.Clamp(LocalPlayer():GetPos():Distance(self:GetPos()) * 0.2, 25, 200) + local f = LocalPlayer():EyeAngles():Forward() - for i=0, 16 do - local angle = i * math.pi*2 / 16 + self.offset - circlepos:SetUnpacked(math.cos(angle)*radius, math.sin(angle)*radius, 0) - local newpos = self:GetPos()+circlepos + + for i = 0, 16 do + local angle = i * math.pi * 2 / 16 + self.offset + + circlepos:SetUnpacked(math.cos(angle) * radius, math.sin(angle) * radius, 0) + + local newpos = self:GetPos() + circlepos -- render.DrawLine(newpos, newpos+VectorRand()*5, red) - render.DrawQuadEasy(newpos,f,6,6,red) + + render.DrawQuadEasy(newpos, f, 6, 6, red) end + -- local bmin, bmax = self:GetRenderBounds() -- render.DrawWireframeBox(self:GetPos(), angle_zero, bmin, bmax) - self.offset = self.offset + (0.00075) + self.offset = self.offset + 0.00075 + if self.offset >= 180 then self.offset = 0 end diff --git a/beatrun/gamemodes/beatrun/entities/weapons/aewep_357.lua b/beatrun/gamemodes/beatrun/entities/weapons/aewep_357.lua index d85da93..f46e3db 100644 --- a/beatrun/gamemodes/beatrun/entities/weapons/aewep_357.lua +++ b/beatrun/gamemodes/beatrun/entities/weapons/aewep_357.lua @@ -1,35 +1,35 @@ -SWEP.ViewModel = "models/weapons/c_357.mdl" -SWEP.WorldModel = "models/weapons/w_357.mdl" +SWEP.ViewModel = "models/weapons/c_357.mdl" +SWEP.WorldModel = "models/weapons/w_357.mdl" -SWEP.Weight = 5 -SWEP.AutoSwitchTo = false -SWEP.AutoSwitchFrom = false +SWEP.Weight = 5 +SWEP.AutoSwitchTo = false +SWEP.AutoSwitchFrom = false -SWEP.Slot = 1 -SWEP.SlotPos = 2 -SWEP.DrawAmmo = true -SWEP.DrawCrosshair = true +SWEP.Slot = 1 +SWEP.SlotPos = 2 +SWEP.DrawAmmo = true +SWEP.DrawCrosshair = true -SWEP.Primary.ClipSize = 6 -SWEP.Primary.DefaultClip = 0 -SWEP.Primary.Automatic = false -SWEP.Primary.Ammo = "357" +SWEP.Primary.ClipSize = 6 +SWEP.Primary.DefaultClip = 0 +SWEP.Primary.Automatic = false +SWEP.Primary.Ammo = "357" + +SWEP.Secondary.ClipSize = -1 +SWEP.Secondary.DefaultClip = -1 +SWEP.Secondary.Automatic = false +SWEP.Secondary.Ammo = "none" SWEP.UseHands = true -SWEP.Secondary.ClipSize = -1 -SWEP.Secondary.DefaultClip = -1 -SWEP.Secondary.Automatic = false -SWEP.Secondary.Ammo = "none" - SWEP.Spawnable = true SWEP.BobScale = 0 SWEP.SwayScale = 0 SWEP.ViewModelFOV = 70 -SWEP.PrintName = "357" -- This will be shown in the spawn menu, and in the weapon selection menu -SWEP.Author = "datae" -- These two options will be shown when you have the weapon highlighted in the weapon selection menu -SWEP.Instructions = "" +SWEP.PrintName = "357" +SWEP.Author = "datae" +SWEP.Instructions = "" SWEP.BulletData = {} SWEP.Damage = 150 @@ -67,173 +67,172 @@ SWEP.OffsetPos = Vector(0,0,-2) SWEP.OffsetAng = Angle() local coolswayCT = 0 -local function LerpC(t,a,b,powa) - -return a + (b - a) * math.pow(t,powa) +local function LerpC(t, a, b, powa) + return a + (b - a) * math.pow(t, powa) end function SWEP:Move_Process(EyePos, EyeAng, velocity) - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp - local FT = FrameTime() - local sightedmult = 1 + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + local FT = FrameTime() + local sightedmult = 1 - VMPos:Set(vector_origin) - VMAng:Set(angle_zero) + VMPos:Set(vector_origin) + VMAng:Set(angle_zero) - VMPosOffset.x = self:GetOwner():GetVelocity().z*0.0015 * sightedmult - VMPosOffset.y = math.Clamp(velocity.y*-0.004, -1, 1) * sightedmult + VMPosOffset.x = self:GetOwner():GetVelocity().z * 0.0015 * sightedmult + VMPosOffset.y = math.Clamp(velocity.y * -0.004, -1, 1) * sightedmult - VMPosOffset_Lerp.x = Lerp(8*FT, VMPosOffset_Lerp.x, VMPosOffset.x) - VMPosOffset_Lerp.y = Lerp(8*FT, VMPosOffset_Lerp.y, VMPosOffset.y) - - VMAngOffset.x = math.Clamp(VMPosOffset.x * 8, -4, 4) - VMAngOffset.y = VMPosOffset.y * 5 - VMAngOffset.z = VMPosOffset.y * 0.5 + (VMPosOffset.x * -5) - - VMAngOffset_Lerp.x = LerpC(10*FT, VMAngOffset_Lerp.x, VMAngOffset.x, 0.75) - VMAngOffset_Lerp.y = LerpC(5*FT, VMAngOffset_Lerp.y, VMAngOffset.y, 0.6) - VMAngOffset_Lerp.z = Lerp(25*FT, VMAngOffset_Lerp.z, VMAngOffset.z) + VMPosOffset_Lerp.x = Lerp(8 * FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(8 * FT, VMPosOffset_Lerp.y, VMPosOffset.y) - VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) - VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) - - VMAng:Add(VMAngOffset_Lerp) - + VMAngOffset.x = math.Clamp(VMPosOffset.x * 8, -4, 4) + VMAngOffset.y = VMPosOffset.y * 5 + VMAngOffset.z = VMPosOffset.y * 0.5 + (VMPosOffset.x * -5) + + VMAngOffset_Lerp.x = LerpC(10 * FT, VMAngOffset_Lerp.x, VMAngOffset.x, 0.75) + VMAngOffset_Lerp.y = LerpC(5 * FT, VMAngOffset_Lerp.y, VMAngOffset.y, 0.6) + VMAngOffset_Lerp.z = Lerp(25 * FT, VMAngOffset_Lerp.z, VMAngOffset.z) + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + VMAng:Add(VMAngOffset_Lerp) end -local stepend = math.pi*4 -function SWEP:Step_Process(EyePos,EyeAng, velocity) - local CT = CurTime() - if CT > coolswayCT then - coolswayCT = CT - else - return - end - - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp - velocity = math.min(velocity:Length(), 500) - - local delta = math.abs(self.StepBob*2/(stepend)-1) - local FT = FrameTime() - local FTMult = 300 * FT - local sightedmult = 1 - local sprintmult = 1 - local onground = self:GetOwner():OnGround() - self.StepBob = self.StepBob + (velocity * 0.00015 + (math.pow(delta, 0.01)*0.03)) * (FTMult) +local stepend = math.pi * 4 - if self.StepBob >= stepend then - self.StepBob = 0 - self.StepRandomX = math.Rand(1,1.5) - self.StepRandomY = math.Rand(1,1.5) - end - - if velocity == 0 then - self.StepBob = 0 - end - - if onground then - VMPosOffset.x = (math.sin(self.StepBob) * velocity * 0.000375 * sightedmult) * self.StepRandomX - VMPosOffset.y = (math.sin(self.StepBob * 0.5) * velocity * 0.0005 * sightedmult) * self.StepRandomY - VMPosOffset.z = math.sin(self.StepBob * 0.75) * velocity * 0.002 * sightedmult - end - - VMPosOffset_Lerp.x = Lerp(16*FT, VMPosOffset_Lerp.x, VMPosOffset.x) - VMPosOffset_Lerp.y = Lerp(4*FT, VMPosOffset_Lerp.y, VMPosOffset.y) - VMPosOffset_Lerp.z = Lerp(2*FT, VMPosOffset_Lerp.z, VMPosOffset.z) - - VMAngOffset.x = VMPosOffset_Lerp.x * 2 - VMAngOffset.y = VMPosOffset_Lerp.y * -7.5 - VMAngOffset.z = VMPosOffset_Lerp.y * 5 - - - VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) - VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) - VMPos:Add(VMAng:Forward() * VMPosOffset_Lerp.z) - - VMAng:Add(VMAngOffset) +function SWEP:Step_Process(EyePos, EyeAng, velocity) + local CT = CurTime() + + if CT > coolswayCT then + coolswayCT = CT + else + return + end + + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, _ = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + + velocity = math.min(velocity:Length(), 500) + + local delta = math.abs(self.StepBob * 2 / stepend - 1) + local FT = FrameTime() + local FTMult = 300 * FT + local sightedmult = 1 + -- local sprintmult = 1 + local onground = self:GetOwner():OnGround() + self.StepBob = self.StepBob + (velocity * 0.00015 + (math.pow(delta, 0.01) * 0.03)) * FTMult + + if self.StepBob >= stepend then + self.StepBob = 0 + self.StepRandomX = math.Rand(1, 1.5) + self.StepRandomY = math.Rand(1, 1.5) + end + + if velocity == 0 then + self.StepBob = 0 + end + + if onground then + VMPosOffset.x = (math.sin(self.StepBob) * velocity * 0.000375 * sightedmult) * self.StepRandomX + VMPosOffset.y = (math.sin(self.StepBob * 0.5) * velocity * 0.0005 * sightedmult) * self.StepRandomY + VMPosOffset.z = math.sin(self.StepBob * 0.75) * velocity * 0.002 * sightedmult + end + + VMPosOffset_Lerp.x = Lerp(16 * FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(4 * FT, VMPosOffset_Lerp.y, VMPosOffset.y) + VMPosOffset_Lerp.z = Lerp(2 * FT, VMPosOffset_Lerp.z, VMPosOffset.z) + + VMAngOffset.x = VMPosOffset_Lerp.x * 2 + VMAngOffset.y = VMPosOffset_Lerp.y * -7.5 + VMAngOffset.z = VMPosOffset_Lerp.y * 5 + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + VMPos:Add(VMAng:Forward() * VMPosOffset_Lerp.z) + VMAng:Add(VMAngOffset) end function SWEP:Breath_Health() - local owner = self:GetOwner() - if !IsValid(owner) then return end - local health = owner:Health() - local maxhealth = owner:GetMaxHealth() - - self.Breath_Intensity = math.Clamp( maxhealth / health, 0, 2 ) - self.Breath_Rate = math.Clamp( ((maxhealth*0.5) / health ), 1, 1.5 ) + local owner = self:GetOwner() + + if not IsValid(owner) then return end + + local health = owner:Health() + local maxhealth = owner:GetMaxHealth() + + self.Breath_Intensity = math.Clamp(maxhealth / health, 0, 2) + self.Breath_Rate = math.Clamp((maxhealth * 0.5) / health, 1, 1.5) end function SWEP:Breath_StateMult() - local owner = self:GetOwner() - if !IsValid(owner) then return end - local sightedmult = 1 - - self.Breath_Intensity = self.Breath_Intensity * sightedmult + local owner = self:GetOwner() + + if not IsValid(owner) then return end + + local sightedmult = 1 + + self.Breath_Intensity = self.Breath_Intensity * sightedmult end function SWEP:Breath_Process(EyePos, EyeAng) - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - - self:Breath_Health() - self:Breath_StateMult() - VMPosOffset.x = (math.sin(CurTime() * 2 * self.Breath_Rate) * 0.1) * self.Breath_Intensity - VMPosOffset.y = (math.sin(CurTime() * 2.5 * self.Breath_Rate) * 0.025) * self.Breath_Intensity - - VMAngOffset.x = VMPosOffset.x * 1.5 - VMAngOffset.y = VMPosOffset.y * 2 - - VMPos:Add(VMAng:Up() * VMPosOffset.x) - VMPos:Add(VMAng:Right() * VMPosOffset.y) - - VMAng:Add(VMAngOffset) - + local VMPos, VMAng = self.VMPos, self.VMAng + + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + + self:Breath_Health() + self:Breath_StateMult() + + VMPosOffset.x = (math.sin(CurTime() * 2 * self.Breath_Rate) * 0.1) * self.Breath_Intensity + VMPosOffset.y = (math.sin(CurTime() * 2.5 * self.Breath_Rate) * 0.025) * self.Breath_Intensity + VMAngOffset.x = VMPosOffset.x * 1.5 + VMAngOffset.y = VMPosOffset.y * 2 + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + VMAng:Add(VMAngOffset) end function SWEP:Look_Process(EyePos, EyeAng) - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - local FT = FrameTime() - local sightedmult = 1 - self.SmoothEyeAng = LerpAngle(0.05, self.SmoothEyeAng, EyeAng-self.LastEyeAng) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local FT = FrameTime() + local sightedmult = 1 - VMPosOffset.x = -self.SmoothEyeAng.x * -1 * sightedmult - VMPosOffset.y = self.SmoothEyeAng.y * 0.5 * sightedmult + self.SmoothEyeAng = LerpAngle(0.05, self.SmoothEyeAng, EyeAng - self.LastEyeAng) - VMAngOffset.x = VMPosOffset.x * 2.5 - VMAngOffset.y = VMPosOffset.y * 1.25 - VMAngOffset.z = VMPosOffset.y * 2 - - self.VMLookLerp.y = Lerp(FT*10, self.VMLookLerp.y, VMAngOffset.y * 1.5 + self.SmoothEyeAng.y) - - VMAng.y = VMAng.y - self.VMLookLerp.y - - VMPos:Add(VMAng:Up() * VMPosOffset.x) - VMPos:Add(VMAng:Right() * VMPosOffset.y) - - VMAng:Add(VMAngOffset) - + VMPosOffset.x = -self.SmoothEyeAng.x * -1 * sightedmult + VMPosOffset.y = self.SmoothEyeAng.y * 0.5 * sightedmult + + VMAngOffset.x = VMPosOffset.x * 2.5 + VMAngOffset.y = VMPosOffset.y * 1.25 + VMAngOffset.z = VMPosOffset.y * 2 + + self.VMLookLerp.y = Lerp(FT * 10, self.VMLookLerp.y, VMAngOffset.y * 1.5 + self.SmoothEyeAng.y) + + VMAng.y = VMAng.y - self.VMLookLerp.y + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + VMAng:Add(VMAngOffset) end function SWEP:GetVMPosition(EyePos, EyeAng) - return self.VMPos, self.VMAng + return self.VMPos, self.VMAng end function SWEP:GetViewModelPosition(eyepos, eyeang) return self:GetVMPosition(eyepos, eyeang) end - function SWEP:Deploy() self:SendWeaponAnim(ACT_VM_DRAW) - self:SetNextPrimaryFire(CurTime()+0.5) - self:SetHoldType( "revolver" ) - + self:SetNextPrimaryFire(CurTime() + 0.5) + self:SetHoldType("revolver") + if CLIENT then self.CLVM = ClientsideModel(self.ViewModel) self:SetNoDraw(true) @@ -244,6 +243,7 @@ function SWEP:Holster() if IsValid(self.CLVM) then self.CLVM:Remove() end + return true end @@ -255,22 +255,23 @@ end function SWEP:GenerateBullet() local tbl = self.BulletData - tbl.Attacker = self.Owner + tbl.Attacker = self:GetOwner() tbl.Damage = self.Damage tbl.Force = self.Force tbl.Distance = self.Distance tbl.Num = 1 tbl.Spread = vector_origin - - tbl.Src = self.Owner:GetShootPos() - tbl.Dir = self.Owner:EyeAngles():Forward() + tbl.Src = self:GetOwner():GetShootPos() + tbl.Dir = self:GetOwner():EyeAngles():Forward() + return tbl end function SWEP:MuzzleFlash() - local vPoint = self.Owner:EyePos()+self.Owner:EyeAngles():Forward()*10 + local vPoint = self:GetOwner():EyePos() + self:GetOwner():EyeAngles():Forward() * 10 local ed = EffectData() - ed:SetOrigin( vPoint ) + + ed:SetOrigin(vPoint) ed:SetScale(1) ed:SetEntity(self) end @@ -280,11 +281,15 @@ function SWEP:DryFire() end function SWEP:Reload() - if self:Clip1() >= self:GetMaxClip1() or self.Owner:GetAmmoCount( self.Primary.Ammo ) <= 0 then return end + if self:Clip1() >= self:GetMaxClip1() or self:GetOwner():GetAmmoCount(self.Primary.Ammo) <= 0 then return end if self.ReloadTime and CurTime() <= self.ReloadTime then return end - self:DefaultReload( ACT_VM_RELOAD ) - local AnimationTime = self.Owner:GetViewModel():SequenceDuration() + + self:DefaultReload(ACT_VM_RELOAD) + + local AnimationTime = self:GetOwner():GetViewModel():SequenceDuration() + self.ReloadTime = CurTime() + AnimationTime + self:SetNextPrimaryFire(CurTime() + AnimationTime) self:SetNextSecondaryFire(CurTime() + AnimationTime) self:EmitSound("Weapon_357.Reload") @@ -299,47 +304,52 @@ end function SWEP:PostDrawViewModel(vm, wep, ply) local EyePos, EyeAng = EyePos(), EyeAngles() - local velocity = self:GetOwner():GetVelocity() - velocity = WorldToLocal(velocity, angle_zero, vector_origin, EyeAng) - self:Move_Process(EyePos, EyeAng, velocity) - self:Step_Process(EyePos, EyeAng, velocity) - self:Breath_Process(EyePos, EyeAng) - self:Look_Process(EyePos, EyeAng) - - self.LastEyeAng = EyeAng - self.LastEyePos = EyePos - self.LastVelocity = velocity + local velocity = self:GetOwner():GetVelocity() + + velocity = WorldToLocal(velocity, angle_zero, vector_origin, EyeAng) + + self:Move_Process(EyePos, EyeAng, velocity) + self:Step_Process(EyePos, EyeAng, velocity) + self:Breath_Process(EyePos, EyeAng) + self:Look_Process(EyePos, EyeAng) + self.LastEyeAng = EyeAng + self.LastEyePos = EyePos + self.LastVelocity = velocity + + local offsetpos, _ = LocalToWorld(self.OffsetPos, self.OffsetAng, self.VMPos, self.VMAng) - local offsetpos, offsetang = LocalToWorld(self.OffsetPos, self.OffsetAng, self.VMPos, self.VMAng) self.VMPos:Set(offsetpos) + if CLIENT and IsValid(self.CLVM) then - cam.Start3D(vector_origin, angle_zero, self.Owner:GetFOV()*0.8) - cam.IgnoreZ(true) - self.CLVM:SetPos(self.VMPos) - self.CLVM:SetAngles(self.VMAng) - - ply:GetHands():SetParent(self.CLVM) - ply:GetHands():SetupBones() - ply:GetHands():DrawModel() - - self.CLVM:SetSequence(vm:GetSequence()) - self.CLVM:SetCycle(vm:GetCycle()) - - self.CLVM:SetupBones() - self.CLVM:DrawModel() - cam.IgnoreZ(false) + cam.Start3D(vector_origin, angle_zero, self:GetOwner():GetFOV() * 0.8) + cam.IgnoreZ(true) + + self.CLVM:SetPos(self.VMPos) + self.CLVM:SetAngles(self.VMAng) + + ply:GetHands():SetParent(self.CLVM) + ply:GetHands():SetupBones() + ply:GetHands():DrawModel() + + self.CLVM:SetSequence(vm:GetSequence()) + self.CLVM:SetCycle(vm:GetCycle()) + self.CLVM:SetupBones() + self.CLVM:DrawModel() + + cam.IgnoreZ(false) cam.End3D() end end function SWEP:PreDrawViewModel(vm, wep, ply) - -- self:PostDrawViewModel(vm, wep, ply) return true end -hook.Add("PreDrawTranslucentRenderables","ae", function() +-- self:PostDrawViewModel(vm, wep, ply) +hook.Add("PreDrawTranslucentRenderables", "ae", function() local ply = LocalPlayer() local activewep = ply:GetActiveWeapon() + if activewep.CLVM then activewep:PostDrawViewModel(ply:GetViewModel(), activewep, ply) end @@ -348,33 +358,36 @@ end) hook.Add("VManipVMEntity", "ae", function() local ply = LocalPlayer() local activewep = ply:GetActiveWeapon() - if activewep.CLVM then - return activewep.CLVM - end + + if activewep.CLVM then return activewep.CLVM end end) + hook.Add("VManipLegsVMEntity", "ae", function() local ply = LocalPlayer() local activewep = ply:GetActiveWeapon() - if activewep.CLVM then - return activewep.CLVM - end + + if activewep.CLVM then return activewep.CLVM end end) function SWEP:PrimaryAttack() if self:Clip1() < 1 then self:DryFire() - self:SetNextPrimaryFire(CurTime()+1) + self:SetNextPrimaryFire(CurTime() + 1) + return end - self:SetClip1(self:Clip1()-1) - self.Owner:MuzzleFlash() + + self:SetClip1(self:Clip1() - 1) + self:GetOwner():MuzzleFlash() self:SendWeaponAnim(ACT_VM_PRIMARYATTACK) - self:SetNextPrimaryFire(CurTime()+0.65) + self:SetNextPrimaryFire(CurTime() + 0.65) self:EmitSound("Weapon_357.Single") - self:FireBullets( self:GenerateBullet() ) - self.Owner:ViewPunch(Angle(-10,0,0)) + self:FireBullets(self:GenerateBullet()) + self:GetOwner():ViewPunch(Angle(-10, 0, 0)) + return true end + function SWEP:SecondaryAttack() return true end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/weapons/aewep_base.lua b/beatrun/gamemodes/beatrun/entities/weapons/aewep_base.lua index 40c41e1..2230443 100644 --- a/beatrun/gamemodes/beatrun/entities/weapons/aewep_base.lua +++ b/beatrun/gamemodes/beatrun/entities/weapons/aewep_base.lua @@ -1,35 +1,35 @@ -SWEP.ViewModel = "models/weapons/c_smg1.mdl" -SWEP.WorldModel = "models/weapons/w_357.mdl" +SWEP.ViewModel = "models/weapons/c_smg1.mdl" +SWEP.WorldModel = "models/weapons/w_357.mdl" -SWEP.Weight = 5 -SWEP.AutoSwitchTo = false -SWEP.AutoSwitchFrom = false +SWEP.Weight = 5 +SWEP.AutoSwitchTo = false +SWEP.AutoSwitchFrom = false -SWEP.Slot = 1 -SWEP.SlotPos = 2 -SWEP.DrawAmmo = true -SWEP.DrawCrosshair = true +SWEP.Slot = 1 +SWEP.SlotPos = 2 +SWEP.DrawAmmo = true +SWEP.DrawCrosshair = true -SWEP.Primary.ClipSize = 45 -SWEP.Primary.DefaultClip = 45 -SWEP.Primary.Automatic = true -SWEP.Primary.Ammo = "smg1" +SWEP.Primary.ClipSize = 45 +SWEP.Primary.DefaultClip = 45 +SWEP.Primary.Automatic = true +SWEP.Primary.Ammo = "smg1" SWEP.UseHands = true -SWEP.Secondary.ClipSize = -1 -SWEP.Secondary.DefaultClip = -1 -SWEP.Secondary.Automatic = false -SWEP.Secondary.Ammo = "none" +SWEP.Secondary.ClipSize = -1 +SWEP.Secondary.DefaultClip = -1 +SWEP.Secondary.Automatic = false +SWEP.Secondary.Ammo = "none" SWEP.Spawnable = true SWEP.BobScale = 0 SWEP.SwayScale = 0 SWEP.ViewModelFOV = 70 -SWEP.PrintName = "AE" -- This will be shown in the spawn menu, and in the weapon selection menu -SWEP.Author = "datae" -- These two options will be shown when you have the weapon highlighted in the weapon selection menu -SWEP.Instructions = "" +SWEP.PrintName = "AE" +SWEP.Author = "datae" +SWEP.Instructions = "" SWEP.BulletData = {} SWEP.Damage = 15 @@ -68,210 +68,212 @@ SWEP.OffsetAng = Angle() local coolswayCT = 0 local oldCT = 0 -local function LerpC(t,a,b,powa) - -return a + (b - a) * math.pow(t,powa) +local function LerpC(t, a, b, powa) + return a + (b - a) * math.pow(t, powa) end function SWEP:Move_Process(EyePos, EyeAng, velocity) - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp - local FT = FrameTime() - local sightedmult = 1 + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + local FT = FrameTime() + local sightedmult = 1 - VMPos:Set(EyePos) - VMAng:Set(EyeAng) + VMPos:Set(EyePos) + VMAng:Set(EyeAng) - VMPosOffset.x = self:GetOwner():GetVelocity().z*0.0015 * sightedmult - VMPosOffset.y = math.Clamp(velocity.y*-0.004, -1, 1) * sightedmult + VMPosOffset.x = self:GetOwner():GetVelocity().z * 0.0015 * sightedmult + VMPosOffset.y = math.Clamp(velocity.y * -0.004, -1, 1) * sightedmult + VMPosOffset_Lerp.x = Lerp(8 * FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(8 * FT, VMPosOffset_Lerp.y, VMPosOffset.y) - VMPosOffset_Lerp.x = Lerp(8*FT, VMPosOffset_Lerp.x, VMPosOffset.x) - VMPosOffset_Lerp.y = Lerp(8*FT, VMPosOffset_Lerp.y, VMPosOffset.y) - - VMAngOffset.x = math.Clamp(VMPosOffset.x * 8, -4, 4) - VMAngOffset.y = VMPosOffset.y * -1 - VMAngOffset.z = VMPosOffset.y * 0.5 + (VMPosOffset.x * -5) - - VMAngOffset_Lerp.x = LerpC(10*FT, VMAngOffset_Lerp.x, VMAngOffset.x, 0.75) - VMAngOffset_Lerp.y = LerpC(5*FT, VMAngOffset_Lerp.y, VMAngOffset.y, 0.6) - VMAngOffset_Lerp.z = Lerp(25*FT, VMAngOffset_Lerp.z, VMAngOffset.z) + VMAngOffset.x = math.Clamp(VMPosOffset.x * 8, -4, 4) + VMAngOffset.y = VMPosOffset.y * -1 + VMAngOffset.z = VMPosOffset.y * 0.5 + (VMPosOffset.x * -5) - VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) - VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) - - VMAng:Add(VMAngOffset_Lerp) - + VMAngOffset_Lerp.x = LerpC(10 * FT, VMAngOffset_Lerp.x, VMAngOffset.x, 0.75) + VMAngOffset_Lerp.y = LerpC(5 * FT, VMAngOffset_Lerp.y, VMAngOffset.y, 0.6) + VMAngOffset_Lerp.z = Lerp(25 * FT, VMAngOffset_Lerp.z, VMAngOffset.z) + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + VMAng:Add(VMAngOffset_Lerp) end -local stepend = math.pi*4 -function SWEP:Step_Process(EyePos,EyeAng, velocity) - local CT = CurTime() - if CT > coolswayCT then - coolswayCT = CT - else - return - end - - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp - velocity = math.min(velocity:Length(), 500) - - local delta = math.abs(self.StepBob*2/(stepend)-1) - local FT = FrameTime() - local FTMult = 300 * FT - local sightedmult = 1 - local sprintmult = 1 - local onground = self:GetOwner():OnGround() - self.StepBob = self.StepBob + (velocity * 0.00015 + (math.pow(delta, 0.01)*0.03)) * (FTMult) +local stepend = math.pi * 4 - if self.StepBob >= stepend then - self.StepBob = 0 - self.StepRandomX = math.Rand(1,1.5) - self.StepRandomY = math.Rand(1,1.5) - end - - if velocity == 0 then - self.StepBob = 0 - end - - if onground then - VMPosOffset.x = (math.sin(self.StepBob) * velocity * 0.000375 * sightedmult) * self.StepRandomX - VMPosOffset.y = (math.sin(self.StepBob * 0.5) * velocity * 0.0005 * sightedmult) * self.StepRandomY - VMPosOffset.z = math.sin(self.StepBob * 0.75) * velocity * 0.002 * sightedmult - end - - VMPosOffset_Lerp.x = Lerp(16*FT, VMPosOffset_Lerp.x, VMPosOffset.x) - VMPosOffset_Lerp.y = Lerp(4*FT, VMPosOffset_Lerp.y, VMPosOffset.y) - VMPosOffset_Lerp.z = Lerp(2*FT, VMPosOffset_Lerp.z, VMPosOffset.z) - - VMAngOffset.x = VMPosOffset_Lerp.x * 2 - VMAngOffset.y = VMPosOffset_Lerp.y * -7.5 - VMAngOffset.z = VMPosOffset_Lerp.y * 5 - - - VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) - VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) - VMPos:Add(VMAng:Forward() * VMPosOffset_Lerp.z) - - VMAng:Add(VMAngOffset) +function SWEP:Step_Process(EyePos, EyeAng, velocity) + local CT = CurTime() + + if CT > coolswayCT then + coolswayCT = CT + else + return + end + + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, _ = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + + velocity = math.min(velocity:Length(), 500) + + local delta = math.abs(self.StepBob * 2 / stepend - 1) + local FT = FrameTime() + local FTMult = 300 * FT + local sightedmult = 1 + -- local sprintmult = 1 + local onground = self:GetOwner():OnGround() + self.StepBob = self.StepBob + (velocity * 0.00015 + (math.pow(delta, 0.01) * 0.03)) * FTMult + + if self.StepBob >= stepend then + self.StepBob = 0 + self.StepRandomX = math.Rand(1, 1.5) + self.StepRandomY = math.Rand(1, 1.5) + end + + if velocity == 0 then + self.StepBob = 0 + end + + if onground then + VMPosOffset.x = (math.sin(self.StepBob) * velocity * 0.000375 * sightedmult) * self.StepRandomX + VMPosOffset.y = (math.sin(self.StepBob * 0.5) * velocity * 0.0005 * sightedmult) * self.StepRandomY + VMPosOffset.z = math.sin(self.StepBob * 0.75) * velocity * 0.002 * sightedmult + end + + VMPosOffset_Lerp.x = Lerp(16 * FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(4 * FT, VMPosOffset_Lerp.y, VMPosOffset.y) + VMPosOffset_Lerp.z = Lerp(2 * FT, VMPosOffset_Lerp.z, VMPosOffset.z) + + VMAngOffset.x = VMPosOffset_Lerp.x * 2 + VMAngOffset.y = VMPosOffset_Lerp.y * -7.5 + VMAngOffset.z = VMPosOffset_Lerp.y * 5 + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + VMPos:Add(VMAng:Forward() * VMPosOffset_Lerp.z) + VMAng:Add(VMAngOffset) end function SWEP:Breath_Health() - local owner = self:GetOwner() - if !IsValid(owner) then return end - local health = owner:Health() - local maxhealth = owner:GetMaxHealth() - - self.Breath_Intensity = math.Clamp( maxhealth / health, 0, 2 ) - self.Breath_Rate = math.Clamp( ((maxhealth*0.5) / health ), 1, 1.5 ) + local owner = self:GetOwner() + + if not IsValid(owner) then return end + + local health = owner:Health() + local maxhealth = owner:GetMaxHealth() + + self.Breath_Intensity = math.Clamp(maxhealth / health, 0, 2) + self.Breath_Rate = math.Clamp((maxhealth * 0.5) / health, 1, 1.5) end function SWEP:Breath_StateMult() - local owner = self:GetOwner() - if !IsValid(owner) then return end - local sightedmult = 1 - - self.Breath_Intensity = self.Breath_Intensity * sightedmult + local owner = self:GetOwner() + + if not IsValid(owner) then return end + + local sightedmult = 1 + + self.Breath_Intensity = self.Breath_Intensity * sightedmult end function SWEP:Breath_Process(EyePos, EyeAng) - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - - self:Breath_Health() - self:Breath_StateMult() - VMPosOffset.x = (math.sin(CurTime() * 2 * self.Breath_Rate) * 0.1) * self.Breath_Intensity - VMPosOffset.y = (math.sin(CurTime() * 2.5 * self.Breath_Rate) * 0.025) * self.Breath_Intensity - - VMAngOffset.x = VMPosOffset.x * 1.5 - VMAngOffset.y = VMPosOffset.y * 2 - - VMPos:Add(VMAng:Up() * VMPosOffset.x) - VMPos:Add(VMAng:Right() * VMPosOffset.y) - - VMAng:Add(VMAngOffset) - + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + + self:Breath_Health() + self:Breath_StateMult() + + VMPosOffset.x = (math.sin(CurTime() * 2 * self.Breath_Rate) * 0.1) * self.Breath_Intensity + VMPosOffset.y = (math.sin(CurTime() * 2.5 * self.Breath_Rate) * 0.025) * self.Breath_Intensity + VMAngOffset.x = VMPosOffset.x * 1.5 + VMAngOffset.y = VMPosOffset.y * 2 + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + VMAng:Add(VMAngOffset) end function SWEP:Look_Process(EyePos, EyeAng) - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - local FT = FrameTime() - local sightedmult = 1 - self.SmoothEyeAng = LerpAngle(FT*5, self.SmoothEyeAng, EyeAng-self.LastEyeAng) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local FT = FrameTime() + local sightedmult = 1 - VMPosOffset.x = -self.SmoothEyeAng.x * -1 * sightedmult - VMPosOffset.y = self.SmoothEyeAng.y * 0.5 * sightedmult + self.SmoothEyeAng = LerpAngle(FT * 5, self.SmoothEyeAng, EyeAng - self.LastEyeAng) - VMAngOffset.x = VMPosOffset.x * 2.5 - VMAngOffset.y = VMPosOffset.y * 1.25 - VMAngOffset.z = VMPosOffset.y * 2 - - self.VMLookLerp.y = Lerp(FT*10, self.VMLookLerp.y, VMAngOffset.y * 1.5 + self.SmoothEyeAng.y) - - VMAng.y = VMAng.y - self.VMLookLerp.y - - VMPos:Add(VMAng:Up() * VMPosOffset.x) - VMPos:Add(VMAng:Right() * VMPosOffset.y) - - VMAng:Add(VMAngOffset) - + VMPosOffset.x = -self.SmoothEyeAng.x * -1 * sightedmult + VMPosOffset.y = self.SmoothEyeAng.y * 0.5 * sightedmult + + VMAngOffset.x = VMPosOffset.x * 2.5 + VMAngOffset.y = VMPosOffset.y * 1.25 + VMAngOffset.z = VMPosOffset.y * 2 + + self.VMLookLerp.y = Lerp(FT * 10, self.VMLookLerp.y, VMAngOffset.y * 1.5 + self.SmoothEyeAng.y) + + VMAng.y = VMAng.y - self.VMLookLerp.y + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + VMAng:Add(VMAngOffset) end function SWEP:GetVMPosition(EyePos, EyeAng) if CurTime() == oldCT then return self.VMPos, self.VMAng end - local velocity = self:GetOwner():GetVelocity() - velocity = WorldToLocal(velocity, angle_zero, vector_origin, EyeAng) - self:Move_Process(EyePos, EyeAng, velocity) - self:Step_Process(EyePos, EyeAng, velocity) - self:Breath_Process(EyePos, EyeAng) - self:Look_Process(EyePos, EyeAng) - - self.LastEyeAng = EyeAng - self.LastEyePos = EyePos - self.LastVelocity = velocity - local offsetpos, offsetang = LocalToWorld(self.OffsetPos, self.OffsetAng, self.VMPos, self.VMAng) + local velocity = self:GetOwner():GetVelocity() + velocity = WorldToLocal(velocity, angle_zero, vector_origin, EyeAng) + + self:Move_Process(EyePos, EyeAng, velocity) + self:Step_Process(EyePos, EyeAng, velocity) + self:Breath_Process(EyePos, EyeAng) + self:Look_Process(EyePos, EyeAng) + self.LastEyeAng = EyeAng + self.LastEyePos = EyePos + self.LastVelocity = velocity + + local offsetpos, _ = LocalToWorld(self.OffsetPos, self.OffsetAng, self.VMPos, self.VMAng) + self.VMPos:Set(offsetpos) -- self.VMAng:Add(offsetang) oldCT = CurTime() - return self.VMPos, self.VMAng + + return self.VMPos, self.VMAng end function SWEP:GetViewModelPosition(eyepos, eyeang) return self:GetVMPosition(eyepos, eyeang) end - function SWEP:Deploy() self:SendWeaponAnim(ACT_VM_DRAW) - self:SetNextPrimaryFire(CurTime()+0.5) + self:SetNextPrimaryFire(CurTime() + 0.5) end function SWEP:GenerateBullet() local tbl = self.BulletData - tbl.Attacker = self.Owner + tbl.Attacker = self:GetOwner() tbl.Damage = self.Damage tbl.Force = self.Force tbl.Distance = self.Distance tbl.Num = 1 - tbl.Spread = Vector(0.05,0.05,0) - - tbl.Src = self.Owner:GetShootPos() - tbl.Dir = self.Owner:EyeAngles():Forward() + tbl.Spread = Vector(0.05, 0.05, 0) + tbl.Src = self:GetOwner():GetShootPos() + tbl.Dir = self:GetOwner():EyeAngles():Forward() + return tbl end function SWEP:MuzzleFlash() - local vPoint = self.Owner:EyePos()+self.Owner:EyeAngles():Forward()*10 + local vPoint = self:GetOwner():EyePos() + self:GetOwner():EyeAngles():Forward() * 10 local ed = EffectData() - ed:SetOrigin( vPoint ) + + ed:SetOrigin(vPoint) ed:SetScale(1) ed:SetEntity(self) - util.Effect( "arccw_shelleffect", ed ) + + util.Effect("arccw_shelleffect", ed) end function SWEP:DryFire() @@ -279,10 +281,13 @@ function SWEP:DryFire() end function SWEP:Reload() - if self:Clip1() >= self:GetMaxClip1() or self.Owner:GetAmmoCount( self.Primary.Ammo ) <= 0 then return end + if self:Clip1() >= self:GetMaxClip1() or self:GetOwner():GetAmmoCount(self.Primary.Ammo) <= 0 then return end if self.ReloadTime and CurTime() <= self.ReloadTime then return end - self:DefaultReload( ACT_VM_RELOAD ) - local AnimationTime = self.Owner:GetViewModel():SequenceDuration() + + self:DefaultReload(ACT_VM_RELOAD) + + local AnimationTime = self:GetOwner():GetViewModel():SequenceDuration() + self.ReloadTime = CurTime() + AnimationTime self:SetNextPrimaryFire(CurTime() + AnimationTime) self:SetNextSecondaryFire(CurTime() + AnimationTime) @@ -292,19 +297,26 @@ end function SWEP:PrimaryAttack() if self:Clip1() < 1 then self:DryFire() - self:SetNextPrimaryFire(CurTime()+0.5) + self:SetNextPrimaryFire(CurTime() + 0.5) + return end - self:SetClip1(self:Clip1()-1) - self.Owner:MuzzleFlash() + + self:SetClip1(self:Clip1() - 1) + self:GetOwner():MuzzleFlash() self:SendWeaponAnim(ACT_VM_PRIMARYATTACK) - self:SetNextPrimaryFire(CurTime()+0.065) + self:SetNextPrimaryFire(CurTime() + 0.065) self:EmitSound("weapons/smg1/smg1_fire1.wav") - self:FireBullets( self:GenerateBullet() ) - self.Owner:ViewPunch(Angle(-0.1,0,0)) - if IsFirstTimePredicted() then self:MuzzleFlash() end + self:FireBullets(self:GenerateBullet()) + self:GetOwner():ViewPunch(Angle(-0.1, 0, 0)) + + if IsFirstTimePredicted() then + self:MuzzleFlash() + end + return true end + function SWEP:SecondaryAttack() return true end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/weapons/aewep_nt.lua b/beatrun/gamemodes/beatrun/entities/weapons/aewep_nt.lua index 61a66c4..755d4b2 100644 --- a/beatrun/gamemodes/beatrun/entities/weapons/aewep_nt.lua +++ b/beatrun/gamemodes/beatrun/entities/weapons/aewep_nt.lua @@ -1,35 +1,35 @@ -SWEP.ViewModel = "models/weapons/v_jinrai_srm_s.mdl" -SWEP.WorldModel = "models/weapons/w_357.mdl" +SWEP.ViewModel = "models/weapons/v_jinrai_srm_s.mdl" +SWEP.WorldModel = "models/weapons/w_357.mdl" -SWEP.Weight = 5 -SWEP.AutoSwitchTo = false -SWEP.AutoSwitchFrom = false +SWEP.Weight = 5 +SWEP.AutoSwitchTo = false +SWEP.AutoSwitchFrom = false -SWEP.Slot = 1 -SWEP.SlotPos = 2 -SWEP.DrawAmmo = true -SWEP.DrawCrosshair = true +SWEP.Slot = 1 +SWEP.SlotPos = 2 +SWEP.DrawAmmo = true +SWEP.DrawCrosshair = true -SWEP.Primary.ClipSize = 45 -SWEP.Primary.DefaultClip = 45 -SWEP.Primary.Automatic = true -SWEP.Primary.Ammo = "smg1" +SWEP.Primary.ClipSize = 45 +SWEP.Primary.DefaultClip = 45 +SWEP.Primary.Automatic = true +SWEP.Primary.Ammo = "smg1" SWEP.UseHands = true -SWEP.Secondary.ClipSize = -1 -SWEP.Secondary.DefaultClip = -1 -SWEP.Secondary.Automatic = false -SWEP.Secondary.Ammo = "none" +SWEP.Secondary.ClipSize = -1 +SWEP.Secondary.DefaultClip = -1 +SWEP.Secondary.Automatic = false +SWEP.Secondary.Ammo = "none" SWEP.Spawnable = true SWEP.BobScale = 0 SWEP.SwayScale = 0 SWEP.ViewModelFOV = 70 -SWEP.PrintName = "AE" -- This will be shown in the spawn menu, and in the weapon selection menu -SWEP.Author = "datae" -- These two options will be shown when you have the weapon highlighted in the weapon selection menu -SWEP.Instructions = "" +SWEP.PrintName = "AE" +SWEP.Author = "datae" +SWEP.Instructions = "" SWEP.BulletData = {} SWEP.Damage = 15 @@ -62,216 +62,219 @@ SWEP.VelocityLastDiff = 0 SWEP.Breath_Intensity = 1 SWEP.Breath_Rate = 1 -SWEP.OffsetPos = Vector(10,-10,0) --NT +SWEP.OffsetPos = Vector(10, -10, 0) --NT -- SWEP.OffsetPos = Vector(0,0,-2) SWEP.OffsetAng = Angle() local coolswayCT = 0 local oldCT = 0 -local function LerpC(t,a,b,powa) - -return a + (b - a) * math.pow(t,powa) +local function LerpC(t, a, b, powa) + return a + (b - a) * math.pow(t, powa) end function SWEP:Move_Process(EyePos, EyeAng, velocity) - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp - local FT = FrameTime() - local sightedmult = 1 + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + local FT = FrameTime() + local sightedmult = 1 - VMPos:Set(EyePos) - VMAng:Set(EyeAng) + VMPos:Set(EyePos) + VMAng:Set(EyeAng) - VMPosOffset.x = self:GetOwner():GetVelocity().z*0.0015 * sightedmult - VMPosOffset.y = math.Clamp(velocity.y*-0.004, -1, 1) * sightedmult + VMPosOffset.x = self:GetOwner():GetVelocity().z * 0.0015 * sightedmult + VMPosOffset.y = math.Clamp(velocity.y * -0.004, -1, 1) * sightedmult + VMPosOffset_Lerp.x = Lerp(8 * FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(8 * FT, VMPosOffset_Lerp.y, VMPosOffset.y) - VMPosOffset_Lerp.x = Lerp(8*FT, VMPosOffset_Lerp.x, VMPosOffset.x) - VMPosOffset_Lerp.y = Lerp(8*FT, VMPosOffset_Lerp.y, VMPosOffset.y) - - VMAngOffset.x = math.Clamp(VMPosOffset.x * 8, -4, 4) - VMAngOffset.y = VMPosOffset.y * -1 - VMAngOffset.z = VMPosOffset.y * 0.5 + (VMPosOffset.x * -5) - - VMAngOffset_Lerp.x = LerpC(10*FT, VMAngOffset_Lerp.x, VMAngOffset.x, 0.75) - VMAngOffset_Lerp.y = LerpC(5*FT, VMAngOffset_Lerp.y, VMAngOffset.y, 0.6) - VMAngOffset_Lerp.z = Lerp(25*FT, VMAngOffset_Lerp.z, VMAngOffset.z) + VMAngOffset.x = math.Clamp(VMPosOffset.x * 8, -4, 4) + VMAngOffset.y = VMPosOffset.y * -1 + VMAngOffset.z = VMPosOffset.y * 0.5 + (VMPosOffset.x * -5) - VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) - VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) - - VMAng:Add(VMAngOffset_Lerp) - + VMAngOffset_Lerp.x = LerpC(10 * FT, VMAngOffset_Lerp.x, VMAngOffset.x, 0.75) + VMAngOffset_Lerp.y = LerpC(5 * FT, VMAngOffset_Lerp.y, VMAngOffset.y, 0.6) + VMAngOffset_Lerp.z = Lerp(25 * FT, VMAngOffset_Lerp.z, VMAngOffset.z) + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + VMAng:Add(VMAngOffset_Lerp) end -local stepend = math.pi*4 -function SWEP:Step_Process(EyePos,EyeAng, velocity) - local CT = CurTime() - if CT > coolswayCT then - coolswayCT = CT - else - return - end - - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp - velocity = math.min(velocity:Length(), 500) - - local delta = math.abs(self.StepBob*2/(stepend)-1) - local FT = FrameTime() - local FTMult = 300 * FT - local sightedmult = 1 - local sprintmult = 1 - local onground = self:GetOwner():OnGround() - self.StepBob = self.StepBob + (velocity * 0.00015 + (math.pow(delta, 0.01)*0.03)) * (FTMult) +local stepend = math.pi * 4 - if self.StepBob >= stepend then - self.StepBob = 0 - self.StepRandomX = math.Rand(1,1.5) - self.StepRandomY = math.Rand(1,1.5) - end - - if velocity == 0 then - self.StepBob = 0 - end - - if onground then - VMPosOffset.x = (math.sin(self.StepBob) * velocity * 0.000375 * sightedmult) * self.StepRandomX - VMPosOffset.y = (math.sin(self.StepBob * 0.5) * velocity * 0.0005 * sightedmult) * self.StepRandomY - VMPosOffset.z = math.sin(self.StepBob * 0.75) * velocity * 0.002 * sightedmult - end - - VMPosOffset_Lerp.x = Lerp(16*FT, VMPosOffset_Lerp.x, VMPosOffset.x) - VMPosOffset_Lerp.y = Lerp(4*FT, VMPosOffset_Lerp.y, VMPosOffset.y) - VMPosOffset_Lerp.z = Lerp(2*FT, VMPosOffset_Lerp.z, VMPosOffset.z) - - VMAngOffset.x = VMPosOffset_Lerp.x * 2 - VMAngOffset.y = VMPosOffset_Lerp.y * -7.5 - VMAngOffset.z = VMPosOffset_Lerp.y * 5 - - - VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) - VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) - VMPos:Add(VMAng:Forward() * VMPosOffset_Lerp.z) - - VMAng:Add(VMAngOffset) +function SWEP:Step_Process(EyePos, EyeAng, velocity) + local CT = CurTime() + + if CT > coolswayCT then + coolswayCT = CT + else + return + end + + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, _ = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + + velocity = math.min(velocity:Length(), 500) + + local delta = math.abs(self.StepBob * 2 / stepend - 1) + local FT = FrameTime() + local FTMult = 300 * FT + local sightedmult = 1 + -- local sprintmult = 1 + local onground = self:GetOwner():OnGround() + + self.StepBob = self.StepBob + (velocity * 0.00015 + (math.pow(delta, 0.01) * 0.03)) * FTMult + + if self.StepBob >= stepend then + self.StepBob = 0 + self.StepRandomX = math.Rand(1, 1.5) + self.StepRandomY = math.Rand(1, 1.5) + end + + if velocity == 0 then + self.StepBob = 0 + end + + if onground then + VMPosOffset.x = (math.sin(self.StepBob) * velocity * 0.000375 * sightedmult) * self.StepRandomX + VMPosOffset.y = (math.sin(self.StepBob * 0.5) * velocity * 0.0005 * sightedmult) * self.StepRandomY + VMPosOffset.z = math.sin(self.StepBob * 0.75) * velocity * 0.002 * sightedmult + end + + VMPosOffset_Lerp.x = Lerp(16 * FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(4 * FT, VMPosOffset_Lerp.y, VMPosOffset.y) + VMPosOffset_Lerp.z = Lerp(2 * FT, VMPosOffset_Lerp.z, VMPosOffset.z) + + VMAngOffset.x = VMPosOffset_Lerp.x * 2 + VMAngOffset.y = VMPosOffset_Lerp.y * -7.5 + VMAngOffset.z = VMPosOffset_Lerp.y * 5 + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + VMPos:Add(VMAng:Forward() * VMPosOffset_Lerp.z) + VMAng:Add(VMAngOffset) end function SWEP:Breath_Health() - local owner = self:GetOwner() - if !IsValid(owner) then return end - local health = owner:Health() - local maxhealth = owner:GetMaxHealth() - - self.Breath_Intensity = math.Clamp( maxhealth / health, 0, 2 ) - self.Breath_Rate = math.Clamp( ((maxhealth*0.5) / health ), 1, 1.5 ) + local owner = self:GetOwner() + + if not IsValid(owner) then return end + + local health = owner:Health() + local maxhealth = owner:GetMaxHealth() + + self.Breath_Intensity = math.Clamp(maxhealth / health, 0, 2) + self.Breath_Rate = math.Clamp((maxhealth * 0.5) / health, 1, 1.5) end function SWEP:Breath_StateMult() - local owner = self:GetOwner() - if !IsValid(owner) then return end - local sightedmult = 1 - - self.Breath_Intensity = self.Breath_Intensity * sightedmult + local owner = self:GetOwner() + + if not IsValid(owner) then return end + + local sightedmult = 1 + + self.Breath_Intensity = self.Breath_Intensity * sightedmult end function SWEP:Breath_Process(EyePos, EyeAng) - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - - self:Breath_Health() - self:Breath_StateMult() - VMPosOffset.x = (math.sin(CurTime() * 2 * self.Breath_Rate) * 0.1) * self.Breath_Intensity - VMPosOffset.y = (math.sin(CurTime() * 2.5 * self.Breath_Rate) * 0.025) * self.Breath_Intensity - - VMAngOffset.x = VMPosOffset.x * 1.5 - VMAngOffset.y = VMPosOffset.y * 2 - - VMPos:Add(VMAng:Up() * VMPosOffset.x) - VMPos:Add(VMAng:Right() * VMPosOffset.y) - - VMAng:Add(VMAngOffset) - + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + + self:Breath_Health() + self:Breath_StateMult() + + VMPosOffset.x = (math.sin(CurTime() * 2 * self.Breath_Rate) * 0.1) * self.Breath_Intensity + VMPosOffset.y = (math.sin(CurTime() * 2.5 * self.Breath_Rate) * 0.025) * self.Breath_Intensity + VMAngOffset.x = VMPosOffset.x * 1.5 + VMAngOffset.y = VMPosOffset.y * 2 + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + VMAng:Add(VMAngOffset) end function SWEP:Look_Process(EyePos, EyeAng) - local VMPos, VMAng = self.VMPos, self.VMAng - local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset - local FT = FrameTime() - local sightedmult = 1 - self.SmoothEyeAng = LerpAngle(FT*5, self.SmoothEyeAng, EyeAng-self.LastEyeAng) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local FT = FrameTime() + local sightedmult = 1 - VMPosOffset.x = -self.SmoothEyeAng.x * -1 * sightedmult - VMPosOffset.y = self.SmoothEyeAng.y * 0.5 * sightedmult + self.SmoothEyeAng = LerpAngle(FT * 5, self.SmoothEyeAng, EyeAng - self.LastEyeAng) - VMAngOffset.x = VMPosOffset.x * 2.5 - VMAngOffset.y = VMPosOffset.y * 1.25 - VMAngOffset.z = VMPosOffset.y * 2 - - self.VMLookLerp.y = Lerp(FT*10, self.VMLookLerp.y, VMAngOffset.y * 1.5 + self.SmoothEyeAng.y) - - VMAng.y = VMAng.y - self.VMLookLerp.y - - VMPos:Add(VMAng:Up() * VMPosOffset.x) - VMPos:Add(VMAng:Right() * VMPosOffset.y) - - VMAng:Add(VMAngOffset) - + VMPosOffset.x = -self.SmoothEyeAng.x * -1 * sightedmult + VMPosOffset.y = self.SmoothEyeAng.y * 0.5 * sightedmult + VMAngOffset.x = VMPosOffset.x * 2.5 + VMAngOffset.y = VMPosOffset.y * 1.25 + VMAngOffset.z = VMPosOffset.y * 2 + + self.VMLookLerp.y = Lerp(FT * 10, self.VMLookLerp.y, VMAngOffset.y * 1.5 + self.SmoothEyeAng.y) + + VMAng.y = VMAng.y - self.VMLookLerp.y + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + VMAng:Add(VMAngOffset) end function SWEP:GetVMPosition(EyePos, EyeAng) if CurTime() == oldCT then return self.VMPos, self.VMAng end - local velocity = self:GetOwner():GetVelocity() - velocity = WorldToLocal(velocity, angle_zero, vector_origin, EyeAng) - self:Move_Process(EyePos, EyeAng, velocity) - self:Step_Process(EyePos, EyeAng, velocity) - self:Breath_Process(EyePos, EyeAng) - self:Look_Process(EyePos, EyeAng) - - self.LastEyeAng = EyeAng - self.LastEyePos = EyePos - self.LastVelocity = velocity - local offsetpos, offsetang = LocalToWorld(self.OffsetPos, self.OffsetAng, self.VMPos, self.VMAng) + local velocity = self:GetOwner():GetVelocity() + + velocity = WorldToLocal(velocity, angle_zero, vector_origin, EyeAng) + + self:Move_Process(EyePos, EyeAng, velocity) + self:Step_Process(EyePos, EyeAng, velocity) + self:Breath_Process(EyePos, EyeAng) + self:Look_Process(EyePos, EyeAng) + self.LastEyeAng = EyeAng + self.LastEyePos = EyePos + self.LastVelocity = velocity + + local offsetpos, _ = LocalToWorld(self.OffsetPos, self.OffsetAng, self.VMPos, self.VMAng) + self.VMPos:Set(offsetpos) -- self.VMAng:Add(offsetang) oldCT = CurTime() - return self.VMPos, self.VMAng + + return self.VMPos, self.VMAng end function SWEP:CalcViewModelView(vm, oldeyepos, oldeyeang, eyepos, eyeang) return self:GetVMPosition(eyepos, eyeang) end - function SWEP:Deploy() self:SendWeaponAnim(ACT_VM_DRAW) - self:SetNextPrimaryFire(CurTime()+0.5) + self:SetNextPrimaryFire(CurTime() + 0.5) end function SWEP:GenerateBullet() local tbl = self.BulletData - tbl.Attacker = self.Owner + tbl.Attacker = self:GetOwner() tbl.Damage = self.Damage tbl.Force = self.Force tbl.Distance = self.Distance tbl.Num = 1 - tbl.Spread = Vector(0.05,0.05,0) - - tbl.Src = self.Owner:GetShootPos() - tbl.Dir = self.Owner:GetEyeTrace().Normal + tbl.Spread = Vector(0.05, 0.05, 0) + tbl.Src = self:GetOwner():GetShootPos() + tbl.Dir = self:GetOwner():GetEyeTrace().Normal + return tbl end function SWEP:MuzzleFlash() - local vPoint = self.Owner:EyePos()+self.Owner:EyeAngles():Forward()*10 + local vPoint = self:GetOwner():EyePos() + self:GetOwner():EyeAngles():Forward() * 10 local ed = EffectData() - ed:SetOrigin( vPoint ) + + ed:SetOrigin(vPoint) ed:SetScale(1) ed:SetEntity(self) - util.Effect( "arccw_shelleffect", ed ) + + util.Effect("arccw_shelleffect", ed) end function SWEP:DryFire() @@ -279,10 +282,13 @@ function SWEP:DryFire() end function SWEP:Reload() - if self:Clip1() >= self:GetMaxClip1() or self.Owner:GetAmmoCount( self.Primary.Ammo ) <= 0 then return end + if self:Clip1() >= self:GetMaxClip1() or self:GetOwner():GetAmmoCount(self.Primary.Ammo) <= 0 then return end if self.ReloadTime and CurTime() <= self.ReloadTime then return end - self:DefaultReload( ACT_VM_RELOAD ) - local AnimationTime = self.Owner:GetViewModel():SequenceDuration() + + self:DefaultReload(ACT_VM_RELOAD) + + local AnimationTime = self:GetOwner():GetViewModel():SequenceDuration() + self.ReloadTime = CurTime() + AnimationTime self:SetNextPrimaryFire(CurTime() + AnimationTime) self:SetNextSecondaryFire(CurTime() + AnimationTime) @@ -292,19 +298,26 @@ end function SWEP:PrimaryAttack() if self:Clip1() < 1 then self:DryFire() - self:SetNextPrimaryFire(CurTime()+0.5) + self:SetNextPrimaryFire(CurTime() + 0.5) + return end - self:SetClip1(self:Clip1()-1) - self.Owner:MuzzleFlash() + + self:SetClip1(self:Clip1() - 1) + self:GetOwner():MuzzleFlash() self:SendWeaponAnim(ACT_VM_PRIMARYATTACK) - self:SetNextPrimaryFire(CurTime()+0.065) + self:SetNextPrimaryFire(CurTime() + 0.065) self:EmitSound("weapons/smg1/smg1_fire1.wav") - self:FireBullets( self:GenerateBullet() ) - self.Owner:ViewPunch(Angle(-0.1,0,0)) - if IsFirstTimePredicted() then self:MuzzleFlash() end + self:FireBullets(self:GenerateBullet()) + self:GetOwner():ViewPunch(Angle(-0.1, 0, 0)) + + if IsFirstTimePredicted() then + self:MuzzleFlash() + end + return true end + function SWEP:SecondaryAttack() return true end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/weapons/shapedrawer/shared.lua b/beatrun/gamemodes/beatrun/entities/weapons/shapedrawer/shared.lua index 4520a63..15eb7d4 100644 --- a/beatrun/gamemodes/beatrun/entities/weapons/shapedrawer/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/weapons/shapedrawer/shared.lua @@ -1,4 +1,4 @@ -SWEP.PrintName = "X" +SWEP.PrintName = "X" SWEP.Slot = 0 SWEP.SlotPos = 1 SWEP.DrawAmmo = false @@ -14,13 +14,13 @@ SWEP.BounceWeaponIcon = false SWEP.DrawWeaponInfoBox = false SWEP.HoldType = "crossbow" - + SWEP.Spawnable = true SWEP.AdminSpawnable = true SWEP.Category = "Beatrun" - -SWEP.UseHands = true - + +SWEP.UseHands = true + SWEP.ViewModel = "models/weapons/c_pistol.mdl" SWEP.WorldModel = "models/weapons/w_crossbow.mdl" @@ -30,7 +30,7 @@ SWEP.Primary.ClipSize = -1 SWEP.Primary.DefaultClip = -1 SWEP.Primary.Automatic = true SWEP.Primary.Ammo = "none" - + SWEP.Secondary.ClipSize = -1 SWEP.Secondary.DefaultClip = -1 SWEP.Secondary.Automatic = false @@ -74,7 +74,7 @@ function SWEP:PrimaryAttack() table.insert(self.points, ply:EyePos()+ply:EyeAngles():Forward()*50) end end - + function SWEP:SecondaryAttack() self:CallOnClient("SecondaryAttack") @@ -84,7 +84,7 @@ end hook.Add("PostDrawTranslucentRenderables","ShapeGun",function() local ply = Entity(1) - local wep = ply:GetActiveWeapon() + local wep = ply:GetActiveWeapon() or nil if IsValid(wep) and wep:GetClass()=="shapedrawer" then for k,v in ipairs(wep.points) do render.DrawWireframeBox(v,angle_zero,Vector(-1,-1,-1),Vector(1,1,1)) diff --git a/beatrun/gamemodes/beatrun/entities/weapons/ziplinegun/shared.lua b/beatrun/gamemodes/beatrun/entities/weapons/ziplinegun/shared.lua index df411e7..4b8e9bc 100644 --- a/beatrun/gamemodes/beatrun/entities/weapons/ziplinegun/shared.lua +++ b/beatrun/gamemodes/beatrun/entities/weapons/ziplinegun/shared.lua @@ -1,46 +1,45 @@ -SWEP.PrintName = "Zipline Gun" -SWEP.Slot = 0 -SWEP.SlotPos = 1 -SWEP.DrawAmmo = false -SWEP.DrawCrosshair = true +SWEP.PrintName = "Zipline Gun" +SWEP.Slot = 0 +SWEP.SlotPos = 1 +SWEP.DrawAmmo = false +SWEP.DrawCrosshair = true - -SWEP.Author = "" -SWEP.Contact = "" -SWEP.Purpose = "" -SWEP.Instructions = "" +SWEP.Author = "" +SWEP.Contact = "" +SWEP.Purpose = "" +SWEP.Instructions = "" SWEP.BounceWeaponIcon = false SWEP.DrawWeaponInfoBox = false SWEP.HoldType = "crossbow" - -SWEP.Spawnable = true -SWEP.AdminSpawnable = true + +SWEP.Spawnable = true +SWEP.AdminSpawnable = true SWEP.Category = "Beatrun" - -SWEP.UseHands = true - -SWEP.ViewModel = "models/weapons/c_crossbow.mdl" -SWEP.WorldModel = "models/weapons/w_crossbow.mdl" -SWEP.ViewModelFOV=75 --65 75 +SWEP.UseHands = true -SWEP.Primary.ClipSize = -1 -SWEP.Primary.DefaultClip = -1 -SWEP.Primary.Automatic = false -SWEP.Primary.Ammo = "none" - -SWEP.Secondary.ClipSize = -1 -SWEP.Secondary.DefaultClip = -1 -SWEP.Secondary.Automatic = false -SWEP.Secondary.Ammo = "none" +SWEP.ViewModel = "models/weapons/c_crossbow.mdl" +SWEP.WorldModel = "models/weapons/w_crossbow.mdl" + +SWEP.ViewModelFOV = 75 -- 65 + +SWEP.Primary.ClipSize = -1 +SWEP.Primary.DefaultClip = -1 +SWEP.Primary.Automatic = false +SWEP.Primary.Ammo = "none" + +SWEP.Secondary.ClipSize = -1 +SWEP.Secondary.DefaultClip = -1 +SWEP.Secondary.Automatic = false +SWEP.Secondary.Ammo = "none" function SWEP:SetupDataTables() end function SWEP:Deploy() - self:SetHoldType( self.HoldType ) + self:SetHoldType(self.HoldType) self:SendWeaponAnim(ACT_VM_DRAW) end @@ -48,10 +47,8 @@ function SWEP:Initialize() end function SWEP:Think() - end - function SWEP:Holster() return true end @@ -63,13 +60,15 @@ function SWEP:Reload() end function SWEP:PrimaryAttack() - local ply = self.Owner + local ply = self:GetOwner() + if SERVER then CreateZipline(ply:EyePos(), ply:GetEyeTrace().HitPos) end end - function SWEP:SecondaryAttack() - + -- for k, v in pairs(ziplines) do + -- v:Remove() + -- end end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Checkpoints.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Checkpoints.lua index 453a57a..7eb777f 100644 --- a/beatrun/gamemodes/beatrun/gamemode/sh/Checkpoints.lua +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Checkpoints.lua @@ -129,7 +129,7 @@ if CLIENT then LocalPlayer():EmitSound("A_TT_Finish_Positive.wav") SaveCheckpointTime() - SaveReplayData() + -- SaveReplayData() else timetext = "+" .. string.FormattedTime(math.abs(timestr), "%02i:%02i:%02i") timecolor = color_negative @@ -300,13 +300,13 @@ function LoadCheckpointTime() end function SaveReplayData() - local replay = util.TableToJSON(LocalPlayer().ReplayTicks) + local replay = util.Compress(util.TableToJSON(LocalPlayer().ReplayTicks)) local dir = "beatrun/replays/" .. game.GetMap() .. "/" if not replay then return end file.CreateDir(dir) - file.Write(dir .. Course_ID .. ".txt", util.Compress(replay)) + file.Write(dir .. Course_ID .. ".txt", replay) end function LoadReplayData() diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Sliding.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Sliding.lua index 6df770b..c733de5 100644 --- a/beatrun/gamemodes/beatrun/gamemode/sh/Sliding.lua +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Sliding.lua @@ -673,6 +673,7 @@ hook.Add("StartCommand", "qslidespeed", function(ply, cmd) end cmd:ClearMovement() + local slidetime = math.max(0.1, qslide_duration) if (ply:GetSlidingTime() - CurTime()) / slidetime > 0.8 and (ply.SlidingInitTime > CurTime() - 0.25 or ply:GetSlidingSlippery()) then diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/sh_buildmode.lua b/beatrun/gamemodes/beatrun/gamemode/sh/sh_buildmode.lua index c4e6096..270430c 100644 --- a/beatrun/gamemodes/beatrun/gamemode/sh/sh_buildmode.lua +++ b/beatrun/gamemodes/beatrun/gamemode/sh/sh_buildmode.lua @@ -936,6 +936,7 @@ if CLIENT then local jsonsave = util.TableToJSON(save) local crc = util.CRC(jsonsave) local dir = "beatrun/courses/" .. game.GetMap() .. "/" + compress = compress or true file.CreateDir(dir) @@ -1620,7 +1621,7 @@ if CLIENT then gui.EnableScreenClicker(false) - LocalPlayer():SetFOV(LocalPlayer():GetInfoNum("Beatrun_FOV")) + LocalPlayer():SetFOV(0) CheckpointNumber = 1 diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/sh_freerunsysall.lua b/beatrun/gamemodes/beatrun/gamemode/sh/sh_freerunsysall.lua index 45bba5b..3adf212 100644 --- a/beatrun/gamemodes/beatrun/gamemode/sh/sh_freerunsysall.lua +++ b/beatrun/gamemodes/beatrun/gamemode/sh/sh_freerunsysall.lua @@ -1,6 +1,6 @@ local quakejump = CreateConVar("Beatrun_QuakeJump", 1, {FCVAR_REPLICATED, FCVAR_ARCHIVE}) - local sidestep = CreateConVar("Beatrun_SideStep", 1, {FCVAR_REPLICATED, FCVAR_ARCHIVE}) +local max_speed = CreateConVar("Beatrun_MaxSpeed", 325, {FCVAR_REPLICATED, FCVAR_ARCHIVE}) local function Hardland(jt) local ply = LocalPlayer() @@ -230,8 +230,8 @@ hook.Add("SetupMove", "MESetupMove", function(ply, mv, cmd) ply.FootstepLand = true end - if ply:GetRunSpeed() ~= 325 * ply:GetOverdriveMult() then - ply:SetRunSpeed(325 * ply:GetOverdriveMult()) + if ply:GetRunSpeed() ~= max_speed:GetInt() * ply:GetOverdriveMult() then + ply:SetRunSpeed(max_speed:GetInt() * ply:GetOverdriveMult()) end if not ply:GetMEMoveLimit() then @@ -275,9 +275,9 @@ hook.Add("SetupMove", "MESetupMove", function(ply, mv, cmd) mult = mult * ply:GetMEMoveLimit() / 1000 end - ply:SetMEMoveLimit(math.Clamp(ply:GetMEMoveLimit() + mult * ply:GetOverdriveMult() * 2, 0, 325 * ply:GetOverdriveMult())) + ply:SetMEMoveLimit(math.Clamp(ply:GetMEMoveLimit() + mult * ply:GetOverdriveMult() * 2, 0, max_speed:GetInt() * ply:GetOverdriveMult())) elseif not ismoving and (not ply:Crouching() or ply:GetCrouchJump()) or CurTime() < ply:GetMESprintDelay() and ply:OnGround() then - ply:SetMEMoveLimit(math.Clamp(ply:GetMEMoveLimit() - 40, weaponspeed, 325 * ply:GetOverdriveMult())) + ply:SetMEMoveLimit(math.Clamp(ply:GetMEMoveLimit() - 40, weaponspeed, max_speed:GetInt() * ply:GetOverdriveMult())) end if MEAngDiff > 1.25 and ply:GetWallrun() == 0 then diff --git a/lua/bin/gmcl_gdiscord_win64.dll b/lua/bin/gmcl_gdiscord_win64.dll new file mode 100644 index 0000000000000000000000000000000000000000..2df989bf2d4e7821c6af012831624846527f6e27 GIT binary patch literal 52224 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 x8fp`~9Rj0P^9$B$w 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 AhyVZp literal 0 HcmV?d00001