CrewPhone: Das Hash-Problem lösen (###-####)
Behebe den CrewPhone Hash-Fehler in FiveM. Schritt-für-Schritt-Lösung für dieses häufige Phone-Script-Problem auf QBCore- und ESX-Servern.

Wie man das CrewPhone Hash-Problem (###) behebt
Viele Spieler, die das CrewPhone (oder gcPhone) Addon auf ihren FiveM-Servern nutzen, starren auf eine scheinbar zufällige Nummer wie ###-#### statt der erwarteten vollständigen Telefonnummer. Es ist ein kleiner, aber störender Fehler, der Spieler daran hindert, Anrufe zu tätigen, Nachrichten zu senden oder das In-Game-Telefon überhaupt zu nutzen. Wenn du dieses Problem hast, bist du nicht allein — und die Lösung ist ziemlich unkompliziert.
—
CrewPhone Hash-Problem: Schnelle Lösung
Der Übeltäter ist meist ein fehlendes client-seitiges Event, das dem Server mitteilt, wann ein Spieler vollständig ins Spiel geladen hat. Ohne diese kleine Benachrichtigung greift das serverseitige Script, das Telefonnummern generiert, oft auf eine Standardsequenz zurück und erzeugt die Platzhalternummern, die du siehst. Die Lösung besteht darin, ein Server-Event auszulösen, sobald das Loadout des Spielers wiederhergestellt wurde.
Hier ist das fertige Snippet, das du direkt in deine client.lua (oder ein äquivalentes Es_extended Client-Script) einfügen kannst:
-- Server-Event auslösen, sobald der Spieler geladen hat
TriggerServerEvent('crew:onPlayerLoaded', GetPlayerServerId(PlayerId()))
-- Beispiel: An den bestehenden Loadout-Wiederherstellungs-Hook anhängen
AddEventHandler('esx:restoreLoadout', function()
local playerPed = PlayerPedId()
local ammoTypes = {}
-- Alle vorhandenen Waffen entfernen
RemoveAllPedWeapons(playerPed, true)
-- Dem Spieler sein Loadout zurückgeben
for _, weapon in ipairs(ESX.PlayerData.loadout) do
local weaponName = weapon.name
local ammoType = GetPedAmmoTypeFromWeapon(playerPed, weaponName)
-- Waffe dem Ped hinzufügen
GiveWeaponToPed(playerPed, weaponName, 0, false, false)
SetPedWeaponTintIndex(playerPed, weaponName, weapon.tintIndex)
-- Waffenkomponenten hinzufügen
for _, component in ipairs(weapon.components) do
local componentHash = ESX.GetWeaponComponent(weaponName, component).hash
GiveWeaponComponentToPed(playerPed, weaponName, componentHash)
end
-- Munition nur einmal pro Typ hinzufügen
if not ammoTypes[ammoType] then
AddAmmoToPed(playerPed, weaponName, weapon.ammo)
ammoTypes[ammoType] = true
end
end
-- Dem Server mitteilen, dass der Spieler vollständig geladen hat
TriggerServerEvent('crew:onPlayerLoaded', GetPlayerServerId(PlayerId()))
isLoadoutLoaded = true
end)
Du musst diesen Block nur über den Rest deines client-seitigen Codes einfügen und sicherstellen, dass er unmittelbar nach der vollständigen Wiederherstellung der Spielerdaten ausgeführt wird.
—
Warum das Event entscheidend ist
In einem typischen FiveM-Server mit Es_extended werden Spielerdaten (einschließlich der Telefonnummer) auf dem Server gespeichert und jedes Mal abgerufen, wenn ein Spieler beitritt. Das Client-Script sendet dann ein "Player Loaded"-Event zurück an den Server, damit dieser weiß, dass alle erforderlichen Assets (Waffen, Kleidung, Telefondaten) angewendet wurden.
Wenn dieses Event fehlt, kann der Server die Telefonnummer nicht korrekt mit dem Spielerobjekt verknüpfen — und fällt zurück auf entweder:
- Einen Standard, unleserlichen Hash (das berühmte
###-####), oder - Gar keine Nummer, was den Client dazu zwingt, eine neue anzufordern und denselben Fehler erneut zu verursachen.
Indem du crew:onPlayerLoaded zum richtigen Zeitpunkt auslöst, gibst du dem Server die Chance, das frisch geladene Spielerobjekt mit seiner gespeicherten Telefonnummer zu verknüpfen. Der Hash-Konvertierungsteil des Scripts transformiert diese Nummer dann korrekt in ein lesbares Format.
—
Schritt-für-Schritt-Einrichtungsanleitung
-
Client-Script finden Suche die
client.lua(oder eine ähnlich benannte Datei) in deinemes_extended- oderCrewPhone-Ressourcen-Ordner. -
Den Trigger einfügen Ganz oben in der Datei hinzufügen:
TriggerServerEvent('crew:onPlayerLoaded', GetPlayerServerId(PlayerId()))Das stellt sicher, dass das Event ausgelöst wird, noch bevor andere Logik ausgeführt wird.
-
Den Loadout-Hook aktualisieren Suche nach der
AddEventHandler('esx:restoreLoadout', function()-Zeile. Ersetze oder ergänze den Handler mit dem vollständigen Beispiel oben. -
Speichern und neu laden Speichere die Datei, dann in der Server-Konsole ausführen:
restart CrewPhone restart es_extendedAlternativ den gesamten Server neu starten, um sicherzustellen, dass alle Änderungen wirksam werden.
-
Testen Dem Server beitreten, eine Waffe ausrüsten und das In-Game-Telefon öffnen. Die Nummer sollte jetzt korrekt angezeigt werden, z.B.
012-3456.
—
Häufige Probleme beheben
| Problem | Mögliche Ursache | Lösung |
|---|---|---|
| Telefonnummer zeigt immer noch ###-#### | Event wird nicht ausgelöst (z.B. falsche Script-Reihenfolge) | Sicherstellen, dass die TriggerServerEvent-Zeile vor anderen Funktionsdefinitionen steht. |
| Server-Logs zeigen ERROR: crew:onPlayerLoaded | Falsch benanntes Event auf der Server-Seite | Überprüfen, dass das Server-Script auf crew:onPlayerLoaded hört (meist in server.lua). |
| Spieler erhält jedes Mal eine andere Nummer | Nummern-Regenerierung beim Laden | Sicherstellen, dass crew:onPlayerLoaded nur nach vollständiger Loadout-Anwendung ausgelöst wird; das Snippet oben handhabt das. |
| Spiel stürzt beim Laden von Waffen ab | Falscher Waffen-Hash oder Komponentenwert | ESX-Version überprüfen, ob sie mit der API des Snippets übereinstimmt (einige ältere Versionen nutzen GetWeaponComponent). |
—
Alternativen, wenn das Script nicht funktioniert
Obwohl die obige Lösung für die meisten Setups funktioniert, können bei benutzerdefinierten Scripts oder einem anderen Framework noch Probleme auftreten. Hier sind einige alternative Ansätze:
-
Die Telefon-Registrierungsfunktion direkt aufrufen
TriggerServerEvent('crew:registerPhone', GetPlayerServerId(PlayerId()))Einige CrewPhone-Varianten bieten ein
registerPhone-Event, das den Server zwingt, unabhängig vom Loadout-Status eine neue Nummer zu generieren. -
Den serverseitigen Nummern-Generator patchen Das Server-Script suchen, das
crew:onPlayerLoadedhandhabt, und sicherstellen, dass es Folgendes enthält:if not playerData.phone then playerData.phone = GeneratePhoneNumber() end TriggerClientEvent('crew:setPhoneNumber', src, playerData.phone)Das erzwingt, dass eine korrekte Nummer gesetzt wird, auch wenn der Client keine angefordert hat.
—
Über das Hash-Problem hinaus
Das Hash-Problem zu beheben ist nur ein Teil eines ausgefeilten Telefonsystems auf deinem Server. Um das Meiste aus CrewPhone herauszuholen, solltest du folgendes in Betracht ziehen:
– Benutzerdefinierte Klingeltöne — Den Standard-Klingelton durch lokalisierte Genres ersetzen. – Spam-Schutz für Nachrichten — Cooldowns implementieren, um Spieler-Flooding des Chats zu verhindern. – Kontakte importieren — Spielern erlauben, Kontakte aus einer gemeinsamen Datenbank für einfacheres Management zu importieren.
Jede dieser Erweiterungen kann später angegangen werden, aber indem du mit dem Hash-Fix anfängst, eliminierst du einen wesentlichen Frustrationspunkt für deine Spieler.
—
Fazit
Das CrewPhone Hash-Problem ist ein kleiner Fehler, der sich wie ein großes Hindernis anfühlen kann. Indem du sicherstellst, dass der Client das crew:onPlayerLoaded-Event direkt nach der Wiederherstellung des Loadouts eines Spielers auslöst, signalisierst du dem Server, die korrekte Telefonnummer zu verknüpfen, und eliminierst die Platzhalter-Anzeige ###-####. Implementiere das Snippet oben, teste es, und du wirst ein reibungsloses Telefonerlebnis für deine Spieler haben.
Kurze Zusammenfassung:
- Den Event-Trigger am Anfang deiner Client-Datei einfügen.
- Den
esx:restoreLoadout-Handler mit dem detaillierten Code-Beispiel patchen. - Den Server neu starten und prüfen, ob die Nummer korrekt angezeigt wird.
Mit diesen Schritten wird das CrewPhone Hash-Problem der Vergangenheit angehören, und deine Community kann ein vollständig funktionierendes In-Game-Telefonsystem genießen. Viel Spaß!


