Tyr wrote: ↑Tue Oct 01, 2019 4:37 pm
- Changed pathnodes (done right sektor?)
Before changing name there could be some bits that can be adjusted toward pathing because for design I would like to have such a skill in making maps, but unfortunately I'm not such an artist...
Let's summarize basics from navigation rules.
1 - Inventory generates a NavigationPoint called InventorySpot, this can be used as PathNode in all ways so existence of PathNode38 over PulseGun is pointless.
2 - Impossible to follow routes using current physics and no special directives set.
Extra description:
ReachSpec 706 connecting LiftCenter0 with LiftExit0 is actually impossible to follow. In this map this is not critical, pawn will fall or doing whatever move resuming navigation after fall in lower area. In other cases where this is an attack direction is a permanent flaw. More maps have such borks.
When LiftCenter is replaced with JumpSpot placed Near LiftExit0 and not Near LiftExit1 pawn has already directives to translocate or Impactjumping if is set into JumpSpot property. Why ? Pawn coming from top will jump in a down location. For coming back will have to reach at JumpSpot which is teaching pawn what to do. LiftCenter is for Lifts or other nasty spots that can be used - not this case. Once having these set, you can even delete PathNode23 and PathNode149. The rest of paths can be a bit more spread as long as they do have connections.
3 - Misc optional extras. Some triggers inspired from Jumper (which don't work for bot) can be used where pawn has to jump over a knee obstruction but is "forgetting" to do this.
Code: Select all
class Bot_Jumper expands Triggers;
var() bool bOnceOnly, bEnabled;
var Pawn Pending;
var() float Frequency;
var Vector Direction;
var float Distance;
var() int JumpZ;
function Timer()
{
if ( Pending != None && Pending.Health > 0 && Pending.MoveTarget != None
&& !Pending.bHidden && Pending.bCanJump && ( Pending.Physics != PHYS_Falling && Pending.Physics != PHYS_Flying ) )
{
Pending.SetPhysics(PHYS_Falling);
Distance = VSize(Pending.MoveTarget.Location-Pending.Location);
Direction = (Pending.MoveTarget.Location-Pending.Location)/Distance;
Pending.Velocity = Pending.GroundSpeed * Direction;
if ( JumpZ != 0 )
Pending.Velocity.Z = JumpZ;
else
Pending.Velocity.Z = FMax(200, Pending.JumpZ);
Pending.Acceleration = Direction * Pending.AccelRate;
Pending.bJumpOffPawn = True;
if ( Bot(Pending) != None )
Bot(Pending).SetFall();
}
}
function Touch( actor Other )
{
if ( !Other.IsA('PlayerPawn') && Other.bIsPawn )
{
Pending = Pawn(Other);
SetTimer(Frequency, false);
if ( bOnceOnly )
{
Disable('Touch');
Disable('Trigger');
}
}
}
function Trigger( actor Other, pawn EventInstigator )
{
if ( bEnabled )
{
bEnabled = False;
Disable('Touch');
}
else
{
bEnabled = True;
Enable('Touch');
}
}
This is a memory helper when Bot goes retarded at walls. Let's see sample:
- This might go in MyLevel directly.
I marked with green some possible routes, I added two such triggers for safety. Spot nearby wall if causes a bot looping there will tell him to jump. This jumper has a "reflex" reaction which is configurable 0.08 to 0.5 seconds recommended depending on needs it has to be bEnabled and... can be even triggered. When this thing is triggered can be disabled and re-enabled if a situation is requiring such stunts.
As other idea, ALL but ALL items can be subject for Bot using paths accordingly.
ThigPads, HealthVials, etc...
- Using LE - JS - LE combo bImpactJump=True
The conclusion:
Even if Level will stay "final" in this state, I have these actors handy in templates that can be spread in map in run-time (any Server or Stand-Alone game) so for me at this moment design part is under attention because issues with paths are.. gone. My MBots were defeating me unable to go stuck nowhere in a few sessions. Of course Editing it is way more relevant showing exactly what is here and there. All I have to say it's that waiting for this map was like a great reward, and it's a success.