Pawn Jump ,Force might stuck the pawn

Topics regarding Scripting with Reality Factory
Post Reply
Veleran
Posts: 891
Joined: Mon Aug 22, 2005 10:22 am
Location: Greece

Pawn Jump ,Force might stuck the pawn

Post by Veleran » Sat Jul 14, 2012 1:19 am

I was setting up a side scrolling platformer level and the Pawn player s head gets stuck on the bottom edge of the platform each time he collides it.
Also speeds up and slides without reason like when you use the standard player and have the realistic jumping on.

Is this a bug from source coding (means out of my abilities) of a pawn.ccp -like file or does the script can fix it with appropriate commands?

Also,the jumping is worse than the standard Player,i can not change falling direction after i hit jump like he can do,and would like an example for how to do that,please.

You can try the script if you want with a scripted player and start to jump under a platform box that is low enough for the player head to hit it.


it is the old playercontrol script ,modified slightly to the move left and right direction.
the pawn i first used it had all idle animations,but it does not matter to the bug anyway.

Code: Select all

{
	//Attributes
	FIREEFFECT [SlowSmoke] // muzzleflash effect
	GROUP [Friendly] // Pawn Group - must be targetted by enemies
	PLAYERSPEED [90] // Walk Speed
	HEALTHATTRIB [health] // health attribute given to pawn
	HEALTHAMOUNT [500] // amount of health given to pawn
	BOX [24] // Box width
	WEAPONS [3]
	{
	    0 [MartialArts]
	    {
		    MODE [melee]
		    STYLE [1]
		    SPEED [8]
		    POWER [5]
		    MOVES [0]
	    }
	    1 [Pistol]
	    {
		    MODE [ranged]
		    STYLE [SEMI]
		    POWER [0]
		    SPEED [8]
		    AMMO [pistolbullet]
	    }   
	    2 [AssaultRifle]
	    {
		    MODE [ranged]
		    STYLE [SEMI]
		    POWER [0]
		    SPEED [20]
		    AMMO [riflebullet]
	    }
	    3 [Dwarfaxe1]
	    {
		    MODE [melee]
		    STYLE [SEMI]
		    SPEED [12]
		    POWER [25]
		    MOVES [1]
	    }
	}
	
	//Animation 
	IDLEANIM [Idle] // Idle AnimationSpeed
	SHOOTANIM [Idle] // Shoot anim
	MELEEANIM
	{
		SWORD [0]
		{
			MOVES
			{
				0 [Idle]
				1 [Idle]
			}
		}
		BAREHAND [0]
		{
			MOVES
			{
				0 [Idle]
			}
		} 
	}
	WALKANIM [Idle] // Walk anim
	RUNANIM [Idle] // Run anim
	BACKANIM [Idle] // walk back anim
	STRAFELEFT [Idle] // Strafe left anim
	STRAFERIGHT [Idle] // Strafe right anim
	INTERANIM [Idle] // Pawn interact anim
	JUMPANIM [Idle] // Jump anim
	JUMPSTARTANIM [Idle] // Jump initial anim
	FALLANIM [Idle] // Falling anim
	LANDANIM [Idle] // Landing anim
	DEATHANIM [Idle] // Death Anim
	ROOTBONE [DWARF FIGHTER BIP01] // Pawn root bone
	WEAPONHAND [DWARF FIGHTER BIP01 R HAND] // Pawn weapon bone
	

	//Input Keys    
	K_INTER [73] // INTERACT KEY - RIGHT MOUSE
	K_FIRE [72] // FIRE KEY - LEFT MOUSE
	K_UP [15] // FORWARD - W
	K_DOWN [27] // BACK - S
	K_LEFT [26] // LEFT - A
	K_RIGHT [28] // RIGHT - D
	K_RUN [36] // RUN - LEFT SHIFT KEY
	K_JUMP [46] // JUMP - SPACEBAR
	K_WEAP [57] // WEAPON CHANGE - LEFT ARROW
	K_DEBUG [59] // DEBUG - F1
	
	//Control variables
	ANIM [string] // Do Not Edit
	ANC [0] // Do Not Edit
	LASTANC [0] // Do Not Edit
	DIR [0] // Do Not Edit
	AT [0.5] // Do Not Edit
	INTER [string] // Do Not Edit
	TM [0] // Do Not Edit
	SPEED [0] // Do Not Edit
	TEMP [0] //
	CURAMMO [0] //
	CURWEAPON [0]// Current weapon selected
	MODE [string] //
	STYLE [string] //
	MOVES [0] //
	ATTSPEED [0.8]  // Speed of firing/striking or rate of auto shots
	POWER [5] // Melee power
	AMMO [string] // Ranged ammo type
	PCURDIR [0] // Temps for iso and s-s
	DIRHANDLEA [0] //
	DIRHANDLEB [0] //
	DIRCOUNT [0] //
	DIROFFSET [0] // Camera-to-movement realignment value for rotated iso views
	FALLING [false] //
	FALLSTART [0] //
	FTSET [false] //
	LANDSET [false] //
	JUMPING [false] //
	JUMPFORCE [80] //
	
Spawn[()
{
	Console(true);
	BoxWidth(BOX);
	SetGroup(GROUP);
	AttributeOrder(HEALTHATTRIB,HEALTHAMOUNT,"Die");
	SetWeapon(WEAPONS[CURWEAPON]);
	LowLevel("Setup");
}]

ChangeWeapon[()
{
	CURWEAPON = CURWEAPON + 1;
	if(CURWEAPON > WEAPONS)
	{
		RemoveWeapon();
		CURWEAPON = 0;
	}
	else
	{
		SetWeapon(WEAPONS[CURWEAPON]);
	}
	LowLevel("ConfigWeapon");
}]

ConfigWeapon[()
{
	MODE = StringCopy(WEAPONS[CURWEAPON].MODE);
	STYLE = StringCopy(WEAPONS[CURWEAPON].STYLE);
	TEMP = Integer(WEAPONS[CURWEAPON].SPEED);
	ATTSPEED = TEMP/10;
	if(MODE = "melee")
	{
		POWER = Integer(WEAPONS[CURWEAPON].POWER);
		MOVES = Integer(WEAPONS[CURWEAPON].MOVES);
	}
	if(MODE = "ranged")
	{
		AMMO = StringCopy(WEAPONS[CURWEAPON].AMMO);
	}
	SetPlayerWeapon(CURWEAPON+1);
	TM = 0;
	self.think ="RunPlayer";
}]

Setup[()
{
	AttachCamera();
	self.yaw_speed=18000;
	AnimateHold(IDLEANIM);
	ANIM=StringCopy(IDLEANIM);
	MODE=StringCopy("melee");
	STYLE=StringCopy("BAREHAND");
	AMMO=StringCopy("pistolbullet");
	ANC=0;
	LASTANC=0;
	TM=self.time;
	self.think="RunPlayer";
}]
	
RunPlayer[()
{
	PlayerRender(false);
	if(IsKeyDown(K_DEBUG))
	{
		//debug(self.key_pressed);
		debug(ATTSPEED);
		debug(MODE);
		debug(STYLE);
		debug(AMMO);
		debug(POWER);
		debug(SPEED);
		debug(MOVES);
		debug(ANIM);
	}
	
	//handle health status
	SetAttribute("health",self.health);
	if(self.health < 1)
	{
		HighLevel("Die");
		return 0;
	}
	
	FTSET = false;
	JUMPCOUNTER = 0;
	
	if(self.IsFalling)
	{
	    self.think="Fall";
	    return 0;
	}
	
	if(JUMPING)
	{
	    self.think="JumpUp";
	    return 0;
	}
	
	DIR=0; // Default straight
	SPEED=0; //Default - no motion
	AT=0.1; //Default
	ANC=0; //Default
	AnimationSpeed(1); //Default
	DIRCOUNT=0;
	DIRHANDLEA=0;
	DIRHANDLEB=0;
	
	//handle controls
	if(IsKeyDown(K_INTER))
	{
		//strike/interact
		AnimateBlend(INTERANIM,0.25);
		self.think="Interact";
		return 0;
	}
	
	if(IsKeyDown(K_WEAP))
	{
		HighLevel("ChangeWeapon");
		return 0;
	}
	
	if(IsKeyDown(K_UP))
	{
		ANIM=StringCopy(WALKANIM); 
		ANC=2;
		SPEED=Integer(PLAYERSPEED);
		if(DIRCOUNT = 0)
			{
	        	DIRHANDLEA=0;
	        	DIRCOUNT = DIRCOUNT + 1;
			}
		else
		{
	    	if(DIRCOUNT = 1)
	    	{
		    	DIRHANDLEB=0;
		    	DIRCOUNT = DIRCOUNT + 1;
	    	}
		}
	}
	
	if(IsKeyDown(K_DOWN))
	{
		ANIM=StringCopy(WALKANIM);
		ANC=2;
		SPEED=Integer(PLAYERSPEED);
		if(DIRCOUNT = 0)
			{
	        	DIRHANDLEA = 180;
	        	DIRCOUNT = DIRCOUNT + 1;
			}
		else
		{
	    	if(DIRCOUNT = 1)
	    	{
		    	DIRHANDLEB = 180;
		    	DIRCOUNT = DIRCOUNT + 1;
	    	}
		}
	}

	if(IsKeyDown(K_LEFT))
	{
		ANIM=StringCopy(WALKANIM);
		ANC=2;
		SPEED=Integer(PLAYERSPEED);
		if(DIRCOUNT = 0)
			{
	        	DIRHANDLEA = 90;
	        	DIRCOUNT = DIRCOUNT + 1;
			}
		else
		{
	    	if(DIRCOUNT = 1)
	    	{
		    	DIRHANDLEB = 90;
		    	DIRCOUNT = DIRCOUNT + 1;
	    	}
		}
	}

	if(IsKeyDown(K_RIGHT))
	{
		ANIM=StringCopy(WALKANIM);
		ANC=2;
		SPEED=Integer(PLAYERSPEED);
		if(DIRCOUNT = 0)
			{
	        	DIRHANDLEA = 270;
	        	DIRCOUNT = DIRCOUNT + 1;
			}
		else
		{
	    	if(DIRCOUNT = 1)
	    	{
		    	DIRHANDLEB = 270;
		    	DIRCOUNT = DIRCOUNT + 1;
	    	}
		}
	}

	if(IsKeyDown(K_JUMP))
	{
	    ANIM=StringCopy(JUMPSTARTANIM);
	    AT=0.1;
	    ANC=8;
	    JUMPING=true;
	}
	
	if(IsKeyDown(K_FIRE))
	{
		//attack
		if(ANC < 1)
		{
			if(MODE = "ranged")  
	        {
				ANC=1;
	   			if(STYLE = "SEMI")
	   			{
		   			CURAMMO = GetAttribute(AMMO);
					if((self.time > TM+ATTSPEED) and (CURAMMO > 0))
					{
						SetAttribute(AMMO, CURAMMO - 1);
						ANIM=StringCopy(SHOOTANIM);
						AT = 0.3;
						FireProjectileBlind(AMMO,WEAPONHAND,0,0,0,"health");
						AddExplosion(FIREEFFECT,WEAPONHAND,0,0,0);
						TM=self.time;
					}
				}
				else
				{
	    			ANIM=StringCopy(SHOOTANIM);
	    			AnimationSpeed(3.6);
	    			AT = 0.1;
	    			CURAMMO = GetAttribute(AMMO);
	    			for AUTOFIRE = 1 to ATTSPEED
	    			{
						if(CURAMMO > 0)
						{
							SetAttribute(AMMO, CURAMMO - 1);
							FireProjectileBlind(AMMO,WEAPONHAND,0,0,0,"health");
							AddExplosion(FIREEFFECT,WEAPONHAND,0,0,0);
						}
					}
				}
			}
			
			if(MODE = "melee")
			{
	    		ANC = 1;
	    		ANIM = StringCopy(MELEEANIM[Integer(STYLE)].MOVES[random(0,MOVES+1)]);
			}
	    		
		}
	}
	
	if(ANC < 1)
	{
		//no button
		ANIM=StringCopy(IDLEANIM);
		AT=0.5;
	}
	
	if(IsKeyDown(K_RUN) and (ANC = 2))
	{
		//left shift key - toggle run
		ANIM = StringCopy(RUNANIM);
		AT = 0.3;
		ANC = 3;
		SPEED=SPEED+(SPEED/2);
	}
	  
	//handle animations
	if((DIRHANDLEA = 0) and (DIRHANDLEB = 270))
	{
		DIRHANDLEA = 360;
	}
	
	if(DIRCOUNT > 0)
	{
	    PCURDIR = Integer((DIRHANDLEA + DIRHANDLEB)/DIRCOUNT);
	    self.ideal_yaw = ConvertDegrees(PCURDIR + DIROFFSET);
	    ChangeYaw();
	}
	
	if(Integer(LASTANC) != Integer(ANC))
	{
		AnimateBlend(ANIM,AT);
	}
	LASTANC=Integer(ANC);
	if(self.animate_at_end)
	{
		AnimateHold(ANIM);
	}
	
	//handle motions
	walkmove(self.current_yaw + DIR,SPEED);

}]

Interact[()
{
	if(self.animate_at_end)
	{
		INTER=TraceToActor(ROOTBONE,0,0,32);
		if(INTER != "FALSE")
		{
			SetEventState(INTER # "Trigger",true);
		}
		self.think="RunPlayer";
		TM = 0;
		return 0;
	}
}]

Fall[()
{
	if(ANC > 1)
	{
		ForceForward(SPEED);
		ANC = 0;
	}
	
	if(not FTSET)
	{
		FALLSTART = self.time;
		FTSET = true;
	}
	
	if((self.time - FALLSTART) > 0.5)
	{
		AnimateHold(FALLANIM);
		self.think="Land";
		return 0;
	}
	
	if(not self.IsFalling)
	{
		self.think="RunPlayer";
		return 0;
	}
	
}]

JumpUp[()
{
	if(ANC > 1)
	{
		ForceForward(SPEED);
		ANC = 0;
	}
	
	if(JUMPING)
	{
		ForceUp(JUMPFORCE);
		AnimationSpeed(3);
		AnimateBlend(JUMPANIM,0.1);
		JUMPING=false;
	}
	
	if(self.IsFalling)
	{
		self.think="Fall";
		return 0;
	}
}]

Land[()
{	
	if(not self.IsFalling)
	{
		AnimationSpeed(3);
		AnimateHold(LANDANIM);
		LANDSET= false;
		self.think = "Delay";
		TM = self.time;
		return 0;
	}
}]

Delay[()
{
	if((self.time - TM) > 0.0)
	{
		self.think="RunPlayer";
		return 0;
	}
}]

Die[()
{
  AnimateStop(DEATHANIM,0,"");  
}]


}
Last edited by Veleran on Sun Mar 17, 2013 12:36 pm, edited 2 times in total.

Veleran
Posts: 891
Joined: Mon Aug 22, 2005 10:22 am
Location: Greece

Re: Pawn Jump ,Force might stuck the pawn

Post by Veleran » Sat Aug 11, 2012 8:12 pm

The standard player can jump better and the bounding box can be seen (in debug show entity bounding box mode)
projecting towards the direction you move.

Can the pawn use some command in jump order to further test collision to avoid getting stuck?

I guess that must be one of the reasons the player does nt tuck like the pawn.
Force does kind of a rough job,and the jump order of the script does not allow you to jump and then move like the player can.
If you want to script the jump move ,are there any suggestions?
Could it be gravity on and off and flymove do it or not?

Veleran
Posts: 891
Joined: Mon Aug 22, 2005 10:22 am
Location: Greece

Re: Pawn Jump ,Force might stuck the pawn

Post by Veleran » Fri Jan 25, 2013 3:14 am

The buggy section is that below.No one has bugs with it or no one has tried the script.
I want non realistic jumping so you can jump up and after that to press left and flymove that way for a certain duration of time and then set gravity to on and fall down.
The jump up does nt seem to stuck you,only if i hold down both up and left or right keys you can get stuck on the polygon horizontal edge.
I hope this last tip can help.

JumpUp[()
{
if(ANC > 1)
{
ForceForward(SPEED);
ANC = 0;
}

if(JUMPING)
{
ForceUp(JUMPFORCE);
AnimationSpeed(3);
AnimateBlend(JUMPANIM,0.1);
JUMPING=false;
}

if(self.IsFalling)
{
self.think="Fall";
return 0;
}
}]

Veleran
Posts: 891
Joined: Mon Aug 22, 2005 10:22 am
Location: Greece

Re: Pawn Jump ,Force might stuck the pawn

Post by Veleran » Thu Feb 28, 2013 9:48 pm

Certainly the jump order needs a re write,but i do not see it happening because i can not script low level.
Summer 2010 Metal Head said to me
Alright, so I wouldn't suggest modifying the genericplayer script. When I started to make my first scripted player, that was my idea too, but than I realized, that it would be better to start from scratch. Really, it's a lot easier. Those sample scripts are pretty confusing.
What is that "Anc" anyway...

Post Reply