Need More Fixes ?

Posts about Nelsona's findings in UT!
Post Reply
User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Mon Aug 27, 2012 1:06 pm

After solving a small bug related to fixing a mesh for squid (thanks sis. for alarming me). Maybe is time or not to describe the black side of an attached-revorked MH version.

- A few guys might be jealous for a game without hundreds of accesed nones - will try to slap the new technology developing craps unplayable - even no one of them is able to handle A.I. (any type);
- Spamming type, thinking at this method for increasing difficulty might be delivered using other ideeas, classic style isn't accepted any longer (I already noticed such map - no many votes indeed, players leaving - but author maybe has a lower I.Q. to notice what kind of creation just did);
- high number of monsters assumed to be busy with self fighting might increase difficulty because they are friends now - noobs might run away;
- Maybe more - I won't tell about them - You don't know why ? Good.

Choosing from playing default MH503 and other one reworked. I'm half triggered for 2 ways: 1) A reworked MH; 2) Maybe I'll do a kind of MH v504 or v6. This last one should be simple letting people to pick a loved mutator for it (not UTJMH - they are containing a bad move in MH). In other way, option 2) is a hard challenge - Why ? OLD Weapons for replacements - They totally need a rework - Why again ? Learn a bit of coding and look at them, Phew.
For a version improved already might be used simple regen mutators - (like SMO series but fixed ini for latest one), even an anti-Grab tool, a server controller if is required by admins. Other requirements can be coded, but not tools for stunts (out of my pleasure - I won't support trashes in MH).

Now I have to play for hunting unwanted bugs.

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Thu Sep 06, 2012 3:47 pm

Another short subject. My opinions for A.I. levels related to MH (do not confuse with other ideeas):
- (-1) - default MH, monsters atacking each-others, doing damage each-others and ruining the fun;
- (0) - they are fighting without damage (first fix related to MH);
- (1) - They aren't do damage or fight, just small attempts - is currently used;
- (2) - They are friends - no damage for each-other, no self fight, just interest to hunt player even helping each-other - used by Mars and Me;
- (3) - reserved slot - (I'll see if deserve effort to complete this after a few attempts to increase the speed of controller again to gain resources). In this level monsters aren't fighting themselves, damage for each-other 0, self damage = full (no fun to fire a door like a dumbass - is punished with death :P, killed by itself), and this formula might contains small features. If is a map bStupidMap=False, exist 150-180 monsters on map, movers 0 or less than some X value, this means exist some options to travel, also if MonsterEnd trigger is a big one - teleporters not so many (I think is not funny to attempt travelling through an inactive teleporter). After starting match, monsters from map are going to get mad trying to hunt player with any price without default behavior to wait their death. If these conditions aren't completed monsters will act normally (friends, and hunting player who race in map closer).

This kind of level 3 of A.I. is somehow limited. Exist maps Gods style, Assault style, Mission style, etc (argh I forgot - Dumb style - player is bored fast by such a "great map"). This new A.I. feature is based on let's say DM style or some Arena style. I think there are very few maps like this type required for level 3 (hunt player doesn't matter if is guilty or not, must die). I'm thinking and studying how many maps can develop this "last level ? :mrgreen: ". I was thinking to develop removal of any fear but here is not recommended this last tweak (I think might crash server). The most important problem for level 3 is very good pathing - not really red paths, good geometry and blue paths well defined (I think is hard to find such maps). Anyway sooner or later I'll try to draw a few cubes and to convert common DM stock maps to MH.

medor
Posts: 86
Joined: Wed Feb 16, 2011 8:08 am

Re: Need More Fixes ?

Post by medor » Fri Sep 07, 2012 1:19 am

just a simple idea

may be an option to appear when you're dead
it is too maps where we must all recross for return to combat

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Fri Sep 07, 2012 10:05 am

Indeed is a bit necesary this feature but:
- Mappers won't ever learn to set up a second spawnpoint;
- PlayerStart is a NavigationPoint - spawning them might be a bad ideea, is like adding pathnodes without rebuild paths, for this reason I'm staying away to alter PathNet because bad things might occur;
- Maybe other thing dropped during death can help player to teleport at that location - this maybe is easy or not, I didn't looked for such features (sometimes I'm wander if a certain thing added if is abused by 10 players how will be the game). I noticed this abusive attitude related to HealGun, over 100 weapons spawned - maybe a protest for a crappy map, I don't know I just left that server.

