Finished implementing item drops

Signed-off-by: TjgL <lithmoneo@gmail.com>
This commit is contained in:
TjgL 2025-03-22 22:31:36 +01:00
parent 82c0257e14
commit cb59ea1628
15 changed files with 114 additions and 34 deletions

View File

@ -131,7 +131,7 @@ ManualIPAddress=
+Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="Bullet",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.") +Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="Bullet",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.")
+Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.") +Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.")
+Profiles=(Name="UI",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap),(Channel="Bullet",Response=ECR_Ignore)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ") +Profiles=(Name="UI",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap),(Channel="Bullet",Response=ECR_Ignore)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ")
+Profiles=(Name="Drop",CollisionEnabled=QueryAndPhysics,bCanModify=True,ObjectTypeName="Drop",CustomResponses=,HelpMessage="Needs description") +Profiles=(Name="Drop",CollisionEnabled=QueryAndPhysics,bCanModify=True,ObjectTypeName="Drop",CustomResponses=((Channel="WorldStatic",Response=ECR_Ignore),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore),(Channel="Bullet",Response=ECR_Ignore),(Channel="Enemy",Response=ECR_Ignore),(Channel="Drop",Response=ECR_Ignore)),HelpMessage="Needs description")
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Block,bTraceType=True,bStaticObject=False,Name="Bullet") +DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Block,bTraceType=True,bStaticObject=False,Name="Bullet")
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,DefaultResponse=ECR_Block,bTraceType=True,bStaticObject=False,Name="Enemy") +DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,DefaultResponse=ECR_Block,bTraceType=True,bStaticObject=False,Name="Enemy")
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel3,DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False,Name="Projectile") +DefaultChannelResponses=(Channel=ECC_GameTraceChannel3,DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False,Name="Projectile")

Binary file not shown.

Binary file not shown.

BIN
Content/Legumix/Drops/BP_HealthPack.uasset (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

BIN
Content/Legumix/Player/BP_Play.uasset (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

View File

@ -16,7 +16,7 @@ void ALMAmmoPack::ConsumePack(ALMPlayer* Player)
{ {
Super::ConsumePack(Player); Super::ConsumePack(Player);
Player->GetWeaponManager()->AddAmmoType(AmmoType, AmmoCount); Player->AddAmmo(AmmoType, AmmoCount);
OnPackConsumed(); OnPackConsumed();
Despawn(); Despawn();
} }

View File

@ -14,6 +14,8 @@ ALMHealthPack::ALMHealthPack()
void ALMHealthPack::ConsumePack(ALMPlayer* Player) void ALMHealthPack::ConsumePack(ALMPlayer* Player)
{ {
Super::ConsumePack(Player);
Player->GetHealthComponent()->AddHealth(HealthGain); Player->GetHealthComponent()->AddHealth(HealthGain);
OnPackConsumed(); OnPackConsumed();
Despawn(); Despawn();

View File

@ -3,12 +3,17 @@
#include "LMItemDrop.h" #include "LMItemDrop.h"
#include "Kismet/KismetMathLibrary.h"
ALMItemDrop::ALMItemDrop() ALMItemDrop::ALMItemDrop()
{ {
PrimaryActorTick.bCanEverTick = true; PrimaryActorTick.bCanEverTick = true;
Root = CreateDefaultSubobject<USceneComponent>("Root");
RootComponent = Root;
StaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>("MeshComponent"); StaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>("MeshComponent");
RootComponent = StaticMeshComponent; StaticMeshComponent->SetupAttachment(RootComponent);
} }
void ALMItemDrop::BeginPlay() void ALMItemDrop::BeginPlay()
@ -18,8 +23,41 @@ void ALMItemDrop::BeginPlay()
GetWorldTimerManager().SetTimer(DespawnHandle, this, &ALMItemDrop::Despawn, TimeBeforeDespawn); GetWorldTimerManager().SetTimer(DespawnHandle, this, &ALMItemDrop::Despawn, TimeBeforeDespawn);
} }
void ALMItemDrop::SetAttractor(AActor* Target)
{
Attractor = Target;
GetWorldTimerManager().SetTimer(MoveHandle, this, &ALMItemDrop::DoMovingTowardsTarget, MoveRate, true);
GetWorldTimerManager().ClearTimer(DespawnHandle);
}
void ALMItemDrop::DoMovingTowardsTarget()
{
if (MoveTime >= MoveDuration)
{
GetWorldTimerManager().ClearTimer(MoveHandle);
SetActorLocation(Attractor->GetActorLocation());
return;
}
const FVector Position = Attractor->GetActorLocation();
const float Duration = MoveTime / MoveDuration;
FString text = FString::Printf(TEXT("Time : %f / %f = %f"), MoveTime, MoveDuration, Duration);
GEngine->AddOnScreenDebugMessage(-15, 1.f, FColor::Red, text);
const float CurvePosition = PositionAtTime->GetFloatValue(Duration);
const FVector NewPosition = UKismetMathLibrary::VLerp(SpawnLocation, Position, CurvePosition);
MoveTime += MoveRate;
SetActorLocation(NewPosition);
}
void ALMItemDrop::ConsumePack(ALMPlayer* Player) void ALMItemDrop::ConsumePack(ALMPlayer* Player)
{ {
if (MoveHandle.IsValid())
{
GetWorldTimerManager().ClearTimer(MoveHandle);
}
} }
void ALMItemDrop::Despawn() void ALMItemDrop::Despawn()

View File

@ -17,19 +17,32 @@ void ULMGrabRange::TickComponent(float DeltaTime, enum ELevelTick TickType, FAct
{ {
Super::TickComponent(DeltaTime, TickType, ThisTickFunction); Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (!bIsEnabled)
return;
for (int i = Drops.Num() - 1; i >= 0; i--)
{
ALMItemDrop* Item = Drops[i];
const FVector ItemPosition = Item->GetActorLocation();
const FVector Position = GetComponentLocation();
const float DistanceLeft = FVector::Dist(ItemPosition, Position);
FString text = FString::Printf(TEXT("Item %s at distance %f"), *Item->GetName(), DistanceLeft);
GEngine->AddOnScreenDebugMessage(i, 1.f, FColor::Cyan, text);
if (DistanceLeft <= RangeToGrab)
{
Item->ConsumePack(Player);
Drops.Remove(Item);
}
}
} }
void ULMGrabRange::OnDropOverlapped_Implementation(ALMItemDrop* ItemDrop) void ULMGrabRange::OnDropOverlapped(ALMItemDrop* ItemDrop)
{ {
Drops.AddUnique(ItemDrop); Drops.AddUnique(ItemDrop);
} ItemDrop->SetAttractor(Player);
void ULMGrabRange::ConsumeDrop(ALMItemDrop* ItemDrop)
{
ItemDrop->ConsumePack(Player);
} }
void ULMGrabRange::BeginPlay() void ULMGrabRange::BeginPlay()

View File

@ -26,21 +26,14 @@ private:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Legumix, meta=(AllowPrivateAccess=true, ClampMin=0.1f)) UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Legumix, meta=(AllowPrivateAccess=true, ClampMin=0.1f))
float RangeToGrab = 10.f; float RangeToGrab = 10.f;
/** Distance curve from 0-1 to the player. */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Legumix, meta=(AllowPrivateAccess=true))
TObjectPtr<UCurveFloat> SpeedAtPosition;
TObjectPtr<ALMPlayer> Player; TObjectPtr<ALMPlayer> Player;
public: public:
ULMGrabRange(); ULMGrabRange();
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category=Legumix) UFUNCTION(BlueprintCallable, Category=Legumix)
void OnDropOverlapped(ALMItemDrop* ItemDrop); void OnDropOverlapped(ALMItemDrop* ItemDrop);
UFUNCTION(BlueprintCallable, Category=Legumix) virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
void ConsumeDrop(ALMItemDrop* ItemDrop);
void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
protected: protected:
virtual void BeginPlay() override; virtual void BeginPlay() override;

