Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "PWNGame.h"
- #include "PWNPlayerCharacter.h"
- #include "PWNWeapon.h"
- APWNWeapon::APWNWeapon(const class FPostConstructInitializeProperties& PCIP)
- : Super(PCIP)
- {
- this->SetActorHiddenInGame(true);
- // We must tick
- PrimaryActorTick.bCanEverTick = true;
- // Dummy root component
- RootComponentDummy = PCIP.CreateDefaultSubobject<USkeletalMeshComponent>(this, TEXT("RootComponentDummy"));
- RootComponent = RootComponentDummy;
- // Defaults
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_Inactive;
- ArmStateNextTimeLeft = 0.0f;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_Inactive;
- // Arm Comp
- Arm = PCIP.CreateDefaultSubobject<USkeletalMeshComponent>(this, TEXT("Arm"));
- Arm->SetHiddenInGame(true, false);
- Arm->AttachParent = RootComponentDummy;
- ArmRelativeLocation = FVector(0.0f, 0.0f, -30.0f);
- ArmRelativeScale = 0.75f * FVector(1.0f, 1.0f, 1.0f);
- // Weapon Comp
- Weapon = PCIP.CreateDefaultSubobject<USkeletalMeshComponent>(this, TEXT("Weapon"));
- Weapon->SetHiddenInGame(true, false);
- Weapon->SetRelativeScale3D(WeaponRelativeScale);
- // DamageType
- DamageTypeClass = UPWNDamageType::StaticClass();
- }
- void APWNWeapon::PostInitializeComponents()
- {
- Super::PostInitializeComponents();
- }
- void APWNWeapon::BeginPlay()
- {
- //UPWNGameGlobals::PrintOnscreenString(TEXT("BeginPlay - APWNWeapon"));
- Super::BeginPlay();
- }
- /**************************************/
- /*** Asset Loaders and Initialisers ***/
- /**************************************/
- USkeletalMesh* APWNWeapon::LoadSkeletalMeshFromPath(FString path)
- {
- return Cast<USkeletalMesh>(StaticLoadObject(USkeletalMesh::StaticClass(), NULL, *path));
- }
- UAnimBlueprintGeneratedClass* APWNWeapon::LoadAnimBlueprintGeneratedClassFromPath(FString path)
- {
- return Cast<UAnimBlueprintGeneratedClass>(StaticLoadObject(UAnimBlueprintGeneratedClass::StaticClass(), NULL, *path));
- }
- void APWNWeapon::Init(bool isInLeftHand)
- {
- // Hand
- IsInLeftHand = isInLeftHand;
- // Set our own constructor references
- SetAssetReferences_Base();
- SetAssetReferences_Specific();
- // Spawn our required assets
- SpawnAssets_Base();
- SpawnAssets_Specific();
- // Set our assets
- SetAssets_Base();
- SetAssets_Specific();
- }
- void APWNWeapon::SetAssetReferences_Base()
- {
- // Arm
- //TODO: Move these out to another function as ALL weapons will use them
- ConstRefArmMeshLeftName = TEXT("SkeletalMesh'/Game/PWNGame/FPSArms/Mesh/FPSArm_Left.FPSArm_Left'");
- ConstRefArmMeshRightName = TEXT("SkeletalMesh'/Game/PWNGame/FPSArms/Mesh/FPSArm_Right.FPSArm_Right'");
- ConstRefArmAnimBlueprintLeftClassName = TEXT("AnimBlueprintGeneratedClass'/Game/PWNGame/FPSArms/Mesh/FPSArm_Left_AnimBlueprint.FPSArm_Left_AnimBlueprint_C'");
- ConstRefArmAnimBlueprintRightClassName = TEXT("AnimBlueprintGeneratedClass'/Game/PWNGame/FPSArms/Mesh/FPSArm_Right_AnimBlueprint.FPSArm_Right_AnimBlueprint_C'");
- }
- void APWNWeapon::SetAssetReferences_Specific()
- {
- // Anims - Basic
- ConstRef_ArmAnimSet_Basic_Left_BP.Empty();
- ConstRef_ArmAnimSet_Basic_Right_BP.Empty();
- // Anims - Attacking
- ConstRef_ArmAnimSet_Attacking_Left_BP.Empty();
- ConstRef_ArmAnimSet_Attacking_Right_BP.Empty();
- // Weapon
- ConstRefWeaponMeshName = TEXT("");
- WeaponSocketName = TEXT("HandSocket");
- WeaponRotationOffsetLeft = FVector(0.0f, 0.0f, 0.0f);
- WeaponRotationOffsetRight = FVector(0.0f, 0.0f, 0.0f);
- }
- void APWNWeapon::SpawnAssets_Base()
- {
- /***********/
- /*** Arm ***/
- /***********/
- // Arm Mesh
- if (ConstRefArmMeshLeftName.IsEmpty() || ConstRefArmMeshRightName.IsEmpty())
- {
- //UPWNGameGlobals::PrintOnscreenString("No ConstRefArmMeshLeftName mesh specified.");
- }
- else
- {
- // Load arm mesh asset from path
- ArmMesh = LoadSkeletalMeshFromPath(IsInLeftHand ? ConstRefArmMeshLeftName : ConstRefArmMeshRightName);
- }
- // Arm Anim Blueprint
- if (ConstRefArmAnimBlueprintLeftClassName.IsEmpty() || ConstRefArmAnimBlueprintRightClassName.IsEmpty())
- {
- //UPWNGameGlobals::PrintOnscreenString("No ConstRefArmAnimBlueprintLeftClassName mesh specified.");
- }
- else
- {
- ArmAnimBlueprintClass = LoadAnimBlueprintGeneratedClassFromPath(IsInLeftHand ? ConstRefArmAnimBlueprintLeftClassName : ConstRefArmAnimBlueprintRightClassName);
- }
- // Interpleaders
- InterpLeaderYaw = NewObject<UPWNInterpLeader>(UPWNInterpLeader::StaticClass());
- }
- void APWNWeapon::SpawnAssets_Specific()
- {
- // Get world object for spawning
- UWorld* world = GetWorld();
- // Arm Anim Set - Basic
- if (ConstRef_ArmAnimSet_Basic_Left_BP.IsEmpty() || ConstRef_ArmAnimSet_Basic_Right_BP.IsEmpty())
- {
- //UPWNGameGlobals::PrintOnscreenString("No ConstRefArmAnimSetLeftClassName mesh specified.");
- }
- else
- {
- // Get AnimsetClass
- TSubclassOf<APWNAnimSet_Basic> armAnimSetClass_Basic = LoadPWNAnimSetBlueprintFromPath_Basic(IsInLeftHand ? ConstRef_ArmAnimSet_Basic_Left_BP : ConstRef_ArmAnimSet_Basic_Right_BP);
- // Spawn animset
- if (world && armAnimSetClass_Basic)
- {
- ArmAnimSet_Basic = world->SpawnActor<APWNAnimSet_Basic>(armAnimSetClass_Basic);
- }
- }
- if (world)
- {
- Spawn_AnimSet_Attacking_Instance(world, IsInLeftHand ? ConstRef_ArmAnimSet_Attacking_Left_BP : ConstRef_ArmAnimSet_Attacking_Right_BP, ArmAnimSet_Attacking);
- }
- // Set relative dimensions
- Arm->SetRelativeLocation(ArmRelativeLocation);
- Arm->SetRelativeScale3D(ArmRelativeScale);
- /**************/
- /*** Weapon ***/
- /**************/
- // Arm Meshes
- if (ConstRefWeaponMeshName.IsEmpty())
- {
- //UPWNGameGlobals::PrintOnscreenString("No weapon mesh specified.");
- }
- else
- {
- WeaponMesh = LoadSkeletalMeshFromPath(ConstRefWeaponMeshName);
- Weapon->SetRelativeScale3D(WeaponRelativeScale);
- }
- /**************/
- }
- void APWNWeapon::Spawn_AnimSet_Attacking_Instance(UWorld* worldRef, FString animSetAttackingAssetRef, APWNAnimSet_Attacking* &animSetAttackingToAssignTo)
- {
- // Arm Anim Set - Attacking
- if (animSetAttackingAssetRef.IsEmpty())
- {
- //UPWNGameGlobals::PrintOnscreenString("AnimSetAttackingAssetRef is Empty. Not spawning Animset: " + animSetAttackingAssetRef);
- }
- else
- {
- // Get AnimsetClass
- TSubclassOf<APWNAnimSet_Attacking> armAnimSetClass_Attacking = LoadPWNAnimSetBlueprintFromPath_Attacking(animSetAttackingAssetRef);
- // Spawn animset
- if (armAnimSetClass_Attacking)
- {
- animSetAttackingToAssignTo = worldRef->SpawnActor<APWNAnimSet_Attacking>(armAnimSetClass_Attacking);
- }
- }
- }
- TSubclassOf<APWNAnimSet_Basic> APWNWeapon::LoadPWNAnimSetBlueprintFromPath_Basic(FString path)
- {
- // Get anim blueprint
- UBlueprint* bluePrint = Cast<UBlueprint>(StaticLoadObject(UBlueprint::StaticClass(), NULL, *path));
- // Cast and return class
- if (bluePrint)
- return Cast<UClass>(bluePrint->GeneratedClass);
- else
- return nullptr;
- }
- TSubclassOf<APWNAnimSet_Attacking> APWNWeapon::LoadPWNAnimSetBlueprintFromPath_Attacking(FString path)
- {
- // Get anim blueprint
- UBlueprint* bluePrint = Cast<UBlueprint>(StaticLoadObject(UBlueprint::StaticClass(), NULL, *path));
- // Cast and return class
- if (bluePrint)
- return Cast<UClass>(bluePrint->GeneratedClass);
- else
- return nullptr;
- }
- void APWNWeapon::SetAssets_Base()
- {
- /***********/
- /*** Arm ***/
- /***********/
- // Set Skel Mesh
- if (ArmMesh)
- Arm->SetSkeletalMesh(ArmMesh);
- else
- {
- UPWNGameGlobals::PrintOnscreenString("ArmMesh is NULL. Aborting.");
- return;
- }
- // Set anim blueprint
- if (ArmAnimBlueprintClass)
- {
- Arm->AnimBlueprintGeneratedClass = ArmAnimBlueprintClass;
- // Arm Anim Instance
- Arm->InitializeAnimScriptInstance();
- ArmAnimInstance = Cast<UPWNWeaponAnimInstance>(Arm->GetAnimInstance());
- if (ArmAnimInstance)
- {
- ArmAnimEndDelegate.BindUObject(this, &APWNWeapon::ArmAnimEndedNotify);
- }
- }
- else
- {
- UPWNGameGlobals::PrintOnscreenString("ArmAnimBlueprintClass is NULL. No animations will be played.");
- }
- /***********/
- }
- void APWNWeapon::SetAssets_Specific()
- {
- /***********/
- /*** Arm ***/
- /***********/
- /**************/
- /*** Weapon ***/
- /**************/
- if (Arm && Weapon && WeaponMesh)
- {
- Weapon->SetSkeletalMesh(WeaponMesh);
- if (!WeaponSocketName.IsNone())
- {
- Weapon->AttachTo(Arm, WeaponSocketName);
- if (IsInLeftHand)
- Weapon->SetRelativeRotation(FRotator::MakeFromEuler(WeaponRotationOffsetLeft));
- else
- Weapon->SetRelativeRotation(FRotator::MakeFromEuler(WeaponRotationOffsetRight));
- }
- }
- /**************/
- }
- /**************************************/
- void APWNWeapon::Tick(float DeltaTime)
- {
- if (ArmStateNext != EWeaponStateEnum::WEAPONSTATE_Inactive)
- {
- ArmStateNextCheckTransition(DeltaTime);
- }
- Super::Tick(DeltaTime);
- }
- void APWNWeapon::UpdateDisplay(float deltaTime, FRotator newRotation, FVector newLocation)
- {
- FRotator appliedRot = newRotation;
- // Ensure we use correct rotators - todo
- float dYaw, dPitch, newYaw;
- dYaw = FMath::Abs(newRotation.Yaw - PrevRot.Yaw);
- dPitch = FMath::Abs(newRotation.Pitch - PrevRot.Pitch);
- dYaw = FMath::Max(0.001f, dYaw);
- newYaw = InterpLeaderYaw->Update(deltaTime, newRotation.Yaw);
- if ((dYaw > dPitch) || (FMath::Abs(InterpLeaderYaw->Interp) > 0.01f))
- appliedRot.Yaw = newYaw;
- SetActorRotation(appliedRot);
- SetActorLocation(newLocation);
- PrevRot = newRotation;
- }
- /*************/
- /*** DEBUG ***/
- /*************/
- void APWNWeapon::PWNDebugTest()
- {
- UPWNGameGlobals::PrintOnscreenString("MONTAGE ENDED");
- }
- /*************/
- /**************************/
- /*** Playing Animations ***/
- /**************************/
- bool APWNWeapon::SetArmAnimSet_Attacking(APWNAnimSet_Attacking* animSetToUse)
- {
- if (animSetToUse)
- {
- ArmAnimSet_Attacking = animSetToUse;
- return true;
- }
- else
- return false;
- }
- UAnimMontage* APWNWeapon::FindArmAnim(EWeaponStateEnum::EWeaponState animState)
- {
- UAnimMontage* anim = nullptr;
- switch (animState)
- {
- case EWeaponStateEnum::WEAPONSTATE_Equipping:
- anim = ArmAnimSet_Basic->Anim_Equipping;
- break;
- case EWeaponStateEnum::WEAPONSTATE_Idling:
- anim = ArmAnimSet_Basic->Anim_Idles[0];
- break;
- case EWeaponStateEnum::WEAPONSTATE_AttackPreparing:
- anim = (ArmAnimSet_Attacking) ? ArmAnimSet_Attacking->Anim_AttackPreparing : nullptr;
- break;
- case EWeaponStateEnum::WEAPONSTATE_PreAttacking:
- anim = (ArmAnimSet_Attacking) ? ArmAnimSet_Attacking->Anim_PreAttacking : nullptr;
- break;
- case EWeaponStateEnum::WEAPONSTATE_Attacking:
- anim = (ArmAnimSet_Attacking) ? ArmAnimSet_Attacking->Anim_Attacking : nullptr;
- break;
- case EWeaponStateEnum::WEAPONSTATE_PostAttacking:
- anim = (ArmAnimSet_Attacking) ? ArmAnimSet_Attacking->Anim_PostAttacking : nullptr;
- break;
- case EWeaponStateEnum::WEAPONSTATE_AttackReturning:
- anim = (ArmAnimSet_Attacking) ? ArmAnimSet_Attacking->Anim_AttackReturning : nullptr;
- break;
- case EWeaponStateEnum::WEAPONSTATE_AttackRebounding:
- anim = (ArmAnimSet_Attacking) ? ArmAnimSet_Attacking->Anim_AttackRebounding : nullptr;
- break;
- case EWeaponStateEnum::WEAPONSTATE_AttackRebounded:
- anim = (ArmAnimSet_Attacking) ? ArmAnimSet_Attacking->Anim_AttackRebounded : nullptr;
- break;
- case EWeaponStateEnum::WEAPONSTATE_AttackReboundReturning:
- anim = (ArmAnimSet_Attacking) ? ArmAnimSet_Attacking->Anim_AttackReboundReturning : nullptr;
- break;
- case EWeaponStateEnum::WEAPONSTATE_ReloadPreparing:
- anim = ArmAnimSet_Basic->Anim_ReloadPreparing;
- break;
- case EWeaponStateEnum::WEAPONSTATE_Reloading:
- anim = ArmAnimSet_Basic->Anim_Reloading;
- break;
- case EWeaponStateEnum::WEAPONSTATE_ReloadReturning:
- anim = ArmAnimSet_Basic->Anim_ReloadReturning;
- break;
- case EWeaponStateEnum::WEAPONSTATE_PuttingDown:
- anim = ArmAnimSet_Basic->Anim_PuttingDown;
- break;
- case EWeaponStateEnum::WEAPONSTATE_Inactive:
- anim = ArmAnimSet_Basic->Anim_Inactive;
- break;
- }
- //UPWNGameGlobals::PrintOnscreenString(TEXT("Could not find Anim, because Animset is null!"));
- return anim;
- }
- float APWNWeapon::PlayArmAnim(EWeaponStateEnum::EWeaponState weaponState, float const rate, float const startingPosPct)
- {
- // Find the actual montage to play
- UAnimMontage* animToPlay = FindArmAnim(weaponState);
- if (!animToPlay)
- {
- //UPWNGameGlobals::PrintOnscreenString(TEXT("Arm animation is null."), GetWeaponsStateString(weaponState));
- return -1.0f;
- }
- if (!ArmAnimInstance)
- {
- //UPWNGameGlobals::PrintOnscreenString(TEXT("Arm anim instance is null: "), GetWeaponsStateString(weaponState));
- return -1.0f;
- }
- // Play anim
- float const currAnimDuration = ArmAnimInstance->Montage_Play(animToPlay, rate) / (animToPlay->RateScale);
- // Reregister our OnMontageEnded event
- ArmAnimInstance->Montage_SetEndDelegate(ArmAnimEndDelegate);
- float startingPos = 0.0f;
- if (startingPosPct > 0.0f)
- {
- UPWNGameGlobals::PrintOnscreenFloat(currAnimDuration);
- UPWNGameGlobals::PrintOnscreenFloat(startingPosPct);
- startingPos = currAnimDuration * startingPosPct;
- //ArmAnimInstance->Montage_SetPosition(animToPlay, startingPos);
- ArmAnimInstance->Montage_SetPosition(animToPlay, startingPosPct);
- }
- Arm->RefreshBoneTransforms();
- //UPWNGameGlobals::PrintOnscreenString(TEXT("Playing arm anim: "), GetWeaponsStateString(weaponState));
- //return currAnimDuration - startingPos;
- return currAnimDuration - startingPosPct;
- }
- /**************************/
- /**************/
- /*** States ***/
- /**************/
- void APWNWeapon::AttackStart(TEnumAsByte<EMovementDirectionEnum::EMovementDirection> attackDirection)
- {
- if (ArmStateCurrent == EWeaponStateEnum::WEAPONSTATE_Idling)
- {
- AttackDirection = attackDirection;
- UpdateAttackDirectionAnimset();
- ArmState_AttackPreparing_Start();
- }
- }
- void APWNWeapon::AttackStop(){}
- void APWNWeapon::UpdateAttackDirectionAnimset(){}
- void APWNWeapon::Equip()
- {
- // Unhide us
- this->SetActorHiddenInGame(false);
- Arm->SetHiddenInGame(false, true);
- Weapon->SetHiddenInGame(false, true);
- // Start equipping sequence
- ArmState_Equipping_Start();
- }
- float APWNWeapon::GetActiveMontagePosition(USkeletalMeshComponent* skelComp)
- {
- UAnimInstance* animInstance = skelComp->GetAnimInstance();
- if (animInstance)
- {
- FAnimMontageInstance* currMontage = animInstance->GetActiveMontageInstance();
- if (currMontage)
- {
- return currMontage->Position;
- }
- }
- return -1.0f;
- }
- float APWNWeapon::GetActiveMontageLength(USkeletalMeshComponent* skelComp)
- {
- UAnimInstance* animInstance = skelComp->GetAnimInstance();
- if (animInstance)
- {
- FAnimMontageInstance* currMontage = animInstance->GetActiveMontageInstance();
- if (currMontage)
- {
- if (currMontage->Montage)
- return currMontage->Montage->SequenceLength;
- }
- }
- return -1.0f;
- }
- FMontageDetails APWNWeapon::GetActiveMontageDetails(USkeletalMeshComponent* skelComp)
- {
- FMontageDetails details;
- details.Length = -1.0f;
- details.Position = -1.0f;
- details.Name = TEXT("NONE");
- UAnimInstance* animInstance = skelComp->GetAnimInstance();
- if (animInstance)
- {
- FAnimMontageInstance* currMontage = animInstance->GetActiveMontageInstance();
- if (currMontage)
- {
- details.Position = currMontage->Position;
- if (currMontage->Montage)
- {
- details.Length = currMontage->Montage->SequenceLength;
- details.Name = currMontage->Montage->GetName();
- }
- }
- }
- return details;
- }
- void APWNWeapon::SetActiveMontagePosition(USkeletalMeshComponent* skelComp, float pos)
- {
- UAnimInstance* animInstance = skelComp->GetAnimInstance();
- if (animInstance)
- {
- FAnimMontageInstance* currMontage = animInstance->GetActiveMontageInstance();
- if (currMontage)
- {
- if (currMontage->Montage)
- currMontage->Position = pos;
- }
- }
- }
- void APWNWeapon::ArmStateNextCheckTransition(float deltaTime)
- {
- // Minimum time left before end of anim before we transition
- float minTimeLeftBeforeTrans = 1.0f * deltaTime;
- // Update how long we've spent in this state
- ArmStateCurrentTimeSpent += deltaTime;
- // Check whether we must transition
- if (ArmStateNextTimeLeft > minTimeLeftBeforeTrans)
- ArmStateNextTimeLeft -= deltaTime;// DIV BY WORLDINFO.GAMESPEED
- // Most accurate check - First line of defense
- if (ArmAnimInstance)
- {
- float currMontagePos = GetActiveMontagePosition(Arm);
- float currMontageLength = GetActiveMontageLength(Arm);
- if (currMontagePos >= 0.0f && currMontageLength > 0.0f)
- {
- if (currMontagePos > currMontageLength - minTimeLeftBeforeTrans)
- {
- ArmStateNextHandleTransition(0.0f);
- return;
- }
- }
- }
- // Hacky check - Second line of defense if we ever run into problems
- if (ArmStateNextTimeLeft < minTimeLeftBeforeTrans)
- {
- //UPWNGameGlobals::PrintOnscreenString("TRANS VIA METHOD 2!");
- ArmStateNextHandleTransition(0.0f);
- }
- }
- void APWNWeapon::ArmAnimEndedNotify(UAnimMontage* montage, bool bInterrupted)
- {
- //UPWNGameGlobals::PrintOnscreenString("Anim Ended: " + montage->GetName());
- }
- void APWNWeapon::ArmStateNextHandleTransition(float startPosPct)
- {
- switch (ArmStateNext)
- {
- case EWeaponStateEnum::WEAPONSTATE_Equipping:
- ArmState_Equipping_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_Idling:
- ArmState_Idling_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_AttackPreparing:
- ArmState_AttackPreparing_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_PreAttacking:
- ArmState_PreAttacking_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_Attacking:
- ArmState_Attacking_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_PostAttacking:
- ArmState_PostAttacking_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_AttackReturning:
- ArmState_AttackReturning_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_ReloadPreparing:
- ArmState_ReloadPreparing_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_Reloading:
- ArmState_Reloading_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_ReloadReturning:
- ArmState_ReloadReturning_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_PuttingDown:
- ArmState_PuttingDown_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_AttackRebounding:
- ArmState_AttackRebounding_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_AttackRebounded:
- ArmState_AttackRebounded_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_AttackReboundReturning:
- ArmState_AttackReboundReturning_Start(startPosPct);
- break;
- case EWeaponStateEnum::WEAPONSTATE_Inactive:
- ArmState_Inactive_Start(startPosPct);
- break;
- default:
- break;
- }
- ArmStateCurrentTimeSpent = 0.0f;
- }
- void APWNWeapon::ArmStateCheckSkipToNext()
- {
- if (ArmStateNextTimeLeft < 0.0f)
- {
- ArmStateCurrent = ArmStateNext;
- ArmStateNext = (EWeaponStateEnum::EWeaponState)((uint8)ArmStateNext + 1);
- ArmStateNextTimeLeft = 0.0f;
- }
- }
- void APWNWeapon::ArmState_Equipping_Start(float startPosPct)
- {
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_Equipping;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_Idling;
- ArmStateNextTimeLeft = PlayArmAnim(ArmStateCurrent, 1.0f, startPosPct);
- ArmStateCheckSkipToNext();
- }
- void APWNWeapon::ArmState_Idling_Start(float startPosPct)
- {
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_Idling;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_Idling;
- ArmStateNextTimeLeft = PlayArmAnim(ArmStateCurrent, 1.0f, startPosPct);
- // We do NOT check for state skipping here, as idling has no auto next state
- }
- void APWNWeapon::ArmState_AttackPreparing_Start(float startPosPct)
- {
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_AttackPreparing;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_PreAttacking;
- ArmStateNextTimeLeft = PlayArmAnim(ArmStateCurrent, 1.0f, startPosPct);
- ArmStateCheckSkipToNext();
- }
- //
- void APWNWeapon::ArmState_PreAttacking_Start(float startPosPct)
- {
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_PreAttacking;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_Attacking;
- ArmStateNextTimeLeft = PlayArmAnim(ArmStateCurrent, 1.0f, startPosPct);
- ArmStateCheckSkipToNext();
- }
- void APWNWeapon::ArmState_Attacking_Start(float startPosPct)
- {
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_Attacking;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_PostAttacking;
- ArmStateNextTimeLeft = PlayArmAnim(ArmStateCurrent, 1.0f, startPosPct);
- ArmStateCheckSkipToNext();
- }
- void APWNWeapon::ArmState_PostAttacking_Start(float startPosPct)
- {
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_PostAttacking;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_AttackReturning;
- ArmStateNextTimeLeft = PlayArmAnim(ArmStateCurrent, 1.0f, startPosPct);
- ArmStateCheckSkipToNext();
- }
- void APWNWeapon::ArmState_AttackReturning_Start(float startPosPct)
- {
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_AttackReturning;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_Idling;
- ArmStateNextTimeLeft = PlayArmAnim(ArmStateCurrent, 1.0f, startPosPct);
- // We do NOT check for state skipping here, as this is the last state in our attack sequence.
- }
- void APWNWeapon::ArmState_AttackRebounding_Start(float startPosPct)
- {
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_AttackRebounding;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_AttackRebounded;
- ArmStateNextTimeLeft = PlayArmAnim(ArmStateCurrent, 1.0f, startPosPct);
- ArmStateCheckSkipToNext();
- }
- void APWNWeapon::ArmState_AttackRebounded_Start(float startPosPct)
- {
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_AttackRebounded;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_AttackReboundReturning;
- ArmStateNextTimeLeft = PlayArmAnim(ArmStateCurrent, 1.0f, startPosPct);
- ArmStateCheckSkipToNext();
- }
- void APWNWeapon::ArmState_AttackReboundReturning_Start(float startPosPct)
- {
- ArmStateCurrent = EWeaponStateEnum::WEAPONSTATE_AttackReboundReturning;
- ArmStateNext = EWeaponStateEnum::WEAPONSTATE_Idling;
- ArmStateNextTimeLeft = PlayArmAnim(ArmStateCurrent, 1.0f, startPosPct);
- ArmStateCheckSkipToNext();
- }
- /********************/
- /*** Other states ***/
- /********************/
- void APWNWeapon::ArmState_ReloadPreparing_Start(float startPosPct){}
- void APWNWeapon::ArmState_Reloading_Start(float startPosPct){}
- void APWNWeapon::ArmState_ReloadReturning_Start(float startPosPct){}
- void APWNWeapon::ArmState_PuttingDown_Start(float startPosPct){}
- void APWNWeapon::ArmState_Inactive_Start(float startPosPct){}
- ///**************/
- UPWNSerialiser* APWNWeapon::Serialise()
- {
- // Create my serialiser - if I'm NOT a parent class in inheritance
- UPWNSerialiser* mySaveData = NewObject<UPWNSerialiser>(this, UPWNSerialiser::StaticClass());
- // Save my basic data
- // No need to store location and rotation as those are set by character when spawning
- mySaveData->AddNumericValue(TEXT("ArmStateCurrent"), uint8(ArmStateCurrent));
- mySaveData->AddNumericValue(TEXT("ArmStateNext"), uint8(ArmStateNext));
- mySaveData->AddNumericValue(TEXT("ArmStateNextTimeLeft"), ArmStateNextTimeLeft);
- mySaveData->AddNumericValue(TEXT("ArmStateCurrentTimeSpent"), ArmStateCurrentTimeSpent);
- // Current anim progress
- float armCurrMontagePos = GetActiveMontagePosition(Arm);
- mySaveData->AddNumericValue(TEXT("ArmAnimCurrentPosition"), (armCurrMontagePos >= 0.0f) ? armCurrMontagePos : 0.0f);
- return mySaveData;
- }
- void APWNWeapon::DeSerialise(UPWNSerialiser* mySavedData)
- {
- // Arm current state
- uint8 armStateCurrent;
- mySavedData->LoadNumericValue(TEXT("ArmStateCurrent"), armStateCurrent);
- ArmStateNext = (EWeaponStateEnum::EWeaponState)armStateCurrent;
- // Arm current anim
- float armAnimCurrPos;
- mySavedData->LoadNumericValue(TEXT("ArmAnimCurrentPosition"), armAnimCurrPos);
- ArmStateNextHandleTransition(armAnimCurrPos);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement