mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
393
lua/entities/ent_mannable_editable.lua
Normal file
393
lua/entities/ent_mannable_editable.lua
Normal file
@@ -0,0 +1,393 @@
|
||||
--[[
|
||||
| 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
|
||||
Reference in New Issue
Block a user