View File

@ -116,6 +116,14 @@ bool ALMPlayer::CanJumpInternal_Implementation() const
return JumpIsAllowedInternal(); return JumpIsAllowedInternal();
} }
void ALMPlayer::AddAmmo(const EAmmoType Ammo, const int AmmoCount)
{
if (GetWeaponManager()->AddAmmoType(Ammo, AmmoCount))
{
OnAmmoPickup();
}
}
void ALMPlayer::SetWeaponManager(ULMWeaponManager* Manager) void ALMPlayer::SetWeaponManager(ULMWeaponManager* Manager)
{ {
UE_LOG(LogTemp, Warning, TEXT("Set weapon manager")) UE_LOG(LogTemp, Warning, TEXT("Set weapon manager"))

View File

@ -18,26 +18,48 @@ protected:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Legumix) UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Legumix)
float TimeBeforeDespawn = 30.f; float TimeBeforeDespawn = 30.f;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Legumix)
float MoveRate = 0.1f;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Legumix)
float MoveDuration = 1.f;
/** Distance curve from 0-1 to the player. */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Legumix, meta=(AllowPrivateAccess=true))
TObjectPtr<UCurveFloat> PositionAtTime;
FTimerHandle DespawnHandle; FTimerHandle DespawnHandle;
FTimerHandle MoveHandle;
private: private:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true))
TObjectPtr<USceneComponent> Root;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true))
TObjectPtr<UStaticMeshComponent> StaticMeshComponent; TObjectPtr<UStaticMeshComponent> StaticMeshComponent;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true))
FVector SpawnLocation; FVector SpawnLocation;
UPROPERTY()
TObjectPtr<AActor> Attractor;
float MoveTime = 0.f;
public: public:
ALMItemDrop(); ALMItemDrop();
virtual void BeginPlay() override; virtual void BeginPlay() override;
void SetAttractor(AActor* Target);
UFUNCTION()
void DoMovingTowardsTarget();
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
virtual void ConsumePack(ALMPlayer* Player); virtual void ConsumePack(ALMPlayer* Player);
UFUNCTION(BlueprintImplementableEvent) UFUNCTION(BlueprintImplementableEvent)
void OnPackConsumed(); void OnPackConsumed();
FVector GetSpawnLocation() { return SpawnLocation; } FVector GetSpawnLocation() const { return SpawnLocation; }
protected: protected:
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)

View File

@ -5,6 +5,7 @@
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "LMBulletInfo.h" #include "LMBulletInfo.h"
#include "LMTeam.h" #include "LMTeam.h"
#include "Ammo/LMAmmoPack.h"
#include "Camera/CameraComponent.h" #include "Camera/CameraComponent.h"
#include "GameFramework/Character.h" #include "GameFramework/Character.h"
#include "LMPlayer.generated.h" #include "LMPlayer.generated.h"
@ -56,6 +57,9 @@ public:
virtual bool CanJumpInternal_Implementation() const override; virtual bool CanJumpInternal_Implementation() const override;
UFUNCTION(BlueprintCallable)
void AddAmmo(EAmmoType Ammo, int AmmoCount);
protected: protected:
// Called when the game starts or when spawned // Called when the game starts or when spawned
virtual void BeginPlay() override; virtual void BeginPlay() override;