server-beta icon indicating copy to clipboard operation
server-beta copied to clipboard

A couple of issues found with new NPCs

Open NexiusTailer opened this issue 3 months ago • 3 comments

1. NPC_SetPos may remove bot from vehicle The first issue with NPC_SetPos native: when you teleported an NPC which was in car by FCNPC plugin, this bot always teleported right with his vehicle and continued to be in it on the new position set: https://github.com/ziggi/FCNPC/blob/master/src/CPlayerData.cpp#L997-L1004

But in omp implementation, an NPC may be either teleported without the vehicle or the vehicle may stay at the old position until re-stream, and it cannot be solved by using SetVehiclePos because this function doesn't work when NPC is a driver of the vehicle. So NPC_SetPos must always teleport an NPC who's a driver of this vehicle together with this vehicle, just like in FCNPC.

Test script where you can compare the behavior in-game: FCNPC / omp NPCs variant

2. NPC doesn't call vehicle events like death or respawn If you apply NPC_SetVehicleHealth for a driver NPC and set any low health value for his vehicle like 150.0 or 0.0 when it starts firing and finally explode, still no OnVehicleDeath will be called, nor OnVehicleSpawn after a while too. Looks like this vehicle will explode and disappear only clientside, but not serverside. NPC will just stay at the same place without a car, moreover without his own death and respawn.

Test script where you can compare the behavior in-game: FCNPC / omp NPCs variant

3. NPC_EnableInfiniteAmmo has no effect if NPC_SetAmmo wasn't used If an NPC has weapon with 0 ammo and you try to use NPC_EnableInfiniteAmmo, he still won't shoot any bullets:

NPC_SetWeapon(npcid, random(3) + 22);
NPC_EnableInfiniteAmmo(npcid, true);
NPC_AimAtPlayer(npcid, playerid, .shoot = true);

but when you set this NPC at least 1 or more bullets with NPC_SetAmmo, he immediately start shooting:

NPC_SetWeapon(npcid, random(3) + 22);
NPC_SetAmmo(npcid, 1); // or 5, or 999
NPC_EnableInfiniteAmmo(npcid, true);
NPC_AimAtPlayer(npcid, playerid, .shoot = true);

while FCNPC correctly handle even the first case

NexiusTailer avatar Dec 16 '25 23:12 NexiusTailer

  1. NPC_SetPos may remove bot from vehicle

Isn't that how SetPlayerPos works? I think the implementation in FCNPC is incorrect.

ziggi avatar Dec 28 '25 15:12 ziggi

  1. NPC_SetPos may remove bot from vehicle

Isn't that how SetPlayerPos works? I think the implementation in FCNPC is incorrect.

Sure, but we have a different case with players comparing to NPCs:

  • to teleport just the player who sits in any vehicle without the vehicle, we oughta use SetPlayerPos, that's how it works
  • to teleport the player with his vehicle, we oughta use SetVehiclePos, just teleporting the vehicle in which the player sits

As I already mentioned above, we cannot use SetVehiclePos on a vehicle with NPC as driver. So the easiest fix is to let teleporting NPCs with their vehicle by existing NPC_SetPos (and thus we will actually have to eject NPC from car to teleport just him without this car, like it is in FCNPC now), or make the logic identical as when working with players and add new NPC_SetVehiclePos function.

Anyway thanks for notice as now there's some choice of how to solve this better.

NexiusTailer avatar Dec 28 '25 15:12 NexiusTailer

If it is not possible to change the behavior of the SetVehiclePos function to support NPC as driver (for compatibility reasons or something else), then yes, it is better to add something like NPC_SetVehiclePos.

ziggi avatar Dec 28 '25 15:12 ziggi

can you please test this for NPC_SetVehiclePos? (and NPC_SetVehicleRot) https://github.com/openmultiplayer/open.mp/actions/runs/20794996896

native bool:NPC_SetVehiclePos(npcid, Float:x, Float:y, Float:z);
native bool:NPC_SetVehicleRot(npcid, Float:x, Float:y, Float:z);

AmyrAhmady avatar Jan 07 '26 20:01 AmyrAhmady

Tested the build #1182 and now can say that NPC_SetVehiclePos and NPC_SetVehicleRot works good.

But NPC_SetPos seems broken now: it doesn't teleport an NPC which is in vehicle, now at all. Visually this NPC keep staying in his vehicle on the previous vehicle position. Also if I look at sobeit custom nametags which show NPCs, he starts eing "AFK" in this vehicle after NPC_SetPos was used on him.

My current test script: https://pastebin.com/NPTN1iFz

NexiusTailer avatar Jan 08 '26 11:01 NexiusTailer

Issue with NPC_SetPos applied to NPC vehicle driver now solved after #1182, but since there were NPC_SetVehiclePos and NPC_SetVehicleRot added, would be great to also have their counterparts (getter functions)

NexiusTailer avatar Jan 28 '26 08:01 NexiusTailer

Create a new issue for getter functions, I'm going to close this one

AmyrAhmady avatar Jan 28 '26 18:01 AmyrAhmady