Garry 的 mod 菜单脚本 (lua)

Posted

技术标签:

【中文标题】Garry 的 mod 菜单脚本 (lua)【英文标题】:Garry's mod menu script (lua) 【发布时间】:2015-05-23 23:46:57 【问题描述】:
function Team_Swap()

local Backg = vgui.Create( "DFrame" )
    Backg:SetSize( ScrW() / 2, ScrH() / 2 )
    Backg:SetPos ( ScrW() / 2, ScrH() / 2 )
    Backg:SetTitle( "Swap Teams" )
    Backg:SetVisible ( true )
    Backg:SetDraggable ( true )
    Backg:ShowCloseButton ( true )
    Backg:MakePopup()

local DColorButton = vgui.Create ( "DColorButton", Backg )
DColorButton:SetPos( 40, 40 )
DColorButton:Paint( 100, 40 )
DColorButton:SetSize( 100, 40 )
DColorButton:SetText( "Join Red Team", Color( 221,78,76 ) )
DColorButton:SetColor( Color( 221,78,76 )
function DColorButton:DoClick(player)
    player:Kill()
    player:SetTeam(1)
    player:Spawn()
end
end
concommand.Add( "set_team", Team_Swap )

这段代码运行良好......直到你完成它的唯一目的点击按钮 单击按钮时在控制台中返回以下文本

newrecycle]set_team

[错误] gamemodes/capturetheflag/gamemode/cl_init.lua:32: 尝试索引本地“玩家”(零值) 1. DoClick - gamemodes/capturetheflag/gamemode/cl_init.lua:32 2. 未知 - lua/vgui/dlabel.lua:218

[n3wr3cycl3|20|STEAM_0:1:59994487] Lua 错误:

[ERROR] gamemodes/capturetheflag/gamemode/cl_init.lua:32: 尝试索引本地“玩家”(零值) 1. DoClick - gamemodes/capturetheflag/gamemode/cl_init.lua:32 2. 未知 - lua/vgui/dlabel.lua:218

请帮忙!

【问题讨论】:

在我看到调用 DoClick 的函数之前,我只能推测 player 在单击时没有作为参数传递。除此之外,一切看起来都很好。 调用DoClick的函数是原生C++代码。 【参考方案1】:

首先:您正在混合客户端 (vgui) 和服务器端 (Player:SetTeam()) 的东西。

(您在此错误中运行的原因在客户端脚本中)

我的建议:

客户端脚本:

function Team_Select()
local Backg = vgui.Create( "DFrame" )
Backg:SetSize( ScrW() / 2, ScrH() / 2 )
Backg:SetPos ( ScrW() / 2, ScrH() / 2 )
Backg:SetTitle( "Swap Teams" )
Backg:SetVisible ( true )
Backg:SetDraggable ( true )
Backg:ShowCloseButton ( true )
Backg:MakePopup()

local TeamRedButton = vgui.Create ( "DColorButton", Backg )
TeamRedButton:SetPos( 40, 40 )
TeamRedButton:Paint( 100, 40 )
TeamRedButton:SetSize( 100, 40 )
TeamRedButton:SetText( "Join Red Team", Color( 221,78,76 ) )
TeamRedButton:SetColor( Color( 221,78,76 )
function TeamRedButton:DoClick() -- DoClick has 0 Params
  RunConsoleCommand("switchteam", "red")
end
end
concommand.Add( "chooseteam", Team_Select )

和服务器端脚本:

function Team_Switch( --[[ Player ]] player, --[[ String ]] cmd, --[[ Table ]] args)
  -- Get the Parameter out of the Table (in my example "red" for the red team) 
  -- and move the player to the choosen Team
end
concommand.Add("switchteam", Team_Switch)

客户端脚本只是用户的 GUI。实际的 Teamswitch 由服务器处理,也可以从客户端控制台初始化。 用户可以直接执行switchteam red

来源:我的经验和 GMod Wiki

【讨论】:

代码可能有错误,因为我无法测试它。如果是这样,请评论错误。

以上是关于Garry 的 mod 菜单脚本 (lua)的主要内容,如果未能解决你的问题,请参考以下文章

LUA 将文件内容写入另一个(Garry's Mod)

Garry 的 mod lua,将矢量移近

停止 Lua 中的所有计时器(Garry's Mod)

Garry 的 mod Expression 2 for 循环

经验心得Garry‘s mod:无尽的趣味与极致的体验

资源分享Garry's mod 自制整合包