Implemented Clock Class (#977)
* Simplified some stuff, made up-to-date * Dealt with DST problems * Made SystemTime.Format clearscope, as there is no reason for this function to be limited to the ui
This commit is contained in:
parent
85759e3bd0
commit
5803b78147
5 changed files with 227 additions and 27 deletions
|
|
@ -2669,20 +2669,84 @@ DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, setFrozen, setFrozen)
|
|||
//
|
||||
//=====================================================================================
|
||||
|
||||
static int GetRealTime()
|
||||
extern time_t epochoffset;
|
||||
|
||||
static int GetEpochTime()
|
||||
{
|
||||
time_t now;
|
||||
time(&now);
|
||||
struct tm* timeinfo = localtime(&now);
|
||||
return timeinfo ? timeinfo->tm_sec + timeinfo->tm_min * 60 + timeinfo->tm_hour * 3600 : 0;
|
||||
return now != (time_t)(-1) ? now + epochoffset : (time_t)(-1);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(_AltHUD, GetRealTime, GetRealTime)
|
||||
//Returns an empty string if the Strf tokens are valid, otherwise returns the problematic token
|
||||
static FString CheckStrfString(FString timeForm)
|
||||
{
|
||||
// Valid Characters after %
|
||||
const char validSingles[] = { 'a','A','b','B','c','C','d','D','e','F','G','g','h','H','I','j','k','l','m','M','n','p','P','r','R','s','S','t','T','u','U','V','w','W','x','X','y','Y','z','Z' };
|
||||
|
||||
timeForm.Substitute("%%", "%a"); //Prevent %% from causing tokenizing problems
|
||||
timeForm = "a" + timeForm; //Prevent %* at the beginning from causing a false error from tokenizing
|
||||
|
||||
auto tokens = timeForm.Split("%");
|
||||
for (auto t : tokens)
|
||||
{
|
||||
bool found = false;
|
||||
// % at end
|
||||
if (t.Len() == 0) return FString("%");
|
||||
|
||||
// Single Character
|
||||
for (int i = 0; i < sizeof(validSingles)/sizeof(validSingles[0]); i++)
|
||||
{
|
||||
if (t[0] == validSingles[i])
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) continue;
|
||||
return FString("%") + t[0];
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
static void FormatTime(const FString& timeForm, int timeVal, FString* result)
|
||||
{
|
||||
FString error = CheckStrfString(timeForm);
|
||||
if (!error.IsEmpty())
|
||||
ThrowAbortException(X_FORMAT_ERROR, "'%s' is not a valid format specifier of SystemTime.Format()", error.GetChars());
|
||||
|
||||
time_t val = timeVal;
|
||||
struct tm* timeinfo = localtime(&val);
|
||||
if (timeinfo != nullptr)
|
||||
{
|
||||
char timeString[1024];
|
||||
if (strftime(timeString, sizeof(timeString), timeForm, timeinfo))
|
||||
*result = timeString;
|
||||
}
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(_SystemTime, Now, GetEpochTime)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
ACTION_RETURN_INT(GetRealTime());
|
||||
ACTION_RETURN_INT(GetEpochTime());
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(_SystemTime, Format, FormatTime)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
PARAM_STRING(timeForm);
|
||||
PARAM_INT(timeVal);
|
||||
FString result;
|
||||
FormatTime(timeForm, timeVal, &result);
|
||||
ACTION_RETURN_STRING(result);
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
//
|
||||
//
|
||||
//
|
||||
//=====================================================================================
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(_AltHUD, GetLatency, Net_GetLatency)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue