cssharp logoCssharp Docs

玩家管理与识别

有助于更好地理解游戏中的玩家管理

在 CS2 中,玩家的位置、索引、用户 ID、控制器和棋子之间存在一些重要差异。了解这些概念有助于更好地理解游戏中的玩家管理。

控制器与棋子

在 CS2 中,所有玩家都分为两种实体:玩家控制器(Player Controller)和玩家棋子(Player Pawn)。

  • 玩家控制器:代表服务器上的玩家。
  • 玩家棋子:代表游戏世界中的物理角色。

例如,若要编辑玩家的健康状况,您需要调整其 Player Pawn 的健康属性,而要检查玩家的 SteamID,则需要查询 Player Controller

CCSPlayerController player = ...;
CCSPlayerPawn playerPawn = player.PlayerPawn.Value; // 获取 PlayerPawn 的实际值
CCSPlayerController samePlayer = playerPawn.Controller.Value; // 反向查找 PlayerController

识别玩家

您可以通过以下几种方式识别玩家:

  1. 插槽(Slot):在服务器中表示“槽位”,即实体索引减一。例如,索引为 10 的玩家控制器对应的玩家槽位为 9。
  2. 用户 ID(User ID):在执行 status 命令时显示的用户 ID。通过位移操作,可以将用户 ID 转换为槽,然后加 1 转换为索引(计算公式:userid & 0xFF)。
  3. 实体索引(Entity Index):所有实体都有唯一的索引,玩家控制器和玩家棋子的索引各自不同。玩家控制器有一个保留的实体索引(范围:0 到 MAXPLAYERS(64)),而玩家棋子没有,因此对于玩家棋子使用数百个索引是常见的。
  4. 实体指针和句柄:在 CounterStrikeSharp 中与之交互的所有实体对象实际上都是指向服务器上的指针的封装器。您可以使用以下实用工具方法从 CPlayerSlotUser IDIndex 获取玩家实例:
var player = Utilities.GetPlayerFromUserid(userid);
var player = Utilities.GetPlayerFromIndex(index);
var player = Utilities.GetPlayerFromSlot(slot);

注意事项

在访问任何句柄之前,您应该检查其有效性,以确保安全性和稳定性。

RegisterEventHandler<EventPlayerSpawn>((@event, info) =>
{
    if (!@event.Userid.IsValid) return 0; // 检查 PlayerController 是否有效
    if (!@event.Userid.PlayerPawn.IsValid) return 0; // 检查 CHandle 指向的 PlayerPawn 是否有效
});

目录