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