Customizable triggered HUD-message: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
mNo edit summary
m (minor tidy)
Line 1: Line 1:
[originally from sourcewiki.org, modified for the Valve Developer Community to adhere to the Wiki standards]
There's an entity to display HUD-messages called [[game_text]] with various properties to define which, where and how to display text. But it's missing one possibility which could be very handy: you can't define the message via a triggered input.
----


There's an entity to display HUD-messages called '''game_text''' with various properties to define which, where and how to display text.
That means, if several in-game messages are needed, like "the door has opened", "someone shot the sheriff", etc which are triggered by entities via their outputs, many "game_text" entities need to be created. This can lead to a huge number of "game_text" entities which can only cause problems later on.
But it's missing one possibility which could be very handy: you can't define the message via a triggered input.


That means, if  several ingame-messages are needed, like "the door has opened", "someone shot the sheriff", etc which are triggered by entities via their outputs, many "game_text" entities need to be created. This can lead to a huge number of "game_text" entities which can only cause problems later on.
The class '''CGameText''', to which the '''game_text'''-entity is linked, is defined in '''dlls/maprules.cpp'''. To enhance the '''CGameText''', just inherit from it and add an additional input to it, providing the text to be shown. Usually one would include a header ('''maprules.h''') in your cpp and define the new class there, but unfortunately it's empty, which makes it harder to enhance it in a clean way.
 
The class '''CGameText''', to which the '''game_text'''-entity is linked, is defined in '''dlls/maprules.cpp'''. To enhance the '''CGameText''', just inherit from it and add an additional input to it, providing the text to be shown. Usually one would include a header ('''maprules.h''') in your cpp and define the new class there, but unfortenately it's empty, which makes it harder to enhance it in a clean way.


The easier way is to include the new class in '''maprules.cpp''' and hope it won't get changed too much by future SDK-updates:
The easier way is to include the new class in '''maprules.cpp''' and hope it won't get changed too much by future SDK-updates:
Line 24: Line 20:
};
};


// the entity is calles "mm_game_text"
// the entity is called "mm_game_text"
LINK_ENTITY_TO_CLASS( mm_game_text, CGSGameText );
LINK_ENTITY_TO_CLASS( mm_game_text, CGSGameText );


Line 54: Line 50:


[[Image:mm_game_text.gif]]
[[Image:mm_game_text.gif]]
<h2>Credits</h2>
This tutorial was originally from sourcewiki.org, and modified for the Valve Developer Community to adhere to the wiki standards.




[[Category:Tutorials]][[Category:Programming]]
[[Category:Tutorials]]
[[Category:Programming]]

Revision as of 16:29, 25 February 2008

There's an entity to display HUD-messages called game_text with various properties to define which, where and how to display text. But it's missing one possibility which could be very handy: you can't define the message via a triggered input.

That means, if several in-game messages are needed, like "the door has opened", "someone shot the sheriff", etc which are triggered by entities via their outputs, many "game_text" entities need to be created. This can lead to a huge number of "game_text" entities which can only cause problems later on.

The class CGameText, to which the game_text-entity is linked, is defined in dlls/maprules.cpp. To enhance the CGameText, just inherit from it and add an additional input to it, providing the text to be shown. Usually one would include a header (maprules.h) in your cpp and define the new class there, but unfortunately it's empty, which makes it harder to enhance it in a clean way.

The easier way is to include the new class in maprules.cpp and hope it won't get changed too much by future SDK-updates:

Find the end of the data description for CGameText and append this, the comments should be sufficient:

class CGSGameText : public CGameText
{
public:
  // that's right, we're inheriting from CGameText
  DECLARE_CLASS(CGSGameText, CGameText);
  DECLARE_DATADESC();

  // this function handles the triggered input
  void InputDisplayText( inputdata_t &inputdata );
};

// the entity is called "mm_game_text"
LINK_ENTITY_TO_CLASS( mm_game_text, CGSGameText );

BEGIN_DATADESC( CGSGameText )
  // the parameter of the input-function is a string
  DEFINE_INPUTFUNC( FIELD_STRING, "DisplayText", InputDisplayText ),
END_DATADESC()

void CGSGameText::InputDisplayText( inputdata_t &inputdata )
{
  // the baseclass already defines a memberfunction to set the 
  // message-text (CGameText::MessageSet), we just call it
  MessageSet( STRING(inputdata.value.StringID()) );
  // and show the message
  Display( inputdata.pActivator );
}

To use the entity in hammer, The following additions to your *.fgd need to be added:

@PointClass base(game_text) iconsprite("editor/game_text.vmt") = mm_game_text : 
    "An entity that displays customized text on player's screens."
[
  input DisplayText(string) : "Display this message text."
]

All that is needed is to create that entity (mm_game_text) in a map, customize it as though it were the entity game_text and link as many different outputs to it as needed.

Mm game text.gif

Credits

This tutorial was originally from sourcewiki.org, and modified for the Valve Developer Community to adhere to the wiki standards.