diff --git a/Module/Public/Entity/Entities/KyberCurrentTimeEntity.h b/Module/Public/Entity/Entities/KyberCurrentTimeEntity.h new file mode 100644 index 00000000..d8526a47 --- /dev/null +++ b/Module/Public/Entity/Entities/KyberCurrentTimeEntity.h @@ -0,0 +1,27 @@ +// Copyright Armchair Developers. Licensed under GPLv3. + +#pragma once + +#include + +namespace Kyber +{ +class KyberCurrentTimeEntityData : public EntityData +{ +public: + bool EnableUpdates; +}; + +class KyberCurrentTimeEntity : public KyberEntity +{ +public: + KyberCurrentTimeEntity(EntityManager* entityManager, NativeEntity* entity, KyberCurrentTimeEntityData* data); + + void Event(EntityEvent* event) override; + void Update(const UpdateParameters& params) override; + float GetTime(); + +private: + PropertyWriter m_timeOut; +}; +} // namespace Kyber diff --git a/Module/Public/Entity/Entities/KyberTimeSplitterEntity.h b/Module/Public/Entity/Entities/KyberTimeSplitterEntity.h new file mode 100644 index 00000000..1ab6fcd3 --- /dev/null +++ b/Module/Public/Entity/Entities/KyberTimeSplitterEntity.h @@ -0,0 +1,30 @@ +// Copyright Armchair Developers. Licensed under GPLv3. + +#pragma once + +#include + +namespace Kyber +{ +class KyberTimeSplitterEntityData : public EntityData +{ +public: + bool UseUTC; +}; + +class KyberTimeSplitterEntity : public KyberEntity +{ +public: + KyberTimeSplitterEntity(EntityManager* entityManager, NativeEntity* entity, KyberTimeSplitterEntityData* data); + + void PropertyChanged(PropertyModification* modification) override; + +private: + PropertyWriter m_secIntOut; + PropertyWriter m_minIntOut; + PropertyWriter m_hourIntOut; + PropertyWriter m_dayIntOut; + PropertyWriter m_monthIntOut; + PropertyWriter m_yearIntOut; +}; +} // namespace Kyber diff --git a/Module/Source/Entity/Entities/KyberCurrentTimeEntity.cpp b/Module/Source/Entity/Entities/KyberCurrentTimeEntity.cpp new file mode 100644 index 00000000..b2c397dc --- /dev/null +++ b/Module/Source/Entity/Entities/KyberCurrentTimeEntity.cpp @@ -0,0 +1,51 @@ +// Copyright Armchair Developers. Licensed under GPLv3. + +#include + +#include + +#include + +namespace Kyber +{ +KB_IMPLEMENT_TYPE(KyberCurrentTimeEntityData) +{ + KyberTypeInfo info("KyberCurrentTimeEntityData", "EntityData"); + info.AddField("Boolean", "EnableUpdates"); + return info; +} + +KB_IMPLEMENT_ENTITY(KyberCurrentTimeEntity, KyberCurrentTimeEntityData); + +KyberCurrentTimeEntity::KyberCurrentTimeEntity(EntityManager* entityManager, NativeEntity* entity, KyberCurrentTimeEntityData* data) + : KyberEntity(entity, data) +{ + m_timeOut = CreateFieldOverride("Time", g_program->m_entityManager->GetNativeType("Float32")); + + SetWantUpdates(data->EnableUpdates); +} + +void KyberCurrentTimeEntity::Event(EntityEvent* event) +{ + if (event->Is("Update")) + { + float currentTime = GetTime(); + m_timeOut = ¤tTime; + FireEvent("OnUpdate"); + } +} + +void KyberCurrentTimeEntity::Update(const UpdateParameters& params) +{ + float currentTime = GetTime(); + m_timeOut = ¤tTime; +} + +float KyberCurrentTimeEntity::GetTime() +{ + auto now = std::chrono::system_clock::now(); + auto duration = now.time_since_epoch(); + auto seconds = std::chrono::duration_cast>(duration); + return seconds.count(); +} +} // namespace Kyber diff --git a/Module/Source/Entity/Entities/KyberTimeSplitterEntity.cpp b/Module/Source/Entity/Entities/KyberTimeSplitterEntity.cpp new file mode 100644 index 00000000..c57d1289 --- /dev/null +++ b/Module/Source/Entity/Entities/KyberTimeSplitterEntity.cpp @@ -0,0 +1,71 @@ +// Copyright Armchair Developers. Licensed under GPLv3. + +#include + +#include + +#include + +namespace Kyber +{ +KB_IMPLEMENT_TYPE(KyberTimeSplitterEntityData) +{ + KyberTypeInfo info("KyberTimeSplitterEntityData", "EntityData"); + info.AddField("Boolean", "UseUTC"); + return info; +} + +KB_IMPLEMENT_ENTITY(KyberTimeSplitterEntity, KyberTimeSplitterEntityData); + +KyberTimeSplitterEntity::KyberTimeSplitterEntity(EntityManager* entityManager, NativeEntity* entity, KyberTimeSplitterEntityData* data) + : KyberEntity(entity, data) +{ + m_dayIntOut = CreateFieldOverride("DayInt", g_program->m_entityManager->GetNativeType("Int32")); + m_monthIntOut = CreateFieldOverride("MonthInt", g_program->m_entityManager->GetNativeType("Int32")); + m_yearIntOut = CreateFieldOverride("YearInt", g_program->m_entityManager->GetNativeType("Int32")); + m_secIntOut = CreateFieldOverride("SecondInt", g_program->m_entityManager->GetNativeType("Int32")); + m_minIntOut = CreateFieldOverride("MinuteInt", g_program->m_entityManager->GetNativeType("Int32")); + m_hourIntOut = CreateFieldOverride("HourInt", g_program->m_entityManager->GetNativeType("Int32")); +} + +void KyberTimeSplitterEntity::PropertyChanged(PropertyModification* modification) +{ + float currentTime = 0; + + PropertyReader fieldValue = GetFieldReader("Time"); + if (fieldValue.HasConnectionValue()) + { + currentTime = fieldValue.Get(); + } + + if (currentTime <= 0) + { + return; + } + + // Convert to time_point from float + auto duration = std::chrono::duration(currentTime); + auto timePoint = std::chrono::system_clock::time_point( + std::chrono::duration_cast(duration) + ); + + std::time_t sysClockTime = std::chrono::system_clock::to_time_t(timePoint); + std::tm* time = GetData()->UseUTC ? std::gmtime(&sysClockTime) : std::localtime(&sysClockTime); + + // Get Second, Minute, Hour, Day, Month, Year + int second = time->tm_sec; + int minute = time->tm_min; + int hour = time->tm_hour; + int day = time->tm_mday; + int month = time->tm_mon + 1; + int year = time->tm_year + 1900; + + // Update property outputs + m_dayIntOut = &day; + m_monthIntOut = &month; + m_yearIntOut = &year; + m_secIntOut = &second; + m_minIntOut = &minute; + m_hourIntOut = &hour; +} +} // namespace Kyber diff --git a/Module/Source/Entity/NativeEntityManager.cpp b/Module/Source/Entity/NativeEntityManager.cpp index 25e24f2e..a655dd8c 100644 --- a/Module/Source/Entity/NativeEntityManager.cpp +++ b/Module/Source/Entity/NativeEntityManager.cpp @@ -386,14 +386,14 @@ ClassInfoAsset* EntityManager::CreateClassInfoAsset(const KyberTypeInfo& info) void KyberEntityBase::FireEvent(EventId entityEvent) { - KYBER_LOG(Info, "Firing event " << entityEvent); - EntityEvent event = entityEvent; FullEntityBusInternalFireEventHk(m_nativeEntity->m_entityBus, reinterpret_cast(m_data), &event); } void KyberEntityBase::FireEvent(const char* event) { + KYBER_LOG(Debug, "Firing event " << event); + FireEvent(StringUtils::HashQuick(event)); }