Files
wnsrc/lua/entities/ent_mannable_gauss.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

193 lines
4.6 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 = "Gauss Gun"
ENT.Category = "Jakub Baku Emplacements"
ENT.Spawnable = true
ENT.AdminOnly = false
if(SERVER) then
function ENT.DupeFunction(ply, data)
data.__PreFireTimer = 0
end
function ENT:DoInit()
self:BakuRegisterMannable()
self.__ChargeSound = nil
self.__PreFireTimer = 0
self.ShootDelay = 0.075
self._Automatic = false
self._HideGunModel = true
end
function ENT:OnStartAttack()
if(self.__PreFireTimer < CurTime()) then
self.__ChargeSound = CreateSound(self, "Jeep.GaussCharge")
self.__ChargeSound:Play()
self.__PreFireTimer = CurTime() + 0.4
if(math.random(1, 4) == 2) then
local ef = EffectData()
ef:SetOrigin(self:GetBonePosition(4))
ef:SetMagnitude(2)
util.Effect("ElectricSpark", ef)
end
self._ShootTimer = CurTime() + 0.4
end
end
function ENT:OnStopAttack()
if(self.__ChargeSound) then
self.__ChargeSound:Stop()
end
end
function ENT:OnStartShooting()
if(self.__ChargeSound) then
self.__ChargeSound:Stop()
end
end
function ENT:DoRemove()
if(self.__ChargeSound) then
self.__ChargeSound:Stop()
end
end
function ENT:DoShoot(dest)
local lastpos = self:GetAttachment(1).Pos
local lastdir = dest
local lasthitpos = lastpos
local lastent = self
local bounces = math.random(3, 8)
local __kika02aa = self._User
local hitentities = {[__kika02aa:EntIndex()] = true}
for i = 1, bounces do
local tr = util.TraceLine({
start = lastpos,
endpos = lastpos + lastdir * 65535,
filter = lastent
})
local __i = ((bounces - i + 1) / bounces)
local ef = EffectData()
ef:SetOrigin(tr.HitPos)
ef:SetStart(lastpos)
ef:SetEntity(NULL)
ef:SetScale(__i)
ef:SetFlags(0)
util.Effect("eff_baku_jeeptracer",ef)
lastpos = tr.HitPos
lastdir = ((lastdir - 2 * lastdir:Dot(tr.HitNormal) * tr.HitNormal) + VectorRand() * 0.01):GetNormalized()
lasthitpos = tr.HitPos
if(IsValid(tr.Entity)) then
hitentities[tr.Entity:EntIndex()] = true
local dmg = DamageInfo()
dmg:SetDamage( __i * 40 )
dmg:SetDamageType(bit.bor(DMG_SHOCK, DMG_BULLET, DMG_ENERGYBEAM))
dmg:SetAttacker(__kika02aa)
dmg:SetInflictor(self)
dmg:SetDamagePosition(tr.HitPos)
tr.Entity:TakeDamageInfo(dmg)
if(math.random(1,4) > 1 && tr.Entity:IsNPC()) then
lastent = tr.Entity
local entsnear = ents.FindInSphere(tr.HitPos, 512)
local ent = nil
local lasthealth = 65535
for k, v in pairs(entsnear) do
if(v:IsNPC() && !hitentities[v:EntIndex()] && v:Health() < lasthealth) then
ent = v
lasthealth = v:Health()
end
end
if(IsValid(ent)) then
hitentities[ent:EntIndex()] = true
lastdir = (ent:GetPos() + ent:OBBCenter() - tr.HitPos):GetNormalized()
end
end
end
if(tr.HitSky) then break end
sound.Play("weapons/fx/rics/ric" .. math.random(1, 5) .. ".wav", tr.HitPos, 75, 100 + math.random(-20, 20), 10)
end
self:EmitSound("PropJeep.FireCannon")
local ef = EffectData()
ef:SetEntity(self)
ef:SetAttachment(1)
ef:SetFlags(7)
util.Effect("MuzzleFlash", ef)
ef = EffectData()
ef:SetOrigin(lasthitpos)
util.Effect("cball_explode", ef)
end
else
function ENT:DoInit()
self:SetupCustomModel("models/weapons/jakubbaku/w_gauss.mdl", 1)
self._Notification = {"Hold left mouse, let it charge.", "Watch out for ricochetes!"}
local mat = Matrix()
mat:Translate(Vector(-3, 0, 0))
mat:Rotate(Angle(0, 90, 94))
self._GunModelMatrix = mat
end
function ENT:DoThink()
end
local glow = Material("sprites/bakuglow")
function ENT:DoDraw()
if(self._Active) then
local pos = self:GetAttachment(1).Pos
render.SetMaterial(glow)
render.DrawSprite(pos, 40, 32, Color(255, 180, 40))
local dlight = DynamicLight( self:EntIndex() )
if ( dlight ) then
dlight.pos = pos
dlight.r = 255
dlight.g = 180
dlight.b = 40
dlight.brightness = 1
dlight.Decay = 100
dlight.Size = 64
dlight.DieTime = CurTime() + 0.1
end
end
end
end