177{
179 SCOPE_CYCLE_COUNTER(STATGROUP_ALS_Mantle_Component);
180
182 {
183 return false;
184 }
185
186
187 const FVector& TraceDirection =
OwnerCharacter->GetActorForwardVector();
190 FVector TraceStart = CapsuleBaseLocation + TraceDirection * -30.0f;
192 const FVector TraceEnd = TraceStart + TraceDirection * TraceSettings.
ReachDistance;
194
195 UWorld* World = GetWorld();
196 check(World);
197
198 FCollisionQueryParams Params;
200
201 FHitResult HitResult;
202 {
203 const FCollisionShape CapsuleCollisionShape = FCollisionShape::MakeCapsule(TraceSettings.
ForwardTraceRadius, HalfHeight);
205 CapsuleCollisionShape, Params);
206
208 {
210 TraceStart,
211 TraceEnd,
212 CapsuleCollisionShape,
213 DebugType,
214 bHit,
215 HitResult,
216 FLinearColor::Black,
217 FLinearColor::Black,
218 1.0f);
219 }
220 }
221
222 if (!HitResult.IsValidBlockingHit() ||
OwnerCharacter->GetCharacterMovement()->IsWalkable(HitResult))
223 {
224
225 return false;
226 }
227
228 if (HitResult.GetComponent() != nullptr)
229 {
230 UPrimitiveComponent* PrimitiveComponent = HitResult.GetComponent();
232 {
233
234 return false;
235 }
236 }
237
238 const FVector InitialTraceImpactPoint = HitResult.ImpactPoint;
239 const FVector InitialTraceNormal = HitResult.ImpactNormal;
240
241
242 FVector DownwardTraceEnd = InitialTraceImpactPoint;
243 DownwardTraceEnd.Z = CapsuleBaseLocation.Z;
244 DownwardTraceEnd += InitialTraceNormal * -15.0f;
245 FVector DownwardTraceStart = DownwardTraceEnd;
247
248 {
249 const FCollisionShape SphereCollisionShape = FCollisionShape::MakeSphere(TraceSettings.
DownwardTraceRadius);
250 const bool bHit = World->SweepSingleByChannel(HitResult, DownwardTraceStart, DownwardTraceEnd, FQuat::Identity,
252 Params);
253
255 {
257 TraceStart,
258 TraceEnd,
259 SphereCollisionShape,
260 DebugType,
261 bHit,
262 HitResult,
263 FLinearColor::Black,
264 FLinearColor::Black,
265 1.0f);
266 }
267 }
268
269
270 if (!
OwnerCharacter->GetCharacterMovement()->IsWalkable(HitResult))
271 {
272
273 return false;
274 }
275
276 const FVector DownTraceLocation(HitResult.Location.X, HitResult.Location.Y, HitResult.ImpactPoint.Z);
277 UPrimitiveComponent* HitComponent = HitResult.GetComponent();
278
279
280
284 CapsuleLocationFBase, 0.0f,
286
287 if (!bCapsuleHasRoom)
288 {
289
290 return false;
291 }
292
293 const FTransform TargetTransform(
294 (InitialTraceNormal * FVector(-1.0f, -1.0f, 0.0f)).ToOrientationRotator(),
295 CapsuleLocationFBase,
296 FVector::OneVector);
297
298 const float MantleHeight = (CapsuleLocationFBase -
OwnerCharacter->GetActorLocation()).
Z;
299
300
303 {
305 }
306 else
307 {
309 }
310
311
313 {
314 FVector GroundTraceStart = CapsuleBaseLocation;
315 GroundTraceStart.Z = DownTraceLocation.Z;
316 FVector GroundTraceEnd = GroundTraceStart;
317 GroundTraceEnd.Z -= 70.0f;
318
319 const float CapsuleRadius =
OwnerCharacter->GetCapsuleComponent()->GetScaledCapsuleRadius();
320 const FCollisionShape CapsuleCollisionShape = FCollisionShape::MakeCapsule(CapsuleRadius, CapsuleRadius);
321 const bool bHitGround = World->SweepSingleByProfile(HitResult, GroundTraceStart, GroundTraceEnd, FQuat::Identity,
MantleObjectDetectionProfile, CapsuleCollisionShape, Params);
322
323 if (bHitGround)
324 {
325 return false;
326 }
327 }
328
334
335 return true;
336}
EALSMantleType
Definition ALSCharacterEnumLibrary.h:161
static void DrawDebugSphereTraceSingle(const UWorld *World, const FVector &Start, const FVector &End, const FCollisionShape &CollisionShape, EDrawDebugTrace::Type DrawDebugType, bool bHit, const FHitResult &OutHit, FLinearColor TraceColor, FLinearColor TraceHitColor, float DrawTime)
Definition ALSDebugComponent.cpp:337
static void DrawDebugCapsuleTraceSingle(const UWorld *World, const FVector &Start, const FVector &End, const FCollisionShape &CollisionShape, EDrawDebugTrace::Type DrawDebugType, bool bHit, const FHitResult &OutHit, FLinearColor TraceColor, FLinearColor TraceHitColor, float DrawTime)
Definition ALSDebugComponent.cpp:275
bool MantleCheck(const FALSMantleTraceSettings &TraceSettings, EDrawDebugTrace::Type DebugType)
Definition ALSMantleComponent.cpp:176
FName MantleObjectDetectionProfile
Definition ALSMantleComponent.h:90
TEnumAsByte< ECollisionChannel > WalkableSurfaceDetectionChannel
Definition ALSMantleComponent.h:93
void Server_MantleStart(float MantleHeight, const FALSComponentAndTransform &MantleLedgeWS, EALSMantleType MantleType)
void MantleStart(float MantleHeight, const FALSComponentAndTransform &MantleLedgeWS, EALSMantleType MantleType)
Definition ALSMantleComponent.cpp:89
float AcceptableVelocityWhileMantling
Definition ALSMantleComponent.h:112
static FVector GetCapsuleBaseLocation(float ZOffset, UCapsuleComponent *Capsule)
Definition ALSMathLibrary.cpp:22
static FVector GetCapsuleLocationFromBase(FVector BaseLocation, float ZOffset, UCapsuleComponent *Capsule)
Definition ALSMathLibrary.cpp:28
static bool CapsuleHasRoomCheck(UCapsuleComponent *Capsule, FVector TargetLocation, float HeightOffset, float RadiusOffset, EDrawDebugTrace::Type DebugType=EDrawDebugTrace::Type::None, bool DrawDebugTrace=false)
Definition ALSMathLibrary.cpp:35
float MinLedgeHeight
Definition ALSCharacterStructLibrary.h:162
float ReachDistance
Definition ALSCharacterStructLibrary.h:165
float DownwardTraceRadius
Definition ALSCharacterStructLibrary.h:171
float ForwardTraceRadius
Definition ALSCharacterStructLibrary.h:168
float MaxLedgeHeight
Definition ALSCharacterStructLibrary.h:159