Page 1 of 1

ZenCoder's fix for PlayerBots

Posted: Tue Apr 27, 2021 2:15 am
by evilgrins
I'm not a coder, doing scripts is not my strong suit... but I copy & paste with the best of them!
Image
I was toying with this for awhile, before I actually tried it... and admittedly screwed up a map I'd been editing for a very long time.

The annoying thing about summoning playerbots, or editing them directly onto a map, is they can't be team assigned and they all show up on the scoreboard as "Player". This is especially annoying if you are working with more than one of them. But due to a recent map edit I've been working on, 1 of 4, I discovered there's been a work-around for this that I somehow never noticed before...

...which was especially annoying as I've been asking if this were possible for years and everybody told me it couldn't be done!

Part of the mapping edits I've been working on is this map:
https://unrealarchive.org/maps/unreal-t ... a6ea8.html
That map is especially interesting as it has a playerbot embedded into the map, but it's on the Red Team and it actually has a name. So I studied how that was setup to see if I could do it, while I did a review of more of ZenCoder's work to see if he'd done similar anywhere else.

As I've since learned, this method only works with one player model type at a time, you can setup multiple bots on the map this way but they each have to be a different model... which may explain why ZenCoder only had one on one team. But the basic code is pretty simple:
//=============================================================================
// Ronald.
//=============================================================================
class Ronald expands MaleOneBot;

function PostBeginPlay(){
PlayerReplicationInfo.PlayerName = "Ronald the Clone";
PlayerReplicationInfo.Team = 0;
}

With slight alterations, I've used that on 5 different player models for a few maps already... but as stated, I can only do that with one player model per team (if I've got a Boss model on 1 team I can't have one on the other team). Try to do 2 with that on any map, the map won't work and you'll have to start over from scratch.

I did find another map ZenCoder had done this on:
https://unrealarchive.org/maps/unreal-t ... ea07d.html
This time around it was the Abbey model and it was for more than one of the same model type.

That looks like this...
//=============================================================================
// Amazon.
//=============================================================================
class Amazon expands AbbeyBot;
var() int myTeam;

function PostBeginPlay(){

PlayerReplicationInfo.Team = myTeam;
if ( myTeam == 0 ) {
PlayerReplicationInfo.PlayerName = "Sheena";
multiskins[0] = texture'MyLevel.Amaz1T_0';
} else {
PlayerReplicationInfo.PlayerName = "Xena";
multiskins[0] = texture'MyLevel.Amaz1T_1';
}
}

The screenshot at the top of this post was my attempt to do it, and it worked. I'm doing a re-edit of the CTF-ColaWars map.

Now, I only know how to use it to the extent of making slight variables in what's there, but I'm no coder. I can't make them do auto-taunts, I can't alter their skill level (which is probably a good thing) but I can use them fairly basically for fillers.

Just wanted to share, and to those who told me this was impossible... I will have blood vengeance!

But, moving right along, there are still complications.

For the 1st version you have to skin the model after you place it on the map, but with the 2nd version you can skin it in the code so long as the skin is 1 texture for the entire model. However, if the model is a multi-texture deal then you're better off skinning it as with the 1st version...

...though those better at coding might be able to find work-around for that too.

Re: ZenCoder's fix for PlayerBots

Posted: Tue Apr 27, 2021 3:42 am
by Kelly
Leaving a bookmark here for when Nels sees this and loses his shit.

Re: ZenCoder's fix for PlayerBots

Posted: Tue Apr 27, 2021 5:32 am
by Nelsona
Blah blah, no fix for state dying and no shadow. I feel something like n00b years 2001

Code: Select all

//=============================================================================
// Ronald.
//=============================================================================
class Ronald expands MaleOneBot;

function PreBeginPlay()
{
	Super.PrebeginPlay();
	Level.Game.AddDefaultInventory(Self); //Doesn't work right now, next time I'll write these different
}

simulated function PostBeginPlay()
{
	if ( ROLE == ROLE_Authority )
	{
		PlayerReplicationInfo.PlayerName = "Ronald the Clone";
		PlayerReplicationInfo.Team = 0;
	}
	if ( Level.NetMode != NM_DedicatedServer )
		Shadow = Spawn(class'PlayerShadow',self);
}

