====== Comfort: Countdown and Peacetime ======
===== Beschreibung =====
Mit diesem Code lassen sich Countdowns starten, die nach Ablauf bestimmte Funktionen aufrufen. \\
Ausserdem lässt sich eine Friedenszeit im Multiplayer setzen. \\
===== Anwendung =====
Die Anwendung ist sehr einfach. Zunächst muss in der FirstMapAction() vor Anwendung der Code eingelesen werden:
Countdown_and_Peacetime()
Jetzt können folgende Funktionen verwendet werden
==== Countdown ====
_countdownId = StartCountdown (_Limit, _Callback, _Show)
_countdownId: Id für spätere Verwendung
_Limit: Ablauf des Countdowns in Sekunden
_Callback: Funktion (ohne " ", also einfach der Name!)
_Show: True, falls der Countdown gezeigt werden soll. Achtung! Es kann nur ein Countdown auf einmal angezeigt werden!
StopCountdown(_Id)
_Id: Id eines Countdowns wie in StartCountdown vermerkt
==== Peacetime (Multiplayer) ====
SetPeacetime = function ( _seconds )
_seconds: Dauer der Friedenszeit in Sekunden
Sollen nach Ablauf der Friedenszeit noch andere Aktionen durchgeführt werden, muss noch die folgende Funktion bearbeitet werden.
PeacetimeEnd = function()
...
end
===== Code =====
function Countdown_and_Peacetime()
PeacetimeEnd = function()
-- sämtliche Aktionen bei Ende der Friedenszeit
MultiplayerTools.SetUpDiplomacyOnMPGameConfig()
-- Sound bei Ende der Friedenszeit
Sound.PlayGUISound( Sounds.OnKlick_Select_kerberos, 127 )
-- Nachricht bei Ende der Friedenszeit
Message( "@color:255,255,0 "..g_MC_Loc[gvRL].Wartimemsg );
end
SetPeacetime = function ( _seconds )
---hier wird die Funktion special peacetime gestartet
SpecialPeacetime();
StartCountdown( _seconds, PeacetimeEnd, true );
end
SpecialPeacetime = function()
-- Anzahl der menschlichen Spieler wird hier ermittelt
local _humenPlayer = XNetwork.GameInformation_GetMapMaximumNumberOfHumanPlayer()
-- Abfrage ob Standardsituation gegeben ist das jeder sich mit jedem verbünden kann
if XNetwork.GameInformation_GetFreeAlliancesFlag() == 1 then
-- Feststellung wer mit wem verbündet ist und Festlegung des DiplomatiST für die Peacetime
if _humenPlayer > 1 then
for _teampId = 1, _humenPlayer do
local _teamplayer = XNetwork.GameInformation_GetLogicPlayerTeam( _teampId )
for _oppopId = 1, _humenPlayer do
if _teampId ~= OppoPlayer then
local _oppoPlayer = XNetwork.GameInformation_GetLogicPlayerTeam( _oppopId )
if _teamplayer == _oppoPlayer then
Logic.SetDiplomacyState( _oppopId, _teampId, Diplomacy.Friendly )
else
Logic.SetDiplomacyState( _oppopId, _teampId, Diplomacy.Neutral )
end
end
end
end
end
end
end
StartCountdown = function (_Limit, _Callback, _Show)
assert(type(_Limit) == "number")
Counter.Index = (Counter.Index or 0) + 1
if _Show and CountdownIsVisisble() then
assert(false, "StartCountdown: A countdown is already visible")
end
Counter["counter" .. Counter.Index] = {Limit = _Limit, TickCount = 0, Callback = _Callback, Show = _Show, Finished = false}
if _Show then
MapLocal_StartCountDown(_Limit)
end
if Counter.JobId == nil then
Counter.JobId = StartSimpleJob("CountdownTick")
end
return Counter.Index
end
StopCountdown = function(_Id)
if Counter.Index == nil then
return
end
if _Id == nil then
for i = 1, Counter.Index do
if Counter.IsValid("counter" .. i) then
if Counter["counter" .. i].Show then
MapLocal_StopCountDown()
end
Counter["counter" .. i] = nil
end
end
else
if Counter.IsValid("counter" .. _Id) then
if Counter["counter" .. _Id].Show then
MapLocal_StopCountDown()
end
Counter["counter" .. _Id] = nil
end
end
end
CountdownTick = function()
local empty = true
for i = 1, Counter.Index do
if Counter.IsValid("counter" .. i) then
if Counter.Tick("counter" .. i) then
Counter["counter" .. i].Finished = true
end
if Counter["counter" .. i].Finished and not IsBriefingActive() then
if Counter["counter" .. i].Show then
MapLocal_StopCountDown()
end
-- callback function
if type(Counter["counter" .. i].Callback) == "function" then
Counter["counter" .. i].Callback()
end
Counter["counter" .. i] = nil
end
empty = false
end
end
if empty then
Counter.JobId = nil
Counter.Index = nil
return true
end
end
CountdownIsVisisble = function()
for i = 1, Counter.Index do
if Counter.IsValid("counter" .. i) and Counter["counter" .. i].Show then
return true
end
end
return false
end
end
===== Anmerkungen =====
Der Autor der Funktionen ist mir unbekannt.