325 lines
12 KiB
Lua
325 lines
12 KiB
Lua
AddCSLuaFile()
|
|
|
|
ENT.Base = "tacrp_proj_base"
|
|
ENT.PrintName = "Rock"
|
|
ENT.Spawnable = false
|
|
|
|
ENT.Model = "models/props_debris/concrete_chunk05g.mdl"
|
|
|
|
ENT.IsRocket = false // projectile has a booster and will not drop.
|
|
|
|
ENT.InstantFuse = false // projectile is armed immediately after firing.
|
|
ENT.RemoteFuse = false // allow this projectile to be triggered by remote detonator.
|
|
ENT.ImpactFuse = true // projectile explodes on impact.
|
|
|
|
ENT.ExplodeOnDamage = false // projectile explodes when it takes damage.
|
|
ENT.ExplodeUnderwater = false
|
|
|
|
ENT.Delay = 0
|
|
|
|
ENT.AllowFunny = true
|
|
|
|
ENT.ExtraModels = {
|
|
"models/props_junk/PopCan01a.mdl",
|
|
"models/Gibs/HGIBS.mdl",
|
|
"models/props_junk/garbage_glassbottle003a.mdl",
|
|
"models/props_junk/garbage_glassbottle001a.mdl",
|
|
"models/props_junk/garbage_glassbottle002a.mdl",
|
|
"models/props_junk/garbage_metalcan001a.mdl",
|
|
"models/props_junk/garbage_metalcan002a.mdl",
|
|
"models/props_junk/GlassBottle01a.mdl",
|
|
"models/props_junk/garbage_coffeemug001a.mdl",
|
|
"models/props_junk/glassjug01.mdl",
|
|
"models/props_lab/jar01b.mdl",
|
|
"models/props_junk/watermelon01.mdl",
|
|
"models/props_junk/CinderBlock01a.mdl",
|
|
"models/props_junk/MetalBucket01a.mdl",
|
|
"models/props_junk/metal_paintcan001a.mdl",
|
|
"models/Gibs/Antlion_gib_Large_2.mdl",
|
|
"models/props_junk/garbage_plasticbottle003a.mdl",
|
|
"models/props_junk/garbage_plasticbottle002a.mdl",
|
|
"models/props_junk/garbage_plasticbottle001a.mdl",
|
|
"models/props_junk/terracotta01.mdl",
|
|
"models/props_junk/Shoe001a.mdl",
|
|
"models/props_lab/frame002a.mdl",
|
|
"models/props_lab/reciever01c.mdl",
|
|
"models/props_lab/box01a.mdl",
|
|
"models/props_junk/garbage_milkcarton001a.mdl",
|
|
"models/props_lab/cactus.mdl",
|
|
"models/props_lab/desklamp01.mdl",
|
|
"models/Gibs/HGIBS_spine.mdl",
|
|
"models/Gibs/wood_gib01a.mdl",
|
|
"models/Gibs/wood_gib01b.mdl",
|
|
"models/Gibs/wood_gib01c.mdl",
|
|
"models/Gibs/wood_gib01d.mdl",
|
|
"models/Gibs/wood_gib01e.mdl",
|
|
"models/props_c17/oildrum001_explosive.mdl", // won't actually explode :trolleg:
|
|
"models/props_interiors/SinkKitchen01a.mdl",
|
|
"models/props_borealis/door_wheel001a.mdl",
|
|
"models/hunter/blocks/cube025x025x025.mdl",
|
|
"models/food/burger.mdl",
|
|
"models/food/hotdog.mdl",
|
|
"models/lamps/torch.mdl",
|
|
"models/player/items/humans/top_hat.mdl",
|
|
"models/dav0r/camera.mdl",
|
|
"models/dav0r/tnt/tnt.mdl",
|
|
"models/maxofs2d/camera.mdl",
|
|
"models/maxofs2d/companion_doll.mdl",
|
|
"models/maxofs2d/cube_tool.mdl",
|
|
"models/maxofs2d/light_tubular.mdl",
|
|
"models/maxofs2d/lamp_flashlight.mdl",
|
|
"models/mechanics/gears/gear12x12.mdl",
|
|
"models/mechanics/various/211.mdl",
|
|
"models/props_phx/games/chess/white_rook.mdl",
|
|
"models/props_phx/games/chess/white_queen.mdl",
|
|
"models/props_phx/games/chess/white_pawn.mdl",
|
|
"models/props_phx/games/chess/white_knight.mdl",
|
|
"models/props_phx/games/chess/white_king.mdl",
|
|
"models/props_phx/games/chess/white_dama.mdl",
|
|
"models/props_phx/games/chess/black_rook.mdl",
|
|
"models/props_phx/games/chess/black_queen.mdl",
|
|
"models/props_phx/games/chess/black_pawn.mdl",
|
|
"models/props_phx/games/chess/black_knight.mdl",
|
|
"models/props_phx/games/chess/black_king.mdl",
|
|
"models/props_phx/games/chess/black_dama.mdl",
|
|
"models/props_phx/games/chess/black_bishop.mdl",
|
|
"models/props_phx/misc/egg.mdl",
|
|
"models/props_phx/misc/potato.mdl",
|
|
"models/props_phx/misc/potato_launcher_explosive.mdl",
|
|
"models/props_phx/misc/smallcannonball.mdl",
|
|
"models/props_phx/misc/soccerball.mdl",
|
|
"models/props_phx/misc/fender.mdl",
|
|
"models/props_combine/breenbust.mdl",
|
|
"models/props_combine/breenglobe.mdl",
|
|
"models/props_combine/combinebutton.mdl",
|
|
"models/props_combine/breenclock.mdl",
|
|
"models/props_interiors/pot01a.mdl",
|
|
"models/props_junk/garbage_bag001a.mdl",
|
|
"models/props_lab/harddrive02.mdl",
|
|
"models/props_lab/monitor02.mdl", // HAAAAAAX
|
|
"models/props_lab/clipboard.mdl",
|
|
"models/props_lab/tpplug.mdl",
|
|
"models/props_pipes/valvewheel002a.mdl",
|
|
"models/props_pipes/valve003.mdl",
|
|
"models/props_rooftop/sign_letter_m001.mdl",
|
|
"models/props_rooftop/sign_letter_f001b.mdl",
|
|
"models/props_rooftop/sign_letter_u001b.mdl",
|
|
"models/props_wasteland/speakercluster01a.mdl",
|
|
"models/props_wasteland/prison_toilet01.mdl",
|
|
"models/props_c17/streetsign001c.mdl",
|
|
"models/props_c17/streetsign002b.mdl",
|
|
"models/props_c17/streetsign003b.mdl",
|
|
"models/props_c17/streetsign004e.mdl",
|
|
"models/props_c17/streetsign004f.mdl",
|
|
"models/props_c17/streetsign005b.mdl",
|
|
"models/props_c17/streetsign005c.mdl",
|
|
"models/props_c17/streetsign005d.mdl",
|
|
"models/props_c17/playgroundTick-tack-toe_block01a.mdl",
|
|
"models/props_c17/doll01.mdl",
|
|
"models/props_c17/BriefCase001a.mdl",
|
|
"models/props_c17/metalPot001a.mdl",
|
|
"models/props_c17/metalPot002a.mdl",
|
|
"models/props_canal/mattpipe.mdl",
|
|
"models/extras/info_speech.mdl",
|
|
"models/items/grenadeammo.mdl", // not a live one
|
|
"models/props_c17/light_cagelight02_on.mdl",
|
|
"models/props_c17/suitcase_passenger_physics.mdl",
|
|
"models/props_citizen_tech/guillotine001a_wheel01.mdl",
|
|
"models/props_interiors/bathtub01a.mdl", // now this is just absurd
|
|
"models/props_junk/garbage_takeoutcarton001a.mdl",
|
|
"models/props_junk/garbage_newspaper001a.mdl",
|
|
"models/props_junk/sawblade001a.mdl",
|
|
"models/props_lab/bewaredog.mdl",
|
|
"models/props_lab/huladoll.mdl",
|
|
"models/props_lab/powerbox02d.mdl",
|
|
"models/props_lab/powerbox02b.mdl",
|
|
"models/props_lab/powerbox02a.mdl",
|
|
"models/weapons/w_bugbait.mdl",
|
|
"models/weapons/w_alyx_gun.mdl",
|
|
"models/weapons/w_crowbar.mdl",
|
|
"models/weapons/w_smg1.mdl",
|
|
"models/weapons/w_shotgun.mdl",
|
|
"models/weapons/w_rocket_launcher.mdl",
|
|
"models/weapons/w_pistol.mdl",
|
|
"models/weapons/w_physics.mdl",
|
|
"models/weapons/w_irifle.mdl",
|
|
"models/weapons/w_357.mdl",
|
|
"models/weapons/w_package.mdl",
|
|
"models/weapons/w_pist_deagle.mdl",
|
|
"models/weapons/w_pist_elite_single.mdl",
|
|
"models/weapons/w_pist_glock18.mdl",
|
|
"models/weapons/w_rif_ak47.mdl",
|
|
"models/weapons/w_rif_m4a1.mdl",
|
|
"models/weapons/w_shot_m3super90.mdl",
|
|
"models/weapons/w_smg_mp5.mdl",
|
|
"models/weapons/w_snip_awp.mdl",
|
|
"models/weapons/w_crossbow.mdl",
|
|
"models/weapons/w_eq_defuser.mdl",
|
|
"models/weapons/w_toolgun.mdl",
|
|
"models/weapons/w_missile_closed.mdl",
|
|
"models/weapons/w_stunbaton.mdl",
|
|
"models/weapons/w_annabelle.mdl",
|
|
"models/roller.mdl",
|
|
"models/pigeon.mdl",
|
|
"models/headcrabclassic.mdl",
|
|
"models/headcrab.mdl",
|
|
"models/headcrabblack.mdl",
|
|
"models/crow.mdl",
|
|
"models/seagull.mdl",
|
|
"models/kleiner.mdl",
|
|
"models/gman.mdl",
|
|
"models/manhack.mdl",
|
|
|
|
// CSS
|
|
"models/props/cs_militia/bottle01.mdl",
|
|
"models/props/cs_office/coffee_mug.mdl",
|
|
"models/props/cs_office/computer_keyboard.mdl",
|
|
"models/props/cs_office/water_bottle.mdl",
|
|
"models/props/cs_office/projector_remote.mdl",
|
|
"models/props/cs_office/phone.mdl",
|
|
"models/props/cs_italy/bananna_bunch.mdl",
|
|
"models/props/cs_italy/bananna.mdl",
|
|
"models/props/cs_italy/orange.mdl",
|
|
"models/props/de_tides/vending_turtle.mdl",
|
|
}
|
|
|
|
function ENT:Initialize()
|
|
if SERVER then
|
|
if util.IsValidModel(TacRP.ConVars["rock_funny"]:GetString()) then
|
|
self:SetModel(TacRP.ConVars["rock_funny"]:GetString())
|
|
elseif self.AllowFunny and math.random() <= TacRP.ConVars["rock_funny"]:GetFloat() then
|
|
local i = math.min(TacRP.ConVars["rock_funny"]:GetFloat() > 1 and TacRP.ConVars["rock_funny"]:GetInt() - 1 or math.random(1, #self.ExtraModels), #self.ExtraModels)
|
|
local mdl = self.ExtraModels[i]
|
|
self:SetModel(util.IsValidModel(mdl) and mdl or self.Model)
|
|
else
|
|
self:SetModel(self.Model)
|
|
end
|
|
|
|
self:SetSkin(math.random(1, self:SkinCount()))
|
|
|
|
self:PhysicsInit(SOLID_VPHYSICS)
|
|
self:SetMoveType(MOVETYPE_VPHYSICS)
|
|
self:SetSolid(SOLID_VPHYSICS)
|
|
self:SetCollisionGroup(COLLISION_GROUP_PROJECTILE)
|
|
if self.Defusable then
|
|
self:SetUseType(SIMPLE_USE)
|
|
end
|
|
self:PhysWake()
|
|
|
|
local phys = self:GetPhysicsObject()
|
|
if !phys:IsValid() then
|
|
self:Remove()
|
|
else
|
|
phys:SetDragCoefficient(0)
|
|
phys:SetMass(2)
|
|
end
|
|
|
|
if self.IsRocket then
|
|
phys:EnableGravity(false)
|
|
end
|
|
end
|
|
|
|
self.SpawnTime = CurTime()
|
|
|
|
self.NPCDamage = IsValid(self:GetOwner()) and self:GetOwner():IsNPC() and !TacRP.ConVars["npc_equality"]:GetBool()
|
|
|
|
if self.AudioLoop then
|
|
self.LoopSound = CreateSound(self, self.AudioLoop)
|
|
self.LoopSound:Play()
|
|
end
|
|
|
|
if self.InstantFuse then
|
|
self.ArmTime = CurTime()
|
|
self.Armed = true
|
|
end
|
|
end
|
|
|
|
function ENT:Impact(data, collider)
|
|
return true
|
|
end
|
|
|
|
|
|
function ENT:PhysicsCollide(data, collider)
|
|
local attacker = self.Attacker or self:GetOwner() or self
|
|
|
|
if IsValid(data.HitEntity) and data.HitEntity:GetClass() == "func_breakable_surf" then
|
|
self:FireBullets({
|
|
Attacker = attacker,
|
|
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
|
|
|
|
local prop1 = util.GetSurfaceData(data.OurSurfaceProps)
|
|
local prop2 = util.GetSurfaceData(data.TheirSurfaceProps)
|
|
|
|
|
|
if IsValid(data.HitEntity) and (self.LastDamage or 0) + 0.25 < CurTime() then
|
|
local dmg = DamageInfo()
|
|
dmg:SetAttacker(attacker)
|
|
dmg:SetInflictor(self)
|
|
dmg:SetDamage(Lerp((data.OurOldVelocity:Length() - 500) / 2500, 4, 35))
|
|
if self:GetModel() != self.Model then
|
|
dmg:ScaleDamage(2)
|
|
end
|
|
dmg:SetDamageType(DMG_CRUSH + DMG_CLUB)
|
|
dmg:SetDamageForce(data.OurOldVelocity)
|
|
dmg:SetDamagePosition(data.HitPos)
|
|
data.HitEntity:TakeDamageInfo(dmg)
|
|
self.LastDamage = CurTime()
|
|
self:SetCollisionGroup(COLLISION_GROUP_WEAPON)
|
|
elseif data.Speed >= 75 and (self.LastImpact or 0) + 0.1 < CurTime() then
|
|
self.LastImpact = CurTime()
|
|
self:EmitSound(self:GetModel() == self.Model and "physics/concrete/rock_impact_hard" .. math.random(1, 6) .. ".wav" or prop1.impactHardSound)
|
|
elseif data.Speed >= 25 and (self.LastImpact or 0) + 0.1 < CurTime() then
|
|
self.LastImpact = CurTime()
|
|
self:EmitSound(self:GetModel() == self.Model and "physics/concrete/rock_impact_soft" .. math.random(1, 3) .. ".wav" or prop1.impactSoftSound)
|
|
end
|
|
|
|
if !self.FirstHit then
|
|
self.FirstHit = true
|
|
self:EmitSound(prop2.bulletImpactSound)
|
|
|
|
if self:GetModel() == self.Model then
|
|
self:EmitSound("physics/concrete/concrete_break" .. math.random(2, 3) .. ".wav", 75, math.Rand(105, 110), 0.5)
|
|
SafeRemoveEntityDelayed(self, 3)
|
|
else
|
|
self:EmitSound(prop1.impactHardSound)
|
|
if util.IsValidRagdoll(self:GetModel()) then
|
|
local rag = ents.Create("prop_ragdoll")
|
|
rag:SetModel(self:GetModel())
|
|
rag:SetPos(self:GetPos())
|
|
rag:SetAngles(self:GetAngles())
|
|
rag:Spawn()
|
|
rag:SetCollisionGroup(COLLISION_GROUP_WEAPON)
|
|
if IsValid(rag:GetPhysicsObject()) then
|
|
rag:GetPhysicsObject():ApplyForceOffset(data.HitPos, data.OurOldVelocity)
|
|
end
|
|
|
|
SafeRemoveEntityDelayed(rag, 5)
|
|
self:Remove()
|
|
else
|
|
local gibs = self:PrecacheGibs()
|
|
if gibs > 0 then
|
|
self:GibBreakClient(data.OurNewVelocity * math.Rand(0.8, 1.2))
|
|
// self:GibBreakServer( data.OurOldVelocity * 2 )
|
|
self:Remove()
|
|
else
|
|
SafeRemoveEntityDelayed(self, 3)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
end
|
|
end
|