MapChecker

Tutorials and discussions about Mapping - Introduce your own ones!
Buggie
Godlike
Posts: 3130
Joined: Sat Mar 21, 2020 5:32 am

Re: MapChecker

Post by Buggie »

Added more checks:

Code: Select all

	checkTriggersNotUsed();
- fixed/improved few checks.

Updated in first post: viewtopic.php?f=5&t=14809   
Auto merged new post submitted 3 hours 5 minutes later
Added more checks:

Code: Select all

	checkInOutPaths();
Updated in first post: viewtopic.php?f=5&t=14809
User avatar
Barbie
Godlike
Posts: 2911
Joined: Fri Sep 25, 2015 9:01 pm
Location: moved without proper hashing

Re: MapChecker

Post by Barbie »

Buggie wrote: Sat Mar 18, 2023 5:16 am Added more checks:

Code: Select all

	checkTriggersNotUsed();
Maybe add

Code: Select all

if (Trigger.Event == None && Trigger.Message == "") LogProblem(Trigger @ "does nothing");
"If Origin not in center it be not in center." --Buggie
Buggie
Godlike
Posts: 3130
Joined: Sat Mar 21, 2020 5:32 am

Re: MapChecker

Post by Buggie »

Added more checks:

Code: Select all

	checkTriggerNotUsed();
- fixed/improved few checks.

Updated in first post: viewtopic.php?f=5&t=14809
User avatar
OjitroC
Godlike
Posts: 3746
Joined: Sat Sep 12, 2015 8:46 pm

Re: MapChecker

Post by OjitroC »

