Level Update
This commit is contained in:
commit
c4dfe3487a
@ -18,6 +18,24 @@
|
||||
{
|
||||
"Name": "OculusVR",
|
||||
"Enabled": false
|
||||
},
|
||||
{
|
||||
"Name": "MeshEditor",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "Shotgun",
|
||||
"Enabled": true,
|
||||
"SupportedTargetPlatforms": [
|
||||
"Win64"
|
||||
]
|
||||
}
|
||||
],
|
||||
"TargetPlatforms": [
|
||||
"HTML5",
|
||||
"LinuxNoEditor",
|
||||
"MacNoEditor",
|
||||
"WindowsNoEditor",
|
||||
"AllDesktop"
|
||||
]
|
||||
}
|
@ -60,3 +60,4 @@ InitialAverageFrameRate=0.016667
|
||||
PhysXTreeRebuildRate=10
|
||||
DefaultBroadphaseSettings=(bUseMBPOnClient=False,bUseMBPOnServer=False,MBPBounds=(Min=(X=0.000000,Y=0.000000,Z=0.000000),Max=(X=0.000000,Y=0.000000,Z=0.000000),IsValid=0),MBPNumSubdivs=2)
|
||||
|
||||
|
||||
|
BIN
Content/Box_Brush2_StaticMesh.uasset
Normal file
BIN
Content/Box_Brush2_StaticMesh.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush2_StaticMesh1.uasset
Normal file
BIN
Content/Box_Brush2_StaticMesh1.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush2_StaticMesh2.uasset
Normal file
BIN
Content/Box_Brush2_StaticMesh2.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush2_StaticMesh3.uasset
Normal file
BIN
Content/Box_Brush2_StaticMesh3.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush2_StaticMesh4.uasset
Normal file
BIN
Content/Box_Brush2_StaticMesh4.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush2_StaticMesh5.uasset
Normal file
BIN
Content/Box_Brush2_StaticMesh5.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush4_StaticMesh.uasset
Normal file
BIN
Content/Box_Brush4_StaticMesh.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush4_StaticMesh1.uasset
Normal file
BIN
Content/Box_Brush4_StaticMesh1.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush4_StaticMesh2.uasset
Normal file
BIN
Content/Box_Brush4_StaticMesh2.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush5_StaticMesh.uasset
Normal file
BIN
Content/Box_Brush5_StaticMesh.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush6_StaticMesh.uasset
Normal file
BIN
Content/Box_Brush6_StaticMesh.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush_StaticMesh.uasset
Normal file
BIN
Content/Box_Brush_StaticMesh.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush_StaticMesh1.uasset
Normal file
BIN
Content/Box_Brush_StaticMesh1.uasset
Normal file
Binary file not shown.
BIN
Content/Box_Brush_StaticMesh2.uasset
Normal file
BIN
Content/Box_Brush_StaticMesh2.uasset
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Content/Eingene3DSachen/WuerfelBox.uasset
Normal file
BIN
Content/Eingene3DSachen/WuerfelBox.uasset
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Content/ModularFantasyHouse/Meshes/SM_Wall_Stone_Slopped.uasset
Normal file
BIN
Content/ModularFantasyHouse/Meshes/SM_Wall_Stone_Slopped.uasset
Normal file
Binary file not shown.
BIN
Content/Spiral_Stair_Brush2_StaticMesh.uasset
Normal file
BIN
Content/Spiral_Stair_Brush2_StaticMesh.uasset
Normal file
Binary file not shown.
BIN
Content/placeholder_flatSocket.uasset
Normal file
BIN
Content/placeholder_flatSocket.uasset
Normal file
Binary file not shown.
BIN
Content/placeholder_halfCylinderShell.uasset
Normal file
BIN
Content/placeholder_halfCylinderShell.uasset
Normal file
Binary file not shown.
@ -1,6 +1,4 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
#include "OpenDoor.h"
|
||||
#include "Components/AudioComponent.h"
|
||||
#include "Components/PrimitiveComponent.h"
|
||||
#include "Engine/World.h"
|
||||
#include "GameFramework/Actor.h"
|
||||
@ -22,32 +20,6 @@ UOpenDoor::UOpenDoor()
|
||||
void UOpenDoor::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
InitialYaw = GetOwner()->GetActorRotation().Yaw;
|
||||
CurrentYaw = InitialYaw;
|
||||
TargetAngleOfOpenDoor += InitialYaw;
|
||||
|
||||
FindPressurePlateComponent();
|
||||
|
||||
FindAudioComponent();
|
||||
//ActorThatOpens = GetWorld()->GetFirstPlayerController()->GetPawn();
|
||||
}
|
||||
|
||||
void UOpenDoor::FindAudioComponent()
|
||||
{
|
||||
AudioComponent = GetOwner()->FindComponentByClass<UAudioComponent>(); //<> for function templates
|
||||
if (!AudioComponent) // same as if(PhysicsHandle == nullptr)
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("No Audio component found on: %s !"), *GetOwner()->GetName());
|
||||
}
|
||||
}
|
||||
|
||||
void UOpenDoor::FindPressurePlateComponent()
|
||||
{
|
||||
if (!PressurePlate)
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("%s has OpenDoor on it, but no PressurePlate set!"), *GetOwner()->GetName());
|
||||
}
|
||||
}
|
||||
|
||||
// Called every frame
|
||||
@ -60,76 +32,36 @@ void UOpenDoor::TickComponent(float DeltaTime, ELevelTick TickType, FActorCompon
|
||||
//if(PressurePlate && PressurePlate->IsOverlappingActor(ActorThatOpens)) //prüft erst, ob es ein actor gibt
|
||||
if (TotalMass() >= MassToOpenDoor)
|
||||
{
|
||||
UE_LOG(LogTemp, Warning, TEXT("TEST OPEN DOOR"));
|
||||
OpenDoor(DeltaTime);
|
||||
OpenDoor();
|
||||
//DoorLastOpened When the door was opened
|
||||
DoorLastOpened = GetWorld()->GetTimeSeconds();
|
||||
doorLastOpened = GetWorld()->GetTimeSeconds();
|
||||
}
|
||||
|
||||
else
|
||||
else if(open)
|
||||
{
|
||||
//if door has been open longer than DoorCloseDelay
|
||||
//if(GetWorld()->GetTimeSeconds() > DoorLastOpened + DoorDelay)
|
||||
if (GetWorld()->GetTimeSeconds() - DoorLastOpened > DoorDelay)
|
||||
CloseDoor(DeltaTime);
|
||||
if (GetWorld()->GetTimeSeconds() - doorLastOpened > RotationDelay)
|
||||
CloseDoor();
|
||||
}
|
||||
|
||||
if(rotating)
|
||||
{
|
||||
if (GetOwner()->GetActorRotation().Equals(targetRotation, 1.0))
|
||||
{
|
||||
rotating = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
GetOwner()->AddActorLocalRotation(DeltaTime * OpenDoorRotationSpeed * FRotator(0.0f, 1.0f, 0.0f));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void UOpenDoor::OpenDoor(float DeltaTime)
|
||||
void UOpenDoor::OpenDoor()
|
||||
{
|
||||
FRotator DoorRotation = GetOwner()->GetActorRotation();
|
||||
//CurrentYaw = FMath::FInterpTo(CurrentYaw, TargetYaw, DeltaTime, 2.f);
|
||||
CurrentYaw = FMath::Lerp(CurrentYaw, TargetAngleOfOpenDoor, DeltaTime * OpenDoorRotationSpeed);
|
||||
//complex Interpolation
|
||||
DoorRotation.Yaw = CurrentYaw;
|
||||
rotateDoor(DoorRotation);
|
||||
|
||||
CloseDoorSoundHasBeenPlayed = false;
|
||||
if (!AudioComponent) { return; }
|
||||
if (!OpenDoorSoundHasBeenPlayed)
|
||||
{
|
||||
AudioComponent->Play();
|
||||
OpenDoorSoundHasBeenPlayed = true;
|
||||
}
|
||||
FRotator rotation = GetOwner()->GetActorRotation();
|
||||
rotation.Yaw = TargetAngle;
|
||||
Rotate(rotation);
|
||||
open = true;
|
||||
}
|
||||
|
||||
void UOpenDoor::CloseDoor(float DeltaTime)
|
||||
void UOpenDoor::CloseDoor()
|
||||
{
|
||||
FRotator DoorRotation = GetOwner()->GetActorRotation();
|
||||
CurrentYaw = FMath::Lerp(CurrentYaw, InitialYaw, DeltaTime * CloseDoorRotationSpeed);
|
||||
DoorRotation.Yaw = CurrentYaw;
|
||||
rotateDoor(DoorRotation);
|
||||
|
||||
OpenDoorSoundHasBeenPlayed = false;
|
||||
if (!AudioComponent) { return; }
|
||||
if (!CloseDoorSoundHasBeenPlayed)
|
||||
{
|
||||
AudioComponent->Play();
|
||||
CloseDoorSoundHasBeenPlayed = true;
|
||||
}
|
||||
FRotator rotation = GetOwner()->GetActorRotation();
|
||||
rotation.Yaw = 0.0f;
|
||||
Rotate(rotation);
|
||||
open = false;
|
||||
}
|
||||
|
||||
void UOpenDoor::rotateDoor(FRotator targetRotation)
|
||||
{
|
||||
this->targetRotation = targetRotation;
|
||||
rotating = true;
|
||||
}
|
||||
|
||||
|
||||
float UOpenDoor::TotalMass() const
|
||||
{
|
||||
float TotalMass = 0.f;
|
||||
@ -147,32 +79,4 @@ float UOpenDoor::TotalMass() const
|
||||
}
|
||||
|
||||
return TotalMass;
|
||||
}
|
||||
|
||||
//Notes
|
||||
//UE_LOG(LogTemp, Warning, TEXT("%f"), TargetYaw);
|
||||
// UE_LOG(LogTemp, Warning, TEXT("%s"), *GetOwner()->GetActorRotation().ToString());
|
||||
// UE_LOG(LogTemp, Warning, TEXT("The Yaw is: %f"), GetOwner()->GetActorRotation().Yaw);
|
||||
|
||||
// FRotator CurrentRotation = GetOwner()->GetActorRotation();
|
||||
// FMath::Lerp(CurrentRotation, FRotator(0.f,90.f,0.f), 0.2f);
|
||||
|
||||
// GetOwner()->SetActorRotation(CurrentRotation);
|
||||
// UE_LOG(LogTemp, Warning, TEXT("The Yaw is: %f"), CurrentRotation.Yaw);
|
||||
//TargetYaw = 90.f;
|
||||
// FRotator OpenDoor(0.f, 0.f, 0.f);
|
||||
// //OpenDoor.Yaw = FMath::Lerp(CurrentYaw, TargetYaw, 0.02f); //complex Interpolation
|
||||
// OpenDoor.Yaw = FMath::FInterpTo(CurrentYaw, TargetYaw, DeltaTime, 2.f);//complex Interpolation Framerate unabhängig wegen Deltatime
|
||||
// //OpenDoor.Yaw = FMath::FInterpConstantTo(CurrentYaw, TargetYaw, DeltaTime, 0.02f); //lineare interpolation
|
||||
// GetOwner()->SetActorRotation(OpenDoor);
|
||||
|
||||
|
||||
//float f = 10.f;
|
||||
//FRotator CurrentRotation = GetOwner()->GetActorRotation();
|
||||
//FRotator Rotation = FRotator(0.f, -90.f, 0.f);
|
||||
//FRotator OpenDoor={float,float,float}
|
||||
//FRotator OpenDoor{float,float,float}
|
||||
//FRotator OpenDoor(float,float,float)
|
||||
//CurrentRotation.Yaw = 90.f;
|
||||
|
||||
//GetOwner()->SetActorRotation(CurrentRotation);
|
||||
}
|
@ -1,6 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
|
||||
#include "RotatingActor.h"
|
||||
#include "Components/AudioComponent.h"
|
||||
#include "Components/ActorComponent.h"
|
||||
#include "Engine/TriggerVolume.h"
|
||||
@ -10,7 +12,7 @@
|
||||
|
||||
|
||||
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
|
||||
class BUILDINGESCAPE_API UOpenDoor : public UActorComponent
|
||||
class BUILDINGESCAPE_API UOpenDoor : public URotatingActor
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@ -24,46 +26,19 @@ protected:
|
||||
public:
|
||||
// Called every frame
|
||||
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
|
||||
void OpenDoor(float DeltaTime);
|
||||
void CloseDoor(float DeltaTime);
|
||||
void OpenDoor();
|
||||
void CloseDoor();
|
||||
float TotalMass() const;
|
||||
void FindAudioComponent();
|
||||
void FindPressurePlateComponent();
|
||||
|
||||
//Tracks if Sound has been Played
|
||||
bool OpenDoorSoundHasBeenPlayed = false;
|
||||
bool CloseDoorSoundHasBeenPlayed = true;
|
||||
|
||||
private:
|
||||
|
||||
float InitialYaw;
|
||||
float CurrentYaw;
|
||||
float DoorLastOpened = 0.f;
|
||||
bool HasSoundBeenPlayed = false;
|
||||
bool rotating = false;
|
||||
FRotator targetRotation;
|
||||
|
||||
void rotateDoor(FRotator targetRotation);
|
||||
bool open = false;
|
||||
float doorLastOpened;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float MassToOpenDoor = 50.f;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float TargetAngleOfOpenDoor =90.f;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float OpenDoorRotationSpeed = 2.f;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float CloseDoorRotationSpeed = 0.5f;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float DoorDelay = 2.f; //2 second delay
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
ATriggerVolume* PressurePlate = nullptr;
|
||||
|
||||
UPROPERTY()
|
||||
UAudioComponent* AudioComponent = nullptr;
|
||||
|
||||
};
|
||||
|
57
Source/BuildingEscape/RotatingActor.cpp
Normal file
57
Source/BuildingEscape/RotatingActor.cpp
Normal file
@ -0,0 +1,57 @@
|
||||
#include "RotatingActor.h"
|
||||
|
||||
|
||||
URotatingActor::URotatingActor()
|
||||
{
|
||||
PrimaryComponentTick.bCanEverTick = true;
|
||||
}
|
||||
|
||||
void URotatingActor::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
AudioComponent = GetOwner()->FindComponentByClass<UAudioComponent>();
|
||||
if (!AudioComponent)
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("No audio component found on: %s !"), *GetOwner()->GetName());
|
||||
}
|
||||
}
|
||||
|
||||
void URotatingActor::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
|
||||
{
|
||||
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
|
||||
if (rotating)
|
||||
{
|
||||
if (GetOwner()->GetActorRotation().Equals(targetRotation, 1.0f))
|
||||
{
|
||||
rotating = false;
|
||||
}else
|
||||
{
|
||||
GetOwner()->AddActorLocalRotation(DeltaTime * RotationSpeed * FRotator(0.0f, tempRotation, 0.0f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void URotatingActor::Rotate(const FRotator TargetRotation)
|
||||
{
|
||||
this->targetRotation = TargetRotation;
|
||||
rotating = true;
|
||||
tempRotation = (TargetRotation.Yaw < 0) ? -1.f : 1.f;
|
||||
if(Negative)
|
||||
{
|
||||
tempRotation = (TargetRotation.Yaw < 0) ? 1.f : -1.f;
|
||||
}
|
||||
|
||||
if(AudioComponent != nullptr && !soundHasBeenPlayed)
|
||||
{
|
||||
AudioComponent->Play();
|
||||
soundHasBeenPlayed = true;
|
||||
}
|
||||
}
|
||||
|
||||
void URotatingActor::Rotate()
|
||||
{
|
||||
FRotator rotation = GetOwner()->GetActorRotation();
|
||||
rotation.Yaw = TargetAngle;
|
||||
Rotate(rotation);
|
||||
|
||||
}
|
51
Source/BuildingEscape/RotatingActor.h
Normal file
51
Source/BuildingEscape/RotatingActor.h
Normal file
@ -0,0 +1,51 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "GameFramework/Actor.h"
|
||||
#include "Components/ActorComponent.h"
|
||||
#include "Components/AudioComponent.h"
|
||||
|
||||
#include "RotatingActor.generated.h"
|
||||
|
||||
|
||||
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
|
||||
class BUILDINGESCAPE_API URotatingActor : public UActorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
URotatingActor();
|
||||
|
||||
protected:
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
void Rotate(FRotator TargetRotation);
|
||||
|
||||
UFUNCTION()
|
||||
void Rotate();
|
||||
|
||||
public:
|
||||
virtual void TickComponent(float DeltaTime, ELevelTick TickType,
|
||||
FActorComponentTickFunction* ThisTickFunction) override;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float TargetAngle = 90.0f;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
UAudioComponent * AudioComponent;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float RotationSpeed = 15.f;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float RotationDelay = 2.f;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
bool Negative = false;
|
||||
|
||||
private:
|
||||
FRotator targetRotation;
|
||||
bool rotating;
|
||||
bool soundHasBeenPlayed;
|
||||
float tempRotation;
|
||||
};
|
@ -8,11 +8,6 @@ UTriggerOpenDoor::UTriggerOpenDoor()
|
||||
void UTriggerOpenDoor::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
AudioComponent = GetOwner()->FindComponentByClass<UAudioComponent>();
|
||||
if (!AudioComponent)
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("No audio component found on: %s !"), *GetOwner()->GetName());
|
||||
}
|
||||
if(!TriggerVolume)
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("No trigger volume found on: %s !"), *GetOwner()->GetName());
|
||||
@ -24,8 +19,7 @@ void UTriggerOpenDoor::TickComponent(float DeltaTime, ELevelTick TickType,
|
||||
FActorComponentTickFunction* ThisTickFunction)
|
||||
{
|
||||
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
|
||||
if (!doorOpen)
|
||||
{
|
||||
|
||||
if(!TriggerVolume)
|
||||
{
|
||||
return;
|
||||
@ -35,25 +29,6 @@ void UTriggerOpenDoor::TickComponent(float DeltaTime, ELevelTick TickType,
|
||||
TriggerVolume->GetOverlappingActors(overlappingActors);
|
||||
if (overlappingActors.Num() >= 1)
|
||||
{
|
||||
|
||||
if (AudioComponent)
|
||||
{
|
||||
AudioComponent->Play();
|
||||
}
|
||||
doorOpen = true;
|
||||
opening = true;
|
||||
currentRotation = GetOwner()->GetActorRotation();
|
||||
Rotate();
|
||||
}
|
||||
}
|
||||
if (opening)
|
||||
{
|
||||
if (GetOwner()->GetActorRotation().Equals(TargetRotation, 1.0))
|
||||
{
|
||||
opening = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
GetOwner()->AddActorLocalRotation(DeltaTime * TargetSpeed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
|
||||
#include "RotatingActor.h"
|
||||
#include "Components/ActorComponent.h"
|
||||
#include "Components/AudioComponent.h"
|
||||
#include "Engine/TriggerVolume.h"
|
||||
@ -11,7 +13,7 @@
|
||||
|
||||
|
||||
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
|
||||
class BUILDINGESCAPE_API UTriggerOpenDoor : public UActorComponent
|
||||
class BUILDINGESCAPE_API UTriggerOpenDoor : public URotatingActor
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@ -19,24 +21,11 @@ public:
|
||||
UTriggerOpenDoor();
|
||||
virtual void TickComponent(float DeltaTime, ELevelTick TickType,
|
||||
FActorComponentTickFunction* ThisTickFunction) override;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
FRotator TargetRotation = FRotator(00.0f, 90.0f, 0.0f);
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
FRotator TargetSpeed = FRotator(0.0f, 1.0f, 0.0f);
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
ATriggerVolume * TriggerVolume = nullptr;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
UAudioComponent * AudioComponent = nullptr;
|
||||
|
||||
protected:
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
private:
|
||||
bool doorOpen = false;
|
||||
bool opening = false;
|
||||
FRotator currentRotation;
|
||||
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user