跳至正文
版本:最新版 - a1.148.0 ⚖️

额外功能

沙盒游戏模式的一些额外功能和概念

沙盒游戏模式还提供了其他几个子系统,可以通过脚本进行使用和扩展,例如:

Sandbox WebUI

你可以通过 Sandbox.HUD 变量直接访问沙盒 WebUI。

Tutorials

教程 UI 现在可以显示标题、简短描述以及按键。 它会被工具枪系统自动调用,用于显示当前装备工具的操作说明。

你也可以在自己的包中使用它来向玩家提供指引。 请查看下方公开的方法:

Client/Index.lua
-- 显示教程 UI
---@param title string 教程标题
---@param description string 描述
---@param keys_data table 按以下格式排列的按键表
---@ { { key = "按键名称", description = "其功能" }, ... }
function Sandbox.Tutorials.Show(title, description, keys_data)

-- 隐藏教程 UI
function Sandbox.Tutorials.Hide()

SpawnHistory

这是一个服务器端系统,用于追踪每个玩家生成的全部物品。 它通过将信息附加到生成的物品上来实现,因此你可以检查是谁(以及在何时)生成了特定物品。

你可以在服务器端调用这些函数,将物品添加到玩家的历史记录中,以便玩家可以通过按 X 键来撤销生成。

Server/Index.lua
-- 用于将物品添加到玩家历史记录的辅助函数
function Sandbox.SpawnHistory.AddItemToHistory(player, item)

-- 销毁玩家历史记录中的最后一个物品(如果有),并返回 true,否则返回 false
function Sandbox.SpawnHistory.DeleteItemFromHistory(player, index)

-- 用于更新物品所有权数据的辅助函数
-- 例如当物品被修改且我们需要更新新所有者时
function Sandbox.SpawnHistory.UpdateItemOwnership(player, item)
提示

通过调用 SpawnHistory.AddItemToHistory(),会在实体上设置一个值 "SpawnedBy",该值会同步给所有客户端,并包含以下数据:

{
player_name, -- 玩家名称
player_steam_id, -- 玩家 Steam ID
time, -- 生成时间
}

Notifications

虽然游戏内置已经有了一个通知系统(Client.ShowNotification()),但沙盒提供了一个更高级的通知系统,允许你显示只展示一次的“教程类”通知:

Client/Index.lua
-- 在屏幕上添加通知
---@param type NotificationType 要显示的通知类型
---@param id string 用于存储该通知是否已向玩家显示过的唯一 ID
---@param message string 要显示的信息
---@param duration number 通知持续时间(秒)
---@param delay number 延迟显示通知的时间(秒)
---@param force? boolean 是否强制显示(无论之前是否已显示过)
function Sandbox.Notifications.Add(type, id, message, duration, delay, force)

PersistentConfig

我们创建了一个系统,用于在使用工具枪(或任何其他自定义工具)时帮助持久化配置。 我们的工具枪使用它来在不同会话之间持久化在上下文菜单中修改的配置:

Client/Index.lua
-- 保存配置
function PersistentConfigSystem.SaveConfig(class_name, config, value)

-- 获取配置
function PersistentConfigSystem.GetConfig(class_name, config_name)

EntityInput

这是一个由我们的实体使用的系统,用于将自定义输入绑定到实体上的动作:

Client/Index.lua
-- 为实体添加输入绑定
function EntityInputSystem.AddEntityBinding(entity, name, binding, callback_pressed, callback_released)

-- 从实体移除输入绑定
function EntityInputSystem.RemoveEntityBinding(entity, name)

在内部,它通过为你想要的任何实体类简单定义 input_bindings 来自动工作。这会在选择该实体时向上下文菜单公开待设置的输入绑定:

Client/MyEntity.lua
-- 此实体的输入绑定
Thruster.input_bindings = {
{
label = "activate / deactivate",
callback_pressed = function(entity)
entity:CallRemoteEvent("SetActive", Reliability.Reliable, true)
end,
callback_released = function(entity)
entity:CallRemoteEvent("SetActive", Reliability.Reliable, false)
end,
},
{
label = "toggle",
callback_pressed = function(entity)
entity:CallRemoteEvent("SetActive", Reliability.Reliable, not entity:GetValue("Active"))
end,
},
}