state Dying
{
ignores SeePlayer, EnemyNotVisible, HearNoise, Died, Bump, Trigger, HitWall, HeadZoneChange, FootZoneChange, ZoneChange, Falling, WarnTarget, LongFall, SetFall, PainTimer;

	function ReStartPlayer()
	{
		if( bHidden && Level.Game.RestartPlayer(self) )
		{
			Velocity = vect(0,0,0);
			Acceleration = vect(0,0,0);
			ViewRotation = Rotation;
			ReSetSkill();
			SetPhysics(PHYS_Falling);
			GotoState('Roaming');
		}
		else
			GotoState('Dying', 'TryAgain');
	}
	
	function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, 
							Vector momentum, name damageType)
	{
		if ( !bHidden )
			Super.TakeDamage(Damage, instigatedBy, hitlocation, momentum, damageType);
	}
	
	function BeginState()
	{
		SetTimer(0, false);
		Enemy = None;
		AmbushSpot = None;
		bFire = 0;
		bAltFire = 0;
	}

	function EndState()
	{
		if ( Health <= 0 )
			log(self$" health still <0");
	}

Begin:
	Sleep(0.2);
	if ( !bHidden )
	{
		SpawnCarcass();
		HidePlayer();
	}
TryAgain:
	Sleep(RandRange(1.00,3.5));
//	Sleep(0.25 + DeathMatchGame(Level.Game).NumBots * FRand()); //Virus destroyed ! Just like that.
	ReStartPlayer();
	Goto('TryAgain');
WaitingForStart:
	bHidden = true;
}
Actually that Ronald map has already these, but, as usual, we are posting only poorly written codes :tease: . To not forget that Bot can actually jump higher in initial stage being initialized by BotPack and not by nothing. Pawn needs a bit of love and then it will jump on a heavy pathed box or else it loops jumping, like here...
HardCore_Path.PNG
HardCore_Path.PNG (1.4 MiB) Viewed 6729 times
Boo !

Re: ZenCoder's fix for PlayerBots

Posted: Tue Apr 27, 2021 10:16 am
by Nelsona
Next rant ? Of course, why not ?
Do the mapper really need to recompile a class for a stupid name of a clown unable to jump properly ?
Definitely not. All these can be a package dedicated for going in MyLevel and... having a configurable "UsedName" and "TeamNumber" variables in seconds.
The code should/could manage JumpZ for being aligned at original Bot-Type jumpy capability depending on game settings. May I ask where are these fixes ? Answer: Nowhere, exactly, no fix. It was only a lousy obsession about a Name and the rest... let's load f...g Accessed Nones trashing a good CTF session.
I had to pick between two things: Giving up at jumpy route because Clown was physically retarded, or teaching Clown to jump.
I picked the second option, ALL Pawns should jump, especially in Hard-Core setup - I went for adjusting value directly.

And now the maths lesson for dummies.
Engine says: GameInfo is waiting for a quick examination.

Code: Select all

function AddDefaultInventory( pawn PlayerPawn )
{
	local Weapon newWeapon;
	local class<Weapon> WeapClass;

	PlayerPawn.JumpZ = PlayerPawn.Default.JumpZ * PlayerJumpZScaling();
}
Resulting stupid Clown code:

Code: Select all

JumpZ = Default.JumpZ * Level.Game.PlayerJumpZScaling(); //357.5
And if we don't like FLOATING junks:

Code: Select all

JumpZ = int(Default.JumpZ * Level.Game.PlayerJumpZScaling()); //357
Here it's in account Level.Game which might need a check in a simulated function because a client doesn't have such things and it loads another crapped result of an invalid code execution.
Resulting

Code: Select all

	if ( Level.Game != None ) //Needed if it gets called in simulated fock-tions
		JumpZ = int(Default.JumpZ * Level.Game.PlayerJumpZScaling()); //357
Good ? Maybe not and it can be a bless fixing Roaming :: PickDestination as well... Without a weapon this dumb prick does only errors.

