This commit is contained in:
lifestorm
2024-08-04 23:54:45 +03:00
parent 8064ba84d8
commit 6a58f406b1
7522 changed files with 4011896 additions and 15 deletions

View File

@@ -0,0 +1,83 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
include("shared.lua")
DEFINE_BASECLASS( SWEP.Base )
SWEP.StatTrakBoneCheck = false
SWEP.NameTagBoneCheck = false
function SWEP:PreDrawViewModel(vm, wep, ply)
if not self.StatTrakBoneCheck and IsValid(vm) then
if not self.NoStattrak and self.VElements["stattrak"].bonemerge and not vm:LookupBone("v_weapon.stattrack") then
self.NoStattrak = true
end
self.StatTrakBoneCheck = true
end
if not self.NameTagBoneCheck and IsValid(vm) then
if not self.NoNametag and self.VElements["nametag"].bonemerge and not vm:LookupBone("v_weapon.uid") then
self.NoNametag = true
end
self.NameTagBoneCheck = true
end
return BaseClass.PreDrawViewModel(self, vm, wep, ply)
end
local cv_dropmags = GetConVar("cl_tfa_csgo_magdrop") or CreateClientConVar("cl_tfa_csgo_magdrop", "1", true, true, "Drop magazine on weapon reload?")
local cv_maglife = GetConVar("cl_tfa_csgo_maglife") or CreateClientConVar("cl_tfa_csgo_maglife", "15",true,true, "Magazine Lifetime")
SWEP.MagLifeTime = 15
function SWEP:DropMag()
if not cv_dropmags or not cv_dropmags:GetBool() then return end
if not cv_maglife then
cv_maglife = GetConVar("cl_tfa_csgo_maglifelife")
end
if cv_life then
self.LifeTime = cv_life:GetInteger()
end
if not self.MagModel then return end
local mag = ents.CreateClientProp()
mag:SetModel(self.MagModel)
mag:SetMaterial(self:GetMaterial())
for i = 1, #self:GetMaterials() do
mag:SetSubMaterial(i - 1, self:GetSubMaterial(i - 1))
end -- full skin support
local pos, ang = self:GetPos(), self:GetAngles()
if self:IsFirstPerson() and self:VMIV() then
local vm = self.OwnerViewModel
ang = vm:GetAngles()
pos = vm:GetPos() - ang:Up() * 8
end
mag:SetPos(pos)
mag:SetAngles(ang)
mag:PhysicsInit(SOLID_VPHYSICS)
mag:PhysWake()
mag:SetMoveType(MOVETYPE_VPHYSICS) -- we call it AFTER physics init
mag:Spawn()
SafeRemoveEntityDelayed(mag, self.MagLifeTime)
end

View File

@@ -0,0 +1,25 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
AddCSLuaFile( "cl_init.lua" )
AddCSLuaFile( "shared.lua" )
include("shared.lua")
function SWEP:DropMag()
net.Start("TFA_CSGO_DropMag", true)
net.WriteEntity(self)
if sp then
net.Broadcast()
else
net.SendOmit(self:GetOwner())
end
end

View File

