Hudmessageonactor

From ZDoom Wiki
Jump to navigation Jump to search

This function will either place text, or a sprite (depending on parameters used) on the screen relative to the position of an actor. For this to work, an actor must have a thing ID.

Parameters

  • tid: The thing ID of the actor. The X and Y position with which to display the message is calculated from the activator and target actor's X, Y, Z, pitch and angle.
  • msgID: A unique message ID number, messages with lower ids will overlap those with higher ids.
  • hudX: The horizontal scale of the HUD. Larger values make the text/sprite smaller on the X axis. The default is 640.
  • hudY: The vertical scale of the HUD. Larger values make the text/sprite smaller on the Y axis. The default is 480.
  • xOffset: The horizontal offset of the HUD message. Negative values move it further to the left, positive values further to the right.
  • yOffset: The vertical offset of the HUD message. Negative values move it further up to the top, positive values further down to the bottom.
  • range: The minimum distance that must be met between the activator and target actor for the HUD message to appear.
  • sprite: Use a sprite instead of text. Must be a valid sprite name. Passing -1 means that no sprite will be used.
  • text: The text to be displayed. If a sprite is used, the text will be overridden and not displayed.
  • holdTime: The duration which to display the HUD message. Defaults to 0.1.
  • colour: A string constant that specifies the text colour. Valid values can be found in the HudMessage documentation.
//Original code by Isle
function void HudMessageOnActor(int tid, int msgID, int hudX, int hudY, int xOffset, int yOffset, int range, str sprite, str text, int holdTime, str colour)
{
		
	int dist, angle, vang, pitch, x, y;
	
	if (holdTime == 0) { holdTime = 0.1; }	
	if (hudX == 0) { hudX = 640; }
	if (hudY == 0) { hudY = 480; }
	
	if(sprite != -1)
	{
		
		SetFont(sprite);
		text = "A";
		
	}
	
	SetHudSize(hudX, hudY, 1);
	x = GetActorX(tid) - GetActorX(0);
	y = GetActorY(tid) - GetActorY(0);
	
	vang = VectorAngle(x,y);
	angle = (vang - GetActorAngle(0) + 1.0) % 1.0;
	
	if(((vang+0.125)%0.5) > 0.25) dist = FixedDiv(y, sin(vang));
	else dist = FixedDiv(x, cos(vang));
	
	if ((angle < 0.23 || angle > 0.85) && (dist >> 16) < range)
	{
		
		if (GetActorPitch(0) >= -0.5 && GetActorPitch(0) <= 0.5)
		{
 
			pitch = VectorAngle(dist, GetActorZ(tid) - (GetActorZ(0) + GetActorViewHeight(0)));
			pitch += FixedMul(GetActorPitch(0), 1.2) % 1.0;
 
			if ((hudX/2) * sin(angle) != 0 && cos(angle) != 0 && (hudX/2) * sin(pitch) != 0 && cos(pitch) != 0)
			{
				
				x = hudX/2 - ((hudX/2) * sin(angle) / cos(angle));
				y = hudY/2 - ((HUDX/2) * sin(pitch) / cos(pitch));
				
				x+=xOffset;
				y+=yOffset;
				
				HudMessage(s:text; HUDMSG_PLAIN, msgID, colour, (x << 16), (y << 16), holdTime);
				
			}
			
		}
		
	}
	
}