mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
207
gamemodes/sandbox/entities/weapons/gmod_tool/stools/button.lua
Normal file
207
gamemodes/sandbox/entities/weapons/gmod_tool/stools/button.lua
Normal file
@@ -0,0 +1,207 @@
|
||||
--[[
|
||||
| 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.button.name"
|
||||
|
||||
TOOL.ClientConVar[ "model" ] = "models/maxofs2d/button_05.mdl"
|
||||
TOOL.ClientConVar[ "keygroup" ] = "37"
|
||||
TOOL.ClientConVar[ "description" ] = ""
|
||||
TOOL.ClientConVar[ "toggle" ] = "1"
|
||||
|
||||
TOOL.Information = {
|
||||
{ name = "left" },
|
||||
{ name = "right" }
|
||||
}
|
||||
|
||||
cleanup.Register( "buttons" )
|
||||
|
||||
local function IsValidButtonModel( model )
|
||||
for mdl, _ in pairs( list.Get( "ButtonModels" ) ) do
|
||||
if ( mdl:lower() == model:lower() ) then return true end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function TOOL:RightClick( trace, worldweld )
|
||||
|
||||
if ( IsValid( trace.Entity ) && trace.Entity:IsPlayer() ) then return false end
|
||||
if ( SERVER && !util.IsValidPhysicsObject( trace.Entity, trace.PhysicsBone ) ) then return false end
|
||||
if ( CLIENT ) then return true end
|
||||
|
||||
local model = self:GetClientInfo( "model" )
|
||||
local key = self:GetClientNumber( "keygroup" )
|
||||
local description = self:GetClientInfo( "description" )
|
||||
local toggle = self:GetClientNumber( "toggle" ) == 1
|
||||
local ply = self:GetOwner()
|
||||
|
||||
-- If we shot a button change its settings
|
||||
if ( IsValid( trace.Entity ) && trace.Entity:GetClass() == "gmod_button" && trace.Entity:GetPlayer() == ply ) then
|
||||
trace.Entity:SetKey( key )
|
||||
trace.Entity:SetLabel( description )
|
||||
trace.Entity:SetIsToggle( toggle )
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
-- Check the model's validity
|
||||
if ( !util.IsValidModel( model ) || !util.IsValidProp( model ) || !IsValidButtonModel( model ) ) then return false end
|
||||
if ( !self:GetWeapon():CheckLimit( "buttons" ) ) then return false end
|
||||
|
||||
local Ang = trace.HitNormal:Angle()
|
||||
Ang.pitch = Ang.pitch + 90
|
||||
|
||||
local button = MakeButton( ply, model, Ang, trace.HitPos, key, description, toggle )
|
||||
if ( !IsValid( button ) ) then return false end
|
||||
|
||||
local min = button:OBBMins()
|
||||
button:SetPos( trace.HitPos - trace.HitNormal * min.z )
|
||||
|
||||
undo.Create( "Button" )
|
||||
undo.AddEntity( button )
|
||||
|
||||
if ( worldweld && trace.Entity != NULL ) then
|
||||
local weld = constraint.Weld( button, trace.Entity, 0, trace.PhysicsBone, 0, 0, true )
|
||||
if ( IsValid( weld ) ) then
|
||||
ply:AddCleanup( "buttons", weld )
|
||||
undo.AddEntity( weld )
|
||||
end
|
||||
|
||||
if ( IsValid( button:GetPhysicsObject() ) ) then button:GetPhysicsObject():EnableCollisions( false ) end
|
||||
button:SetCollisionGroup( COLLISION_GROUP_WORLD )
|
||||
button.nocollide = true
|
||||
end
|
||||
|
||||
undo.SetPlayer( ply )
|
||||
undo.Finish()
|
||||
|
||||
return true
|
||||
|
||||
end
|
||||
|
||||
function TOOL:LeftClick( trace )
|
||||
|
||||
return self:RightClick( trace, true )
|
||||
|
||||
end
|
||||
|
||||
if ( SERVER ) then
|
||||
|
||||
function MakeButton( ply, model, ang, pos, key, description, toggle, nocollide, Data )
|
||||
|
||||
if ( IsValid( ply ) && !ply:CheckLimit( "buttons" ) ) then return false end
|
||||
if ( !IsValidButtonModel( model ) ) then return false end
|
||||
|
||||
local button = ents.Create( "gmod_button" )
|
||||
if ( !IsValid( button ) ) then return false end
|
||||
|
||||
duplicator.DoGeneric( button, Data )
|
||||
button:SetModel( model ) -- Backwards compatible for addons directly calling this function
|
||||
button:SetAngles( ang )
|
||||
button:SetPos( pos )
|
||||
button:Spawn()
|
||||
|
||||
DoPropSpawnedEffect( button )
|
||||
duplicator.DoGenericPhysics( button, ply, Data )
|
||||
|
||||
button:SetPlayer( ply )
|
||||
button:SetKey( key )
|
||||
button:SetLabel( description )
|
||||
button:SetIsToggle( toggle )
|
||||
|
||||
if ( nocollide == true ) then
|
||||
if ( IsValid( button:GetPhysicsObject() ) ) then button:GetPhysicsObject():EnableCollisions( false ) end
|
||||
button:SetCollisionGroup( COLLISION_GROUP_WORLD )
|
||||
end
|
||||
|
||||
table.Merge( button:GetTable(), {
|
||||
key = key,
|
||||
pl = ply,
|
||||
toggle = toggle,
|
||||
nocollide = nocollide,
|
||||
description = description
|
||||
} )
|
||||
|
||||
if ( IsValid( ply ) ) then
|
||||
ply:AddCount( "buttons", button )
|
||||
ply:AddCleanup( "buttons", button )
|
||||
end
|
||||
|
||||
return button
|
||||
|
||||
end
|
||||
|
||||
duplicator.RegisterEntityClass( "gmod_button", MakeButton, "Model", "Ang", "Pos", "key", "description", "toggle", "nocollide", "Data" )
|
||||
|
||||
end
|
||||
|
||||
function TOOL:UpdateGhostButton( ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
|
||||
local trace = ply:GetEyeTrace()
|
||||
if ( !trace.Hit || IsValid( trace.Entity ) && ( trace.Entity:GetClass() == "gmod_button" || trace.Entity:IsPlayer() ) ) then
|
||||
ent:SetNoDraw( true )
|
||||
return
|
||||
end
|
||||
|
||||
local ang = trace.HitNormal:Angle()
|
||||
ang.pitch = ang.pitch + 90
|
||||
|
||||
local min = ent:OBBMins()
|
||||
ent:SetPos( trace.HitPos - trace.HitNormal * min.z )
|
||||
ent:SetAngles( ang )
|
||||
|
||||
ent:SetNoDraw( false )
|
||||
|
||||
end
|
||||
|
||||
function TOOL:Think()
|
||||
|
||||
local mdl = self:GetClientInfo( "model" )
|
||||
if ( !IsValidButtonModel( mdl ) ) then self:ReleaseGhostEntity() return end
|
||||
|
||||
if ( !IsValid( self.GhostEntity ) || self.GhostEntity:GetModel() != mdl ) then
|
||||
self:MakeGhostEntity( mdl, vector_origin, angle_zero )
|
||||
end
|
||||
|
||||
self:UpdateGhostButton( self.GhostEntity, self:GetOwner() )
|
||||
|
||||
end
|
||||
|
||||
local ConVarsDefault = TOOL:BuildConVarList()
|
||||
|
||||
function TOOL.BuildCPanel( CPanel )
|
||||
|
||||
CPanel:AddControl( "Header", { Description = "#tool.button.desc" } )
|
||||
|
||||
CPanel:AddControl( "ComboBox", { MenuButton = 1, Folder = "button", Options = { [ "#preset.default" ] = ConVarsDefault }, CVars = table.GetKeys( ConVarsDefault ) } )
|
||||
|
||||
CPanel:AddControl( "Numpad", { Label = "#tool.button.key", Command = "button_keygroup" } )
|
||||
|
||||
CPanel:AddControl( "TextBox", { Label = "#tool.button.text", Command = "button_description", MaxLenth = "20" } )
|
||||
|
||||
CPanel:AddControl( "CheckBox", { Label = "#tool.button.toggle", Command = "button_toggle", Help = true } )
|
||||
|
||||
CPanel:AddControl( "PropSelect", { Label = "#tool.button.model", ConVar = "button_model", Height = 0, Models = list.Get( "ButtonModels" ) } )
|
||||
|
||||
end
|
||||
|
||||
list.Set( "ButtonModels", "models/maxofs2d/button_01.mdl", {} )
|
||||
list.Set( "ButtonModels", "models/maxofs2d/button_02.mdl", {} )
|
||||
list.Set( "ButtonModels", "models/maxofs2d/button_03.mdl", {} )
|
||||
list.Set( "ButtonModels", "models/maxofs2d/button_04.mdl", {} )
|
||||
list.Set( "ButtonModels", "models/maxofs2d/button_05.mdl", {} )
|
||||
list.Set( "ButtonModels", "models/maxofs2d/button_06.mdl", {} )
|
||||
list.Set( "ButtonModels", "models/maxofs2d/button_slider.mdl", {} )
|
||||
|
||||
--list.Set( "ButtonModels", "models/dav0r/buttons/button.mdl", {} )
|
||||
--list.Set( "ButtonModels", "models/dav0r/buttons/switch.mdl", {} )
|
||||
Reference in New Issue
Block a user