refactor: prefixo ZMMO -> Zeus em classes/módulos C++ do cliente
- Renomeia ~50 classes UCLASS/USTRUCT/UENUM/UINTERFACE pra Zeus* (AZeusGameMode, AZeusCharacter, UZeusGameInstance, IZeusEntityInterface, UZeusWorldSubsystem, FZeusEntitySnapshot, etc.) - Encurta AZMMOPlayerCharacter -> AZeusCharacter - Renomeia módulos satélite ZMMOAttributes -> ZeusAttributes e ZMMOJobs -> ZeusJobs (pasta + .Build.cs + .uproject) - Mantém módulo principal ZMMO (renomeia depois quando jogo ganhar nome) - DefaultEngine.ini: ActiveClassRedirects ZMMOX -> ZeusX (preserva BPs/assets) - DefaultGame.ini: sections atualizadas pra ZeusThemeSubsystem/ZeusPlayerState - Category="ZMMO|..." -> "Zeus|..." em UPROPERTYs - Preserva LogZMMO, ZMMO_API, /Script/ZMMO., /Game/ZMMO/, classes Target Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
67
Source/ZeusJobs/Private/ZeusJobChangeNetworkHandler.cpp
Normal file
67
Source/ZeusJobs/Private/ZeusJobChangeNetworkHandler.cpp
Normal file
@@ -0,0 +1,67 @@
|
||||
#include "ZeusJobChangeNetworkHandler.h"
|
||||
|
||||
#include "Engine/GameInstance.h"
|
||||
#include "Engine/World.h"
|
||||
#include "ZeusNetworkSubsystem.h"
|
||||
|
||||
DEFINE_LOG_CATEGORY_STATIC(LogZeusJobChange, Log, All);
|
||||
|
||||
bool UZeusJobChangeNetworkHandler::ShouldCreateSubsystem(UObject* Outer) const
|
||||
{
|
||||
// Mesmo criterio do AttributeNetworkHandler — so' em mundos de gameplay
|
||||
// (PIE / standalone in-game). Editor preview / front-end menu nao precisa.
|
||||
const UWorld* World = Cast<UWorld>(Outer);
|
||||
if (World == nullptr) { return false; }
|
||||
return World->WorldType == EWorldType::Game
|
||||
|| World->WorldType == EWorldType::PIE;
|
||||
}
|
||||
|
||||
void UZeusJobChangeNetworkHandler::Initialize(FSubsystemCollectionBase& Collection)
|
||||
{
|
||||
Super::Initialize(Collection);
|
||||
|
||||
if (UZeusNetworkSubsystem* Net = GetZeusNetSubsystem())
|
||||
{
|
||||
JobChangeResultHandle = Net->OnJobChangeResult.AddUObject(
|
||||
this, &UZeusJobChangeNetworkHandler::HandleJobChangeResult);
|
||||
UE_LOG(LogZeusJobChange, Log,
|
||||
TEXT("[ZeusJobChangeNetworkHandler] Bind OnJobChangeResult OK"));
|
||||
}
|
||||
else
|
||||
{
|
||||
UE_LOG(LogZeusJobChange, Warning,
|
||||
TEXT("[ZeusJobChangeNetworkHandler] ZeusNetworkSubsystem indisponivel — bind pulado"));
|
||||
}
|
||||
}
|
||||
|
||||
void UZeusJobChangeNetworkHandler::Deinitialize()
|
||||
{
|
||||
if (UZeusNetworkSubsystem* Net = GetZeusNetSubsystem())
|
||||
{
|
||||
if (JobChangeResultHandle.IsValid())
|
||||
{
|
||||
Net->OnJobChangeResult.Remove(JobChangeResultHandle);
|
||||
JobChangeResultHandle.Reset();
|
||||
}
|
||||
}
|
||||
OnJobChangeResult.Clear();
|
||||
Super::Deinitialize();
|
||||
}
|
||||
|
||||
void UZeusJobChangeNetworkHandler::HandleJobChangeResult(
|
||||
bool bAccepted, int32 Reason, int32 NewClassId)
|
||||
{
|
||||
UE_LOG(LogZeusJobChange, Log,
|
||||
TEXT("[ZeusJobChangeNetworkHandler] S_JOB_CHANGE_RESULT accepted=%d reason=%d newClassId=%d"),
|
||||
bAccepted ? 1 : 0, Reason, NewClassId);
|
||||
OnJobChangeResult.Broadcast(bAccepted, Reason, NewClassId);
|
||||
}
|
||||
|
||||
UZeusNetworkSubsystem* UZeusJobChangeNetworkHandler::GetZeusNetSubsystem() const
|
||||
{
|
||||
const UWorld* World = GetWorld();
|
||||
if (World == nullptr) { return nullptr; }
|
||||
UGameInstance* GI = World->GetGameInstance();
|
||||
if (GI == nullptr) { return nullptr; }
|
||||
return GI->GetSubsystem<UZeusNetworkSubsystem>();
|
||||
}
|
||||
5
Source/ZeusJobs/Private/ZeusJobDataAsset.cpp
Normal file
5
Source/ZeusJobs/Private/ZeusJobDataAsset.cpp
Normal file
@@ -0,0 +1,5 @@
|
||||
#include "ZeusJobDataAsset.h"
|
||||
|
||||
// Implementacao vazia — todas as props sao UPROPERTY EditDefaultsOnly e
|
||||
// vivem inline no .uasset. Override de GetPrimaryAssetId() esta no header
|
||||
// (constexpr-friendly).
|
||||
89
Source/ZeusJobs/Private/ZeusJobsLibrary.cpp
Normal file
89
Source/ZeusJobs/Private/ZeusJobsLibrary.cpp
Normal file
@@ -0,0 +1,89 @@
|
||||
#include "ZeusJobsLibrary.h"
|
||||
|
||||
#include "Engine/GameInstance.h"
|
||||
#include "Engine/World.h"
|
||||
#include "ZeusJobDataAsset.h"
|
||||
#include "ZeusJobsSubsystem.h"
|
||||
#include "ZeusNetworkSubsystem.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
/// Resolve Subsystem via WorldContextObject. Retorna nullptr em contextos
|
||||
/// invalidos (CDO em editor, world em destruicao).
|
||||
UZeusJobsSubsystem* ResolveSubsystem(const UObject* WorldContextObject)
|
||||
{
|
||||
if (WorldContextObject == nullptr) { return nullptr; }
|
||||
const UWorld* World = WorldContextObject->GetWorld();
|
||||
if (World == nullptr) { return nullptr; }
|
||||
UGameInstance* GI = World->GetGameInstance();
|
||||
if (GI == nullptr) { return nullptr; }
|
||||
return GI->GetSubsystem<UZeusJobsSubsystem>();
|
||||
}
|
||||
} // namespace
|
||||
|
||||
FText UZeusJobsLibrary::GetJobDisplayName(const UObject* WorldContextObject, int32 ClassId)
|
||||
{
|
||||
if (UZeusJobsSubsystem* Sub = ResolveSubsystem(WorldContextObject))
|
||||
{
|
||||
if (UZeusJobDataAsset* Job = Sub->GetJobData(ClassId))
|
||||
{
|
||||
return Job->DisplayName.IsEmpty()
|
||||
? FText::FromString(Job->TechnicalName)
|
||||
: Job->DisplayName;
|
||||
}
|
||||
}
|
||||
// Fallback: nao crasha UI se ClassId desconhecido.
|
||||
return FText::FromString(FString::Printf(TEXT("Classe %d"), ClassId));
|
||||
}
|
||||
|
||||
UZeusJobDataAsset* UZeusJobsLibrary::GetJobData(const UObject* WorldContextObject, int32 ClassId)
|
||||
{
|
||||
if (UZeusJobsSubsystem* Sub = ResolveSubsystem(WorldContextObject))
|
||||
{
|
||||
return Sub->GetJobData(ClassId);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool UZeusJobsLibrary::IsJobRegistered(const UObject* WorldContextObject, int32 ClassId)
|
||||
{
|
||||
if (UZeusJobsSubsystem* Sub = ResolveSubsystem(WorldContextObject))
|
||||
{
|
||||
return Sub->GetJobData(ClassId) != nullptr;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
TArray<UZeusJobDataAsset*> UZeusJobsLibrary::GetJobsByTier(
|
||||
const UObject* WorldContextObject, EZeusJobTier Tier)
|
||||
{
|
||||
if (UZeusJobsSubsystem* Sub = ResolveSubsystem(WorldContextObject))
|
||||
{
|
||||
return Sub->GetJobsByTier(Tier);
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
TArray<UZeusJobDataAsset*> UZeusJobsLibrary::GetEligibleNextJobs(
|
||||
const UObject* WorldContextObject, int32 CurrentClassId)
|
||||
{
|
||||
if (UZeusJobsSubsystem* Sub = ResolveSubsystem(WorldContextObject))
|
||||
{
|
||||
return Sub->GetEligibleNextJobs(CurrentClassId);
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
void UZeusJobsLibrary::SendJobChangeRequest(
|
||||
const UObject* WorldContextObject, int32 TargetClassId)
|
||||
{
|
||||
if (WorldContextObject == nullptr) { return; }
|
||||
const UWorld* World = WorldContextObject->GetWorld();
|
||||
if (World == nullptr) { return; }
|
||||
UGameInstance* GI = World->GetGameInstance();
|
||||
if (GI == nullptr) { return; }
|
||||
if (UZeusNetworkSubsystem* Net = GI->GetSubsystem<UZeusNetworkSubsystem>())
|
||||
{
|
||||
Net->SendJobChangeRequest(TargetClassId);
|
||||
}
|
||||
}
|
||||
13
Source/ZeusJobs/Private/ZeusJobsModule.cpp
Normal file
13
Source/ZeusJobs/Private/ZeusJobsModule.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
#include "ZeusJobsModule.h"
|
||||
|
||||
#include "Modules/ModuleManager.h"
|
||||
|
||||
void FZeusJobsModule::StartupModule()
|
||||
{
|
||||
}
|
||||
|
||||
void FZeusJobsModule::ShutdownModule()
|
||||
{
|
||||
}
|
||||
|
||||
IMPLEMENT_MODULE(FZeusJobsModule, ZeusJobs)
|
||||
96
Source/ZeusJobs/Private/ZeusJobsSubsystem.cpp
Normal file
96
Source/ZeusJobs/Private/ZeusJobsSubsystem.cpp
Normal file
@@ -0,0 +1,96 @@
|
||||
#include "ZeusJobsSubsystem.h"
|
||||
|
||||
#include "AssetRegistry/AssetRegistryModule.h"
|
||||
#include "Modules/ModuleManager.h"
|
||||
#include "ZeusJobDataAsset.h"
|
||||
|
||||
DEFINE_LOG_CATEGORY_STATIC(LogZeusJobs, Log, All);
|
||||
|
||||
void UZeusJobsSubsystem::Initialize(FSubsystemCollectionBase& Collection)
|
||||
{
|
||||
Super::Initialize(Collection);
|
||||
LoadJobsFromAssetRegistry();
|
||||
UE_LOG(LogZeusJobs, Log, TEXT("[ZeusJobsSubsystem] Initialize: %d job(s) carregados"), CachedJobs.Num());
|
||||
}
|
||||
|
||||
void UZeusJobsSubsystem::Deinitialize()
|
||||
{
|
||||
CachedJobs.Empty();
|
||||
Super::Deinitialize();
|
||||
}
|
||||
|
||||
void UZeusJobsSubsystem::LoadJobsFromAssetRegistry()
|
||||
{
|
||||
FAssetRegistryModule& AssetRegistryModule =
|
||||
FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
|
||||
IAssetRegistry& AR = AssetRegistryModule.Get();
|
||||
|
||||
// Editor pode chamar antes de scan inicial. Standalone/PIE scan ja' rodou.
|
||||
// SearchAllAssets(false) = nao-blocking; assume cache populado em runtime.
|
||||
#if WITH_EDITOR
|
||||
AR.SearchAllAssets(true); // bloqueia editor; ok em Initialize
|
||||
#endif
|
||||
|
||||
TArray<FAssetData> Assets;
|
||||
const FTopLevelAssetPath ClassPath(UZeusJobDataAsset::StaticClass()->GetClassPathName());
|
||||
AR.GetAssetsByClass(ClassPath, Assets, /*bSearchSubClasses*/ true);
|
||||
|
||||
for (const FAssetData& AssetData : Assets)
|
||||
{
|
||||
UZeusJobDataAsset* Job = Cast<UZeusJobDataAsset>(AssetData.GetAsset());
|
||||
if (Job == nullptr) { continue; }
|
||||
|
||||
if (CachedJobs.Contains(Job->ClassId))
|
||||
{
|
||||
UE_LOG(LogZeusJobs, Warning,
|
||||
TEXT("[ZeusJobsSubsystem] Duplicate ClassId=%d (existing=%s, new=%s) — ignorando segundo"),
|
||||
Job->ClassId,
|
||||
*CachedJobs[Job->ClassId]->GetName(),
|
||||
*Job->GetName());
|
||||
continue;
|
||||
}
|
||||
|
||||
CachedJobs.Add(Job->ClassId, Job);
|
||||
UE_LOG(LogZeusJobs, Verbose,
|
||||
TEXT("[ZeusJobsSubsystem] Cached classId=%d name=%s display=%s"),
|
||||
Job->ClassId, *Job->TechnicalName, *Job->DisplayName.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
UZeusJobDataAsset* UZeusJobsSubsystem::GetJobData(int32 ClassId) const
|
||||
{
|
||||
if (const TObjectPtr<UZeusJobDataAsset>* Found = CachedJobs.Find(ClassId))
|
||||
{
|
||||
return Found->Get();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
TArray<UZeusJobDataAsset*> UZeusJobsSubsystem::GetJobsByTier(EZeusJobTier Tier) const
|
||||
{
|
||||
TArray<UZeusJobDataAsset*> Out;
|
||||
Out.Reserve(CachedJobs.Num());
|
||||
for (const TPair<int32, TObjectPtr<UZeusJobDataAsset>>& Pair : CachedJobs)
|
||||
{
|
||||
if (Pair.Value && Pair.Value->Tier == Tier)
|
||||
{
|
||||
Out.Add(Pair.Value.Get());
|
||||
}
|
||||
}
|
||||
return Out;
|
||||
}
|
||||
|
||||
TArray<UZeusJobDataAsset*> UZeusJobsSubsystem::GetEligibleNextJobs(int32 CurrentClassId) const
|
||||
{
|
||||
TArray<UZeusJobDataAsset*> Out;
|
||||
Out.Reserve(4); // tipico: 2-6 destinos
|
||||
for (const TPair<int32, TObjectPtr<UZeusJobDataAsset>>& Pair : CachedJobs)
|
||||
{
|
||||
if (Pair.Value && Pair.Value->ParentClassId == CurrentClassId
|
||||
&& Pair.Value->ClassId != CurrentClassId)
|
||||
{
|
||||
Out.Add(Pair.Value.Get());
|
||||
}
|
||||
}
|
||||
return Out;
|
||||
}
|
||||
Reference in New Issue
Block a user