Ten poradnik przeprowadzi Cię przez tworzenie skryptu FiveM, który synchronizuje zegar w grze z rzeczywistym czasem. Dzięki temu środowisko gry będzie odzwierciedlać aktualny czas, zwiększając realizm dla graczy.
Omówimy zarówno skrypty po stronie serwera, jak i klienta, dodając funkcjonalność uruchamiania i zatrzymywania synchronizacji oraz konfigurację zasobu dla Twojego serwera FiveM.
Wymagania wstępne
Przed rozpoczęciem upewnij się, że posiadasz następujące rzeczy:
- Dostęp do serwera FiveM: Wymagany jest dostęp administracyjny do Twojego serwera FiveM, aby dodawać skrypty.
- Podstawowa znajomość Lua: Znajomość skryptów Lua pomoże Ci zrozumieć i dostosować skrypt.
- Edytor tekstu: Oprogramowanie takie jak Visual Studio Code, Sublime Text lub Notepad++ do edycji plików skryptów.
Konfigurowanie folderu zasobów
- Przejdź do katalogu Resources:Znajdź
resourcesfolder w katalogu Twojego serwera FiveM. Zazwyczaj znajduje się on pod adresem:bashCode kopierenyour-fivem-server-folder/resources/ - Utwórz nowy folder zasobu:Wewnątrz folderu
resources, utwórz nowy folder o nazwierealtime.bashCode kopierenyour-fivem-server-folder/resources/realtime/ - Przejdź do
realtimeFolder:Ten folder będzie zawierać wszystkie niezbędne skrypty i pliki konfiguracyjne do synchronizacji czasu rzeczywistego.
Tworzenie skryptu po stronie serwera (server.lua)
- Tworzyć
server.lua:Wewnątrz folderurealtimefolder, utwórz nowy plik o nazwieserver.lua. - Dodaj następujący kod do
server.lua:luaCode kopierenRegisterNetEvent("realtime:event") AddEventHandler("realtime:event", function() local hour = tonumber(os.date("%H")) local minute = tonumber(os.date("%M")) local second = tonumber(os.date("%S")) TriggerClientEvent("realtime:event", source, hour, minute, second) end)Wyjaśnienie:- RegisterNetEvent: Rejestruje zdarzenie sieciowe o nazwie
realtime:event. - AddEventHandler: Określa, co się dzieje, gdy
realtime:eventjest wyzwolone. - os.date: Pobiera bieżący czas systemowy (godzina, minuta, sekunda).
- TriggerClientEvent: Wysyła dane czasu do klienta, który wywołał zdarzenie.
- RegisterNetEvent: Rejestruje zdarzenie sieciowe o nazwie
Tworzenie skryptu po stronie klienta (client.lua)
- Tworzyć
client.lua:Wewnątrz folderurealtimefolder, utwórz nowy plik o nazwieclient.lua. - Dodaj następujący kod do
client.lua:luaCode kopieren-- Set the duration of one in-game minute in milliseconds SetMillisecondsPerGameMinute(60000) -- 60,000 ms = 1 real-world minute RegisterNetEvent("realtime:event") AddEventHandler("realtime:event", function(hour, minute, second) NetworkOverrideClockTime(hour, minute, second) end) -- Trigger the server event to initiate synchronization TriggerServerEvent("realtime:event")Wyjaśnienie:- SetMillisecondsPerGameMinute: Określa, jak długo trwa jedna minuta w grze. Ustawienie go na
60000sprawia, że 1 minuta w grze równa się 1 minucie czasu rzeczywistego. - RegisterNetEvent & AddEventHandler: Nasłuchuje zdarzenia
realtime:eventz serwera i odpowiednio aktualizuje zegar w grze. - NetworkOverrideClockTime: Zastępuje zegar w grze, aby dopasować go do czasu rzeczywistego otrzymanego z serwera.
- TriggerServerEvent: Inicjuje synchronizację poprzez wywołanie zdarzenia serwera.
- SetMillisecondsPerGameMinute: Określa, jak długo trwa jedna minuta w grze. Ustawienie go na
Dodawanie funkcjonalności zatrzymania
Aby umożliwić włączanie i wyłączanie synchronizacji czasu rzeczywistego, dodamy funkcje uruchamiania i zatrzymywania synchronizacji.
- Aktualizacja
client.luaz funkcjonalnością zatrzymania:luaCode kopierenlocal syncActive = true local syncThread = nil -- Function to start synchronization function StartRealTimeSync() if not syncActive then syncActive = true syncThread = CreateThread(function() while syncActive do TriggerServerEvent("realtime:event") Wait(60000) -- Wait for 1 minute before next sync end end) end end -- Function to stop synchronization function StopRealTimeSync() if syncActive then syncActive = false if syncThread then -- In Lua, there's no direct way to kill a thread. -- Using a flag to exit the loop effectively stops the thread. syncThread = nil end end end RegisterNetEvent("realtime:event") AddEventHandler("realtime:event", function(hour, minute, second) if syncActive then NetworkOverrideClockTime(hour, minute, second) end end) -- Start synchronization on resource start StartRealTimeSync() -- Example: Command to toggle synchronization RegisterCommand("toggleTimeSync", function() if syncActive then StopRealTimeSync() print("Real-time synchronization stopped.") else StartRealTimeSync() print("Real-time synchronization started.") end end, false)Wyjaśnienie:- syncActive: Flaga określająca, czy synchronizacja jest aktywna.
- StartRealTimeSync: Inicjuje pętlę, która co minutę żąda aktualizacji czasu z serwera.
- StopRealTimeSync: Zatrzymuje synchronizację poprzez ustawienie flagi na false.
- RegisterCommand: Dodaje komendę (
/toggleTimeSync) którą gracze mogą użyć do włączania lub wyłączania synchronizacji.
Tworzenie manifestu zasobu (fxmanifest.lua)
Każdy zasób FiveM wymaga pliku manifestu, który definiuje jego metadane i zależności.
- Tworzyć
fxmanifest.lua:Wewnątrz folderurealtimefolder, utwórz nowy plik o nazwiefxmanifest.lua. - Dodaj następujący kod do
fxmanifest.lua:fx_version 'cerulean' game 'gta5' author 'YourName' description 'Real-Time Synchronization Script for FiveM' version '1.0.0' server_script 'server.lua' client_script 'client.lua' - Wyjaśnienie:
- fx_version: Określa wersję manifestu FiveM.
ceruleanjest najnowsza w momencie pisania. - gra: Wskazuje grę, dla której jest zasób (
gta5). - autor, opis, wersja: Metadane dotyczące twojego zasobu.
- server_script & client_script: Określa skrypty serwera i klienta do załadowania.
- fx_version: Określa wersję manifestu FiveM.
Uruchamianie zasobu na twoim serwerze
- Edytuj konfigurację serwera:Otwórz plik konfiguracyjny serwera, zazwyczaj nazwany
server.cfg. - Dodaj zasób do konfiguracji:Dodaj następującą linię, aby upewnić się, że
realtimezasób zaczyna się od serwera:rubyCode kopierenensure realtimeUwaga: Jeśli używaszstartzamiastensure, możesz użyć:start realtime - Zapisz i uruchom ponownie swój serwer:Po zapisaniu zmian w
server.cfg, uruchom ponownie swój serwer FiveM, aby załadować nowy zasób.
Pełne pobranie zasobu
Dla wygody, oto kompletny zestaw plików, które musisz utworzyć dla realtime zasobu.
1. server.lua
RegisterNetEvent("realtime:event")
AddEventHandler("realtime:event", function()
local hour = tonumber(os.date("%H"))
local minute = tonumber(os.date("%M"))
local second = tonumber(os.date("%S"))
TriggerClientEvent("realtime:event", source, hour, minute, second)
end)
2. client.lua
local syncActive = true
local syncThread = nil
-- Function to start synchronization
function StartRealTimeSync()
if not syncActive then
syncActive = true
syncThread = CreateThread(function()
while syncActive do
TriggerServerEvent("realtime:event")
Wait(60000) -- Wait for 1 minute before next sync
end
end)
end
end
-- Function to stop synchronization
function StopRealTimeSync()
if syncActive then
syncActive = false
if syncThread then
-- In Lua, threads are cooperative; setting syncActive to false will stop the loop
syncThread = nil
end
end
end
RegisterNetEvent("realtime:event")
AddEventHandler("realtime:event", function(hour, minute, second)
if syncActive then
NetworkOverrideClockTime(hour, minute, second)
end
end)
-- Start synchronization on resource start
StartRealTimeSync()
-- Example: Command to toggle synchronization
RegisterCommand("toggleTimeSync", function()
if syncActive then
StopRealTimeSync()
print("Real-time synchronization stopped.")
else
StartRealTimeSync()
print("Real-time synchronization started.")
end
end, false)
3. fxmanifest.lua
fx_version 'cerulean' game 'gta5' author 'YourName' description 'Real-Time Synchronization Script for FiveM' version '1.0.0' server_script 'server.lua' client_script 'client.lua'
Pełny skrypt
Tutaj możesz pobrać skrypt, który właśnie utworzyliśmy:
https://github.com/HiFiveM/fivem-realtime/archive/refs/heads/main.zip
Pomyślnie utworzyłeś zasób FiveM, który synchronizuje zegar w grze z czasem rzeczywistym. Ten skrypt dodaje obszar rozgrywki, zapewniając, że środowisko gry odzwierciedla rzeczywisty czas, dodając warstwę realizmu dla graczy.
Możesz dalej dostosowywać skrypt, zmieniając interwały synchronizacji, dodając więcej komend lub integrując go z innymi funkcjami serwera.
Śmiało rozwijaj tę podstawę, aby dostosować ją do unikalnych potrzeb swojego serwera!
