Hey,
I have been coding in my TTT servers Scoreboard, yet its not working because I keep getting this error:
[CODE][ERROR] gamemodes/terrortown/gamemode/cl_hud.lua:260: attempt to index local 'L' (a nil value)
1. InfoPaint - gamemodes/terrortown/gamemode/cl_hud.lua:260
2. unknown - gamemodes/terrortown/gamemode/cl_hud.lua:342
[ERROR] gamemodes/terrortown/gamemode/cl_hud.lua:260: attempt to index local 'L' (a nil value)
1. InfoPaint - gamemodes/terrortown/gamemode/cl_hud.lua:260
2. unknown - gamemodes/terrortown/gamemode/cl_hud.lua:342
[ERROR] gamemodes/terrortown/gamemode/cl_hud.lua:260: attempt to index local 'L' (a nil value)
1. InfoPaint - gamemodes/terrortown/gamemode/cl_hud.lua:260
2. unknown - gamemodes/terrortown/gamemode/cl_hud.lua:342
[ERROR] gamemodes/terrortown/gamemode/cl_hud.lua:260: attempt to index local 'L' (a nil value)
1. InfoPaint - gamemodes/terrortown/gamemode/cl_hud.lua:260
2. unknown - gamemodes/terrortown/gamemode/cl_hud.lua:342
[ERROR] gamemodes/terrortown/gamemode/cl_hud.lua:260: attempt to index local 'L' (a nil value)
1. InfoPaint - gamemodes/terrortown/gamemode/cl_hud.lua:260
2. unknown - gamemodes/terrortown/gamemode/cl_hud.lua:342
[/CODE]
sb_main
[CODE]
---- VGUI panel version of the scoreboard, based on TEAM GARRY's sandbox mode
---- scoreboard.
local surface = surface
local draw = draw
local math = math
local string = string
local vgui = vgui
local GetTranslation = LANG.GetTranslation
local GetPTranslation = LANG.GetParamTranslation
include("sb_team.lua")
surface.CreateFont("cool_small", {font = "coolvetica",
size = 20,
weight = 400})
surface.CreateFont("cool_large", {font = "coolvetica",
size = 24,
weight = 400})
surface.CreateFont("treb_small", {font = "Trebuchet18",
size = 14,
weight = 700})
local logo = surface.GetTextureID("VGUI/ttt/score_logo")
local PANEL = {}
local max = math.max
local floor = math.floor
local function UntilMapChange()
local rounds_left = max(0, GetGlobalInt("ttt_rounds_left", 6))
local time_left = floor(max(0, ((GetGlobalInt("ttt_time_limit_minutes") or 60) * 60) - CurTime()))
local h = floor(time_left / 3600)
time_left = time_left - floor(h * 3600)
local m = floor(time_left / 60)
time_left = time_left - floor(m * 60)
local s = floor(time_left)
return rounds_left, string.format("%02i:%02i:%02i", h, m, s)
end
GROUP_TERROR = 1
GROUP_NOTFOUND = 2
GROUP_FOUND = 3
GROUP_SPEC = 4
GROUP_COUNT = 4
function ScoreGroup(p)
if not IsValid(p) then return -1 end -- will not match any group panel
if DetectiveMode() then
if p:IsSpec() and (not p:Alive()) then
if p:GetNWBool("body_found", false) then
return GROUP_FOUND
else
local client = LocalPlayer()
-- To terrorists, missing players show as alive
if client:IsSpec() or
client:IsActiveTraitor() or
((GAMEMODE.round_state != ROUND_ACTIVE) and client:IsTerror()) then
return GROUP_NOTFOUND
else
return GROUP_TERROR
end
end
end
end
return p:IsTerror() and GROUP_TERROR or GROUP_SPEC
end
function PANEL:Init()
self.hostdesc = vgui.Create("DLabel", self)
self.hostdesc:SetText(GetTranslation("sb_playing"))
self.hostdesc:SetContentAlignment(9)
self.hostname = vgui.Create( "DLabel", self )
self.hostname:SetText( GetHostName() )
self.hostname:SetContentAlignment(6)
self.mapchange = vgui.Create("DLabel", self)
self.mapchange:SetText("Map changes in 00 rounds or in 00:00:00")
self.mapchange:SetContentAlignment(9)
self.mapchange.Think = function (sf)
local r, t = UntilMapChange()
sf:SetText(GetPTranslation("sb_mapchange",
{num = r, time = t}))
sf:SizeToContents()
end
self.ply_frame = vgui.Create( "TTTPlayerFrame", self )
self.ply_groups = {}
local t = vgui.Create("TTTScoreGroup", self.ply_frame:GetCanvas())
t:SetGroupInfo(GetTranslation("terrorists"), Color(0,200,0,100), GROUP_TERROR)
self.ply_groups[GROUP_TERROR] = t
t = vgui.Create("TTTScoreGroup", self.ply_frame:GetCanvas())
t:SetGroupInfo(GetTranslation("spectators"), Color(200, 200, 0, 100), GROUP_SPEC)
self.ply_groups[GROUP_SPEC] = t
if DetectiveMode() then
t = vgui.Create("TTTScoreGroup", self.ply_frame:GetCanvas())
t:SetGroupInfo(GetTranslation("sb_mia"), Color(130, 190, 130, 100), GROUP_NOTFOUND)
self.ply_groups[GROUP_NOTFOUND] = t
t = vgui.Create("TTTScoreGroup", self.ply_frame:GetCanvas())
t:SetGroupInfo(GetTranslation("sb_confirmed"), Color(130, 170, 10, 100), GROUP_FOUND)
self.ply_groups[GROUP_FOUND] = t
end
-- the various score column headers
self.cols = {}
self.cols[1] = vgui.Create( "DLabel", self )
self.cols[1]:SetText( GetTranslation("sb_ping") )
self.cols[2] = vgui.Create( "DLabel", self )
self.cols[2]:SetText( GetTranslation("sb_deaths") )
self.cols[3] = vgui.Create( "DLabel", self )
self.cols[3]:SetText( GetTranslation("sb_score") )
self.cols[5] = vgui.Create( "DLabel", self )
self.cols[5]:SetText("Rank")
if KARMA.IsEnabled() then
self.cols[4] = vgui.Create("DLabel", self)
self.cols[4]:SetText(GetTranslation("sb_karma"))
end
self:UpdateScoreboard()
self:StartUpdateTimer()
end
function PANEL:StartUpdateTimer()
if not timer.Exists("TTTScoreboardUpdater") then
timer.Create( "TTTScoreboardUpdater", 0.3, 0,
function()
local pnl = GAMEMODE:GetScoreboardPanel()
if IsValid(pnl) then
pnl:UpdateScoreboard()
end
end)
end
end
local colors = {
bg = Color(30,30,30, 235),
bar = Color(220,180,0,255)
};
local y_logo_off = 72
function PANEL:Paint()
-- Logo sticks out, so always offset bg
draw.RoundedBox( 8, 0, y_logo_off, self:GetWide(), self:GetTall() - y_logo_off, colors.bg)
-- Server name is outlined by orange/gold area
draw.RoundedBox( 8, 0, y_logo_off + 25, self:GetWide(), 32, colors.bar)
-- TTT Logo
surface.SetTexture( logo )
surface.SetDrawColor( 255, 255, 255, 255 )
surface.DrawTexturedRect( 5, 0, 256, 256 )
end
function PANEL:PerformLayout()
-- position groups and find their total size
local gy = 0
-- can't just use pairs (undefined ordering) or ipairs (group 2 and 3 might not exist)
for i=1, GROUP_COUNT do
local group = self.ply_groups[i]
if ValidPanel(group) then
if group:HasRows() then
group:SetVisible(true)
group:SetPos(0, gy)
group:SetSize(self.ply_frame:GetWide(), group:GetTall())
group:InvalidateLayout()
gy = gy + group:GetTall() + 5
else
group:SetVisible(false)
end
end
end
self.ply_frame:GetCanvas():SetSize(self.ply_frame:GetCanvas():GetWide(), gy)
local h = y_logo_off + 110 + self.ply_frame:GetCanvas():GetTall()
-- if we will have to clamp our height, enable the mouse so player can scroll
local scrolling = h > ScrH() * 0.95
-- gui.EnableScreenClicker(scrolling)
self.ply_frame:SetScroll(scrolling)
h = math.Clamp(h, 110 + y_logo_off, ScrH() * 0.95)
local w = math.max(ScrW() * 0.6, 640)
self:SetSize(w, h)
self:SetPos( (ScrW() - w) / 2, math.min(72, (ScrH() - h) / 4))
self.ply_frame:SetPos(8, y_logo_off + 109)
self.ply_frame:SetSize(self:GetWide() - 16, self:GetTall() - 109 - y_logo_off - 5)
-- server stuff
When you make changes to client side code it does this.
Either restart the map or make it only define the variables values if the object hasn't already been defined.
Yeah, TTT wasn't made to be "lua refreshed".
This is a simple workaround you can use to edit the HUD in real time.
1. Open terrortown/gamemode/lang_shd.lua
2. Add this after line 5: [QUOTE]if LANG then return end[/QUOTE]
3. The top of that file should look like this: [QUOTE]if LANG then return end
LANG = {}[/QUOTE]
That is very messy code in your first post I can't really help you without it being cleaned up
Thank you for the improved code layout I will fix it for you
[QUOTE=brandonj4;40556204]Yeah, TTT wasn't made to be "lua refreshed".
This is a simple workaround you can use to edit the HUD in real time.
1. Open terrortown/gamemode/lang_shd.lua
2. Add this after line 5:
3. The top of that file should look like this:[/QUOTE]First of all, how is that going to help with the errors with the code? Secondly, by returning LANG as false, what is that supposed to do regarding the HUD editing?
[code]
if ply:IsUserGroup("user") then
self.cols[5]:SetText("User")
self.cols[5]:SetTextColor(namecolor.default)
elseif ply:IsUserGroup("owner") then
self.cols[5]:SetText("Owner")
self.cols[5]:SetTextColor(namecolor.owner)
elseif ply:IsUserGroup("admin") then
self.cols[5]:SetText("Admin")
self.cols[5]:SetTextColor(namecolor.admin)
elseif ply:IsUserGroup("moderator") then
self.cols[5]:SetText("Moderator")
self.cols[5]:SetTextColor(namecolor.moderator)
elseif ply:IsUserGroup("respected") then
self.cols[5]:SetText("Respected")
self.cols[5]:SetTextColor(namecolor.respected)
elseif ply:IsUserGroup("donator") then
self.cols[5]:SetText("Donator")
self.cols[5]:SetTextColor(namecolor.donator)
elseif ply:IsUserGroup("headadmin") then
self.cols[5]:SetText("Head-Admin")
self.cols[5]:SetTextColor(namecolor.headadmin)
elseif ply:IsUserGroup("superadmin") then
self.cols[5]:SetText("Super-Admin")
self.cols[5]:SetTextColor(namecolor.superadmin)
end
[/code]
Instead of
[code]
="keyword operator">="keyword">if ply:IsUserGroup("user") then
self.cols[="constant numeric">5]:SetText("User")
self.cols[5]:SetTextColor(namecolor.default)
elseif ply:IsUserGroup("owner") ="keyword">then
self.cols[5]:SetText("Owner")
self.cols[5]:SetTextColor(namecolor.owner)
elseif ply:IsUserGroup("admin") then
self.cols[5]:SetText("Admin")
self.cols[5]:SetTextColor(namecolor.admin)
elseif ply:IsUserGroup("moderator") then
self.cols[5]:SetText("Moderator")
self.cols[5]:SetTextColor(namecolor.moderator)
elseif ply:IsUserGroup("respected") then
self.cols[5]:SetText("Respected")
self.cols[5]:SetTextColor(namecolor.respected)
elseif ply:IsUserGroup("donator") ="keyword">then
self.cols[5]:SetText("Donator")
self.cols[5]:SetTextColor(namecolor.donator)
="keyword">elseif ply:IsUserGroup("headadmin") then
self.cols[5]:SetText("Head-Admin")
self.cols[5]:SetTextColor(namecolor.headadmin)
elseif ply:IsUserGroup("superadmin") then
self.cols[5]:SetText("Super-Admin")
self.cols[5]:SetTextColor(namecolor.superadmin)
="keyword">end
[/code]
I think that if this doesn't work it might be that the newer ttt version use's different code to what I made
[QUOTE=ZombieWizzard;40569521][code]
if ply:IsUserGroup("user") then
self.cols[5]:SetText("User")
self.cols[5]:SetTextColor(namecolor.default)
elseif ply:IsUserGroup("owner") then
self.cols[5]:SetText("Owner")
self.cols[5]:SetTextColor(namecolor.owner)
elseif ply:IsUserGroup("admin") then
self.cols[5]:SetText("Admin")
self.cols[5]:SetTextColor(namecolor.admin)
elseif ply:IsUserGroup("moderator") then
self.cols[5]:SetText("Moderator")
self.cols[5]:SetTextColor(namecolor.moderator)
elseif ply:IsUserGroup("respected") then
self.cols[5]:SetText("Respected")
self.cols[5]:SetTextColor(namecolor.respected)
elseif ply:IsUserGroup("donator") then
self.cols[5]:SetText("Donator")
self.cols[5]:SetTextColor(namecolor.donator)
elseif ply:IsUserGroup("headadmin") then
self.cols[5]:SetText("Head-Admin")
self.cols[5]:SetTextColor(namecolor.headadmin)
elseif ply:IsUserGroup("superadmin") then
self.cols[5]:SetText("Super-Admin")
self.cols[5]:SetTextColor(namecolor.superadmin)
end
[/code]
Instead of
[code]
="keyword operator">="keyword">if ply:IsUserGroup("user") then
self.cols[="constant numeric">5]:SetText("User")
self.cols[5]:SetTextColor(namecolor.default)
elseif ply:IsUserGroup("owner") ="keyword">then
self.cols[5]:SetText("Owner")
self.cols[5]:SetTextColor(namecolor.owner)
elseif ply:IsUserGroup("admin") then
self.cols[5]:SetText("Admin")
self.cols[5]:SetTextColor(namecolor.admin)
elseif ply:IsUserGroup("moderator") then
self.cols[5]:SetText("Moderator")
self.cols[5]:SetTextColor(namecolor.moderator)
elseif ply:IsUserGroup("respected") then
self.cols[5]:SetText("Respected")
self.cols[5]:SetTextColor(namecolor.respected)
elseif ply:IsUserGroup("donator") ="keyword">then
self.cols[5]:SetText("Donator")
self.cols[5]:SetTextColor(namecolor.donator)
="keyword">elseif ply:IsUserGroup("headadmin") then
self.cols[5]:SetText("Head-Admin")
self.cols[5]:SetTextColor(namecolor.headadmin)
elseif ply:IsUserGroup("superadmin") then
self.cols[5]:SetText("Super-Admin")
self.cols[5]:SetTextColor(namecolor.superadmin)
="keyword">end
[/code]
I think that if this doesn't work it might be that the newer ttt version use's different code to what I made[/QUOTE]
Wait wut, my code is nothing like that. Mine is the way you put it, not with all that keyword shit.
Idk, might be a copy + paste bug.
and I use the TTT that comes with the game or server.
Couldn't you just replace the code with the original terrortown code? That way the code should actually work with no problems because its genuine, you know... lol
[QUOTE=ShadowRanger;40574976]Couldn't you just replace the code with the original terrortown code? That way the code should actually work with no problems because its genuine, you know... lol[/QUOTE]
Haven't you even read the post?
I want to have ranks on my scoreboard, but it don't work because I keep getting lua errors if I make more ranks than I have already.
[QUOTE=zxEvolution;40580051]Haven't you even read the post?
I want to have ranks on my scoreboard, but it don't work because I keep getting lua errors if I make more ranks than I have already.[/QUOTE]Can you please give us an update on what code you have now and what errors your getting? I read the previous errors you were getting but you might have changed it around since.
Sorry, you need to Log In to post a reply to this thread.