To summarize: As long as I'm trying harder to write my codes without errors as much as possible, I don't see why would I use other incomplete codes instead of my codes or messing up with bad settings. Bot placed over a weapon will fall and it picks weapon immediately before having any issue. Later if it respawns it will be loaded by GameInfo/DeathMatchPlus. Reminder: It's year 2021 not 2001. This is a reason for which I cannot be fooled that easy about a fix announced with whistles and bells like I was in 2007-2008...
As for naming sake of naming a Bot embedded inside a map, I already sent privately to a guy a map with a TBossBot which went called "Da Boss" using a little actor attached in map without other bot class. What a new Pawn can do internally, a closer actor can do to a stock pawn without any issue. Bot (not Bots) will follow game directives as well, not only roaming here and there without purpose.
Let's see what is about concerning original Bot stuff at this point...

Code: Select all

class MyInsBot expands Actor;

var() int ATeam;

Auto State() SettingMyBot
{
Begin:
	Sleep(0.2);
	CaptureAndSetMyBot();
	Sleep(0.5);
	GoToState('');
}

function CaptureAndSetMyBot()
{
	local Bot ABot;

	foreach RadiusActors(class'Bot',ABot,150)
	{
		if ( ABot.PlayerReplicationInfo != None )
		{
			ABot.PlayerReplicationInfo.PlayerName = string(ABot.Tag);
			if ( Level.Game.bTeamGame )
				ABot.PlayerReplicationInfo.Team = ATeam;
			Level.Game.AddDefaultInventory(aBot);
			break;
		}
	}
}
All it needs is adding this actor nearby Bot, defining team and Bot will have name identical with TAG used.

Now... let me know if you can make such a Clown (Bots-type not BotPack.Bot) to get Enemy Flag and bringing it at home in plain fields (no JumpSpots usage and other Bot specific tools). Eh ?

Re: ZenCoder's fix for PlayerBots

Posted: Tue Apr 27, 2021 3:15 pm
by evilgrins
Nelsona wrote: Tue Apr 27, 2021 5:32 amwe are posting only poorly written codes :tease:
Image Image
Perhaps someday I will learn to do better, but as for now... still not a coder.
Kelly wrote: Tue Apr 27, 2021 3:42 amLeaving a bookmark here for when Nels sees this and loses his shit.
Loses his shit in a happy way or in a reach thru the screen and try and kill me way?

Good to know in advance, so I can decide if I need to lean back.

Re: ZenCoder's fix for PlayerBots

Posted: Tue Apr 27, 2021 3:33 pm
by Nelsona
evilgrins wrote: Tue Apr 27, 2021 3:15 pm Perhaps someday I will learn to do better, but as for now... still not a coder.
Neither me, I'm a technician not a coder, and then... I was digging for a better solution at these embedded bots. DeathMatchPlus sends them in State Dying-WaitingForStart this way preventing lousy pawns from dodging out of normal settings assigned for Pawn (Inventory and Physics) - concerning Bot not old Bots. So what do we have here more exactly ? We have Pawn and external entity "DeathMatchPlus" managing this Pawn, not pawn itself and then I was doing things in the same way as UT does, not as "coders" do.
For older "Bots" code probably is the same but... Using string 'Bots' not 'Bot', state code having the similar labeling.

Re: ZenCoder's fix for PlayerBots

Posted: Fri Apr 30, 2021 2:55 pm
by Kelly
Nels can come across as confrontational but I don't think he's at all like that. It's more a cultural difference I think. Few people take more time to explain things than he does and he for sure knows what he is talking about. He just doesn't like broken things in maps and he's probably going to add a filter to kill these in his map fixer :lol: after he gets done telling you why they are not a good idea. (He's right, they aren't.) If you are REALLY nice to him he might even fix them for you so they won't break stuff. He's damn good at that.

And yeah, you might lean back a little. It wouldn't hurt.

Re: ZenCoder's fix for PlayerBots

Posted: Fri Apr 30, 2021 5:41 pm
by evilgrins
Kelly wrote: Fri Apr 30, 2021 2:55 pmIf you are REALLY nice to him he might even fix them for you so they won't break stuff.
He already did, in the ut99.org forum.
Kelly wrote: Fri Apr 30, 2021 2:55 pmAnd yeah, you might lean back a little. It wouldn't hurt.
Eek!