248 lines
9.4 KiB
C++
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 |