Files
BallisticsDocs/Source/EasyBallisticsEditor/Private/EBWeaponDataFactory.cpp
T
2025-07-10 01:02:24 -07:00

248 lines
9.4 KiB
C++

// Copyright 2016 Mookie. All Rights Reserved.
#include "EBWeaponDataFactory.h"
#include "EBWeaponData.h"
#include "EBWeaponConfiguration.h"
#include "AssetToolsModule.h"
#include "EasyBallisticsEditor.h"
#define LOCTEXT_NAMESPACE "EBWeaponDataFactory"
UEBWeaponDataFactory::UEBWeaponDataFactory()
{
bCreateNew = true;
bEditAfterNew = true;
SupportedClass = UEBWeaponData::StaticClass();
}
UObject* UEBWeaponDataFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
{
UEBWeaponData* WeaponData = NewObject<UEBWeaponData>(InParent, Class, Name, Flags);
if (WeaponData)
{
// Set up default configuration based on name
FString AssetName = Name.ToString();
if (AssetName.Contains(TEXT("M4")) || AssetName.Contains(TEXT("AR15")) || AssetName.Contains(TEXT("Rifle")))
{
// Configure for M4/AR-15 type weapon
WeaponData->WeaponName = FText::FromString(TEXT("M4 Carbine"));
WeaponData->WeaponDescription = FText::FromString(TEXT("5.56mm assault rifle with selective fire capabilities"));
WeaponData->WeaponType = EWeaponType::Rifle;
WeaponData->WeaponTier = 3;
WeaponData->Damage = 35.0f;
WeaponData->FireRate = 750.0f;
WeaponData->MuzzleVelocity = 91440.0f; // ~3000 fps
WeaponData->Accuracy = 0.92f;
WeaponData->RecoilStrength = 1.2f;
WeaponData->EffectiveRange = 400.0f;
WeaponData->MagazineSize = 30;
WeaponData->MaxReserveAmmo = 180;
WeaponData->ReloadTime = 2.5f;
WeaponData->TacticalReloadTime = 2.0f;
WeaponData->AvailableFireModes.Add(EFireMode::FM_Semiauto);
WeaponData->AvailableFireModes.Add(EFireMode::FM_Auto);
WeaponData->DefaultFireMode = EFireMode::FM_Auto;
WeaponData->WeaponWeight = 3.4f;
WeaponData->ADSTime = 0.35f;
WeaponData->EquipTime = 0.8f;
}
else if (AssetName.Contains(TEXT("AK")) || AssetName.Contains(TEXT("74")))
{
// Configure for AK type weapon
WeaponData->WeaponName = FText::FromString(TEXT("AK-74"));
WeaponData->WeaponDescription = FText::FromString(TEXT("5.45mm assault rifle with proven reliability"));
WeaponData->WeaponType = EWeaponType::Rifle;
WeaponData->WeaponTier = 3;
WeaponData->Damage = 32.0f;
WeaponData->FireRate = 650.0f;
WeaponData->MuzzleVelocity = 88500.0f; // ~2900 fps
WeaponData->Accuracy = 0.88f;
WeaponData->RecoilStrength = 1.4f;
WeaponData->EffectiveRange = 350.0f;
WeaponData->MagazineSize = 30;
WeaponData->MaxReserveAmmo = 180;
WeaponData->ReloadTime = 2.8f;
WeaponData->TacticalReloadTime = 2.2f;
WeaponData->AvailableFireModes.Add(EFireMode::FM_Semiauto);
WeaponData->AvailableFireModes.Add(EFireMode::FM_Auto);
WeaponData->DefaultFireMode = EFireMode::FM_Auto;
WeaponData->WeaponWeight = 3.6f;
WeaponData->ADSTime = 0.4f;
WeaponData->EquipTime = 0.9f;
}
else if (AssetName.Contains(TEXT("Pistol")) || AssetName.Contains(TEXT("Glock")) || AssetName.Contains(TEXT("1911")))
{
// Configure for pistol
WeaponData->WeaponName = FText::FromString(TEXT("M1911"));
WeaponData->WeaponDescription = FText::FromString(TEXT(".45 ACP semi-automatic pistol"));
WeaponData->WeaponType = EWeaponType::Pistol;
WeaponData->WeaponTier = 2;
WeaponData->Damage = 55.0f;
WeaponData->FireRate = 350.0f;
WeaponData->MuzzleVelocity = 76200.0f; // ~2500 fps
WeaponData->Accuracy = 0.85f;
WeaponData->RecoilStrength = 2.0f;
WeaponData->EffectiveRange = 80.0f;
WeaponData->MagazineSize = 7;
WeaponData->MaxReserveAmmo = 35;
WeaponData->ReloadTime = 1.8f;
WeaponData->TacticalReloadTime = 1.5f;
WeaponData->AvailableFireModes.Add(EFireMode::FM_Semiauto);
WeaponData->DefaultFireMode = EFireMode::FM_Semiauto;
WeaponData->WeaponWeight = 1.1f;
WeaponData->ADSTime = 0.2f;
WeaponData->EquipTime = 0.4f;
}
else if (AssetName.Contains(TEXT("Sniper")) || AssetName.Contains(TEXT("Bolt")))
{
// Configure for bolt-action sniper rifle
WeaponData->WeaponName = FText::FromString(TEXT("M24 SWS"));
WeaponData->WeaponDescription = FText::FromString(TEXT("7.62mm bolt-action sniper rifle"));
WeaponData->WeaponType = EWeaponType::Sniper;
WeaponData->WeaponTier = 4;
WeaponData->Damage = 120.0f;
WeaponData->FireRate = 60.0f;
WeaponData->MuzzleVelocity = 108000.0f; // ~3540 fps
WeaponData->Accuracy = 0.98f;
WeaponData->RecoilStrength = 3.5f;
WeaponData->EffectiveRange = 800.0f;
WeaponData->MagazineSize = 5;
WeaponData->MaxReserveAmmo = 30;
WeaponData->ReloadTime = 3.5f;
WeaponData->TacticalReloadTime = 3.0f;
WeaponData->AvailableFireModes.Add(EFireMode::FM_Manual);
WeaponData->DefaultFireMode = EFireMode::FM_Manual;
WeaponData->WeaponWeight = 5.5f;
WeaponData->ADSTime = 0.6f;
WeaponData->EquipTime = 1.2f;
}
else if (AssetName.Contains(TEXT("Shotgun")))
{
// Configure for shotgun
WeaponData->WeaponName = FText::FromString(TEXT("M870"));
WeaponData->WeaponDescription = FText::FromString(TEXT("12-gauge pump-action shotgun"));
WeaponData->WeaponType = EWeaponType::Shotgun;
WeaponData->WeaponTier = 2;
WeaponData->Damage = 80.0f;
WeaponData->FireRate = 120.0f;
WeaponData->MuzzleVelocity = 38100.0f; // ~1250 fps
WeaponData->Accuracy = 0.6f;
WeaponData->RecoilStrength = 4.0f;
WeaponData->EffectiveRange = 50.0f;
WeaponData->MagazineSize = 8;
WeaponData->MaxReserveAmmo = 40;
WeaponData->ReloadTime = 4.0f;
WeaponData->TacticalReloadTime = 3.5f;
WeaponData->AvailableFireModes.Add(EFireMode::FM_Manual);
WeaponData->DefaultFireMode = EFireMode::FM_Manual;
WeaponData->WeaponWeight = 3.2f;
WeaponData->ADSTime = 0.45f;
WeaponData->EquipTime = 0.9f;
}
else if (AssetName.Contains(TEXT("LMG")) || AssetName.Contains(TEXT("Machine")))
{
// Configure for light machine gun
WeaponData->WeaponName = FText::FromString(TEXT("M249 SAW"));
WeaponData->WeaponDescription = FText::FromString(TEXT("5.56mm light machine gun"));
WeaponData->WeaponType = EWeaponType::LMG;
WeaponData->WeaponTier = 4;
WeaponData->Damage = 28.0f;
WeaponData->FireRate = 850.0f;
WeaponData->MuzzleVelocity = 91440.0f; // ~3000 fps
WeaponData->Accuracy = 0.78f;
WeaponData->RecoilStrength = 2.5f;
WeaponData->EffectiveRange = 600.0f;
WeaponData->MagazineSize = 200;
WeaponData->MaxReserveAmmo = 400;
WeaponData->ReloadTime = 6.0f;
WeaponData->TacticalReloadTime = 5.0f;
WeaponData->AvailableFireModes.Add(EFireMode::FM_Auto);
WeaponData->DefaultFireMode = EFireMode::FM_Auto;
WeaponData->WeaponWeight = 7.5f;
WeaponData->ADSTime = 0.8f;
WeaponData->EquipTime = 1.5f;
}
else if (AssetName.Contains(TEXT("SMG")) || AssetName.Contains(TEXT("Sub")))
{
// Configure for submachine gun
WeaponData->WeaponName = FText::FromString(TEXT("MP5"));
WeaponData->WeaponDescription = FText::FromString(TEXT("9mm submachine gun"));
WeaponData->WeaponType = EWeaponType::SMG;
WeaponData->WeaponTier = 2;
WeaponData->Damage = 25.0f;
WeaponData->FireRate = 800.0f;
WeaponData->MuzzleVelocity = 76200.0f; // ~2500 fps
WeaponData->Accuracy = 0.82f;
WeaponData->RecoilStrength = 0.8f;
WeaponData->EffectiveRange = 150.0f;
WeaponData->MagazineSize = 30;
WeaponData->MaxReserveAmmo = 120;
WeaponData->ReloadTime = 2.2f;
WeaponData->TacticalReloadTime = 1.8f;
WeaponData->AvailableFireModes.Add(EFireMode::FM_Semiauto);
WeaponData->AvailableFireModes.Add(EFireMode::FM_Auto);
WeaponData->DefaultFireMode = EFireMode::FM_Auto;
WeaponData->WeaponWeight = 2.5f;
WeaponData->ADSTime = 0.25f;
WeaponData->EquipTime = 0.6f;
}
else
{
// Default generic weapon
WeaponData->WeaponName = FText::FromString(TEXT("Generic Weapon"));
WeaponData->WeaponDescription = FText::FromString(TEXT("A basic weapon configuration"));
WeaponData->WeaponType = EWeaponType::Rifle;
WeaponData->WeaponTier = 1;
WeaponData->Damage = 30.0f;
WeaponData->FireRate = 600.0f;
WeaponData->MuzzleVelocity = 91440.0f;
WeaponData->Accuracy = 0.85f;
WeaponData->RecoilStrength = 1.0f;
WeaponData->EffectiveRange = 300.0f;
WeaponData->MagazineSize = 30;
WeaponData->MaxReserveAmmo = 120;
WeaponData->ReloadTime = 2.5f;
WeaponData->TacticalReloadTime = 2.0f;
WeaponData->AvailableFireModes.Add(EFireMode::FM_Semiauto);
WeaponData->AvailableFireModes.Add(EFireMode::FM_Auto);
WeaponData->DefaultFireMode = EFireMode::FM_Auto;
WeaponData->WeaponWeight = 3.5f;
WeaponData->ADSTime = 0.3f;
WeaponData->EquipTime = 0.75f;
}
// Set common default values
WeaponData->MuzzleSocketName = TEXT("MuzzleSocket");
WeaponData->ScopeSocketName = TEXT("ScopeSocket");
WeaponData->GripSocketName = TEXT("GripSocket");
WeaponData->LaserSocketName = TEXT("LaserSocket");
WeaponData->BurstCount = 3;
WeaponData->SprintToFireTime = 0.25f;
WeaponData->bUseGPUSimulation = true;
WeaponData->bEnableEffectLOD = true;
WeaponData->MaxHeatLevel = 100.0f;
WeaponData->HeatDecayRate = 10.0f;
WeaponData->HeatPerShot = 5.0f;
}
return WeaponData;
}
UClass* FEBWeaponDataFactory::GetSupportedClass() const
{
return UEBWeaponData::StaticClass();
}
uint32 FEBWeaponDataFactory::GetCategories()
{
return FEasyBallisticsEditorModule::GetBallisticsAssetCategory();
}
FText FEBWeaponDataFactory::GetAssetDescription(const FAssetData& AssetData) const
{
return LOCTEXT("EBWeaponDataDescription", "Defines comprehensive weapon properties including visuals, ballistics, audio, VFX, animations, and behavior for game-ready weapons.");
}
#undef LOCTEXT_NAMESPACE