ProjectM/Source/ProjectT/System/Lobby/Objects/LobbyPreviewCharacter.cpp

127 lines
4.5 KiB
C++

#include "LobbyPreviewCharacter.h"
#include "ProjectT/System/Core/Interfaces/GlobalObjectProvider.h"
#include "ProjectT/System/Core/Managers/DataDam.h"
#include "ProjectT/Data/Gen/GenerateEnumDataTableKey.h"
#include "ProjectT/Data/Gen/GenerateStructMeshList.h"
#include "ProjectT/Data/Gen/GenerateStructSocketList.h"
#include "ProjectT/Data/Gen/GenerateStructCharacterMeshSet.h"
#include "ProjectT/Data/Gen/GenerateStructAnimationSet.h"
#include "ProjectT/System/Core/Common/AssetUtilsLibrary.h"
#include "ProjectT/System/Core/Common/GlobalUtilsLibrary.h"
#include "ProjectT/System/Core/SaveGame/UserSaveGame.h"
// Sets default values
ALobbyPreviewCharacter::ALobbyPreviewCharacter()
{
PrimaryActorTick.bCanEverTick = true;
BodyMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("CharacterBody"));
BodyMesh->SetupAttachment(RootComponent);
WeaponMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Weapon"));
WeaponMesh->SetupAttachment(BodyMesh);
WeaponDynamicMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("WeaponDynamic"));
WeaponDynamicMesh->SetupAttachment(BodyMesh);
}
// Called when the game starts or when spawned
void ALobbyPreviewCharacter::BeginPlay()
{
Super::BeginPlay();
UUserSaveGame* SG;
UUserSaveGame::LoadUserSaveGame(SG);
if(!SG) return;
FString SelectData;
SG->GetSelectedCharacterData(SelectData);
UDataTable* ChrTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::PlayerCharacter);
FPlayerCharacter* ChrData = ChrTable->FindRow<FPlayerCharacter>(*SelectData, TEXT("FPlayerCharacter"));
if(!ChrData) return;
SetCharacterByData(*ChrData);
}
// Called every frame
void ALobbyPreviewCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
bool ALobbyPreviewCharacter::SetCharacterByData(const FPlayerCharacter& Data)
{
UDataTable* CMSTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::CharacterMeshSet);
FCharacterMeshSet* CMSData = CMSTable->FindRow<FCharacterMeshSet>(FROM_INT(Data.iCharMeshSetId), TEXT("FCharacterMeshSet"));
if(!CMSData) return false;
UDataTable* MLSTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::MeshList);
FMeshList* BodyData = MLSTable->FindRow<FMeshList>(FROM_INT(CMSData->iBodyMeshId), TEXT("FMeshList"));
if(!BodyData) return false;
USkeletalMesh* FindBodyMesh = UAssetUtilsLibrary::GetSkeletalMeshFromPath(BodyData->sMeshPath);
if(!FindBodyMesh) return false;
BodyMesh->SetSkeletalMesh(FindBodyMesh);
UDataTable* ASTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::AnimationSet);
FAnimationSet* AnimData = ASTable->FindRow<FAnimationSet>(FROM_INT(Data.iCharAniSetId), TEXT("FAnimationSetList"));
if(!AnimData) return false;
UAnimSequence* FindAnim = UAssetUtilsLibrary::GetAnimSequenceFromPath(AnimData->sIdleAniPath);
if(!FindAnim) return false;
BodyMesh->PlayAnimation(FindAnim, true);
FMeshList* WeaponData = nullptr;
if(CMSData->iWeaponMeshId != 0) WeaponData = MLSTable->FindRow<FMeshList>(FROM_INT(CMSData->iWeaponMeshId), TEXT("FMeshList"));
if(!WeaponData) return true;
if(!CHECK_FREE(WeaponData->sMeshPath))
{
UMeshComponent* WeaponComponent = nullptr;
FString ScriptType = UGlobalUtilsLibrary::GetScriptTypeByRefPath(WeaponData->sMeshPath);
if(ScriptType.Equals(TEXT("StaticMesh")))
{
UStaticMesh* FindWeaponMesh = UAssetUtilsLibrary::GetStaticMeshFromPath(WeaponData->sMeshPath);
WeaponMesh->SetStaticMesh(FindWeaponMesh);
UGlobalUtilsLibrary::EnableComponent(WeaponMesh, true);
WeaponComponent = WeaponMesh;
}
else if(ScriptType.Equals(TEXT("SkeletalMesh")))
{
USkeletalMesh* FindWeaponMesh = UAssetUtilsLibrary::GetSkeletalMeshFromPath(WeaponData->sMeshPath);
WeaponDynamicMesh->SetSkeletalMesh(FindWeaponMesh);
UGlobalUtilsLibrary::EnableComponent(WeaponDynamicMesh, true);
WeaponComponent = WeaponDynamicMesh;
}
else
{
}
CMSData->iWeaponSocketId;
UDataTable* SocketTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::SocketList);
FSocketList* SocketData = SocketTable->FindRow<FSocketList>(FROM_INT(CMSData->iWeaponSocketId), TEXT("FSocketList"));
if(CHECK_FREE(SocketData->sSocketName))
{
NMT_MSG_ENSURE(0, "Socket Name Is FREE [%s][%s]", FROM_INT(CMSData->iWeaponSocketId), *SocketData->sSocketName);
return true;
}
WeaponComponent->AttachToComponent(BodyMesh, FAttachmentTransformRules::SnapToTargetIncludingScale, *SocketData->sSocketName);
}
else
{
WeaponMesh->SetStaticMesh(nullptr);
WeaponDynamicMesh->SetSkeletalMesh(nullptr);
}
return true;
}