mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
329 lines
10 KiB
Lua
329 lines
10 KiB
Lua
--[[
|
|
| 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/
|
|
--]]
|
|
|
|
|
|
local PLUGIN = PLUGIN;
|
|
|
|
PLUGIN.name = "TFA weapons and attachments";
|
|
PLUGIN.description = "Adds the weapons and attachments from that TFA mod.";
|
|
PLUGIN.author = "Fruity";
|
|
|
|
weapons.OnLoaded()
|
|
|
|
ix.util.Include("sh_atts.lua")
|
|
ix.util.Include("sv_plugin.lua")
|
|
ix.util.Include("sv_hooks.lua")
|
|
|
|
-- All grenade entities used on the server must be declared here
|
|
PLUGIN.grenades = {
|
|
npc_grenade_frag = true,
|
|
mmod_frag = true,
|
|
tfa_rustalpha_flare_thrown = true,
|
|
tfa_csgo_throwndecoy = true,
|
|
tfa_csgo_thrownflash = true,
|
|
tfa_csgo_thrownfrag = true,
|
|
tfa_csgo_thrownincen = true,
|
|
tfa_csgo_thrownmolotov = true,
|
|
tfa_csgo_thrownsmoke = true,
|
|
tfa_csgo_thrownsonar = true
|
|
}
|
|
|
|
hook.Remove("TFA_GetStat", "TFA_IronsightsConVarToggle")
|
|
|
|
local stunstick = weapons.GetStored("tfa_mmod_stunstick") or {}
|
|
stunstick.PrintName = "Stunstick"
|
|
|
|
function stunstick:OnRaised()
|
|
self:GetOwner():EmitSound("Weapon_StunStick.Activate")
|
|
self:GetOwner():ForceSequence("activatebaton", nil, nil, true)
|
|
end
|
|
|
|
function stunstick:OnLowered()
|
|
self:GetOwner():EmitSound("Weapon_StunStick.Deactivate")
|
|
self:GetOwner():ForceSequence("deactivatebaton", nil, nil, true)
|
|
end
|
|
|
|
local ar2 = weapons.GetStored("tfa_mmod_ar2") or {Primary = {}}
|
|
ar2.Primary.Ammo = "StriderMinigun"
|
|
|
|
if (CLIENT) then
|
|
hook.Remove("HUDPaint", "tfaDrawHitmarker")
|
|
|
|
function PLUGIN:TFA_PreCanPrimaryAttack(weapon)
|
|
if (weapon:GetNetVar("BioLocked")) then
|
|
return false
|
|
end
|
|
end
|
|
|
|
function PLUGIN:TFA_SecondaryAttack(weapon)
|
|
if (weapon:GetNetVar("BioLocked")) then
|
|
return true -- signal we 'handled' the attack
|
|
end
|
|
end
|
|
end
|
|
|
|
function PLUGIN:TFA_PreCanAttach(weapon, attn)
|
|
if (attn == "") then return end
|
|
|
|
for _, v in ipairs(weapon:GetNetVar("ixItemAtts", {})) do
|
|
if (v == attn) then return true end
|
|
end
|
|
|
|
if (weapon.ixItem) then
|
|
for _, v in pairs(weapon.ixItem:GetData("tfa_atts", {})) do
|
|
if (v.att == attn) then return true end
|
|
end
|
|
end
|
|
|
|
local character = weapon.Owner:GetCharacter()
|
|
if (character) then
|
|
local inventory = character:GetInventory()
|
|
if (self.attnTranslate[attn]) then
|
|
if (!inventory:HasItem(self.attnTranslate[attn])) then
|
|
return false
|
|
end
|
|
elseif (!inventory:HasItem(attn)) then
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
|
|
TFA.AddAmmo("csgo_decoy", "Decoy")
|
|
TFA.AddAmmo("csgo_frag", "Fragmentation Grenade")
|
|
TFA.AddAmmo("csgo_flash", "Flashbang")
|
|
TFA.AddAmmo("csgo_incend", "Incendiary Grenade")
|
|
TFA.AddAmmo("csgo_molly", "Molotov")
|
|
TFA.AddAmmo("csgo_smoke", "Smoke Grenade")
|
|
TFA.AddAmmo("csgo_sonarbomb", "Tactical Awareness Grenade")
|
|
|
|
local csgo_flashtime = 10
|
|
local csgo_flashfade = 4
|
|
local csgo_flashdistance = 2048
|
|
local csgo_flashdistancefade = 2048 - 1024
|
|
|
|
local tab = {
|
|
["$pp_colour_addr"] = 0,
|
|
["$pp_colour_addg"] = 0,
|
|
["$pp_colour_addb"] = 0,
|
|
["$pp_colour_brightness"] = 0.0,
|
|
["$pp_colour_contrast"] = 1.0,
|
|
["$pp_colour_colour"] = 1.0,
|
|
["$pp_colour_mulr"] = 0,
|
|
["$pp_colour_mulg"] = 0,
|
|
["$pp_colour_mulb"] = 0
|
|
}
|
|
|
|
function TFA_CSGO_FlashIntensity(ply)
|
|
local flashtime = ply:GetNWFloat("TFACSGO_LastFlash", -999)
|
|
local flashdistance = ply:GetNWFloat("TFACSGO_FlashDistance", 0)
|
|
local flashfac = ply:GetNWFloat("TFACSGO_FlashFactor", 1)
|
|
local distancefac = 1 - math.Clamp((flashdistance - csgo_flashdistance + csgo_flashdistancefade) / csgo_flashdistancefade, 0, 1)
|
|
local intensity = 1 - math.Clamp(((CurTime() - flashtime) / distancefac - csgo_flashtime + csgo_flashfade) / csgo_flashfade, 0, 1)
|
|
intensity = intensity * distancefac
|
|
intensity = intensity * math.Clamp(flashfac + 0.1, 0.35, 1)
|
|
|
|
return intensity
|
|
end
|
|
|
|
if (CLIENT) then
|
|
hook.Add("RenderScreenspaceEffects", "TFA_CSGO_FLASHBANG", function()
|
|
local client = LocalPlayer()
|
|
if (!IsValid(client)) then return end
|
|
local intensity = TFA_CSGO_FlashIntensity(client)
|
|
|
|
if (intensity > 0.01) then
|
|
tab["$pp_colour_brightness"] = math.pow(intensity, 3)
|
|
tab["$pp_colour_colour"] = 1 - intensity * 0.33
|
|
DrawColorModify(tab) --Draws Color Modify effect
|
|
DrawMotionBlur(0.2, intensity, 0.03)
|
|
end
|
|
end)
|
|
end
|
|
|
|
function CSGOSmokeBlind()
|
|
local ply = LocalPlayer()
|
|
|
|
local IsInSmoke = false
|
|
|
|
local SmokeAmount = 0
|
|
|
|
for k,v in pairs(ents.FindByClass("tfa_csgo_thrownsmoke")) do
|
|
local Distance = ply:GetPos():Distance(v:GetPos())
|
|
if Distance <= 144 and v:GetNWBool("IsDetonated",false) then
|
|
IsInSmoke = true
|
|
SmokeAmount = SmokeAmount + (144 - Distance)*2
|
|
end
|
|
end
|
|
|
|
if IsInSmoke then
|
|
local ModAmount = math.Clamp(SmokeAmount / 100,0,1)
|
|
local smokeMat = Material( "tfa_csgo/particle/particle_smokegrenade_view" )
|
|
|
|
surface.SetDrawColor( Color(99, 99, 99,ModAmount*255) )
|
|
surface.SetMaterial( smokeMat )
|
|
surface.DrawRect( 0, 0, ScrW(), ScrH() )
|
|
|
|
end
|
|
end
|
|
hook.Add("RenderScreenspaceEffects","CSGOSmokeBlind",CSGOSmokeBlind)
|
|
|
|
TFA.CSGO = TFA.CSGO or {}
|
|
TFA.CSGO.HandsTbl = TFA.CSGO.HandsTbl or {}
|
|
|
|
function TFA.CSGO.AddHandsModel(id, mdl, name)
|
|
assert(type(id) == "string", "Invalid hands variant ID specified: " .. tostring(id))
|
|
assert(type(mdl) == "string", "Invalid hands model path specified: " .. tostring(mdl))
|
|
|
|
if (!file.Exists(mdl, "GAME")) then
|
|
print("[TFA CS:GO] Unable to add hands with id " .. id .. ", model " .. mdl .. " not found.")
|
|
|
|
return
|
|
end
|
|
|
|
TFA.CSGO.HandsTbl[id] = {}
|
|
TFA.CSGO.HandsTbl[id].mdl = mdl
|
|
TFA.CSGO.HandsTbl[id].name = type(name) == "string" and name or "#tfa_csgo_hands_" .. id
|
|
end
|
|
|
|
if (SERVER) then return end
|
|
|
|
local cv_hands = CreateClientConVar("cl_tfa_csgo_hands_override", "none", true, false)
|
|
|
|
if IsValid(TFA.CSGO.HandsEnt) then
|
|
TFA.CSGO.HandsEnt:Remove()
|
|
TFA.CSGO.HandsEnt = nil
|
|
end
|
|
|
|
local handsFallback = "models/weapons/tfa_csgo/c_hands_translator.mdl"
|
|
local handsOverride, handsID, handsMDL = false, "", ""
|
|
|
|
function TFA.CSGO.ParentHands(hands, vm, ply, wep)
|
|
if (!IsValid(hands) or !IsValid(vm) or !IsValid(wep)) then
|
|
if IsValid(TFA.CSGO.HandsEnt) then
|
|
TFA.CSGO.HandsEnt:RemoveEffects(EF_BONEMERGE)
|
|
TFA.CSGO.HandsEnt:RemoveEffects(EF_BONEMERGE_FASTCULL)
|
|
TFA.CSGO.HandsEnt:SetParent(NULL)
|
|
|
|
TFA.CSGO.HandsEnt:Remove()
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
if (!wep.IsTFAWeapon or !wep.IsTFACSGOWeapon) then return end
|
|
|
|
handsID = cv_hands:GetString()
|
|
handsOverride = handsID ~= "none" and TFA.CSGO.HandsTbl[handsID]
|
|
|
|
handsMDL = handsOverride and TFA.CSGO.HandsTbl[handsID].mdl or handsFallback
|
|
|
|
if (!IsValid(TFA.CSGO.HandsEnt)) then
|
|
TFA.CSGO.HandsEnt = ClientsideModel(handsMDL)
|
|
|
|
TFA.CSGO.HandsEnt:SetupBones()
|
|
TFA.CSGO.HandsEnt:SetNoDraw(true)
|
|
elseif (TFA.CSGO.HandsEnt:GetModel() ~= handsMDL) then
|
|
TFA.CSGO.HandsEnt:SetModel(handsMDL)
|
|
TFA.CSGO.HandsEnt:SetupBones()
|
|
end
|
|
|
|
if (!vm:LookupBone("ValveBiped.Bip01_R_Hand")) then
|
|
local newhands = TFA.CSGO.HandsEnt
|
|
|
|
newhands:SetParent(vm)
|
|
newhands:SetPos(vm:GetPos())
|
|
newhands:SetAngles(vm:GetAngles())
|
|
|
|
if (!newhands:IsEffectActive(EF_BONEMERGE)) then
|
|
newhands:AddEffects(EF_BONEMERGE)
|
|
newhands:AddEffects(EF_BONEMERGE_FASTCULL)
|
|
end
|
|
|
|
if handsOverride then
|
|
newhands:DrawModel()
|
|
else
|
|
hands:SetParent(newhands)
|
|
end
|
|
end
|
|
end
|
|
|
|
hook.Add("PreDrawPlayerHands", "TFA_CSGO_PreDrawPlayerHands", TFA.CSGO.ParentHands)
|
|
|
|
do
|
|
local CSGOParticleFiles = {}
|
|
table.insert(CSGOParticleFiles, #CSGOParticleFiles, "cs_weapon_fx")
|
|
table.insert(CSGOParticleFiles, #CSGOParticleFiles, "explosions_fx")
|
|
table.insert(CSGOParticleFiles, #CSGOParticleFiles, "inferno_fx")
|
|
|
|
local CSGOParticleEffects = {}
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "weapon_muzzle_smoke")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "weapon_muzzle_smoke_long")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "weapon_sensorgren_beeplight")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "weapon_sensorgren_detonate")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "weapon_decoy_ground_effect")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "weapon_decoy_ground_effect_shot")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "weapon_molotov_fp")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "weapon_molotov_thrown")
|
|
--EXPLOSION_FX
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "explosion_basic")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "explosion_hegrenade_interior")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "explosion_hegrenade_brief")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "explosion_smoke_disperse")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "explosion_smokegrenade")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "explosion_smokegrenade_fallback")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "explosion_smokegrenade_CT")
|
|
--INFERNO FX
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "molotov_explosion")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "molotov_fire01")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "molotov_groundfire")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "molotov_fire_main_gm")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "molotov_fire_child_gm")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "molotov_groundfire_00HIGH")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "molotov_groundfire_00MEDIUM")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "extinguish_fire")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "explosion_molotov_air")
|
|
table.insert(CSGOParticleEffects, #CSGOParticleEffects, "incgrenade_thrown_trail")
|
|
|
|
for k, v in pairs(CSGOParticleFiles) do
|
|
game.AddParticles("particles/" .. v .. ".pcf")
|
|
end
|
|
|
|
for k, v in pairs(CSGOParticleEffects) do
|
|
PrecacheParticleSystem(v)
|
|
end
|
|
end
|
|
|
|
sound.Add(
|
|
{
|
|
name = "csgo_Weapon.WeaponMove1",
|
|
channel = CHAN_ITEM,
|
|
level = 65,
|
|
volume = 0.15,
|
|
sound = "weapons/tfa_csgo/movement1.wav"
|
|
})
|
|
|
|
sound.Add(
|
|
{
|
|
name = "csgo_Weapon.WeaponMove2",
|
|
channel = CHAN_ITEM,
|
|
level = 65,
|
|
volume = 0.15,
|
|
sound = "weapons/tfa_csgo/movement2.wav"
|
|
})
|
|
|
|
sound.Add(
|
|
{
|
|
name = "csgo_Weapon.WeaponMove3",
|
|
channel = CHAN_ITEM,
|
|
level = 65,
|
|
volume = 0.15,
|
|
sound = "weapons/tfa_csgo/movement3.wav"
|
|
})
|