add sborka
This commit is contained in:
132
garrysmod/addons/tacrp/lua/entities/tacrp_proj_ball.lua
Normal file
132
garrysmod/addons/tacrp/lua/entities/tacrp_proj_ball.lua
Normal file
@@ -0,0 +1,132 @@
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Base = "tacrp_proj_base"
|
||||
ENT.PrintName = "Thrown Ball"
|
||||
ENT.Spawnable = false
|
||||
|
||||
ENT.Model = "models/weapons/tacint_extras/w_baseball.mdl" --"models/weapons/w_models/w_baseball.mdl" -- TODO replace with hexed model
|
||||
|
||||
ENT.IsRocket = false
|
||||
|
||||
ENT.InstantFuse = false
|
||||
ENT.RemoteFuse = false
|
||||
ENT.ImpactFuse = true
|
||||
|
||||
ENT.ExplodeOnDamage = false
|
||||
ENT.ExplodeUnderwater = true
|
||||
|
||||
ENT.Delay = 0
|
||||
|
||||
ENT.SmokeTrail = false
|
||||
|
||||
ENT.Damage = 25
|
||||
|
||||
DEFINE_BASECLASS(ENT.Base)
|
||||
|
||||
function ENT:Initialize()
|
||||
BaseClass.Initialize(self)
|
||||
if SERVER then
|
||||
self:GetPhysicsObject():SetDragCoefficient(0)
|
||||
self.StartPos = self:GetPos()
|
||||
self.Trail = util.SpriteTrail(self, 0, color_white, true, 4, 0, 0.1, 2, "trails/tube")
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:StartTouch(ent)
|
||||
if self.Impacted and (CurTime() - self.SpawnTime) > 0.05 and IsValid(ent) and ent:IsPlayer() and ent:GetNWFloat("TacRPScoutBall", 0) > CurTime() then
|
||||
ent:SetNWFloat("TacRPScoutBall", 0)
|
||||
SafeRemoveEntity(self)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide(data, collider)
|
||||
|
||||
if IsValid(data.HitEntity) and data.HitEntity:GetClass() == "func_breakable_surf" then
|
||||
self:FireBullets({
|
||||
Attacker = self:GetOwner(),
|
||||
Inflictor = self,
|
||||
Damage = 0,
|
||||
Distance = 32,
|
||||
Tracer = 0,
|
||||
Src = self:GetPos(),
|
||||
Dir = data.OurOldVelocity:GetNormalized(),
|
||||
})
|
||||
local pos, ang, vel = self:GetPos(), self:GetAngles(), data.OurOldVelocity
|
||||
self:SetAngles(ang)
|
||||
self:SetPos(pos)
|
||||
self:GetPhysicsObject():SetVelocityInstantaneous(vel * 0.5)
|
||||
return
|
||||
end
|
||||
|
||||
if self.Impacted then return end
|
||||
self.Impacted = true
|
||||
self:SetTrigger(true)
|
||||
self:UseTriggerBounds(true, 8)
|
||||
if IsValid(self.Trail) then
|
||||
self.Trail:Remove()
|
||||
end
|
||||
self:SetCollisionGroup(COLLISION_GROUP_WEAPON)
|
||||
|
||||
local attacker = self.Attacker or self:GetOwner() or self
|
||||
if IsValid(data.HitEntity) then
|
||||
local d = data.OurOldVelocity:GetNormalized()
|
||||
|
||||
local tgtpos = data.HitPos
|
||||
local dist = (tgtpos - self.StartPos):Length()
|
||||
self.Damage = Lerp(math.Clamp(dist / 1500, 0, 1) ^ 1.5, 15, 50) * (data.HitEntity:IsPlayer() and 1 or 1.5)
|
||||
|
||||
local dmg = DamageInfo()
|
||||
dmg:SetAttacker(attacker)
|
||||
dmg:SetInflictor(IsValid(self.Inflictor) and self.Inflictor or self)
|
||||
dmg:SetDamage(self.Damage)
|
||||
dmg:SetDamageType(DMG_SLASH)
|
||||
dmg:SetDamageForce(d * 10000)
|
||||
dmg:SetDamagePosition(data.HitPos)
|
||||
|
||||
if dist > 200 then
|
||||
data.HitEntity.TacRPBashSlow = true
|
||||
end
|
||||
|
||||
if data.HitEntity:IsPlayer() then
|
||||
local wep = data.HitEntity:GetActiveWeapon()
|
||||
if IsValid(wep) and wep.ArcticTacRP then
|
||||
wep:SetBreath(0)
|
||||
wep:SetOutOfBreath(true)
|
||||
end
|
||||
end
|
||||
|
||||
if data.HitEntity:IsPlayer() or data.HitEntity:IsNPC() or data.HitEntity:IsNextBot() then
|
||||
if dist >= 1500 then
|
||||
data.HitEntity:EmitSound("tacrp/sandman/pl_impact_stun_range.wav", 100)
|
||||
else
|
||||
data.HitEntity:EmitSound("tacrp/sandman/pl_impact_stun.wav", 90)
|
||||
end
|
||||
else
|
||||
data.HitEntity:EmitSound("tacrp/sandman/baseball_hitworld" .. math.random(1, 3) .. ".wav", 90)
|
||||
end
|
||||
|
||||
if data.HitEntity:IsNPC() or data.HitEntity:IsNextBot() then
|
||||
data.HitEntity:SetVelocity(Vector(0, 0, 200))
|
||||
if data.HitEntity:IsNPC() then
|
||||
data.HitEntity:SetSchedule(SCHED_FLINCH_PHYSICS)
|
||||
end
|
||||
end
|
||||
|
||||
local atktr = util.TraceLine({
|
||||
start = self:GetPos(),
|
||||
endpos = tgtpos,
|
||||
filter = self
|
||||
})
|
||||
|
||||
TacRP.CancelBodyDamage(data.HitEntity, dmg, atktr.HitGroup)
|
||||
data.HitEntity:SetPhysicsAttacker(attacker, 3)
|
||||
data.HitEntity:DispatchTraceAttack(dmg, atktr)
|
||||
|
||||
self:SetOwner(nil)
|
||||
else
|
||||
data.HitEntity:EmitSound("tacrp/sandman/baseball_hitworld" .. math.random(1, 3) .. ".wav", 90)
|
||||
end
|
||||
|
||||
SafeRemoveEntityDelayed(self, 5)
|
||||
-- self:GetPhysicsObject():SetVelocity(-data.HitNormal * data.OurNewVelocity:Length())
|
||||
end
|
||||
Reference in New Issue
Block a user