Files
wnsrc/lua/entities/ent_mannable_editable.lua
lifestorm 6a58f406b1 Upload
2024-08-04 23:54:45 +03:00

393 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/
--]]
AddCSLuaFile()
ENT.Base = "ent_mannable_bakubase"
ENT.PrintName = "Editable Gun"
ENT.Category = "Jakub Baku Emplacements"
ENT.Spawnable = true
ENT.AdminOnly = false
ENT.Editable = true
local __muzzles = {
{effect = "GunshipMuzzleFlash"},
{effect = "ChopperMuzzleFlash"},
{effect = "AirboatMuzzleFlash"},
{effect = "MuzzleFlash", flags = 7},
{effect = "CS_MuzzleFlash"},
{effect = "CS_MuzzleFlash_X"},
{effect = "StriderMuzzleFlash"},
{effect = "MuzzleFlash", flags = 5}
}
local __tracers = {
"AR2Tracer",
"HelicopterTracer",
"AirboatGunTracer",
"Tracer",
"ToolTracer",
"eff_baku_combinecannon_tracer",
"eff_baku_jeeptracer",
}
local __impacts = {
"StunstickImpact",
"BoltImpact",
"ManhackSparks",
"HelicopterMegaBomb",
"AR2Impact",
}
local __shells = {
"ShellEject",
"RifleShellEject",
"ShotgunShellEject"
}
function ENT:DoSetupDataTables()
self:NetworkVar("Int", 0, "ProjectileType", {KeyName = "projtype", Edit = { title = "Projectile type", category = "Projectile", type = "Combo", order = 10, values = {
["Bullet"] = 1,
["Flechette"] = 2,
["SMG Grenade"] = 3,
["Rocket"] = 4,
}}})
self:NetworkVar("Float", 0, "PhysProjVel", {KeyName = "physvel", Edit = {title = "Phys projectile velocity", category = "Projectile", type = "Float", order = 20,
min = 0, max = 8000}})
self:NetworkVar("Float", 3, "Spread", {KeyName = "spread", Edit = {title = "Spread", category = "Projectile", type = "Float", order = 26,
min = 0, max = 10}})
self:NetworkVar("Float", 1, "FireDelay", {KeyName = "firedelay", Edit = {title = "Fire delay", category = "Projectile", type = "Float", order = 25,
min = 0.05, max = 10}})
self:NetworkVar("Int", 1, "ProjDamage", {KeyName = "damage", Edit = {title = "Damage", category = "Projectile", type = "Int", order = 30,
min = 0, max = 100}})
self:NetworkVar("Int", 2, "NumProjectiles", {KeyName = "numprojectiles", Edit = {title = "Bullets per shot", category = "Projectile", type = "Int", order = 40,
min = 0, max = 20}})
self:NetworkVar("String", 0, "ShootSound", {KeyName = "shootsound", Edit = {title = "Shoot sound", category = "Sound", type = "Generic", order = 50}})
self:NetworkVar("Bool", 0, "__LoopSound", {KeyName = "loopsound", Edit = {title = "Loop fire sound", category = "Sound", type = "Boolean", order = 55}})
self:NetworkVar("String", 1, "ChargeSound", {KeyName = "chargesound", Edit = {title = "Charge sound", category = "Sound", type = "Generic", order = 60}})
self:NetworkVar("Float", 2, "ChargeTime", {KeyName = "chargetime", Edit = {title = "Charge time", category = "Sound", type = "Float", order = 70, min = 0, max = 10}})
self:NetworkVar("String", 3, "EndFireSound", {KeyName = "endfiresound", Edit = {title = "Last fire Sound", category = "Sound", type = "Generic", order = 75}})
self:NetworkVar("Int", 3, "MuzzleEffect", {KeyName = "muzzleeffect", Edit = { title = "Muzzle flash", category = "Effects", type = "Combo", order = 80, values = {
["Airboat Gun"] = 3,
["Chopper"] = 2,
["Gunship"] = 1,
["Counter Strike X"] = 6,
["HL2 Default"] = 4,
["Counter Strike"] = 5,
["Strider"] = 7,
["Combine"] = 8
}}})
self:NetworkVar("Int", 4, "TracerEffect", {KeyName = "tracereffect", Edit = { title = "Tracer", category = "Effects", type = "Combo", order = 90, values = {
["AR2"] = 1,
["Chopper"] = 2,
["Airboat Gun"] = 3,
["HL2 Default"] = 4,
["Toolgun"] = 5,
["Combine cannon"] = 6,
["Gauss gun"] = 7,
}}})
self:NetworkVar("Int", 5, "ShellEject", {KeyName = "shelleject", Edit = { title = "Shells", category = "Effects", type = "Combo", order = 100, values = {
["None"] = 0,
["Default"] = 1,
["Rifle"] = 2,
["Buckshot"] = 3,
}}})
if(SERVER) then
self:NetworkVarNotify("ChargeSound", self.HandleVarChange)
self:NetworkVarNotify("ChargeTime", self.HandleVarChange)
self:NetworkVarNotify("FireDelay", self.HandleVarChange)
self:NetworkVarNotify("__LoopSound", self.HandleVarChange)
self:NetworkVarNotify("ShootSound", self.HandleVarChange)
self:NetworkVarNotify("TracerEffect", self.HandleVarChange)
self:NetworkVarNotify("MuzzleEffect", self.HandleVarChange)
end
self:SetShootSound("Weapon_AR2.NPC_Single")
self:SetChargeSound("Jeep.GaussCharge")
self:Set__LoopSound(false)
self:SetProjectileType(1)
self:SetFireDelay(0.075)
self:SetProjDamage(13)
self:SetNumProjectiles(1)
self:SetPhysProjVel(1000)
self:SetSpread(3)
self:SetMuzzleEffect(8)
self:SetTracerEffect(1)
self:SetShellEject(0)
end
if(SERVER) then
function ENT.DupeFunction(ply, data)
data.__PreFireTimer = 0
end
ENT.ShootDelay = 0.075
ENT.__PreFireTimer = 0
ENT.__IsLoopSound = false
ENT.__ShootSound = false
ENT.__TracerEffect = "Tracer"
ENT.__MuzzleEffect = {effect = "MuzzleFlash", flags = 5}
ENT._PitchOffset = 10
ENT.__ChargeSound = nil
ENT.__DoCharge = false
ENT._HideGunModel = false
local _varhandlers = {
["ChargeSound"] = function(self, old, new)
local cleared = string.Trim(new)
if(cleared != "") then
self.__ChargeSoundName = cleared
else
self.__ChargeSoundName = nil
end
end,
["ChargeTime"] = function(self, old, new)
self.__DoCharge = new > 0.001
end,
["FireDelay"] = function(self, old, new)
self.ShootDelay = new
end,
["__LoopSound"] = function(self, old, new)
self.__IsLoopSound = new
end,
["ShootSound"] = function(self, old, new)
local cleared = string.Trim(new)
if(cleared != "") then
self.__ShootSoundName = cleared
else
self.__ShootSoundName = nil
end
end,
["TracerEffect"] = function(self, old, new)
if(__tracers[new]) then
self.__TracerEffect = __tracers[new]
end
end,
["MuzzleEffect"] = function(self, old, new)
if(__muzzles[new]) then
self.__MuzzleEffect = __muzzles[new]
end
end
}
function ENT:HandleVarChange(name, old, new)
if(isfunction(_varhandlers[name])) then
if(old != new) then
_varhandlers[name](self, old, new)
end
end
end
function ENT:DoInit()
self:BakuRegisterMannable()
self.ShootDelay = 0.075
self.__ShootSoundName = self.__ShootSoundName or "Airboat.FireGunLoop"
self.__ChargeSound = self.__ChargeSound or "Airboat.FireGunLoop"
self.__PreFireTimer = 0
self.__IsLoopSound = self.__IsLoopSound or false
self.__ShootSound = self.__ShootSound or false
self.__TracerEffect = self.__TracerEffect or "Tracer"
self.__MuzzleEffect = self.__MuzzleEffect or {effect = "MuzzleFlash", flags = 5}
self._PitchOffset = 10
self.__ChargeSound = nil
self.__DoCharge = false
self._HideGunModel = false
end
function ENT:OnStartAttack()
if(self.__PreFireTimer < CurTime() && self.__DoCharge) then
local delay = CurTime() + self:GetChargeTime()
self.__PreFireTimer = delay
self._ShootTimer = delay
if(self.__DoCharge) then
self.__ChargeSound = CreateSound(self, self.__ChargeSoundName)
self.__ChargeSound:Play()
end
end
end
function ENT:OnStartShooting()
if(self.__DoCharge && self.__ChargeSound) then
self.__ChargeSound:Stop()
end
if(self.__IsLoopSound) then
self.__ShootSound = CreateSound(self, self.__ShootSoundName)
self.__ShootSound:Play()
end
end
function ENT:OnStopAttack()
if(self.__ShootSound) then
self.__ShootSound:Stop()
end
if(self.__ChargeSound) then
self.__ChargeSound:Stop()
end
self:EmitSound(self:GetEndFireSound())
end
function ENT:DoRemove()
if(self.__ChargeSound) then
self.__ChargeSound:Stop()
end
if(self.__ShootSound) then
self.__ShootSound:Stop()
end
end
local function createphysprojectile(self, dest, class, damagefunc)
local num = self:GetNumProjectiles()
for i = 1, num do
local proj = ents.Create(class)
proj:SetPos(self:GetAttachment(1).Pos + dest * 10)
proj:SetAngles(dest:Angle())
if(isfunction(damagefunc)) then
damagefunc(self:GetProjDamage(), proj)
end
proj:SetOwner(self._User)
proj:Spawn()
local phys = proj:GetPhysicsObject()
if(IsValid(phys)) then
phys:SetVelocity((dest + VectorRand() * self:GetSpread() * 0.01):GetNormalized() * self:GetPhysProjVel())
else
proj:SetVelocity((dest + VectorRand() * self:GetSpread() * 0.01):GetNormalized() * self:GetPhysProjVel())
end
/*local tbl = proj:GetSaveTable(true)
print("-------------------------")
for k, v in pairs(tbl) do
if(!istable(v) && ( string.find(string.lower(k), "vel") )) then
print(k, v)
end
end*/
end
end
local function setrocketdamage(dmg, proj)
proj:SetSaveValue("m_flDamage", math.max(dmg, 40))
end
local function setboltdamage(dmg, proj)
//-N-O---W-O-R-K---S-H-I-T-
end
local projectiles = {
[1] = function(self, dest)
//bullet
local bullet = {
TracerName = self.__TracerEffect,
Damage = self:GetProjDamage(),
Force = 5,
Spread = Vector(1, 1, 0) * self:GetSpread() * 0.01,
Src = self:GetAttachment(1).Pos,
Dir = dest,
Num = self:GetNumProjectiles(),
Attacker = self._User,
Inflictor = self,
}
self:FireBullets(bullet)
end,
[2] = function(self, dest)
createphysprojectile(self, dest, "hunter_flechette")
end,
[3] = function(self, dest)
createphysprojectile(self, dest, "grenade_ar2")
end,
[4] = function(self, dest)
createphysprojectile(self, dest, "rpg_missile", setrocketdamage)
end,
[5] = function(self, dest)
//createphysprojectile(self, dest, "rpg_missile", setrocketdamage)
end,
[6] = function(self, dest)
createphysprojectile(self, dest, "crossbow_bolt", setboltdamage)
end,
}
function ENT:DoShoot(dest)
local func = projectiles[self:GetProjectileType()]
if(isfunction(func)) then
func(self, dest)
else
projectiles[1](self, dest)
end
if(!self.__IsLoopSound) then
self:EmitSound(self:GetShootSound())
end
local ef = EffectData()
ef:SetEntity(self)
ef:SetAttachment(1)
ef:SetFlags(self.__MuzzleEffect.flags or 0)
util.Effect(self.__MuzzleEffect.effect, ef)
if(self:GetShellEject() > 0) then
ef = EffectData()
ef:SetOrigin(self:GetBonePosition(4))
ef:SetAngles(self:GetRight():Angle())
util.Effect(__shells[self:GetShellEject()], ef)
end
end
else
function ENT:DoInit()
/*self:SetupCustomModel("models/weapons/w_hmg1.mdl")
local mat = Matrix()
mat:Translate(Vector(5, 0, -1))
mat:Rotate(Angle(0, 90, 3))
self._GunModelMatrix = mat*/
end
function ENT:DoThink()
end
end