From my side player deserve nothing, just normal things necesary. If admin is too kind giving a finger, player will bite entire hand, legs, everything and will ask more. That's why I removed all weaponry options from mod, I have optional NsWeaponLoader2 and I'm using maps with a minimum of inventory as ruled in any map by Epic not by "mappers" with intention to remove it, I cannot really do this for a few maps, not bad but without a logic placement of inventory.

Yeah, I know a very long map (if you see a reason to have that in server, use it) I won't use that before to slap all craps out from it. Maybe you know what is about, but let me explain a few things:
- long map with repeated zones make player bored;
- dumb monsters health and no healing spots or ammo - is not a MH map - is just an attempt... LOL;
- all kind of packages containing weapons and assumed monsters (out of default scoring system - 1 point to kill a huge monster is bullshit without AltScoring system) - have fun with custom monsters containing custom errors - this wasn't tested of course;
- if I tell you how were set monsters, with a bit of coding experience you will be conviced as being a server crash attempt and maybe you will get ideea to hunt him down. So maybe I don't need to mention anything.

You told about a future MH without errors ? Already exist, unfortunately maps are destroying server not mod. So I warmly recommend to even pay a mapper to put some fixes where things are brought from Lunatic Asylum, to ruin them. If a dude is pissed off, send him links to tutorials, give him a chance to learn something.

Last time I checked a few maps to see if deserve adding A.I. Level 3, more I see, more disgusted I feel. I think is time to not do anything, just maybe checks to fix mistakes from INI-s (in case).

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Sat Sep 08, 2012 8:19 am

K.O. ? I think I noticed engine limit, phew. Level 3 seems to be possible for a few pawns (like a DM loaded with a few Bots) or I think I made a bad move. Bad instigator I think worked because I noticed worse lags even in a normal map. That's it, no problem I'll check other solution but I have to think. Dynamic Pawns like a Bot (triggering this to monster seems to blow up the engine). Looking at PC behavior (I just restarted it to restore order) will be better to find another way or to leave alone my most wanted Level 3. :cry:

Continuing...

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Sat Sep 08, 2012 3:07 pm

Native crashes seems to be a very hard deal. I don't know if I can slap down bad coded classes in original, grr. This time monsters are guilty for bad things...

What can I do ? Let me think if this deserve some hours of work or not...
I won't compute how much time passed from last crash but today I've seen a reminder about "red flag".

Mr. Medor, depending on map (most cases) a MH server might crash especially if has activity. Bad coding in original will deliver only troubles, fixes might be a challenge. Nobody wants to deliver let's see 452 version with important fixes, or like should be done in initial release. I think is not necesary to post anywhere all crash-logs collected last period 2011-2012 based on native troubles and other original errors. I don't want to disturb people about assumed awards. I leave them to enjoy their fake skills and to be happy.

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Sun Sep 09, 2012 4:27 am

First I have to modify a bit a map to see what is going on. Later I'll test another technology in triggering the fight and breaking loops if possible.

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Mon Sep 10, 2012 3:30 pm

:mrgreen: I repeated a map who crashed randomly, after a long time. It seems OK now.

Map mentioned in other topic by EG containing a Bot was interesting now B99-MinasTirith. I just armed Bot from map and she(he ?) killed more monsters in Castle before to open gates doing a good job (better than us - fighters from outside), was really mad dodging and fighting.

Other chapter - Shrimp wasn't agree with Insta. Good ! And I respect this wish as follows, without alter pawns with Insta replacing it and messing up Skaarj:

Code: Select all

	if ( Other.IsA('SuperShockRifle') )
	{
//		log ("An ESR was fixed.");
		SuperShockRifle(Other).AIRating = 0.910000; //Let me see...
		SuperShockRifle(Other).hitdamage = 200; //... And ... Enjoy it ...
	}

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Mon Sep 24, 2012 3:27 pm

