mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
190
gamemodes/sandbox/entities/weapons/gmod_tool/stools/dynamite.lua
Normal file
190
gamemodes/sandbox/entities/weapons/gmod_tool/stools/dynamite.lua
Normal file
@@ -0,0 +1,190 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
TOOL.Category = "Construction"
|
||||
TOOL.Name = "#tool.dynamite.name"
|
||||
|
||||
TOOL.ClientConVar[ "group" ] = 52
|
||||
TOOL.ClientConVar[ "damage" ] = 200
|
||||
TOOL.ClientConVar[ "delay" ] = 0
|
||||
TOOL.ClientConVar[ "model" ] = "models/dav0r/tnt/tnt.mdl"
|
||||
TOOL.ClientConVar[ "remove" ] = 0
|
||||
|
||||
TOOL.Information = { { name = "left" } }
|
||||
|
||||
cleanup.Register( "dynamite" )
|
||||
|
||||
local function IsValidDynamiteModel( model )
|
||||
for mdl, _ in pairs( list.Get( "DynamiteModels" ) ) do
|
||||
if ( mdl:lower() == model:lower() ) then return true end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function TOOL:LeftClick( trace )
|
||||
|
||||
if ( !trace.HitPos || IsValid( trace.Entity ) && trace.Entity:IsPlayer() ) then return false end
|
||||
if ( CLIENT ) then return true end
|
||||
|
||||
local ply = self:GetOwner()
|
||||
|
||||
-- Get client's CVars
|
||||
local group = self:GetClientNumber( "group" )
|
||||
local delay = self:GetClientNumber( "delay" )
|
||||
local damage = self:GetClientNumber( "damage" )
|
||||
local model = self:GetClientInfo( "model" )
|
||||
local remove = self:GetClientNumber( "remove" ) == 1
|
||||
|
||||
-- If we shot a dynamite, change it's settings
|
||||
if ( IsValid( trace.Entity ) && trace.Entity:GetClass() == "gmod_dynamite" && trace.Entity:GetPlayer() == ply ) then
|
||||
|
||||
trace.Entity:SetDamage( damage )
|
||||
trace.Entity:SetShouldRemove( remove )
|
||||
trace.Entity:SetDelay( delay )
|
||||
|
||||
numpad.Remove( trace.Entity.NumDown )
|
||||
trace.Entity.key = group
|
||||
trace.Entity.NumDown = numpad.OnDown( ply, group, "DynamiteBlow", trace.Entity )
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
if ( !util.IsValidModel( model ) || !util.IsValidProp( model ) || !IsValidDynamiteModel( model ) ) then return false end
|
||||
if ( !self:GetWeapon():CheckLimit( "dynamite" ) ) then return false end
|
||||
|
||||
local dynamite = MakeDynamite( ply, trace.HitPos, angle_zero, group, damage, model, remove, delay )
|
||||
if ( !IsValid( dynamite ) ) then return false end
|
||||
|
||||
local CurPos = dynamite:GetPos()
|
||||
local Offset = CurPos - dynamite:NearestPoint( CurPos - ( trace.HitNormal * 512 ) )
|
||||
|
||||
dynamite:SetPos( trace.HitPos + Offset )
|
||||
|
||||
undo.Create( "Dynamite" )
|
||||
undo.AddEntity( dynamite )
|
||||
undo.SetPlayer( ply )
|
||||
undo.Finish()
|
||||
|
||||
return true
|
||||
|
||||
end
|
||||
|
||||
if ( SERVER ) then
|
||||
|
||||
function MakeDynamite( ply, pos, ang, key, damage, model, remove, delay, Data )
|
||||
|
||||
if ( IsValid( ply ) && !ply:CheckLimit( "dynamite" ) ) then return nil end
|
||||
if ( !IsValidDynamiteModel( model ) ) then return nil end
|
||||
|
||||
local dynamite = ents.Create( "gmod_dynamite" )
|
||||
|
||||
duplicator.DoGeneric( dynamite, Data )
|
||||
dynamite:SetPos( pos ) -- Backwards compatible for addons directly calling this function
|
||||
dynamite:SetAngles( ang )
|
||||
dynamite:SetModel( model )
|
||||
|
||||
dynamite:SetShouldRemove( remove )
|
||||
dynamite:SetDamage( damage )
|
||||
dynamite:SetDelay( delay )
|
||||
dynamite:Spawn()
|
||||
|
||||
DoPropSpawnedEffect( dynamite )
|
||||
duplicator.DoGenericPhysics( dynamite, ply, Data )
|
||||
|
||||
if ( IsValid( ply ) ) then
|
||||
dynamite:SetPlayer( ply )
|
||||
end
|
||||
|
||||
table.Merge( dynamite:GetTable(), {
|
||||
key = key,
|
||||
pl = ply,
|
||||
Damage = damage,
|
||||
model = model,
|
||||
remove = remove,
|
||||
delay = delay
|
||||
} )
|
||||
|
||||
dynamite.NumDown = numpad.OnDown( ply, key, "DynamiteBlow", dynamite )
|
||||
|
||||
if ( IsValid( ply ) ) then
|
||||
ply:AddCount( "dynamite", dynamite )
|
||||
ply:AddCleanup( "dynamite", dynamite )
|
||||
end
|
||||
|
||||
return dynamite
|
||||
|
||||
end
|
||||
duplicator.RegisterEntityClass( "gmod_dynamite", MakeDynamite, "Pos", "Ang", "key", "Damage", "model", "remove", "delay", "Data" )
|
||||
|
||||
numpad.Register( "DynamiteBlow", function( ply, dynamite )
|
||||
|
||||
if ( !IsValid( dynamite ) ) then return end
|
||||
|
||||
dynamite:Explode( nil, ply )
|
||||
|
||||
end )
|
||||
|
||||
end
|
||||
|
||||
function TOOL:UpdateGhostDynamite( ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
|
||||
local trace = ply:GetEyeTrace()
|
||||
if ( !trace.Hit || IsValid( trace.Entity ) && ( trace.Entity:IsPlayer() || trace.Entity:GetClass() == "gmod_dynamite" ) ) then
|
||||
ent:SetNoDraw( true )
|
||||
return
|
||||
end
|
||||
|
||||
ent:SetAngles( angle_zero )
|
||||
|
||||
local CurPos = ent:GetPos()
|
||||
local Offset = CurPos - ent:NearestPoint( CurPos - ( trace.HitNormal * 512 ) )
|
||||
|
||||
ent:SetPos( trace.HitPos + Offset )
|
||||
|
||||
ent:SetNoDraw( false )
|
||||
|
||||
end
|
||||
|
||||
function TOOL:Think()
|
||||
|
||||
local mdl = self:GetClientInfo( "model" )
|
||||
if ( !IsValidDynamiteModel( mdl ) ) then self:ReleaseGhostEntity() return end
|
||||
|
||||
if ( !IsValid( self.GhostEntity ) || self.GhostEntity:GetModel() != mdl ) then
|
||||
self:MakeGhostEntity( mdl, vector_origin, angle_zero )
|
||||
end
|
||||
|
||||
self:UpdateGhostDynamite( self.GhostEntity, self:GetOwner() )
|
||||
|
||||
end
|
||||
|
||||
local ConVarsDefault = TOOL:BuildConVarList()
|
||||
|
||||
function TOOL.BuildCPanel( CPanel )
|
||||
|
||||
CPanel:AddControl( "Header", { Description = "#tool.dynamite.help" } )
|
||||
|
||||
CPanel:AddControl( "ComboBox", { MenuButton = 1, Folder = "dynamite", Options = { [ "#preset.default" ] = ConVarsDefault }, CVars = table.GetKeys( ConVarsDefault ) } )
|
||||
|
||||
CPanel:AddControl( "Numpad", { Label = "#tool.dynamite.explode", Command = "dynamite_group" } )
|
||||
CPanel:AddControl( "Slider", { Label = "#tool.dynamite.damage", Command = "dynamite_damage", Type = "Float", Min = 0, Max = 500, Help = true } )
|
||||
CPanel:AddControl( "Slider", { Label = "#tool.dynamite.delay", Command = "dynamite_delay", Type = "Float", Min = 0, Max = 10, Help = true } )
|
||||
CPanel:AddControl( "CheckBox", { Label = "#tool.dynamite.remove", Command = "dynamite_remove" } )
|
||||
|
||||
CPanel:AddControl( "PropSelect", { Label = "#tool.dynamite.model", ConVar = "dynamite_model", Height = 0, Models = list.Get( "DynamiteModels" ) } )
|
||||
|
||||
end
|
||||
|
||||
list.Set( "DynamiteModels", "models/dav0r/tnt/tnt.mdl", {} )
|
||||
list.Set( "DynamiteModels", "models/dav0r/tnt/tnttimed.mdl", {} )
|
||||
list.Set( "DynamiteModels", "models/dynamite/dynamite.mdl", {} )
|
||||
Reference in New Issue
Block a user