feat: Flaschengroessen mit echter Laufzeit und persistenter Restluft
Lint / Lint Resource (push) Has been cancelled
Lint / Lint Resource (push) Has been cancelled
Der Sauerstoff war eine lokale Client-Variable: nicht persistent, an kein Item gebunden, weg bei Relog. Dazu ergab startingOxygenLevel=100 bei decayRate=1/s genau 100 Sekunden Tauchzeit statt Minuten. Sauerstoff-Logik: - Restsekunden statt Punkte, Verbrauch ueber GetGameTimer-Delta statt gezaehlter Wait(1000) - ein Tick laeuft unter Last laenger als eine Sekunde, was sich ueber einen langen Tauchgang aufsummiert - Float-Vergleiche (oxygenLevel % 10 == 0, == 0) raus, Warnschwellen als config.warnAtSeconds, jede Schwelle einmal pro Tauchgang - Verbrauch steigt mit der Tiefe (1 + tiefe/30, gedeckelt), abschaltbar - Anzeige als mm:ss Flaschen: - Vier Items mit capacity in Sekunden (300/600/900/1200) in config/shared.lua - Restluft in metadata.oxygen, Fuellstand zusaetzlich in metadata.durability, damit der Balken direkt im Inventar-Slot sichtbar ist - Kein decay auf den Items: ox_inventory loescht sonst die leere Flasche - Auswahlmenue beim Anlegen und Auffuellen (entfaellt bei nur einer Flasche) - diving_fill fuellt bis capacity statt auf einen Fixwert, verweigert volle Flaschen und verbraucht sich nur bei Erfolg - items_for_ox_inventory.lua zum Reinkopieren Server: - getTanks/syncTank als Callbacks, Restluft kann nur sinken und nicht schneller als maxDrainPerSecond pro echter Sekunde - SetMetadata ersetzt die Metadata-Tabelle komplett, daher wird der bestehende Inhalt kopiert statt nur oxygen gesetzt Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
-- Von Client und Server benutzt. Muss in fxmanifest unter files{} stehen,
|
||||
-- damit lib.require die Datei auf beiden Seiten laden kann.
|
||||
|
||||
local config = {
|
||||
--- Tauchflaschen. capacity = Laufzeit in Sekunden bei normalem Verbrauch.
|
||||
--- Reihenfolge = Reihenfolge im Auswahlmenü.
|
||||
tanks = {
|
||||
{ name = 'diving_tank_small', capacity = 300 }, -- 5 Minuten
|
||||
{ name = 'diving_tank_medium', capacity = 600 }, -- 10 Minuten
|
||||
{ name = 'diving_tank_large', capacity = 900 }, -- 15 Minuten
|
||||
{ name = 'diving_tank_xl', capacity = 1200 }, -- 20 Minuten
|
||||
},
|
||||
|
||||
--- Wie oft der Client die Restluft an den Server meldet (Sekunden).
|
||||
--- Bei einem Crash gehen maximal so viele Sekunden Luft verloren.
|
||||
syncIntervalSeconds = 15,
|
||||
|
||||
--- Obergrenze für die serverseitige Plausibilitätsprüfung: so viele Sekunden
|
||||
--- Luft kann ein Spieler höchstens pro echter Sekunde verbrauchen. Muss über
|
||||
--- maxDecayFactor aus config/client.lua liegen, sonst wird ehrlichen Spielern
|
||||
--- in großer Tiefe fälschlich Luft zurückgegeben.
|
||||
maxDrainPerSecond = 5.0,
|
||||
}
|
||||
|
||||
config.tankByName = {}
|
||||
config.tankNames = {}
|
||||
|
||||
for i = 1, #config.tanks do
|
||||
local tank = config.tanks[i]
|
||||
config.tankByName[tank.name] = tank
|
||||
config.tankNames[i] = tank.name
|
||||
end
|
||||
|
||||
return config
|
||||
Reference in New Issue
Block a user