@@ -0,0 +1,346 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
DEFINE_BASECLASS("tfa_gun_base")
SWEP.Skins = {}
SWEP.Skin = ""
SWEP.Callback = {}
SWEP.VMPos = Vector(0.879, 0.804, -1)
SWEP.VMPos_Additive = false --Set to false for an easier time using VMPos. If true, VMPos will act as a constant delta ON TOP OF ironsights, run, whateverelse
SWEP.ProceduralHolsterEnabled = true
SWEP.ProceduralHolsterTime = 0.0
SWEP.ProceduralHolsterPos = Vector(0, 0, 0)
SWEP.ProceduralHolsterAng = Vector(0, 0, 0)
SWEP.NoStattrak = false
SWEP.NoNametag = false
SWEP.TracerCount = 1
SWEP.TracerName = "tfa_tracer_csgo" -- Change to a string of your tracer name. Can be custom. There is a nice example at https://github.com/garrynewman/garrysmod/blob/master/garrysmod/gamemodes/base/entities/effects/tooltracer.lua
SWEP.TracerDelay = 0.0 --Delay for lua tracer effect
SWEP.IsTFACSGOWeapon = true
--These are particle effects INSIDE a pcf file, not PCF files, that are played when you shoot.
SWEP.SmokeParticles = {
pistol = "weapon_muzzle_smoke",
smg = "weapon_muzzle_smoke",
grenade = "weapon_muzzle_smoke",
ar2 = "weapon_muzzle_smoke_long",
shotgun = "weapon_muzzle_smoke_long",
rpg = "weapon_muzzle_smoke",
physgun = "weapon_muzzle_smoke",
crossbow = "weapon_muzzle_smoke",
melee = "weapon_muzzle_smoke",
slam = "weapon_muzzle_smoke",
normal = "weapon_muzzle_smoke",
melee2 = "weapon_muzzle_smoke",
knife = "weapon_muzzle_smoke",
duel = "weapon_muzzle_smoke",
camera = "weapon_muzzle_smoke",
magic = "weapon_muzzle_smoke",
revolver = "weapon_muzzle_smoke",
silenced = "weapon_muzzle_smoke"
}
TFA = TFA or {}
TFA.CSGO = TFA.CSGO or {}
TFA.CSGO.Skins = TFA.CSGO.Skins or {}
function SWEP:Initialize()
BaseClass.Initialize(self)
self:ReadSkin()
if SERVER then
self:CallOnClient("ReadSkin", "")
end
end
local bgcolor = Color(0, 0, 0, 255 * 0.78)
local btntextcol = Color(191, 191, 191, 255 * 0.9)
local btntextdisabledcol = Color(63, 63, 63, 255 * 0.9)
local emptyFunc = function() end
local SkinMenuFrame
local sp = game.SinglePlayer()
function SWEP:AltAttack()
if sp and SERVER then self:CallOnClient("AltAttack") return end
if not CLIENT or IsValid(SkinMenuFrame) then return end
SkinMenuFrame = vgui.Create("DFrame")
SkinMenuFrame:SetSkin("Default")
SkinMenuFrame:SetSize(320, 24 + 64 * 3 + 5 * 4)
SkinMenuFrame:Center()
SkinMenuFrame:ShowCloseButton(false)
SkinMenuFrame:SetDraggable(false)
SkinMenuFrame:SetTitle("TFA CS:GO Weapon Actions")
SkinMenuFrame:MakePopup()
SkinMenuFrame.Paint = function(myself, wv, hv)
local x, y = myself:GetPos()
render.SetScissorRect(x, y, x + wv, y + hv, true)
Derma_DrawBackgroundBlur(myself)
render.SetScissorRect(0, 0, 0, 0, false)
draw.NoTexture()
surface.SetDrawColor(bgcolor)
surface.DrawRect(0, 0, wv, hv)
end
local btnSkinPicker = vgui.Create("DButton", SkinMenuFrame)
btnSkinPicker:SetTall(64)
btnSkinPicker:DockMargin(0, 0, 0, 5)
btnSkinPicker:Dock(TOP)
btnSkinPicker:SetFont("DermaLarge")
btnSkinPicker:SetTextColor(btntextcol)
btnSkinPicker.Paint = emptyFunc
btnSkinPicker:SetText("Change Skin")
btnSkinPicker.DoClick = function(btn, value)
RunConsoleCommand("cl_tfa_csgo_vgui_skinpicker")
SkinMenuFrame:Close()
end
local btnNamePicker = vgui.Create("DButton", SkinMenuFrame)
btnNamePicker:SetTall(64)
btnNamePicker:DockMargin(0, 0, 0, 5)
btnNamePicker:Dock(TOP)
btnNamePicker:SetFont("DermaLarge")
btnNamePicker:SetTextColor(btntextcol)
btnNamePicker.Paint = emptyFunc
btnNamePicker:SetText("Change Nametag")
if self.NoNametag then
btnNamePicker:SetDisabled(true)
btnNamePicker:SetTextColor(btntextdisabledcol)
btnNamePicker:SetCursor("no")
end
btnNamePicker.DoClick = function(btn, value)
RunConsoleCommand("cl_tfa_csgo_vgui_namepicker")
SkinMenuFrame:Close()
end
local btnClose = vgui.Create("DButton", SkinMenuFrame)
btnClose:SetTall(64)
btnClose:DockMargin(0, 0, 0, 0)
btnClose:Dock(BOTTOM)
btnClose:SetFont("DermaLarge")
btnClose:SetTextColor(btntextcol)
btnClose.Paint = emptyFunc
btnClose:SetText("Close")
btnClose.DoClick = function(btn, value)
SkinMenuFrame:Close()
end
end
function SWEP:SaveSkin()
if CLIENT then
if not file.Exists("tfa_csgo/", "DATA") then
file.CreateDir("tfa_csgo")
end
local f = file.Open("tfa_csgo/" .. self:GetClass() .. ".txt", "w", "DATA")
f:Write(self.Skin and self.Skin or "")
f:Flush()
end
end
function SWEP:SyncToServerSkin(skin)
if not skin or string.len(skin) <= 0 then
skin = self.Skin
end
if not skin then return end
if not CLIENT then return end
-- net.Start("TFA_CSGO_SKIN", true)
-- net.WriteEntity(self)
-- net.WriteString(skin)
-- net.SendToServer()
end
function SWEP:LoadSkinTable()
if true then return end
local cl = self:GetClass()
if TFA.CSGO.Skins[cl] then
for k, v in pairs(TFA.CSGO.Skins[cl]) do
self.Skins[k] = v
end
end
end
function SWEP:ReadSkin()
if CLIENT then
self:LoadSkinTable()
local cl = self:GetClass()
local path = "tfa_csgo/" .. cl .. ".txt"
if file.Exists(path, "DATA") then
local f = file.Read(path, "DATA")
if f and v ~= "" then
self.Skin = f
end
end
self:SetNWString("skin", self.Skin)
self:SyncToServerSkin()
end
self:UpdateSkin()
end
function SWEP:UpdateSkin()
if (CLIENT and IsValid(LocalPlayer()) and LocalPlayer() ~= self.Owner) or SERVER then
self:SetMaterial("")
self.Skin = self:GetNWString("skin")
if self.Skins and self.Skins[self.Skin] and self.Skins[self.Skin].tbl then
self:SetSubMaterial(nil, nil)
for k, str in ipairs(self.Skins[self.Skin].tbl) do
if type(str) == "string" then
self:SetSubMaterial(k - 1, str)
return
end
end
self:ClearMaterialCache()
end
end
if not self.Skin then
self.Skin = ""
end
if self.Skin and self.Skins and self.Skins[self.Skin] then
self.MaterialTable = self.Skins[self.Skin].tbl
for l, b in pairs(self.MaterialTable) do
TFA.CSGO.LoadCachedVMT(string.sub(b, 2))
print("Requesting skin #" .. l .. "//" .. string.sub(b, 2))
end
self:ClearMaterialCache()
end
end
SWEP.LerpLight = Vector(1, 1, 1)
SWEP.VElements = {
["nametag"] = { type = "Model", model = "models/weapons/tfa_csgo/uid.mdl", bone = "", rel = "", pos = Vector(0, 0, 0), angle = Angle(0, 0, 0), size = Vector(1, 1, 1), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bonemerge = true, bodygroup = {}, active = true },
["stattrak"] = { type = "Model", model = "models/weapons/tfa_csgo/stattrack.mdl", bone = "", rel = "", pos = Vector(0, 0, 0), angle = Angle(0, 0, 0), size = Vector(1, 1, 1), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bonemerge = true, bodygroup = {}, active = true },
}
local stattrak_cv = GetConVar("cl_tfa_csgo_stattrack") or CreateClientConVar("cl_tfa_csgo_stattrack", 1, true, true)
local dostattrak
function SWEP:UpdateStattrak()
if not CLIENT or not self.VElements["stattrak"] then return end
dostattrak = stattrak_cv:GetBool() and not self.NoStattrak
local statname = "VElements.stattrak.active"
if self:GetStat(statname) ~= dostattrak then
self.VElements["stattrak"].active = dostattrak
self:ClearStatCache(statname)
end
end
local nametag_cv = GetConVar("cl_tfa_csgo_nametag") or CreateClientConVar("cl_tfa_csgo_nametag", 1, true, true)
local donametag
function SWEP:UpdateNametag()
if not CLIENT or not self.VElements["nametag"] then return end
donametag = nametag_cv:GetBool() and not self.NoNametag
local statname = "VElements.nametag.active"
if self:GetStat(statname) ~= donametag then
self.VElements["nametag"].active = donametag
self:ClearStatCache(statname)
end
end
local shells_cv = GetConVar("cl_tfa_csgo_2dshells") or CreateClientConVar("cl_tfa_csgo_2dshells", 1, true, true)
local shellsoverride
function SWEP:UpdateShells()
if SERVER then
shellsoverride = (IsValid(self:GetOwner()) and self:GetOwner():IsPlayer() and self:GetOwner():GetInfoNum(shells_cv:GetName(), 0) > 0) and "tfa_shell_csgo" or nil
else
shellsoverride = shells_cv:GetBool() and "tfa_shell_csgo" or nil
end
local statname = "ShellEffectOverride"
if self:GetStat(statname) ~= shellsoverride then
self.ShellEffectOverride = shellsoverride
self:ClearStatCache(statname)
end
end
function SWEP:MakeShell(...)
self:UpdateShells()
return BaseClass.MakeShell(self, ...)
end
function SWEP:Think2(...)
if ((CLIENT and IsValid(LocalPlayer()) and LocalPlayer() ~= self.Owner) or SERVER) and self.Skin ~= self:GetNWString("skin") then
self.Skin = self:GetNWString("skin")
self:UpdateSkin()
end
self:UpdateStattrak()
self:UpdateNametag()
BaseClass.Think2(self, ...)
end
function SWEP:SetBodyGroupVM(k, v)
if isstring(k) then
local vals = k:Split(" ")
k = vals[1]
v = vals[2]
end
self.Bodygroups_V[k] = v
if SERVER then
self:CallOnClient("SetBodyGroupVM", "" .. k .. " " .. v)
end
end
local cv_chamber = GetConVar("sv_tfa_csgo_chambering") or CreateConVar("sv_tfa_csgo_chambering", 1, CLIENT and {FCVAR_REPLICATED} or {FCVAR_REPLICATED, FCVAR_ARCHIVE, FCVAR_NOTIFY}, "Allow round-in-the-chamber on TFA CS:GO weapons?")
function SWEP:CanChamber(...)
if not cv_chamber:GetBool() then return false end
return BaseClass.CanChamber(self, ...)
end