TimeFactory.
Die Bibliothek TimeFactory ermöglicht euch, auf eurem SA:MP Server die Uhr schneller laufen zu lassen als in der Realität. Ihr habt dabei aber trotzdem Zugriff auf einen vollständigen Kalender mit Uhrzeit, Wochentagen, Jahr usw. Ihr möchtet dass auf eurem Server die Uhr 4x ( 2-16 ) schneller läuft als in der Realität und trotzdem wissen, welchen Wochentag ihr habt, die Uhrzeit oder den Monat? Dann ist diese Bibliothek eventuell das richtige für euch.
Ursprünglich wollte ein User so eine Bibliothek als Auftragsarbeit haben. Es kam nicht dazu,aus Spaß hab ich mir die dann selbst erstellt und da ich selber keinen nutzen dafür habe, gebe ich das Paket frei.
Erklärung:
Es sind zwei Unix Timestamps zu Beginn nötig um die Berechnungen durchzuführen. Näheres dazu in der Funktion TimeFactory() oder im Spoiler.
UnixTimestamp bei dem in der ECHTEN Welt die Zeit beginnt zu rechnen
Sinnvoll wäre ein UnixTimestamp zB bei Server Eröffnung um ab da die Zeitrechnung
laufen zu lassen
UnixTimestamp bei dem die Zeitrechnung Ingame beginnt.
Diese zwei Zeitstempel werden quasi miteinander verbunden. Wieviele Sekunden bereits in der echten Welt vergangen sind, wird an Hand von realDate bemessen. Gebe ich dort den 1.1.2014 00:00:00 [1388530800] an, sind bis heute (28.12.2014 18:55:00) 362 Tage und knapp 19 Stunden vergangen. Diese 361T und 19H werden mit einem Faktor, in dem Falle 4 (2 - 1 möglich), multipliziert und auf ingameDate, dem 1.1.2010 00:00:00 [1262300400], drauf gerechnet. 1444T und 76H bzw 1447Tage und 2 H. Welches Datum sich daraus ergibt, kann mit TimeFactory_InGameDate() bzw TimeFactory_InGameUnix() ausgelesen werden. Welche Funktionen es noch gibt, seht ihr unten im Beitrag.
Vergeht also bei dem Faktor 4 in der echten Welt 1 Tag, vergehen im Spiel 4 Tage.
Die Erklärung hinter der Bibliothek ist eventuell mit einem Bild einfacher, daher hier eine Darstellung.
Faktor 4:
1 Jahr Echtzeit entspricht 4 Jahren InGame.
Es stimmt allerdings nicht ganz in diesem Fall, dass 1 Jahr 4 Jahren Ingame entspricht. 2012 war nämlich ein Schaltjahr, weshalb es nicht ganz 4 Jahre sind.
Welches Datum es exakt wäre in 1 Jahr ausgehend vom 1.1.2014 00:00:00, könnte man mit TimeFactory_Convert() auslesen.
new
tm<tTime>;
tTime = TimeFactory_Convert( REAL_TO_INGAME , 0 , 0 , 0 , 1, 1 , 2015 );
//Startzeit +1 Jahr: Tue Dec 31 00:00:00 2013
Damit es eben so genau funktioniert mit dem Datum wird auf ein Plugin zurück gegriffen (CTime).
Dort (bei dem Plugin) muss darauf geachtet werden, dass der Monat bei 0,das Jahr bei 1900 und die Woche mit dem Sonntag als 0 beginnt.
Es wird stets in localtime gerechnet, nicht gmtime.
Siehe dazu mehr hier.
Funktionen:
Bei einem tm: Objekt handelt es sich um eine spezielle Struktur:
Alles anzeigenEnumerator (tm "structure"):
enum e_tm {
tm_sec,
tm_min,
tm_hour,
tm_mday,
tm_mon,
tm_year,
tm_wday,
tm_yday,
tm_isdst
};
Quelle
Nun zu den eigentlichen Funktionen der Bilbiothek.
Initialfunktion:
/*
Funktion zum Starten der Berechnung. Muss als erstes gemacht werden bevor
alle anderen Funktionen genutzt werden können.
realDate
UnixTimestamp bei dem in der ECHTEN Welt die Zeit beginnt zu rechnen
Sinnvoll wäre ein UnixTimestamp zB bei Server Eröffnung um ab da die Zeitrechnung
laufen zu lassen
ingameDate
UnixTimestamp bei dem die Zeitrechnung Ingame beginnt.
speed
Integer um die Zeitrechnung zu beschleunigen (2 - 16)
*/
TimeFactory(realdate = 0, ingamedate = 0 , speed = 4)
Initialwerte:
/*
TimeFactory_RealDate
Gibt den Unix Timestamp von Initialwert speed an
*/
TimeFactory_RealDate()
/*
TimeFactory_IngameInitDate
Gibt den Unix Timestamp von Initialwert ingameDate an
*/
TimeFactory_IngameInitDate()
/*
TimeFactory_Speed
Gibt den Zeitfaktor an, der IngameInitDate beschleunigt
*/
TimeFactory_Speed()
/*
TimeFactory_GetElapsedSec
Zeit in Sec die Vergangen ist bis <jetzt>
*/
TimeFactory_GetElapsedSec( since = 0 )
/*
TimeFactory_InGameUnix
Gibt den UnixTimestamp der InGame aktuell ist.
Ist immer größer/gleich dem IngameDate bzw "ingamedate" aus TimeFactory
*/
TimeFactory_InGameUnix()
/*
tm:TimeFactory_InGameDate
Gibt eine Variable zurück, die basierend auf TimeFactory_InGameUnix
ein Array zurück gibt mit folgender Struktur:
var {
tm_sec, //sekunde
tm_min, // Minute
tm_hour, // Stunde
tm_mday, // Monatstag
tm_mon, // 0 Jan,1 Feb, 2 Mär, 3 Apr ...
tm_year, // X - 1900
tm_wday, // 0 SO,1 MO,2 TU,3 WE,4 TH,5 FR, 6 SA
tm_yday, // Tag des Jahres
tm_isdst // DayLightSaving
}
Mit dieser Struktur wird das Datum und Zeit genau beschrieben.
*/
tm:TimeFactory_InGameDate()
TimeFactory_PrintDate( tm<tTime>)
/*
Konvertiert ein Datum von:
InGame zur Realen Zeiten
Realen Zeite zu InGame
enum {
INGAME_TO_REAL,
REAL_TO_INGAME
}
*/
tm:TimeFactory_Convert(type,second,minute,hour,dayofmonth,month,year)
InGame_Second()
InGame_Hour()
InGame_Minute()
InGame_DayOfMonth()
InGame_Month()
InGame_Year()
/*
InGame_WeekDay
Wochentag
0 ist Montag
...
6 ist Sonntag
*/
InGame_WeekDay()
Vorraussetzung:
Es muss folgendes Plugin installiert sein: [Plugin] CTime Library
Screenshots:
Gibt nicht viel zu zeigen auser ein Beispiel Textdraw, dass das aktuelle Datum und Uhrzeit Ingame anzeigt. Das Script dazu ist im Download enthalten.
Hotlink #1
Hotlink #2
Download:
goldkiller.bplaced.net
pastebin.com
Goldkiller