mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
193 lines
4.6 KiB
Lua
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
|