Files
Docs/docs/zh/scripting/server/v2-server-reference.md
2025-12-20 19:35:38 +00:00

9.8 KiB
Raw Blame History

!!! 警告 "这个网站正在建设中!"

这个网站正在积极建设中。

觉得你能帮上忙吗?请用铅笔在右侧点击页面!

这也可以在任何页面上完成。

服务器脚本参考

服务器端版本 2.X

!!! 警告

BeamMP 服务器版本 2.X 已不再提供支持。
本文档仅供参考。
请更新到最新版本以进行维护和支持。

这是 2.x 的脚本,仅当你的服务器端版本是老的/过时的(version 2.x.x) 时才能使用此方法,有关最新文档,请参见 这里。 {.is-warning}

说明

要在服务器控制台中获得函数的输出,必须将其包装在print()语句中。例如:print(GetPlayerName(0))将返回服务器上第一个玩家的名字。

<PlayersServerID> 从0开始。

用于编写脚本的可用函数列表

GetPlayerName(playersServerID)

以字符串形式返回玩家的Discord名称

function onPlayerJoin(playerID)
	local name = GetPlayerName(playerID)
	-- Do something
end

GetPlayerDiscordID(playersServerID)

以字符串形式返回玩家的Discord名称

function onPlayerJoin(playerID)
	local name = GetPlayerDiscordID(playerID)
	-- Do something
end

GetPlayerHWID(playersServerID)

以字符串形式返回玩家的Discord ID

function onPlayerJoin(playerID)
	local name = GetPlayerHWID(playerID)
	-- Do something
end

GetPlayerVehicles(playersServerID)

返回玩家的车辆作为一个对象/数组

function onChatMessage(playerID, senderName, message)
	local vehicleList = GetPlayerVehicles(playerID)
	for vehicleID, vehicleData in pairs(vehicleList) do
  	-- Do something
    -- Could also be used to check how many vehicles a player have
	end
end

DropPlayer(playersServerID)

断开特定玩家的连接。“其实就是踢出玩家”

function onVehicleSpawn(playerID, vehicleID, vehicleData)
	-- Do something
	DropPlayer(playerID)
end

SendChatMessage(playersServerID, message)

通过网络向指定的用户发送消息。每个人都用-1

function onPlayerJoin(playerID)
	SendChatMessage(-1, "Someone just joined!")
end

CancelEvent() -- DEPRECIATED

取消事件的发生。这可能很快就会发生。使用return 1来取消事件。

onInit()

如果在lua文件中声明它将在c++成功加载当前lua文件后被调用

function onInit()
	print("Server ready")
end

exit()

将关闭服务器

function onInit()
	print("Server Ready. But who needs a server which is running")
	exit() -- Stops the server
end

CreateThread(functionName, callInterval)

将在专用线程上执行该函数它将每秒运行callInterval数次。它每秒钟都会跑一次。

function yourFunction()
 	for i = 1,10 do
		SendChatMessage(-1, "Countdown: "..i)
		Sleep(1000)
	end
end
CreateThread("yourFunction", 30)

已弃用示例:将在专用线程上执行该函数

function yourFunction()
 	for i = 1,10 do
		SendChatMessage(-1, "Countdown: "..i)
		Sleep(1000)
	end
end
CreateThread("yourFunction", 30)

StopThread(functionName)

将停止尝试调用当前脚本的线程函数

function yourFunction()
	delayExpired = false
	Sleep(10000)
	delayExpired = true
end
CreateThread("yourFunction", 30)
-- Do something
if not delayExpired then
	StopThread("yourFunction")
else
	-- Do something
end

Sleep(millisecs) - DEPRECIATED

将暂停执行指定的时间(警告,如果没有创建线程,将暂停整个服务器)

function countdown()
 	for i = 1,10 do
		SendChatMessage(-1, "Countdown: "..i)
		Sleep(1000)
	end
end
CreateThread("countdown", 10)

GetPlayerCount()

将返回多少玩家连接