I'm back a bit with an observation related to A.I. for MH - Bot side more exactly. Loading 5 Bots will see at least 1-2 Leaders bumping some help. Hm, but they don't make any interesting move just collecting nearby inventory. If such a Leader wants to have a party supported by other "guy" is time to tell him what is about.
If variable bStupidMap=False the Leader will attack indeed sustained by his servant bumped in "Cover Me" Order. Is more properly than to do nothing because I didn't set any order. Is matching better their default team rules - Good for very noobs who doesn't know to set orders, LOL, making A.I. to lead attack.

Maybe for future, just maybe - I ought to test these with more than 800 monsters:
- Telling to team that he just found a monster boss, randomly;
- Telling about some wander (when is lost out of paths) ?;
- Telling his position when reached at end even waiting for victory and waving ?;
- Others ? More personality ? Calling idiot the player who camps near playerstarts ?

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Mon Oct 22, 2012 12:47 am

Nope, there aren't necesary all kind of cool tweaks, will slow down A.I. too much due to a heavy load, even I removed some lines to speed up things.
Maybe you should look a bit at default attitude:

Code: Select all

function byte AssessBotAttitude(Bot aBot, Pawn Other)	//Added
{
	if ( Other.IsA('PlayerPawn') || Other.IsA('Bot') || Other.IsA('Nali') || Other.IsA('Cow'))
		return 3;
	else
		return 1;
	return super(DeathMatchPlus).AssessBotAttitude(aBot, Other);
}
No longer necesary CanSee checks for Bot since default attitude is triggered native. Is not the same for monsters. They cannot be handled easily so we have a half of code:

Code: Select all

function bool FindSpecialAttractionFor(Bot aBot)
{
	local Pawn P;
	local ScriptedPawn S;
	local bool bFound;
	local NavigationPoint N;
	local NsWayPoint WP;
	local NsWayPoint NextPoint;
	local NSMonsterEnd E;
	local int ActualP;

	if ((aBot != None) && (aBot.Health < 1))
	{
		aBot.GotoState('GameEnded');
		return false;
	}

	if ( aBot.LastAttractCheck == Level.TimeSeconds )
		return false;

//	foreach aBot.VisibleActors(class 'ScriptedPawn', S)
//	foreach AllActors (class 'ScriptedPawn', S)
	for (P=Level.PawnList; P!=None; P=P.NextPawn)
	{
	S = ScriptedPawn(P);
	if ( S != None && S.Health > 0)
	{
	if (S.IsA('Nali') || S.IsA('Cow') || VSize(aBot.Location - S.Location) > 4500)
            continue;
	if (S.LineOfSightTo(aBot))
	if (S.Enemy == None || VSize(S.Location - S.Enemy.Location) >
		VSize(S.Location - aBot.Location)+200)
		{
		if ((!S.Region.Zone.bWaterZone && !aBot.Region.Zone.bWaterZone )
			 || (aBot.Region.Zone.bWaterZone && !S.Region.Zone.bWaterZone && S.bHasRangedAttack)
			 || (!aBot.Region.Zone.bWaterZone && S.Region.Zone.bWaterZone && S.bHasRangedAttack)
			 || (S.Region.Zone.bWaterZone && aBot.Region.Zone.bWaterZone))
			{
			S.Hated = aBot;
			S.Enemy = aBot;
			S.GotoState('RangedAttack','ReadyToAttack');
			if (aBot.Enemy == None || (VSize(aBot.Enemy.Location - aBot.Location) > VSize(S.Location - aBot.Location)+200 && FRand() > 0.35))
				{
//				aBot.Enemy = S;
				aBot.GotoState('Hunting', 'SpecialNavig');
				}
			}
		}
/*
	if (aBot.LineOfSightTo(S))
	if (aBot.Enemy == None || VSize(aBot.Location - aBot.Enemy.Location) >
		VSize(aBot.Location - S.Location)+200)
		{
		if ((!S.Region.Zone.bWaterZone && !aBot.Region.Zone.bWaterZone)
			 || (aBot.Region.Zone.bWaterZone && !S.Region.Zone.bWaterZone && (S.bHasRangedAttack || S.Event != ''))
			 || (!aBot.Region.Zone.bWaterZone && S.Region.Zone.bWaterZone && (S.bHasRangedAttack || S.Event != ''))
			 || (S.Region.Zone.bWaterZone && aBot.Region.Zone.bWaterZone))
			{
			aBot.Enemy = S;
			aBot.GotoState('Hunting','SpecialNavig');
			if (S.Enemy == None || (VSize(S.Enemy.Location - S.Location) > VSize(aBot.Location - S.Location)+200 && FRand() > 0.35))
				{
				S.Hated = aBot;
				S.Enemy = aBot;
				S.GotoState('RangedAttack','ReadyToAttack');
				}
			}
		}
*/
	}
	}
	aBot.LastAttractCheck = Level.TimeSeconds;
	if ( !aBot.IsInState('Roaming') && aBot.Enemy == None && FRand() > 0.4 )
			{
			aBot.bNoClearSpecial = True;
			aBot.GotoState('Roaming', '');
			}

//********* Section added... Is not the perfect ideea but might help enough, :P...
	if (aBot.Orders == 'Freelance')
		aBot.bLeading = True;

	if ((aBot.OrderObject != None && aBot.Orders == 'Attack') || aBot.Orders != '' )
	{	
		if (aBot.IsInState('Roaming') && !bStupidMap && (aBot.MoveTarget == None || aBot.MoveTarget.IsA('InventorySpot')) && aBot.Enemy == None && FRand() > 0.45)
		{
//		ForEach AllActors(class 'PathNode', PN) //Nah, faster
		for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint )
			{
			if (N != None && N.IsA('Pathnode'))
				{
			ActualP = Vsize(aBot.Location - N.Location);
			if ( ActualP > 2500)
					continue;
			if ( ActualP > 80 && aBot.CanSee(N) && ((aBot.Location.Z - N.Location.Z) > -95) && !aBot.Region.Zone.bWaterZone && !N.Region.Zone.bWaterZone )
				{
				if (aBot.ActorReachable(N))
						aBot.Target = N;
					aBot.MoveTarget = N;
//		BroadcastMessage(aBot.GetHumanName()$": I'm forcing a desired temporary destination...");
					aBot.bCamping = False;
					aBot.MoveTimer = 1.0;
				if (aBot.MoveTarget != None)
					{
					SetForcedStateFor(aBot);
					return True;
					}
				}
				}
			}
		}
	}
