from System import DateTime, TimeSpan from System.Globalization import CultureInfo def Execute(): Project.EventsManager.SubscribeEvent("GraphicsEnginesObserver.GraphicsEngineConnected", Script.Id, "OnGraphicsEnginesObserver_GraphicsEngineConnected", True) Project.EventsManager.SubscribeEvent("GameOnline.ClockStarted", Script.Id, "OnGameOnline_ClockStarted", True) Project.EventsManager.SubscribeEvent("GameOnline.ClockStopped", Script.Id, "OnGameOnline_ClockStopped", True) Project.EventsManager.SubscribeEvent("GameOnline.ClockActivePartChanged", Script.Id, "OnGameOnline_ClockStopped", True) Project.EventsManager.SubscribeEvent("GameOpened", Script.Id, "OnGameOpened", True) def OnGraphicsEnginesObserver_GraphicsEngineConnected(sender, args): pass def FormatClock(timeSpan): # print "#INVARIANT--->"+timeSpan.ToString('o',CultureInfo.InvariantCulture) # print "#0--->"+timeSpan.ToString('O') return timeSpan.ToString('O',CultureInfo.InvariantCulture)#ToString("####0.00",CultureInfo.InvariantCulture) def OnGameOnline_ClockStarted(sender, args): if GameOnline.IsOnAir: for r3, matchClockPlugin in GetClockPluginFromAllConnectedEngines(Script.Description): try: SetupClock(matchClockPlugin) startRef = FormatClock(DateTime.Now - sender.Clock.ElapsedTime) cmd = "ENGINE PLUGIN \"%s\" SET \"Worker.StartReference\" \"%s\" \"Worker.StopReference\" \"%s\"" % ( Script.Description, startRef, FormatClock(DateTime.Now + TimeSpan.FromHours(99))) r3.SendCommandAndResponse(cmd) cmd = "ENGINE PLUGIN \"%s\" SET \"Worker.StopType\" \"None\"" % (Script.Description) r3.SendCommandAndResponse(cmd) matchClockPlugin.Start() except: #TODO: Engine is not connected or have errors continue extraTimerClockName = "GameClockExtraTime" for r3, matchClockPlugin in GetClockPluginFromAllConnectedEngines(extraTimerClockName): try: #SetupClock(matchClockPlugin) SetupClockExtraTimer(matchClockPlugin) startRef = FormatClock(DateTime.Now - sender.Clock.ElapsedTime + Game.Clock.ActivePart.EndAt + TimeSpan.FromMilliseconds(100))#.ToString('O') cmd = "ENGINE PLUGIN \"%s\" SET \"Worker.StartReference\" \"%s\""%(extraTimerClockName, startRef) r3.SendCommandAndResponse(cmd) cmd = "ENGINE PLUGIN \"%s\" SET \"Worker.StopType\" \"None\""%(extraTimerClockName) r3.SendCommandAndResponse(cmd) matchClockPlugin.Start() except: #TODO: Engine is not connected or have errors continue kickOffTimerClockName = "GameClockKickOff" for r3, matchClockPlugin in GetClockPluginFromAllConnectedEngines(kickOffTimerClockName): try: SetupClockKickOff(matchClockPlugin) startRef = FormatClock( DateTime.Now - sender.Clock.ElapsedTime)#.ToString('O') endRef = FormatClock(DateTime.Now - sender.Clock.ElapsedTime + Game.Clock.ActivePart.EndAt + TimeSpan.FromMilliseconds(100))#.ToString('O') cmd = "ENGINE PLUGIN \"%s\" SET \"Worker.StartReference\" \"%s\" \"Worker.StopReference\" \"%s\""%(kickOffTimerClockName,startRef, endRef) r3.SendCommandAndResponse(cmd) cmd = "ENGINE PLUGIN \"%s\" SET \"Worker.StopType\" \"StopAtReference\""%(kickOffTimerClockName) r3.SendCommandAndResponse(cmd) matchClockPlugin.Start() except: #TODO: Engine is not connected or have errors continue def OnGameOnline_ClockStopped(sender, args): if GameOnline.IsOnAir: for r3, matchClockPlugin in GetClockPluginFromAllConnectedEngines(Script.Description): SetupClock(matchClockPlugin) if GameOnline.Clock.ActivePart.Name.ToString() == "Finished" or GameOnline.Clock.ActivePart.Name.ToString() == "Full Time" or GameOnline.Clock.ActivePart.Name.ToString() == "Penalties": pass else: if sender.Clock.ElapsedTime > sender.Clock.ActivePart.EndAt: matchClockPlugin.Stop(sender.Clock.ActivePart.EndAt) else: matchClockPlugin.Stop(sender.Clock.ElapsedTime) if Game.Clock.ActivePart.EndAt == "penalties": return endRef = FormatClock(DateTime.Now - sender.Clock.ElapsedTime + Game.Clock.ActivePart.EndAt + TimeSpan.FromMilliseconds(100))#.ToString('O') if Game.Clock.ActivePart.Duration == TimeSpan.FromSeconds(0): #this prevent the extra timer to be shown when the part duration is 0, PS: Not supposed to happen cmd = "ENGINE PLUGIN \"%s\" SET \"Worker.StopReference\" \"%s\""%(Script.Description, DateTime.Now + TimeSpan.FromHours(99)) else: cmd = "ENGINE PLUGIN \"%s\" SET \"Worker.StopReference\" \"%s\""%(Script.Description, endRef) r3.SendCommandAndResponse(cmd) extraTimerClockName = "GameClockExtraTime" for r3, matchClockPlugin in GetClockPluginFromAllConnectedEngines(extraTimerClockName): SetupClockExtraTimer(matchClockPlugin) # if sender.Clock.ElapsedTime> sender.Clock.ActivePart.EndAt: # matchClockPlugin.Stop( sender.Clock.ElapsedTime-sender.Clock.ActivePart.EndAt) # else: # matchClockPlugin.Stop(TimeSpan.FromSeconds(0)) kickOffTimerClockName = "GameClockKickOff" for r3, matchClockPlugin in GetClockPluginFromAllConnectedEngines(kickOffTimerClockName): SetupClockKickOff(matchClockPlugin) if GameOnline.Clock.ActivePart.Name.ToString() == "Finished" or GameOnline.Clock.ActivePart.Name.ToString() == "Full Time" or GameOnline.Clock.ActivePart.Name.ToString() == "Penalties": pass else: if sender.Clock.ElapsedTime > sender.Clock.ActivePart.EndAt: matchClockPlugin.Stop(sender.Clock.ActivePart.EndAt) else: matchClockPlugin.Stop(sender.Clock.ElapsedTime) endRef = FormatClock(DateTime.Now - sender.Clock.ElapsedTime + Game.Clock.ActivePart.EndAt + TimeSpan.FromMilliseconds(100))#.ToString('O') if Game.Clock.ActivePart.Duration == TimeSpan.FromSeconds(0): cmd = "ENGINE PLUGIN \"%s\" SET \"Worker.StopReference\" \"%s\""%(kickOffTimerClockName, FormatClock(DateTime.Now + TimeSpan.FromHours(99))) else: cmd = "ENGINE PLUGIN \"%s\" SET \"Worker.StopReference\" \"%s\""%(kickOffTimerClockName, endRef) r3.SendCommandAndResponse(cmd) def GetClockPluginFromAllConnectedEngines(clockName): list = [] if hasattr(Context, "OutputManager"): for channelOutput in OutputManager.ChannelOutputs: for engineAss in channelOutput.EnginesAssignmentProfiles: for pgmConfig in engineAss.ProgramGraphicsEngines: if pgmConfig.IsValid and pgmConfig.GraphicsEngine and pgmConfig.GraphicsEngine.IsConnected: r3 = pgmConfig.GraphicsEngine list.append((r3, r3.CreateClockPlugin(clockName))) else: for r3 in R3GraphicsEngines: if r3.IsConnected: list.append((r3, r3.CreateClockPlugin(clockName))) return list def SetupClock(clock): clock.SetClockType("Count"); clock.SetMaskFormat("MaxMinSec"); clock.SetPlusSignalVisibility(False); def SetupClockKickOff(clock): clock.SetClockType("Count"); clock.SetMaskFormat("MaxMinSec"); clock.SetPlusSignalVisibility(False); def SetupClockExtraTimer(clock): clock.SetClockType("Count"); clock.SetMaskFormat("MaxMinSec"); clock.SetPlusSignalVisibility(False); def OnTimeSetSafe(sender, args): #runs the script with the script runner avoiding to have to reset the script during the development.. Core.ScriptRunner.Execute(Script, "OnTimeSet", sender, args) def OnTimeSet(sender, args): if sender.IsRunning: OnGameOnline_ClockStarted(ClockWrapper(sender), args) else: OnGameOnline_ClockStopped(ClockWrapper(sender), args) class ClockWrapper: def __init__(self, clock): self.Clock = clock import System def SetTime(): OnTimeSet(GameOnline.Clock, System.EventArgs.Empty) def OnGameOpened(sender, args): #check if the object exists in the context, then removes the subscription if hasattr(Context, "GameOnline"): if Globals["OnTimeSetSubscription"]: GameOnline.Clock.TimeSet -= Globals["OnTimeSetSubscription"] Globals["OnTimeSetSubscription"] = OnTimeSetSafe GameOnline.Clock.TimeSet += Globals["OnTimeSetSubscription"] #if hasattr(Context, "GameOnline"): # OnTimeSet(GameOnline.Clock, args)