SA-MP 行人与角色路径系统
下载地址 SA-MP 行人与角色路径系统插件
一个为 SA-MP(圣安地列斯多人联机)打造的综合系统,可为您的服务器增添智能行人。它利用高度优化的 C++ 插件,结合 PAWN 脚本(pedestrians.inc)来处理寻路、生成与交互。
为什么使用 Actor 而不是 NPC?
本系统最大的优势在于,它使用 SA-MP 的"Actor"来代替标准的 SA-MP "NPC"。
核心功能
安装
PAWN 函数
InitPedestrians()
初始化系统。必须在 OnGameModeInit() 下调用。
IgnorePedestrianNode(nodeid)
忽略特定节点,使行人永远不会走到该节点上。若您在现有人行道上放置了自定义地图,此函数非常有用。必须在 OnGameModeInit() 下调用。
回调
OnPedestrianGetDamage(pedestrianid, playerid, type)
当玩家击中行人时调用。
使用示例:
OnPlayerAimPedestrian(playerid, pedestrianid)
当玩家用火器瞄准行人时调用(每次瞄准仅调用一次)。
(注意:需要在 OnPlayerConnect 下使用 EnablePlayerCameraTarget(playerid, 1); 才能生效)。
使用示例:
OnPedestrianHitByVeh(playerid, pedestrianid)
当行人被玩家的车辆撞倒时调用。默认情况下,行人会倒地几秒钟,然后站起来,无缝地继续他们原来的路线。
使用示例:
配置(皮肤与行走风格)
在 pedestrians.inc 中,您会找到一个包含所有行走风格的枚举,以及两个可配置的二维数组(MaleSkins 和 FemaleSkins)。
要添加新皮肤,只需将 {SKIN_ID, WALK_STYLE} 插入相应的数组中,行人就会在生成时自动采用该行走动画。
从源码构建
本项目使用 CMake 生成构建文件。该插件必须编译为 32 位(x86) 共享库,因为 SA-MP 和 open.mp 服务器可执行文件是 32 位的。
Windows (MSVC)
Linux (GCC)
下载地址 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(开放多人联机)。
安装
- 将 pedestrians.dll 放入 plugins/ 目录,并在 server.cfg 中添加 pedestrians。
- 在 server.cfg 中添加 ackslimit 10000,以防止因 actor 位置快速更新而导致的网络警告。
- 将 pedpaths.json 放入 scriptfiles/ 目录。
- 将 pedestrians.inc 放入 pawno/include/ 目录。
- 打开您的游戏模式并包含该文件:
代码:
#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)
- 安装 CMake 和 Visual Studio(包含 C++ 构建工具)。
- 在仓库根目录下打开终端或 PowerShell。
- 生成构建文件:
代码:mkdir build
cd build
cmake .. -A Win32 - 编译插件:
代码:cmake --build . --config Release - 您可以在 build/Release/ 目录中找到 pedestrians.dll。
Linux (GCC)
- 安装 CMake 和 32 位编译库(例如,在 Ubuntu/Debian 上使用 g++-multilib)。
代码:sudo apt-get install cmake g++-multilib - 在仓库根目录下打开终端。
- 生成构建文件并编译:
代码: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 - 您可以在 build_linux/ 目录中找到 libpedestrians.so。(在您的服务器插件中将其重命名为 pedestrians.so)。

