Add set/show_dhudmessage (bug 5979, r=ds)

This commit is contained in:
Arkshine
2014-04-11 21:54:24 +02:00
parent 4cd9d1df46
commit 5468e9745c
4 changed files with 154 additions and 0 deletions

View File

@ -568,6 +568,97 @@ static cell AMX_NATIVE_CALL show_hudmessage(AMX *amx, cell *params) /* 2 param *
return len;
}
static cell AMX_NATIVE_CALL set_dhudmessage(AMX *amx, cell *params) /* 10 param */
{
g_hudset.a1 = 0;
g_hudset.a2 = 0;
g_hudset.r2 = 255;
g_hudset.g2 = 255;
g_hudset.b2 = 250;
g_hudset.r1 = static_cast<byte>(params[1]);
g_hudset.g1 = static_cast<byte>(params[2]);
g_hudset.b1 = static_cast<byte>(params[3]);
g_hudset.x = amx_ctof(params[4]);
g_hudset.y = amx_ctof(params[5]);
g_hudset.effect = params[6];;
g_hudset.fxTime = amx_ctof(params[7]);
g_hudset.holdTime = amx_ctof(params[8]);
g_hudset.fadeinTime = amx_ctof(params[9]);
g_hudset.fadeoutTime = amx_ctof(params[10]);
g_hudset.channel = -1;
return 1;
}
static cell AMX_NATIVE_CALL show_dhudmessage(AMX *amx, cell *params) /* 2 param */
{
int len = 0;
int index = params[1];
char *message;
if (!index)
{
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CPlayer *pPlayer = GET_PLAYER_POINTER_I(i);
if (pPlayer->ingame && !pPlayer->IsBot())
{
g_langMngr.SetDefLang(i);
message = format_amxstring(amx, params, 2, len);
if (len > 127) // Client truncates after byte 127.
{
len = 127;
// Don't truncate a double-byte character
if (((message[len - 1] & 0xFF) >= 0xC2) && ((message[len - 1] & 0xFF) <= 0xEF))
{
len--;
}
message[len] = 0;
}
UTIL_DHudMessage(pPlayer->pEdict, g_hudset, message, len);
}
}
}
else
{
if (index < 1 || index > gpGlobals->maxClients)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid player id %d", index);
return 0;
}
CPlayer* pPlayer = GET_PLAYER_POINTER_I(index);
if (pPlayer->ingame && !pPlayer->IsBot())
{
g_langMngr.SetDefLang(index);
message = format_amxstring(amx, params, 2, len);
if (len > 127) // Client truncates after byte 127.
{
len = 127;
// Don't truncate a double-byte character
if (((message[len - 1] & 0xFF) >= 0xC2) && ((message[len - 1] & 0xFF) <= 0xEF))
{
--len;
}
message[len] = 0;
}
UTIL_DHudMessage(pPlayer->pEdict, g_hudset, message, len);
}
}
return len;
}
static cell AMX_NATIVE_CALL get_user_name(AMX *amx, cell *params) /* 3 param */
{
int index = params[1];
@ -4925,6 +5016,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"set_cvar_num", set_cvar_num},
{"set_cvar_string", set_cvar_string},
{"set_fail_state", set_fail_state},
{"set_dhudmessage", set_dhudmessage},
{"set_hudmessage", set_hudmessage},
{"set_localinfo", set_localinfo},
{"set_pcvar_flags", set_pcvar_flags},
@ -4936,6 +5028,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"set_user_info", set_user_info},
{"set_xvar_float", set_xvar_num},
{"set_xvar_num", set_xvar_num},
{"show_dhudmessage", show_dhudmessage},
{"show_hudmessage", show_hudmessage},
{"show_menu", show_menu},
{"show_motd", show_motd},

View File

@ -140,6 +140,7 @@ void UTIL_ClientPrint(edict_t *pEntity, int msg_dest, char *msg);
void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1 = NULL, const char *arg2 = NULL);
void UTIL_GetFlags(char* flags, int flag);
void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, const char *pMessage);
void UTIL_DHudMessage(edict_t *pEntity, const hudtextparms_t &textparms, const char *pMessage, unsigned int length);
void UTIL_IntToString(int value, char *output);
void UTIL_ShowMOTD(edict_t *client, char *motd, int mlen, const char *name);
void UTIL_ShowMenu(edict_t* pEntity, int slots, int time, char *menu, int mlen);

View File

@ -273,6 +273,29 @@ void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, const ch
MESSAGE_END();
}
void UTIL_DHudMessage(edict_t *pEntity, const hudtextparms_t &textparms, const char *pMessage, unsigned int length)
{
#define DRC_CMD_MESSAGE 6
if (pEntity)
MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, SVC_DIRECTOR, NULL, pEntity);
else
MESSAGE_BEGIN(MSG_BROADCAST, SVC_DIRECTOR);
WRITE_BYTE(length + 31); // message length (counting WRITE size)
WRITE_BYTE(DRC_CMD_MESSAGE);
WRITE_BYTE(textparms.effect);
WRITE_LONG(textparms.b1 + (textparms.g1 << 8) + (textparms.r1 << 16)); // pack color.
WRITE_LONG(amx_ftoc(textparms.x));
WRITE_LONG(amx_ftoc(textparms.y));
WRITE_LONG(amx_ftoc(textparms.fadeinTime));
WRITE_LONG(amx_ftoc(textparms.fadeoutTime));
WRITE_LONG(amx_ftoc(textparms.holdTime));
WRITE_LONG(amx_ftoc(textparms.fxTime));
WRITE_STRING(pMessage); // max length: 128. Truncated on the client.
MESSAGE_END();
}
/* warning - buffer of msg must be longer than 190 chars!
(here in AMX it is always longer) */
void UTIL_ClientPrint(edict_t *pEntity, int msg_dest, char *msg)