Files
wnsrc/gamemodes/terrortown/entities/entities/ttt_physhammer.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +03:00

184 lines
4.7 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.Type = "anim"
ENT.Model = Model("models/Items/combine_rifle_ammo01.mdl")
ENT.Stuck = false
ENT.Weaponised = false
ENT.PunchMax = 6
ENT.PunchRemaining = 6
function ENT:Initialize()
self:SetModel(self.Model)
self:SetSolid(SOLID_NONE)
if SERVER then
self:SetGravity(0.4)
self:SetFriction(1.0)
self:SetElasticity(0.45)
self:NextThink(CurTime() + 1)
end
self:SetColor(Color(55, 50, 250, 255))
self.Stuck = false
self.PunchMax = 6
self.PunchRemaining = self.PunchMax
end
function ENT:StickTo(ent)
if (not IsValid(ent)) or ent:IsPlayer() or ent:GetMoveType() != MOVETYPE_VPHYSICS then return false end
local phys = ent:GetPhysicsObject()
if (not IsValid(phys)) or (not phys:IsMoveable()) then return false end
-- local norm = self:GetAngles():Up()
self:SetParent(ent)
ent:SetPhysicsAttacker(self:GetOwner())
ent:SetNWBool("punched", true)
self.PunchEntity = ent
self:StartEffects()
self.Stuck = true
return true
end
function ENT:OnRemove()
if IsValid(self.BallSprite) then
self.BallSprite:Remove()
end
if IsValid(self.PunchEntity) then
self.PunchEntity:SetPhysicsAttacker(self.PunchEntity)
self.PunchEntity:SetNWBool("punched", false)
end
end
function ENT:StartEffects()
-- MAKE IT PRETTY
local sprite = ents.Create("env_sprite")
if IsValid(sprite) then
-- local angpos = self:GetAttachment(ball)
-- sometimes attachments don't work (Lua-side) on dedicated servers,
-- so have to fudge it
local ang = self:GetAngles()
local pos = self:GetPos() + self:GetAngles():Up() * 6
sprite:SetPos(pos)
sprite:SetAngles(ang)
sprite:SetParent(self)
sprite:SetKeyValue("model", "sprites/combineball_glow_blue_1.vmt")
sprite:SetKeyValue("spawnflags", "1")
sprite:SetKeyValue("scale", "0.25")
sprite:SetKeyValue("rendermode", "5")
sprite:SetKeyValue("renderfx", "7")
sprite:Spawn()
sprite:Activate()
self.BallSprite = sprite
end
local effect = EffectData()
effect:SetStart(self:GetPos())
effect:SetOrigin(self:GetPos())
effect:SetNormal(self:GetAngles():Up())
util.Effect("ManhackSparks", effect, true, true)
if SERVER then
local ball = self:LookupAttachment("attach_ball")
util.SpriteTrail(self, ball, Color(250, 250, 250), false, 30, 0, 1, 0.07, "trails/physbeam.vmt")
end
end
if SERVER then
local diesound = Sound("weapons/physcannon/energy_disintegrate4.wav")
local punchsound = Sound("weapons/ar2/ar2_altfire.wav")
function ENT:Think()
if not self.Stuck then return end
if self.PunchRemaining <= 0 then
-- self:StopParticles()
local pos = self:GetPos()
util.BlastDamage(self, self:GetOwner(), pos, 300, 125)
sound.Play(diesound, pos, 100, 100)
self:Remove()
local effect = EffectData()
effect:SetStart(pos)
effect:SetOrigin(pos)
util.Effect("Explosion", effect, true, true)
else
self.PunchRemaining = self.PunchRemaining - 1
if IsValid(self.PunchEntity) and IsValid(self.PunchEntity:GetPhysicsObject()) then
local punchphys = self.PunchEntity:GetPhysicsObject()
-- Make physexplosion
local phexp = ents.Create("env_physexplosion")
if IsValid(phexp) then
phexp:SetPos(self:GetPos())
phexp:SetKeyValue("magnitude", 100)
phexp:SetKeyValue("radius", 128)
phexp:SetKeyValue("spawnflags", 1 + 2)
phexp:Spawn()
phexp:Fire("Explode", "", 0)
end
local norm = self:GetAngles():Up() * -1
-- Add speed to ourselves
local base = 120
local bonus = punchphys:GetMass() * 2
local vel = math.max(base * 2, base + bonus)
punchphys:AddVelocity(norm * vel)
util.BlastDamage(self, self:GetOwner(), self:GetPos(), 200, 50)
local effect = EffectData()
effect:SetStart(self:GetPos())
effect:SetOrigin(self:GetPos())
effect:SetNormal(norm * -1)
effect:SetRadius(16)
effect:SetScale(1)
util.Effect("ManhackSparks", effect, true, true)
sound.Play(punchsound, self:GetPos(), 80, 100)
end
end
local delay = math.max(0.1, self.PunchRemaining / self.PunchMax) * 3
self:NextThink(CurTime() + delay)
return true
end
end