//********** End of section added...
	if (aBot.Orders == 'Attack' && ( aBot.Enemy == None || Vsize(aBot.Enemy.Location - aBot.Location) > 1500 ) || (aBot.bLeading && FRand() > 0.2 && ( aBot.Enemy == None || Vsize(aBot.Enemy.Location - aBot.Location) > 1500 )))
	{
		foreach AllActors( class 'NsWayPoint', WP )
		{
			if (!WP.bVisited && (WP.Position == LastPt + 1))
			{
				NextPoint = WP;
				if (aBot.ActorReachable(NextPoint))
					aBot.MoveTarget = NextPoint;
				else
					aBot.MoveTarget = aBot.FindPathToward(NextPoint);
				NumPts --;
			if ( aBot.MoveTarget != None )
				{
				SetAttractionStateFor(aBot);
				return True;
				}
				else
				{
					if ( aBot.bVerbose )
					log(aBot$" - I cannot see a way to hunt, Wtf can I do now ?");
				return False;			
				}
			}
		}

		if (NumPts <= 0)
		{
		foreach AllActors (class 'NSMonsterEnd', E)
			{
			if (E != None)
				{
				if ( aBot.ActorReachable(E) )
					aBot.MoveTarget = E;
				else
					aBot.MoveTarget = aBot.FindPathToward(E);
				if ( aBot.MoveTarget != None )
					{
					SetAttractionStateFor(aBot);
					return True;
					}
				else
					{
			if ( aBot.bVerbose )
			log(aBot$" - No path to End, Wtf can I do now ?");
			return False;
					}
				}
			}
		}
	}
    return false;
}

function SetForcedStateFor(Bot aBot)
{
	aBot.bNoClearSpecial = true;
	aBot.TweenToRunning(0.1);
	if (Vsize(aBot.MoveTarget.Location - aBot.Location) < 600)
		{
		aBot.Movetarget = None;
		aBot.GotoState('Roaming','SpecialNavig');
		}
}
Imagine that NsWayPoint is now protected:

Code: Select all