Running MapChecker and MapGarbage on DM-Deck16][bots8.unr :

MapChecker reports :
MapChecker: NavigationPoint without in (not reachable) or out (trap) paths:
MapChecker: SpecialJump10 no in

MapGarbage reports :
NoIncomingPath: PlayerStart5 is not having incoming connections.
NoIncomingPath: PathNode52 is not having incoming connections.
NoIncomingPath: SpecialJump10 is not having incoming connections.

Interested in why there should be this difference? (Perhaps need to look at how MapChecker detects connections?)

PlayerStart15 is probably not that important but, looking at the paths in the Editor, PathNode52 clearly has only outgoing connections and so this was not detected.
Buggie
Godlike
Posts: 3130
Joined: Sat Mar 21, 2020 5:32 am

Re: MapChecker

Post by Buggie »

MapChecker report not all NavigationsPoints. It be too dumb. PathNodes without "in" paths not hurt and completely normal. More over it can be used for many valid goals, which is not mistake.

PlayerStart not need incoming Connection. Also it can be without any out connections. So this class not checked too.

In fact list of checked classes very limited in present in code. Each item add by some reasons. Each item not present here, too not added by reasons.   
Auto merged new post submitted 4 minutes later
MapChecker coded with big attention for details. For example you can look for move inventory:

Code: Select all

		if (A.Class.Name == 'UT_ShieldBelt' || A.Class.Name == 'UT_Eightball')
			ret -= 4;
		else if (A.Class.Name == 'UT_FlakCannon')
			ret -= 2.1;
		else if (A.Class.Name == 'UT_Jumpboots')
			ret -= 6.5;
		else if (A.Class.Name == 'UDamage')
			ret -= 9.2;
		else if (A.Class.Name == 'ThighPads' || A.Class.Name == 'PulseGun' || A.Class.Name == 'QuadShot')
			ret -= 14;
		else if (A.Class.Name == 'KevlarSuit')
			ret -= 20.5;
		else if (A.Class.Name == 'ImpactHammer')
			ret -= 8.3;
		else if (A.Class.Name == 'Eightball')
			ret -= 1.9;
		else if (A.Class.Name == 'PowerShield')
			ret -= 24.6;
		else if (A.Class.Name == 'WarHeadAmmo')
			ret -= 23.9;
		else if (A.Class.Name == 'ChainSaw')
			ret -= 23;
		else if (A.Class.Name == 'GESBioRifle')
			ret -= 2.3;
		else if (A.Class.Name == 'Translocator' || A.Class.Name == 'Seeds')
			ret -= 2.9;
		else if (A.Class.Name == 'Razorjack')
			ret -= 3.3;
		else if (A.Class.Name == 'Stinger')
			ret -= 3.1;
		else if (A.Class.Name == 'Flare')
			ret -= 5.5;
		else if (A.Class.Name == 'RifleAmmo')
			ret -= 1.5;
		else if (A.Class.Name == 'StingerAmmo')
			ret -= 0.9;
		else if (A.Class.Name == 'BulletBox')
			ret -= 4.9;
		else if (A.Class.Name == 'Armor')
			ret += 3.5;
		else if (A.Class.Name == 'Armor2')
			ret += 7;
		else if (A.Class.Name == 'ripper')
			ret += 8;
		else if (A.Class.Name == 'EClip')
			ret += 1.8;
		else if (A.Class.Name == 'RocketPack')
			ret += 2.4;
		else if (A.Class.Name == 'Miniammo')
			ret += 3.8;
		else if (A.Class.Name == 'SniperRifle')
			ret += 4;
		else if (A.Class.Name == 'FlakShellAmmo')
			ret += 1.4;
		else if (A.Class.Name == 'ShockCore' || A.Class.Name == 'SuperShockCore')
			ret += 2;
There a lot manual work. Each known stock class be placed on map and manually tuned for get best result. After that get proper offset, which used here.

OFC it can be done in very general and dumb way - just use collision height. But this not produce good results.

(Unfortunately mesh can't be detected, so rotated items often detected wrong. Like pulsegun placed on side.)

Same with check paths -only things, about which you can be sure.
User avatar
OjitroC
Godlike
Posts: 3746
Joined: Sat Sep 12, 2015 8:46 pm

Re: MapChecker

Post by OjitroC »

That's interesting and clarifies a lot of things about MapChecker :tu:

One thing that does occur to me is that it would be nice if one was able to select which fixes to run. It would be useful to be able to move the inventory without fixing anything else (possibly because some of the other 'fixes' are not really needed in a particular map). So there may be cases where running all the fixes is not desirable.

I would say in passing that I use both MapChecker and MapGarbage to alert me to possible issues with NavigationPoints and then check out each individual reported issue to see whether they need to be addressed. In general, I'm not too concerned about PlayerStarts not having connections (especially in sniper maps where the Start may be isolated from any path) nor about Pathnodes without incoming connections (though it depends where they are - mostly though it's OK if the Pawn can find a path away from the PathNode).
Buggie
Godlike
Posts: 3130
Joined: Sat Mar 21, 2020 5:32 am

Re: MapChecker

Post by Buggie »

This tool I initially make for myself, since tired do same things and forget it. Like automated tests.
"Fixes" there is mostly for my internal usage. I not advertise it. It usually good enough, but sometimes they use some assumptions. So blind use it not recommended.
I try keep tool clean and easy for add new options. now it basically add function and append name for it. With manual run each option it make add new options much more complicated.
I not want this.

But sometimes I too suffer for missing ability apply only certain fixes. :D
Buggie
Godlike
Posts: 3130
Joined: Sat Mar 21, 2020 5:32 am

Re: MapChecker

Post by Buggie »

Added more checks:

Code: Select all

	checkBadDrawScale();
	checkSpawnCTFFlag();;
Updated in first post: viewtopic.php?f=5&t=14809
User avatar
sektor2111
Godlike
Posts: 6435
Joined: Sun May 09, 2010 6:15 pm
Location: On the roof.

Re: MapChecker

Post by sektor2111 »

Buggie wrote: Mon Mar 27, 2023 6:57 pm PathNodes without "in" paths not hurt and completely normal.
It depends on spot, I sampled already some broken maps due to this chapter. Nodes that are supposed part of a route will cause fractures that discards Pawn from taking that way - and you know very well what's up here. The route is internal chain calculated from goal based on ReachSpecs linking nodes point to point, a single missing Spec will clearly break the chain.
In some "edited map" like MH-LiandriInvasion_MHM (whatever was renamed), simply adding a SpawnPoint for some stupid pupaes in an upper position had completely broke Pathing. Original worked, the "fixed" map has ceased to work, and yes, there was nothing as incoming path - UnReachable Node. QueenDest points are also big, I doubt to see more routes through those points...

I did such checks using RememberSpot and ShowPath testing commands, clearly Nodes causing break-points were exactly these lousy nodes that were placed in bad spots, Editor figuring them UnReachable and not creating Specs for them.

If you need two Sample Maps for proof it's a waste of time, but if you insist I'll do them and the flawed one won't be that "normal" at all. You know the stage: One tunnel like an "U" or "N", PlayerStart at Left, a HealthVial or a weapon + Ammo at Right, not visible from Start. Spectate a Bot in map with a single PathNode broken and see what it does...
Buggie
Godlike
Posts: 3130
Joined: Sat Mar 21, 2020 5:32 am

Re: MapChecker

Post by Buggie »

Added more checks:

Code: Select all

	checkXVehiclesZones();
	checkXVehiclesFactoriesNavigationPoint();
Updated in first post: viewtopic.php?f=5&t=14809
User avatar
Barbie
Godlike
Posts: 2911
Joined: Fri Sep 25, 2015 9:01 pm
Location: moved without proper hashing

Re: MapChecker

Post by Barbie »

Suggestion for enhancement:
MapChecker: Actors change DrawScale but use same CollisionRadius and CollisionHeight:
suppress this message if Actor has no collision flags set.
"If Origin not in center it be not in center." --Buggie
Buggie
Godlike
Posts: 3130
Joined: Sat Mar 21, 2020 5:32 am

Re: MapChecker

Post by Buggie »

It already do:
(A.bBlockActors || A.bBlockPlayers || A.bCollideActors || A.bCollideWorld)
But I about improve it.

Into
(A.bCollideActors || A.bCollideWorld)
User avatar
Barbie
Godlike
Posts: 2911
Joined: Fri Sep 25, 2015 9:01 pm
Location: moved without proper hashing

Re: MapChecker

Post by Barbie »

Take for example class'Plant1': it has bCollideWorld=TRUE and all other FALSE; there should be no need to check default DrawScale against collision size.
"If Origin not in center it be not in center." --Buggie
Buggie
Godlike
Posts: 3130
Joined: Sat Mar 21, 2020 5:32 am

Re: MapChecker

Post by Buggie »

If you not care at all about collision, why bCollideWorld at all set to true?

Fo r plant this done for place it on map not inside wall. But if you scale it you wanna see how collision change too.

Also, what about movers? They considered as World. So such plant must collide with it, and possible move, if able do this.
User avatar
Barbie
Godlike
Posts: 2911
Joined: Fri Sep 25, 2015 9:01 pm
Location: moved without proper hashing

Re: MapChecker

Post by Barbie »

Buggie wrote: Wed May 10, 2023 6:26 pmIf you not care at all about collision, why bCollideWorld at all set to true?
Idk, it is the default setting.
Buggie wrote: Wed May 10, 2023 6:26 pmBut if you scale it you wanna see how collision change too.
Maybe your workflow is different from mine: if I add plants I usually vary their size and rotation and adjust them by visuals, not by collision cylinder. The latter is only of interest if the plant should block players.
And another thing I stumbled over:
MapChecker: Inventory without MyMarker:
MapChecker: InventorySpot without MarkedItem: 1
But MapChecker doesn't tell what Inventory(Spot)s are concerned.
"If Origin not in center it be not in center." --Buggie