Skip to content

Wanted levels and police

Single-player's crimes and cops, plus a bounty: robbing the bank makes a player wanted, and whoever kills a wanted player collects.

police.ts
import { Server, Player, Color } from "@sagl/server";

export function police(server: Server) {
  server.population = { peds: true, traffic: true, police: true, wanted: true };

  // Never more than four stars from crimes alone.
  server.on("playerWantedLevel", (_player, level) => Math.min(level, 4));

  const bank = server.createZone({ center: { x: 2315, y: -8, z: 26.7 }, radius: 6 });
  server.on("zoneEnter", (player, zone) => {
    if (zone !== bank || Date.now() < ((player.data.robbedAt as number) ?? 0) + 300_000) return;
    player.data.robbedAt = Date.now();
    player.giveMoney(5000);
    player.wantedLevel = 5;
    server.broadcast(`${player.name} robbed the bank! Bounty: $2,500`, Color.Red);
  });

  server.on("playerDeath", (player, killer) => {
    if (player.wantedLevel >= 3 && killer instanceof Player && killer !== player) {
      const bounty = player.wantedLevel * 500;
      killer.giveMoney(bounty);
      server.broadcast(`${killer.name} collected $${bounty} for ${player.name}.`, Color.Green);
    }
    player.wantedLevel = 0;
  });
}