function Touch ( actor Other )
{
	if (!bVisited && bEnabled && (Other.IsA('PlayerPawn') || Other.IsA('Bot')))
	{
		if (MonsterHunt2(Level.Game).LastPt + 1 == Position) //Cough, no more triggered earlier...
		{
		if ( Other.IsA('Bot') )						//Added (for spam :P)
			Bot(Other).SendTeamMessage(None, 'OTHER', 11, 15);

		if ((TriggerActor1 != None) && (Other.IsA('PlayerPawn') || Other.IsA('Bot')))// K.O. to idiotic things...
			{
			if (TriggerActor1.IsA('Mover'))
				TriggerActor1.Bump(Other);
			TriggerActor1.Trigger(Self, Pawn(Other));
			}
..........
Done enough ?

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Wed Oct 24, 2012 12:24 am

I don't think is done enough. I have to adjust a few details, hm. Why I have to look at artificial hunters how are runing often right at enemy (native behavior) even we can talk about a Queen or a Titan ? These enemies are the mostly very strong and there is no chance to fight with them in closer combat. I'm working to develop as much as possible moving around a point without to go closer in harmfull zone, until this moment I noticed a few more seconds of resistance not dying immediately but I think still not matching the right strategy for such cases.

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Sat Oct 27, 2012 1:00 am

Yeah, I tested a few instances, the mostly A.I. need somehow a rework to be better (aren't welcomed to be smarter than players :P) so I won't load useless A.I. controller, another small thing doubled by Epic was solved (no need more programming jumps and a double check for spectators - LOL).

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Sat Oct 27, 2012 1:47 am

Gooood... Let's take a look a bit in Old weaponry chapter, maybe a few people will be agree with me when I'm calling them trash, even I'm not expert in weapon design ...

We know Eightball ? Maybe. We launch a grenade in AlternateFire. Grenade will explode sooner or later. We cannot notice this. Why ? Explosion is silent. (Somebody pushed mute buton on remote controll ? FYI !)

This explosion is another coding bullshit, first I'll present the bug explaining a bit...

Code: Select all

	if ( Level.NetMode != NM_Client )
		MakeSound();
	Texture = SpriteAnim[int(FRand()*5)];	
	if (Level.NetMode==NM_Standalone) 
		SetTimer(0.05+FRand()*0.04,False);
	Super.PostBeginPlay();
Which means:
- If this version is not runing as client make some noise, heck. What if I'm client then ? Retards ? Who knows ?
- If I'm playing StandAlone I have a timer. If I'm not StandAlone... Good night !

Here is some Net code more properly indeed:

Code: Select all

simulated function PostBeginPlay()
{
	if ( Role == ROLE_Authority )
		MakeSound();
	if ( !Level.bDropDetail )
		Texture = SpriteAnim[Rand(3)];	
	if ( (Level.NetMode!=NM_DedicatedServer) && Level.bHighDetailMode && !Level.bDropDetail ) 
		SetTimer(0.05+FRand()*0.04,False);
	else
		LightRadius = 6;
	Super.PostBeginPlay();		
}
That's it, I have to rework trashes.
Now I'm no longer wander why Monsters WeaponHolders might have troubles with weapons. A few things aren't ok if we make sound in server or decals or craps belongs to player only.

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Thu Nov 01, 2012 1:26 am

Code: Select all

Didn't find any player starts in list for team 0 !!!
LOL, attempt to force other game than MH in MH play will be removed - even not happened in my version - I hate assumed errors spaming console. Is time to remove this, I need only usefull logs not garbage ported to MH without to be MH.

User avatar
Nelsona
Posts: 998
Joined: Sun Mar 06, 2011 11:45 am
Location: Still at Keyboard
Contact:

Re: Need More Fixes ?

Post by Nelsona » Thu Nov 08, 2012 6:09 pm

Other empty slot to be completed ? Yes, why not ? A.I. need to know what is important in MH. Now I think I stuffed their missing slots:

Code: Select all

function byte PriorityObjective(Bot aBot) //add
{
	local ScriptedPawn S;

	if ( S != None && (VSize(aBot.Location - S.Location) < 1500 )
			&& aBot.LineOfSightTo(S) )
		return 2;

	if ( aBot.Enemy == None &&  aBot.MoveTarget == aBot.FindPathToward(aBot.OrderObject) );
		return 1;

	return 0;
}
I'm studying (if I can find informations about "bestweight") a value related to paths, hm... I don't know if exist a tutorial related to this chapter.

Post Reply