Zum Inhalt springen

Deine erste BS19-Ressource

Diese Anleitung baut eine kleine Ressource von null auf: einen /checkin-Befehl, der einem Überlebenden höchstens einmal pro Stunde eine Wasserflasche gibt. Das dauert etwa 15 Minuten. Du brauchst einen laufenden BS19-Server, Zugriff auf seine Dateien und die txAdmin-Konsole sowie einen Texteditor (VS Code eignet sich gut).

Wenn es läuft, zeigt Eine Ressource auf bs_core schreiben die nächsten Schritte: Client-Code, Callbacks und die Fallen, die du vermeiden solltest.

Lege im resources-Ordner deines Servers einen Ordner [local] an (die Klammern sind wichtig, sie machen ihn zu einer Kategorie statt einer Ressource) und darin einen Ordner bs_checkin. Bewahre deine eigenen Ressourcen in [local] auf, dann überschreiben Framework-Updates sie nie.

resources/[local]/bs_checkin/
├── fxmanifest.lua
├── config.lua
└── server.lua

Der Ordnername ist der Ressourcenname. Beginne ihn mit bs_, damit er nicht mit einem anderen Skript kollidiert.

Jede FiveM-Ressource braucht diese Datei. Sie sagt dem Server, welche Dateien er laden soll und auf welcher Seite.

fx_version 'cerulean'
game 'gta5'
lua54 'yes'
name 'bs_checkin'
description 'My first BS19 resource'
shared_scripts {
'@bs_core/shared/sh_bridge.lua', -- gives you BSB (commands, callbacks)
'config.lua',
}
server_scripts { 'server.lua' }
dependencies { 'bs_core', 'bs_inventory' }

Die Zeile @bs_core/shared/sh_bridge.lua lädt die BS19-Bridge in deine Ressource. Ohne sie gibt es BSB nicht und die Server-Datei schlägt fehl.

Packe jeden Wert, den ein Serverbetreiber ändern wollen könnte, in eine Tabelle, damit niemand deinen Code anfassen muss.

Checkin = {
item = 'water_bottle', -- any item name from bs_inventory's item list
amount = 1,
cooldown = 3600, -- seconds between two check-ins (1 hour)
}
local lastCheckin = {} -- [charId] = os.time() of the last check-in
local function notify(src, kind, message)
TriggerClientEvent('bs:ui:notify', src, { type = kind, message = message })
end
BSB.RegisterCommand('checkin', nil, 'Daily survivor check-in', {}, function(src)
if src == 0 then return print('Run /checkin in game, not in the console.') end
local p = exports.bs_core:GetPlayerSummary(src)
if not p then return notify(src, 'error', 'Pick a character first.') end
local now = os.time()
local last = lastCheckin[p.charId]
if last and now - last < Checkin.cooldown then
local minutes = math.ceil((Checkin.cooldown - (now - last)) / 60)
return notify(src, 'error', ('Come back in %d min.'):format(minutes))
end
local ok, reason = exports.bs_inventory:GiveItem(src, Checkin.item, Checkin.amount)
if not ok then return notify(src, 'error', 'No room: ' .. tostring(reason)) end
lastCheckin[p.charId] = now
notify(src, 'success', ('Welcome back, %s. Here is some water.'):format(p.firstName))
end)

Was der Code macht, Zeile für Zeile:

  • BSB.RegisterCommand erstellt den Chat-Befehl. nil heißt, jeder darf ihn benutzen; setze dort eine ACE wie 'bs.admin', um ihn auf das Team zu beschränken.
  • GetPlayerSummary gibt nil zurück, solange der Spieler noch im Charakterbildschirm ist. Prüfe das also zuerst.
  • Die Abklingzeit wird pro Charakter (charId) gespeichert, nicht pro Spieler, also bekommt ein zweiter Charakter seinen eigenen Check-in. Sie wird beim Neustart der Ressource zurückgesetzt, was für eine erste Ressource reicht.
  • Items laufen immer über exports.bs_inventory:GiveItem. Bei vollem Inventar gibt es false und einen Grund zurück. Schreibe nie selbst in die Datenbank.

Füge diese Zeile am Ende von server.cfg hinzu, nach den BS19-Ressourcen:

ensure bs_checkin

Dann in der txAdmin-Live-Konsole (kein Serverneustart nötig):

refresh
ensure bs_checkin

refresh lässt den Server den neuen Ordner finden. Die Konsole sollte Started resource bs_checkin ausgeben. Wenn du später eine Datei änderst, lädt ensure bs_checkin allein sie neu.

  1. Verbinde dich mit dem Server und wähle einen Charakter.
  2. Drücke T, tippe /checkin und drücke Enter. Du bekommst eine grüne Benachrichtigung und eine Wasserflasche im Inventar (I).
  3. Tippe nochmal /checkin. Du bekommst eine rote Meldung “Come back in 60 min.”.
Was du siehstWarumLösung
Couldn't find resource bs_checkinDer Server hat den Ordner nicht gesehen oder der Name weicht abrefresh ausführen, prüfen, dass der Ordner genau bs_checkin heißt
attempt to index a nil value (global 'BSB')Die Bridge-Zeile fehltDie Zeile @bs_core/shared/sh_bridge.lua in fxmanifest.lua prüfen
No such export GetPlayerSummarybs_core läuft noch nichtensure bs_checkin in server.cfg unter den BS19-Ressourcen lassen
/checkin tut nichts, kein FehlerDu bist noch im Charakterbildschirm oder der Befehl wurde nie registriertCharakter wählen, dann in der Konsole nach einer roten [bs_checkin]-Zeile suchen
“No room: …”Dein Inventar ist voll oder zu schwerEtwas ablegen und erneut versuchen

Jeder rote Fehler in der Konsole nennt auch Datei und Zeile. Behebe ihn, führe ensure bs_checkin erneut aus und versuche es nochmal.

  • Ändere item in config.lua auf bandage und führe ensure bs_checkin aus. Keine Codeänderung nötig.
  • Gib zusätzlich etwas Bargeld: exports.bs_core:AddMoney(src, 'cash', 25, 'checkin').
  • Gib XP: exports.bs_core:AddXP(src, 10, 'checkin').
  • Sieh dir die verfügbaren Aufrufe in Übersicht über Exports und Events an.