function onPlayerJoin(playerID)
	SendChatMessage(playerID, "You are the "..GetPlayerCount().."th player!"
end

RemoveVehicle(playerServerID, VehicleID)

这会导致一辆载具消失。

function onVehicleSpawn(playerID, vehicleID, vehicleData)
	if --[[ Vehicle data equal something it shouldn't be ]] then
		RemoveVehicle(playerID, vehicleIID)
	end
end

GetPlayers()

将返回一个带有name的id表

local function onPlayerJoin(joinedPlayerID)
	local players = GetPlayers()
	for playerID, playerName in pairs(players) do
		if playerID == joinedPlayerID then
			-- Do something
		end
	end
end

RegisterEvent(eventName, functionName)

将该函数注册到指定的事件,都必须是字符串。

  function anyEvent()
		-- Do something
  	end
	RegisterEvent("onAnyEventHappen", "anyEvent")
	-- Do something
	TriggerLocalEvent("onAnyEventHappen")

TriggerLocalEvent(eventName)

将调用同一插件文件夹中的每个注册函数。

  function anyEvent()
		-- Do something
  	end
	RegisterEvent("onAnyEventHappen", "anyEvent")
	-- Do something
	TriggerLocalEvent("onAnyEventHappen")

TriggerGlobalEvent(eventName)

将使用此事件名称调用每个已注册的函数。

	-- File A
  function anyEvent()
		-- Do something
  	end
	RegisterEvent("onAnyEventHappen", "anyEvent")
  	-- File B
	TriggerGlobalEvent("onAnyEventHappen")

TriggerClientEvent(playerServerID, eventName, data)

将使用给定的数据在指定的客户端(-1 表示广播)上触发该事件。

  function onPlayerJoin(playerServerID)
     TriggerClientEvent(playerServerID, "anyEvent", "You just joined the server")
  end
	RegisterEvent("onAnyEventHappen", "anyEvent")

Set(configID, newValue)

会将配置设置修改为下方表格中指定的新值。

  function onChatMessage(playerID, senderName, message)
    if playerID == adminPlayer then
      if message == --[[ anything ]] then
        Set(3, 10)
      end
    end
  end

可用于 Set() 命令的配置项列表

Note that these will not save to the config file.

Config ID 名称 只接受以下内容
0 调试设置 true 或 false
1 私人设置 true 或 false
2 每个玩家的最大车辆数 数字
3 最大玩家数 数字
4 地图 字符串
5 名称 字符串
6 描述 字符串
任何其他ID都会导致控制台警告

用于编写脚本的可用事件列表

默认事件

如何使用事件的示例:

	function onInit()
  	RegisterEvent("onPlayerJoin", "onPlayerJoin")
  end
  
  function onPlayerJoin(playerServerID)
  	-- Do something
  end

如果你不希望访客进入你的服务器:

	function onInit()
		print("noGuests Ready")
		RegisterEvent("onPlayerAuth","onPlayerAuth")
	end

	function onPlayerAuth(name, role, isGuest)
		if isGuest then
			return "You must be signed in to join this server!"
		end
	end
事件 参数 描述
onPlayerAuth 玩家的名称、论坛角色、是否为访客账号(布尔值) 有一名玩家已通过验证并正在请求加入。
onPlayerConnecting 玩家的ID 玩家正在加载(在加载地图之前)
onPlayerJoining 玩家的ID 玩家正在加载地图,很快就会加入
onPlayerJoin 玩家的ID 玩家已加入并加载
onPlayerDisconnect 玩家的ID 玩家退出了游戏
onChatMessage 发消息的玩家的ID、昵称和聊天消息 发送了一条聊天消息。这对于创建命令系统非常有用
onVehicleSpawn 玩家ID车辆ID和车辆数据 当有人刷出一辆车时输出
onVehicleEdited 玩家ID车辆ID和车辆数据 当有人编辑车辆或替换现有车辆时,就会调用此操作
onVehicleDeleted 玩家的ID和车辆ID 当某人删除自己拥有的车辆时,就会调用此操作

自定义事件

可以创建自定义事件以供自己使用。这与默认值的处理方式非常相似。

如何使用自定义事件的范例:

	function onInit()
  	RegisterEvent("myCustomEvent", "myCustomEvent")
  end
  
  function myCustomEvent(playerServerID, customData)
  	-- Do something
  end

接着可以使用各自的函数从客户端或服务器端调用该函数。

玩家

当玩家连接到你的服务器时,他们会被分配一个从 0 开始递增的 serverID。
serverID 会被重复利用;如果玩家离开后再次加入,他们不会获得新的 serverID而是会被分配一个当前可用的 serverID。
当服务器重新启动时serverID 会被重置。

静态标识符

BeamMP 中的玩家拥有 3 个可通过其 serverID 获取的静态标识符分别是他们的名称、discordID以及硬件IDHWID
(尽管最后一个尚未实现,但在此处我们将假设它已实现。)
这三种 ID 类型各自具有不同的来源,以及在玩家识别用途上的优点和缺点。

ID 类型 优点 缺点 获取的函数
name 容易获得,直截了当 不安全 GetPlayerName()
discordID 非常安全 不方便 GetPlayerDiscordID()
HWID 超级安全 难获得 GetPlayerHWID()

车辆

BeamMP 中的车辆有 3 个服务器会关注的属性:车辆所属者的 serverID、车辆的 vehicleID 以及车辆的数据。
所属者的 serverID 很简单,它就是玩家的 serverID。每辆车也有一个 vehicleID但 vehicleID 并不是车辆唯一的;来自不同玩家的两辆车可能拥有相同的 vehicleID。
与 serverID 不同vehicleID 会被重复使用。例如,如果我有 4 辆车,它们的 ID 分别是 0、1、2 和 3。如果我删除 vehicleID 为 2 的车辆,我就只剩下 0、1 和 3。当我生成一辆新车时这辆新车会占用 ID 2。
最后,车辆的第三个属性是 data。data 包含车辆名称、部件以及其他数据顾名思义。data 是以原始 JSON 字符串存储的,因此你需要使用 JSON 库来解析它,或者你也可以手动逐步解析字符串,提取所需的信息。