continue gmod_tool linker

This commit is contained in:
shadowscion 2023-01-17 19:50:52 -06:00
parent 36477416e1
commit fb640e76da
5 changed files with 151 additions and 52 deletions

View File

@ -10,10 +10,8 @@ ENT.Category = "tanktracktool"
local tanktracktool = tanktracktool
ENT.tanktracktool_linkData = {
{ name = "Entity1", tool_bind = 2 },
{ name = "Entity2", tool_bind = 3 },
}
tanktracktool.netvar.addLinks( ENT, "Entity1" )
tanktracktool.netvar.addLinks( ENT, "Entity2" )
function ENT:netvar_setLinks( tbl, ply )
tbl = {

View File

@ -9,17 +9,15 @@ ENT.Category = "tanktracktool"
local tanktracktool = tanktracktool
ENT.tanktracktool_linkerData = {
{ name = "Chassis", bind = { KEY_E } },
{ name = "WheelLeft", bind = { KEY_E } },
{ name = "WheelRight", bind = { KEY_E } },
}
tanktracktool.netvar.addLinks( ENT, "Chassis" )
tanktracktool.netvar.addLinks( ENT, "LeftWheel" )
tanktracktool.netvar.addLinks( ENT, "RightWheel" )
function ENT:netvar_setLinks( tbl, ply )
tbl = {
Chassis = tbl.Chassis or self.netvar.entities.Chassis,
WheelLeft = tbl.WheelLeft or self.netvar.entities.WheelLeft,
WheelRight = tbl.WheelRight or self.netvar.entities.WheelRight,
LeftWheel = tbl.LeftWheel or self.netvar.entities.LeftWheel,
RightWheel = tbl.RightWheel or self.netvar.entities.RightWheel,
}
return tanktracktool.netvar.setLinks( self, tbl, ply )
end

View File

@ -6,13 +6,10 @@ ENT.Spawnable = true
ENT.AdminOnly = false
ENT.Category = "tanktracktool"
ENT.tanktracktool_linkerData = {
{ name = "Chassis", bind = { KEY_E } },
{
{ name = "Roller", istable = true, bind = { KEY_E, KEY_LSHIFT } },
{ name = "Wheel", istable = true, bind = { KEY_E } },
},
}
local tanktracktool = tanktracktool
tanktracktool.netvar.addLinks( ENT, "Chassis" )
tanktracktool.netvar.addLinks( ENT, "Wheel", "Roller" )
local netvar = tanktracktool.netvar.new()

View File

@ -526,7 +526,7 @@ function netvar.getVar( ent, name, index )
return ent.netvar.values[name]
end
function tanktracktool.netvar.setLinks( ent, tbl, ply )
function netvar.setLinks( ent, tbl, ply )
if not netvar.isValid( ent ) then return false end
if not istable( tbl ) then return false end
@ -544,6 +544,22 @@ function tanktracktool.netvar.setLinks( ent, tbl, ply )
return entities
end
function netvar.addLinks( e, n1, n2 )
if not isstring( n1 ) or ( n2 and not isstring( n2 ) ) then return end
if not e.tanktracktool_linkData then e.tanktracktool_linkData = {} end
if not n2 then
table.insert( e.tanktracktool_linkData, { name = n1, tool_bind = "rmb" } )
else
table.insert( e.tanktracktool_linkData, {
istable = true,
{ name = n1, tool_bind = "rmb" },
{ name = n2, tool_bind = "rmb+shift" },
} )
end
end
--[[
duplicator support

View File

@ -186,6 +186,8 @@ multitool.ui.colors.text_keyword = Color( 0, 255, 255 )
multitool.ui.colors.text_input = Color( 0, 255, 0 )
multitool.ui.colors.text_plain = Color( 255, 255, 255 )
multitool.ui.colors.text_box = Color( 0, 0, 0, 100 )
multitool.ui.colors.text_linked = Color( 255, 200, 0, 200 )
multitool.ui.colors.text_linked_box = Color( 0, 0, 0, 100 )
multitool.ui.colors.ents_bbox = Color( 255, 255, 255, 30 )
multitool.ui.colors.ents_possible = rgb( multitool.ui.colors.text_plain, 0.111 )
@ -196,8 +198,8 @@ multitool.ui.fonts = {}
multitool.ui.fonts.small = "tanktracktool_stool0"
multitool.ui.fonts.large = "tanktracktool_stool1"
surface.CreateFont( multitool.ui.fonts.small, { font = "Comic Sans MS", size = 24, weight = 100, shadow = false } )
surface.CreateFont( multitool.ui.fonts.large, { font = "Comic Sans MS", size = 30, weight = 100, shadow = false } )
surface.CreateFont( multitool.ui.fonts.small, { font = "Comic Sans MS", size = 16, weight = 100, shadow = false } )
surface.CreateFont( multitool.ui.fonts.large, { font = "Comic Sans MS", size = 24, weight = 100, shadow = false } )
function multitool:renderModel( ent, color )
if not IsValid( ent ) then return end
@ -249,15 +251,17 @@ local function DrawOverlay( x, y, overlay )
end
x = x - w * 0.5
if overlay.lower then y = y + h * overlay.lower end
if overlay.raise then y = y - h * overlay.raise end
draw.RoundedBox( 8, x - 8, y - 8, w + 16, h + 16, multitool.ui.colors.text_box )
draw.RoundedBox( 8, x - 8, y - 8, w + 16, h + 16, overlay.text_box or multitool.ui.colors.text_box )
for i = 1, #overlay do
local ui = overlay[i]
if not overlay[i].enabled then goto CONTINUE end
surface.SetFont( ui.font )
surface.SetTextColor( color_black )
surface.SetTextColor( overlay.text_out or color_black )
for ox = -1, 1 do
for oy = -1, 1 do
@ -278,13 +282,17 @@ local function DrawOverlay( x, y, overlay )
end
end
local function GetOverlay( overlay )
local function GetOverlay( overlay, enabled, param )
for k, v in ipairs( overlay ) do
v.text = table.concat( v.draw.text, "" )
v.size = GetTextSize( v.text, v.font )
v.enabled = false
v.enabled = enabled
end
if param then
for k, v in pairs( param ) do
overlay[k] = v
end
end
return overlay
end
@ -301,7 +309,7 @@ do
local overlay = GetOverlay( {
{
font = multitool.ui.fonts.small,
font = multitool.ui.fonts.large,
draw = {
text = {
"",
@ -312,7 +320,7 @@ do
},
},
{
font = multitool.ui.fonts.small,
font = multitool.ui.fonts.large,
draw = {
text = {
"Left Click ",
@ -329,7 +337,7 @@ do
},
},
{
font = multitool.ui.fonts.small,
font = multitool.ui.fonts.large,
draw = {
text = {
"Right Click ",
@ -435,7 +443,7 @@ do
local overlay = GetOverlay( {
{
font = multitool.ui.fonts.small,
font = multitool.ui.fonts.large,
draw = {
text = {
"",
@ -446,7 +454,7 @@ do
},
},
{
font = multitool.ui.fonts.small,
font = multitool.ui.fonts.large,
draw = {
text = {
"Left Click ",
@ -565,7 +573,7 @@ do
local overlay = GetOverlay( {
{
font = multitool.ui.fonts.small,
font = multitool.ui.fonts.large,
draw = {
text = {
"",
@ -576,7 +584,7 @@ do
},
},
{
font = multitool.ui.fonts.small,
font = multitool.ui.fonts.large,
draw = {
text = {
"Right Click ",
@ -595,7 +603,7 @@ do
},
},
{
font = multitool.ui.fonts.small,
font = multitool.ui.fonts.large,
draw = {
text = {
"Right Click ",
@ -629,8 +637,9 @@ do
self.Data = {}
self.Data.Send = {}
self.Data.Info = multitool:getLinkableInfo( self.LinkTo )
self.Data.Command = 1
self:updateOverlays()
self:updateOverlay()
gmod_tool:SetOperation( 2 )
end
@ -650,6 +659,14 @@ do
self.LookAt = tr.Entity
gmod_tool:SetStage( 1 )
end
if self.Ents then
for ent, disp in pairs( self.Ents ) do
if not IsValid( ent ) then
return multitool:reset()
end
end
end
end
function multitool.modes.link:draw( gmod_tool, ply )
@ -671,42 +688,115 @@ do
DrawOverlay( x, y, overlay )
end
if self.Ents then
for ent, disp in pairs( self.Ents ) do
if not IsValid( ent ) then
goto CONTINUE
end
local pos = ent:GetPos():ToScreen()
local x = pos.x
local y = pos.y
DrawOverlay( x, y, disp, true )
::CONTINUE::
end
end
end
function multitool.modes.link:updateOverlays()
function multitool.modes.link:updateOverlay()
overlay[1].enabled = true
overlay[2].enabled = false
overlay[3].enabled = false
local k, v = next( self.Data.Info )
if not k or not v then return end
self.Ents = {}
for k, v in pairs( self.Data.Send ) do
if isentity( v ) then
-- v == ent
-- k == key
if v.tool_bind == 2 then
local name = v.name
self.Ents[v] = self.Ents[v] or {}
table.insert( self.Ents[v], k )
else
for i, j in pairs( v ) do
-- i == ent
-- j == key
overlay[2].draw.text[5] = name
overlay[2].text = table.concat( overlay[2].draw.text, "" )
overlay[2].size = GetTextSize( overlay[2].text, overlay[2].font )
overlay[2].enabled = true
self.Ents[i] = self.Ents[i] or {}
table.insert( self.Ents[i], j )
end
end
end
if v.tool_bind == 3 then
local name = v.name
for ent, lines in pairs( self.Ents ) do
local text = {}
overlay[3].draw.text[7] = name
for k, v in ipairs( lines ) do
text[#text + 1] = {
font = multitool.ui.fonts.small,
draw = {
text = { v },
cols = { multitool.ui.colors.text_linked },
}
}
end
self.Ents[ent] = GetOverlay( text, true, {
lower = 3,
text_out = multitool.ui.colors.text_linked_box,
text_box = multitool.ui.colors.text_linked_box,
} )
end
local command = self.Data.Info[self.Data.Command]
if not command then
return
end
if not command.istable then
overlay[2].draw.text[5] = command.name
overlay[2].text = table.concat( overlay[2].draw.text, "" )
overlay[2].size = GetTextSize( overlay[2].text, overlay[2].font )
overlay[2].enabled = true
else
overlay[2].draw.text[5] = command[1].name
overlay[2].text = table.concat( overlay[2].draw.text, "" )
overlay[2].size = GetTextSize( overlay[2].text, overlay[2].font )
overlay[2].enabled = true
overlay[3].draw.text[7] = command[2].name
overlay[3].text = table.concat( overlay[3].draw.text, "" )
overlay[3].size = GetTextSize( overlay[3].text, overlay[3].font )
overlay[3].enabled = true
end
end
function multitool.modes.link:keyPress( gmod_tool, ply, key )
if key == 2 then return multitool:reset() end
if #self.Data.Info > 0 then
table.remove( self.Data.Info, 1 )
local command = self.Data.Info[self.Data.Command]
if not command then
return
end
if key == 1 and IsValid( self.LookAt ) then
if not command.istable then
self.Data.Send[command.name] = self.LookAt
self.Data.Command = self.Data.Command + 1
else
local name = ply:KeyDown( IN_SPEED ) and command[2].name or command[1].name
if not self.Data.Send[name] then
self.Data.Send[name] = {}
end
if not self.Data.Send[name][self.LookAt] then
self.Data.Send[name][self.LookAt] = name .. ( table.Count( self.Data.Send[name] ) + 1 )
end
end
self:updateOverlay()
end
self:updateOverlays()
end
end