TimeOfDayMessage broadcast and fixup

broadcast TimeOfDayMessage to all players in the zone
fix input allows single minute digit times (0:0)
fix set time(speed) before packet creation
fix GetTimeOfDay return seconds, not millis
fix SetTimeOfDay write correct integer type
This commit is contained in:
Resaec 2026-04-13 21:28:44 +02:00
parent 42c66bb4ca
commit 0ae8ab2418
2 changed files with 28 additions and 10 deletions

View file

@ -15,6 +15,8 @@ import net.psforever.objects.sourcing.PlayerSource
import net.psforever.objects.zones.{Zone, ZoneInfo} import net.psforever.objects.zones.{Zone, ZoneInfo}
import net.psforever.packet.game.TimeOfDayMessage.GetTimeOfDayValue import net.psforever.packet.game.TimeOfDayMessage.GetTimeOfDayValue
import net.psforever.packet.game.{SetChatFilterMessage, TimeOfDayMessage} import net.psforever.packet.game.{SetChatFilterMessage, TimeOfDayMessage}
import net.psforever.services.Service
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
import net.psforever.services.chat.{DefaultChannel, OutfitChannel, SquadChannel} import net.psforever.services.chat.{DefaultChannel, OutfitChannel, SquadChannel}
import net.psforever.services.local.{LocalAction, LocalServiceMessage} import net.psforever.services.local.{LocalAction, LocalServiceMessage}
import net.psforever.services.teamwork.{SquadResponse, SquadService, SquadServiceResponse} import net.psforever.services.teamwork.{SquadResponse, SquadService, SquadServiceResponse}
@ -1421,19 +1423,27 @@ class ChatOperations(
} }
def commandSetTime(session: Session, contents: String): Unit = { def commandSetTime(session: Session, contents: String): Unit = {
val TimePattern = """([01]?\d|2[0-3]):([0-5]\d)""".r val TimePattern = """([01]?\d|2[0-3]):([0-5]?\d)""".r
TimePattern.findFirstMatchIn(contents) match { TimePattern.findFirstMatchIn(contents) match {
case Some(m) => case Some(m) =>
val hh = m.group(1).toInt % 24 val hh = m.group(1).toInt % 24
val mm = m.group(2).toInt % 60 val mm = m.group(2).toInt % 60
val requestedTimeOfDay = GetTimeOfDayValue(hh, mm) val requestedTimeOfDay = GetTimeOfDayValue(hh, mm)
val msg = TimeOfDayMessage(requestedTimeOfDay) val zone = session.zone
// update zone // update zone
session.zone.SetTimeOfDay(requestedTimeOfDay) zone.SetTimeOfDay(requestedTimeOfDay)
// build update message
val msg = TimeOfDayMessage(zone.GetTimeOfDay(), zone.GetTimeOfDaySpeed())
// update players in zone
zone.AvatarEvents ! AvatarServiceMessage(
zone.id,
AvatarAction.SendResponse(Service.defaultPlayerGUID, msg)
)
sendResponse(msg)
sendResponse(ChatMsg(messageType = UNK_227, contents = s"@CMT_SETTIME_OK^$hh~^$mm~")) sendResponse(ChatMsg(messageType = UNK_227, contents = s"@CMT_SETTIME_OK^$hh~^$mm~"))
case _ => case _ =>
sendResponse(ChatMsg(messageType = UNK_229, contents = "@CMT_SETTIME_usage")) sendResponse(ChatMsg(messageType = UNK_229, contents = "@CMT_SETTIME_usage"))
@ -1448,12 +1458,20 @@ class ChatOperations(
var timeSpeed = m.matched.toFloat var timeSpeed = m.matched.toFloat
if (timeSpeed < -1000.0f) timeSpeed = -1000.0f if (timeSpeed < -1000.0f) timeSpeed = -1000.0f
if (timeSpeed > 1000.0f) timeSpeed = 1000.0f if (timeSpeed > 1000.0f) timeSpeed = 1000.0f
val msg = TimeOfDayMessage(GetTimeOfDayValue(), timeSpeed) val zone = session.zone
// update zone // update zone
session.zone.SetTimeOfDaySpeed(timeSpeed) zone.SetTimeOfDaySpeed(timeSpeed)
// build update message
val msg = TimeOfDayMessage(zone.GetTimeOfDay(), zone.GetTimeOfDaySpeed())
// update players in zone
zone.AvatarEvents ! AvatarServiceMessage(
zone.id,
AvatarAction.SendResponse(Service.defaultPlayerGUID, msg)
)
sendResponse(msg)
sendResponse(ChatMsg(messageType = UNK_227, contents = s"@CMT_SETTIMESPEED_OK^$timeSpeed~")) sendResponse(ChatMsg(messageType = UNK_227, contents = s"@CMT_SETTIMESPEED_OK^$timeSpeed~"))
case _ => case _ =>
sendResponse(ChatMsg(messageType = UNK_229, contents = "@CMT_SETTIMESPEED_usage")) sendResponse(ChatMsg(messageType = UNK_229, contents = "@CMT_SETTIMESPEED_usage"))

View file

@ -576,9 +576,9 @@ class Zone(val id: String, val map: ZoneMap, zoneNumber: Int) {
// get time since origin // get time since origin
val timeDiff = System.currentTimeMillis() - timeOfDayOrigin val timeDiff = System.currentTimeMillis() - timeOfDayOrigin
// get seconds - limit to 24h // get seconds - limit to 24h
val diffSeconds = timeDiff / 1000 % 86400 val diffSeconds = (timeDiff / 1000) % 86400
timeDiff.toFloat diffSeconds.toFloat
} }
def SetTimeOfDay(requestedTime: Float) = { def SetTimeOfDay(requestedTime: Float) = {
@ -590,7 +590,7 @@ class Zone(val id: String, val map: ZoneMap, zoneNumber: Int) {
// substract requestedMillis from now to get new origin // substract requestedMillis from now to get new origin
val newOrigin = now - requestMillis val newOrigin = now - requestMillis
timeOfDayOrigin = newOrigin.toInt timeOfDayOrigin = newOrigin.toLong
} }
def GetTimeOfDaySpeed(): Float = { def GetTimeOfDaySpeed(): Float = {