samp | open.mp 联机社区论坛
SA-MP 行人与角色路径系统 - 打印版本

+- samp | open.mp 联机社区论坛 (https://open-mp.cn)
+-- 板块: SA-MP (https://open-mp.cn/forumdisplay.php?fid=12)
+--- 板块: 发布 (https://open-mp.cn/forumdisplay.php?fid=18)
+---- 板块: 插件 (https://open-mp.cn/forumdisplay.php?fid=19)
+---- 主题: SA-MP 行人与角色路径系统 (/showthread.php?tid=43)



SA-MP 行人与角色路径系统 - siwode - 07-05-2026

SA-MP 行人与角色路径系统

下载地址 SA-MP 行人与角色路径系统插件

一个为 SA-MP(圣安地列斯多人联机)打造的综合系统,可为您的服务器增添智能行人。它利用高度优化的 C++ 插件,结合 PAWN 脚本(pedestrians.inc)来处理寻路、生成与交互。

为什么使用 Actor 而不是 NPC?
本系统最大的优势在于,它使用 SA-MP 的"Actor"来代替标准的 SA-MP "NPC"。
  • 不占用玩家槽位: 传统 NPC 会占用宝贵的服务器玩家槽位,并且每个都需要独立的连接实例。Actor 则不占用玩家槽位。
  • 极致的性能与可扩展性: 标准的 NPC 需要单独的 PAWN 脚本和预录制的回放文件,若想要上百个 NPC,会给服务器带来沉重负担。本系统使用高度优化的 C++ 插件来解析数千个节点,并仅在活跃玩家周围动态流式加载 Actor(全局池系统)。
  • 动态交互: 传统 NPC 只能遵循静态路径。我们的 Actor 能对环境做出动态反应:被瞄准时会举手,停止行走,并在受伤或听到枪声时惊慌逃跑。

核心功能
  • 全局池生成: 行人仅在玩家附近时创建,并会被智能回收以节省内存。
  • C++ 寻路: 极其流畅和高性能。C++ 插件加载数千个节点(pedpaths.json),并在后台移动行人。
  • 自定义行走风格: 每个行人根据其皮肤 ID 分配正确的行走动画(例如,帮派成员、老人、女性、平民)。可通过二维数组完全配置。
  • 交互与恐慌 AI: 行人被枪击或拳打时会做出反应,并且可以被武器瞄准(OnPlayerAimPedestrian)。
  • 忽略节点: 能够在服务器加载时排除特定节点,防止行人走到自定义地图区域上。
  • 网络优化: 角度缓存和平衡的物理计时器频率,可避免重型 NPC 服务器中常见的 "ackslimit" 警告。
  • 预测生成与反聚集: 系统使用向量数学计算玩家速度和方向,在玩家前方路径上最远 150 米处动态生成行人,确保城镇自然地充满人口,同时避免节点聚集。
  • 跨平台: C++ 插件可为 Windows 编译为 .dll,为 Linux SA-MP 服务器编译为 .so(32 位)。
  • 兼容 open.mp: 该项目不依赖内存劫持或钩子。它使用标准的 AMX 原生函数,使其开箱即用,100% 完全兼容 open.mp(开放多人联机)。



安装

  1. pedestrians.dll 放入 plugins/ 目录,并在 server.cfg 中添加 pedestrians
  2. server.cfg 中添加 ackslimit 10000,以防止因 actor 位置快速更新而导致的网络警告。
  3. pedpaths.json 放入 scriptfiles/ 目录。
  4. pedestrians.inc 放入 pawno/include/ 目录。
  5. 打开您的游戏模式并包含该文件:

代码:
#include <pedestrians>



PAWN 函数

InitPedestrians()
初始化系统。必须在 OnGameModeInit() 下调用。
代码:
public OnGameModeInit() {
    InitPedestrians();
    return 1;
}

IgnorePedestrianNode(nodeid)
忽略特定节点,使行人永远不会走到该节点上。若您在现有人行道上放置了自定义地图,此函数非常有用。必须在 OnGameModeInit() 下调用。
代码:
IgnorePedestrianNode(3016528);
IgnorePedestrianNode(3016545);

代码:
GetPedestrianNode(pedestrianid)
返回行人当前正走向的目标节点 ID。


代码:
StopPedestrian(pedestrianid)
立即停止行人(将速度设为 0.0)。


代码:
ResumePedestrian(pedestrianid)
恢复行人向其目标节点行走(将速度恢复为 1.2)。



代码:
ApplyPedestrianAnim(pedestrianid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time)
轻松为行人应用特定动画(ApplyActorAnimation 的封装函数)。


代码:
GetClosestPedestrianID(playerid)
返回距离特定玩家最近的行人(Actor)ID。




回调

OnPedestrianGetDamage(pedestrianid, playerid, type)
当玩家击中行人时调用。
  • type 0:近战/拳头伤害
  • type 1:火器伤害

使用示例:
代码:
public OnPedestrianGetDamage(pedestrianid, playerid, type)
{
    StopPedestrian(pedestrianid);
   
    new str[128];
    new nodeid = GetPedestrianNode(pedestrianid);
    format(str, sizeof(str), "您击中了行人 ID %d,类型:%d(目标节点:%d)", pedestrianid, type, nodeid);
    SendClientMessage(playerid, -1, str);
   
    // 让他们做出反应并说话
    ApplyPedestrianAnim(pedestrianid, "PED", "IDLE_chat", 4.1, 1, 0, 0, 0, 0);
    return 1;
}

OnPlayerAimPedestrian(playerid, pedestrianid)
当玩家用火器瞄准行人时调用(每次瞄准仅调用一次)。
(注意:需要在 OnPlayerConnect 下使用 EnablePlayerCameraTarget(playerid, 1); 才能生效)。

使用示例:
代码:
public OnPlayerAimPedestrian(playerid, pedestrianid)
{
    StopPedestrian(pedestrianid);
    ApplyPedestrianAnim(pedestrianid, "SHOP", "SHP_Rob_HandsUp", 4.1, 0, 0, 0, 1, 0);
   
    SendClientMessage(playerid, -1, "您瞄准了行人!他们举起了双手。");
    return 1;
}

OnPedestrianHitByVeh(playerid, pedestrianid)
当行人被玩家的车辆撞倒时调用。默认情况下,行人会倒地几秒钟,然后站起来,无缝地继续他们原来的路线。

使用示例:
代码:
public OnPedestrianHitByVeh(playerid, pedestrianid)
{
    new str[128];
    format(str, sizeof(str), "您撞倒了行人 ID %d!", pedestrianid);
    SendClientMessage(playerid, -1, str);
    return 1;
}



配置(皮肤与行走风格)

pedestrians.inc 中,您会找到一个包含所有行走风格的枚举,以及两个可配置的二维数组(MaleSkins 和 FemaleSkins)。
要添加新皮肤,只需将 {SKIN_ID, WALK_STYLE} 插入相应的数组中,行人就会在生成时自动采用该行走动画。

代码:
new MaleSkins[][2] = {
{1, WALK_OLD},
{2, WALK_CIVI},
{18, WALK_GANG1},
{24, WALK_FAT}
};



从源码构建

本项目使用 CMake 生成构建文件。该插件必须编译为 32 位(x86) 共享库,因为 SA-MP 和 open.mp 服务器可执行文件是 32 位的。

Windows (MSVC)
  1. 安装 CMake 和 Visual Studio(包含 C++ 构建工具)。
  2. 在仓库根目录下打开终端或 PowerShell。
  3. 生成构建文件:
    代码:
    mkdir build
    cd build
    cmake .. -A Win32
  4. 编译插件:
    代码:
    cmake --build . --config Release
  5. 您可以在 build/Release/ 目录中找到 pedestrians.dll

Linux (GCC)
  1. 安装 CMake 和 32 位编译库(例如,在 Ubuntu/Debian 上使用 g++-multilib)。
    代码:
    sudo apt-get install cmake g++-multilib
  2. 在仓库根目录下打开终端。
  3. 生成构建文件并编译:
    代码:
    mkdir build_linux
    cd build_linux
    cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32
    make
  4. 您可以在 build_linux/ 目录中找到 libpedestrians.so。(在您的服务器插件中将其重命名为 pedestrians.so)。
```