core/smn_hudtext.cpp
author Ruben Gonzalez <drifter01620@gmail.com>
Thu May 15 21:22:24 2014 -0400 (2014-05-15)
changeset 4362 8a15e967d983
parent 4060 b4484bd36c22
permissions -rw-r--r--
Update gamedata for CS:S update.
dvander@1915
     1
/**
dvander@1915
     2
 * vim: set ts=4 :
dvander@1915
     3
 * =============================================================================
dvander@1915
     4
 * SourceMod
ds@1947
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
dvander@1915
     6
 * =============================================================================
dvander@1915
     7
 *
dvander@1915
     8
 * This program is free software; you can redistribute it and/or modify it under
dvander@1915
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@1915
    10
 * Free Software Foundation.
dvander@1915
    11
 * 
dvander@1915
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@1915
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@1915
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@1915
    15
 * details.
dvander@1915
    16
 *
dvander@1915
    17
 * You should have received a copy of the GNU General Public License along with
dvander@1915
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1915
    19
 *
dvander@1915
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@1915
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@1915
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@1915
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@1915
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@1915
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@1915
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@1915
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@1915
    28
 *
dvander@1915
    29
 * Version: $Id$
dvander@1915
    30
 */
dvander@1915
    31
dvander@1915
    32
#include "sm_globals.h"
dvander@3010
    33
#include <IGameConfigs.h>
dvander@1915
    34
#include "UserMessages.h"
dvander@1915
    35
#include "TimerSys.h"
dvander@1915
    36
#include "PlayerManager.h"
dvander@3010
    37
#include "logic_bridge.h"
dvander@3872
    38
#include "sourcemod.h"
dvander@1915
    39
skamonkey@3855
    40
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3855
    41
#include <game/shared/protobuf/usermessages.pb.h>
skamonkey@3855
    42
#elif SOURCE_ENGINE == SE_CSGO
skamonkey@3743
    43
#include <game/shared/csgo/protobuf/cstrike15_usermessages.pb.h>
skamonkey@3743
    44
#endif
skamonkey@3743
    45
dvander@1915
    46
#define MAX_HUD_CHANNELS		6
dvander@1915
    47
dvander@1915
    48
int g_HudMsgNum = -1;
dvander@1915
    49
dvander@1915
    50
struct hud_syncobj_t
dvander@1915
    51
{
dvander@2816
    52
	int player_channels[256 + 1];
dvander@1915
    53
};
dvander@1915
    54
dvander@1915
    55
struct player_chaninfo_t
dvander@1915
    56
{
dvander@1915
    57
	double chan_times[MAX_HUD_CHANNELS];
dvander@1915
    58
	hud_syncobj_t *chan_syncobjs[MAX_HUD_CHANNELS];
dvander@1915
    59
};
dvander@1915
    60
dvander@1915
    61
struct hud_text_parms
dvander@1915
    62
{
dvander@1915
    63
	float       x;
dvander@1915
    64
	float       y;
dvander@1915
    65
	int         effect;
dvander@1915
    66
	byte        r1, g1, b1, a1;
dvander@1915
    67
	byte        r2, g2, b2, a2;
dvander@1915
    68
	float       fadeinTime;
dvander@1915
    69
	float       fadeoutTime;
dvander@1915
    70
	float       holdTime;
dvander@1915
    71
	float       fxTime;
dvander@1915
    72
	int         channel;
dvander@1915
    73
};
dvander@1915
    74
dvander@1915
    75
class HudMsgHelpers : 
dvander@1915
    76
	public SMGlobalClass,
dvander@1915
    77
	public IHandleTypeDispatch,
dvander@1915
    78
	public IClientListener
dvander@1915
    79
{
dvander@1915
    80
public:
dvander@1915
    81
	bool IsSupported()
dvander@1915
    82
	{
dvander@1915
    83
		return (g_HudMsgNum != -1);
dvander@1915
    84
	}
dvander@1915
    85
dvander@1915
    86
	virtual void OnSourceModAllInitialized_Post()
dvander@1915
    87
	{
dvander@1915
    88
		const char *key;
dvander@1915
    89
dvander@1915
    90
		key = g_pGameConf->GetKeyValue("HudTextMsg");
dvander@1915
    91
		if (key != NULL)
dvander@1915
    92
		{
dvander@1915
    93
			g_HudMsgNum = g_UserMsgs.GetMessageIndex(key);
dvander@1915
    94
		}
dvander@1915
    95
dvander@1915
    96
		if (!IsSupported())
dvander@1915
    97
		{
dvander@1915
    98
			m_hHudSyncObj = 0;
dvander@1915
    99
			m_PlayerHuds = NULL;
dvander@1915
   100
			return;
dvander@1915
   101
		}
dvander@1915
   102
dvander@1915
   103
		m_PlayerHuds = new player_chaninfo_t[256+1];
dvander@3872
   104
		m_hHudSyncObj = handlesys->CreateType("HudSyncObj", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@1915
   105
dvander@1915
   106
		g_Players.AddClientListener(this);
dvander@1915
   107
	}
dvander@1915
   108
dvander@1915
   109
	virtual void OnSourceModShutdown()
dvander@1915
   110
	{
dvander@1915
   111
		if (!IsSupported())
dvander@1915
   112
		{
dvander@1915
   113
			return;
dvander@1915
   114
		}
dvander@1915
   115
dvander@1915
   116
		delete [] m_PlayerHuds;
dvander@3872
   117
		handlesys->RemoveType(m_hHudSyncObj, g_pCoreIdent);
dvander@1915
   118
dvander@1915
   119
		g_Players.RemoveClientListener(this);
dvander@1915
   120
	}
dvander@1915
   121
dvander@1915
   122
	virtual void OnHandleDestroy(HandleType_t type, void *object)
dvander@1915
   123
	{
dvander@1915
   124
		hud_syncobj_t *obj = (hud_syncobj_t *)object;
dvander@1915
   125
dvander@1915
   126
		delete obj;
dvander@1915
   127
	}
dvander@1915
   128
dvander@1915
   129
	virtual bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize)
dvander@1915
   130
	{
dvander@1915
   131
		*pSize = sizeof(unsigned int) * g_Players.GetMaxClients();
dvander@1915
   132
		return true;
dvander@1915
   133
	}
dvander@1915
   134
dvander@1915
   135
	virtual void OnClientConnected(int client)
dvander@1915
   136
	{
dvander@1915
   137
		player_chaninfo_t *player;
dvander@1915
   138
dvander@1915
   139
		player = &m_PlayerHuds[client];
dvander@1915
   140
		memset(player->chan_syncobjs, 0, sizeof(player->chan_syncobjs));
dvander@1915
   141
		memset(player->chan_times, 0, sizeof(player->chan_times));
dvander@1915
   142
	}
dvander@1915
   143
dvander@1915
   144
	Handle_t CreateHudSyncObj(IdentityToken_t *pIdent)
dvander@1915
   145
	{
dvander@1915
   146
		Handle_t hndl;
dvander@1915
   147
		HandleError err;
dvander@1915
   148
		hud_syncobj_t *obj;
dvander@1915
   149
		HandleSecurity sec;
dvander@1915
   150
dvander@2816
   151
		obj = new hud_syncobj_t;
dvander@1915
   152
dvander@2816
   153
		memset(obj->player_channels, 0, sizeof(obj->player_channels));
dvander@1915
   154
dvander@1915
   155
		sec = HandleSecurity(pIdent, g_pCoreIdent);
dvander@1915
   156
		
dvander@3872
   157
		if ((hndl = handlesys->CreateHandleEx(m_hHudSyncObj, obj, &sec, NULL, &err))
dvander@1915
   158
			== BAD_HANDLE)
dvander@1915
   159
		{
dvander@1915
   160
			delete obj;
dvander@1915
   161
		}
dvander@1915
   162
dvander@1915
   163
		return hndl;
dvander@1915
   164
	}
dvander@1915
   165
dvander@1915
   166
	HandleError ReadHudSyncObj(Handle_t hndl, 
dvander@1915
   167
		IdentityToken_t *pOwner, 
dvander@1915
   168
		hud_syncobj_t **pObj)
dvander@1915
   169
	{
dvander@1915
   170
		HandleSecurity sec(pOwner, g_pCoreIdent);
dvander@3872
   171
		return handlesys->ReadHandle(hndl, m_hHudSyncObj, &sec, (void **)pObj);
dvander@1915
   172
	}
dvander@1915
   173
dvander@1915
   174
	unsigned int AutoSelectChannel(unsigned int client)
dvander@1915
   175
	{
dvander@1915
   176
		int last_channel;
dvander@1915
   177
		player_chaninfo_t *player;
dvander@1915
   178
dvander@1915
   179
		player = &m_PlayerHuds[client];
dvander@1915
   180
dvander@1915
   181
		last_channel = 0;
dvander@1915
   182
		for (unsigned int i = 1; i < MAX_HUD_CHANNELS; i++)
dvander@1915
   183
		{
dvander@1915
   184
			if (player->chan_times[i] < player->chan_times[last_channel])
dvander@1915
   185
			{
dvander@1915
   186
				last_channel = i;
dvander@1915
   187
			}
dvander@1915
   188
		}
dvander@1915
   189
dvander@1915
   190
		ManualSelectChannel(client, last_channel);
dvander@1915
   191
dvander@1915
   192
		return last_channel;
dvander@1915
   193
	}
dvander@1915
   194
dvander@1915
   195
	int TryReuseLastChannel(unsigned int client, hud_syncobj_t *obj)
dvander@1915
   196
	{
dvander@1915
   197
		int last_channel;
dvander@1915
   198
		player_chaninfo_t *player;
dvander@1915
   199
dvander@1915
   200
		player = &m_PlayerHuds[client];
dvander@1915
   201
dvander@1915
   202
		/* First, see if we can re-use the previous channel. */
dvander@1915
   203
		last_channel = obj->player_channels[client];
dvander@1915
   204
dvander@1915
   205
		if (player->chan_syncobjs[last_channel] == obj)
dvander@1915
   206
		{
dvander@1915
   207
			player->chan_times[last_channel] = *g_pUniversalTime;
dvander@1915
   208
			return last_channel;
dvander@1915
   209
		}
dvander@1915
   210
dvander@1915
   211
		return -1;
dvander@1915
   212
	}
dvander@1915
   213
dvander@1915
   214
	int AutoSelectChannel(unsigned int client, hud_syncobj_t *obj)
dvander@1915
   215
	{
dvander@1915
   216
		int last_channel;
dvander@1915
   217
		player_chaninfo_t *player;
dvander@1915
   218
dvander@1915
   219
		player = &m_PlayerHuds[client];
dvander@1915
   220
		
dvander@1915
   221
		/* First, see if we can re-use the previous channel. */
dvander@1915
   222
		last_channel = obj->player_channels[client];
dvander@1915
   223
dvander@1915
   224
		if (player->chan_syncobjs[last_channel] == obj)
dvander@1915
   225
		{
dvander@1915
   226
			player->chan_times[last_channel] = *g_pUniversalTime;
dvander@1915
   227
			return last_channel;
dvander@1915
   228
		}
dvander@1915
   229
dvander@1915
   230
		last_channel = 0;
dvander@1915
   231
		for (unsigned int i = 1; i < MAX_HUD_CHANNELS; i++)
dvander@1915
   232
		{
dvander@1915
   233
			if (player->chan_times[i] < player->chan_times[last_channel])
dvander@1915
   234
			{
dvander@1915
   235
				last_channel = i;
dvander@1915
   236
			}
dvander@1915
   237
		}
dvander@1915
   238
dvander@1915
   239
		obj->player_channels[client] = last_channel;
dvander@1915
   240
		player->chan_syncobjs[last_channel] = obj;
dvander@1915
   241
		player->chan_times[last_channel] = *g_pUniversalTime;
dvander@1915
   242
dvander@1915
   243
		return last_channel;
dvander@1915
   244
	}
dvander@1915
   245
dvander@1915
   246
	int ManualSelectChannel(unsigned int client, int channel)
dvander@1915
   247
	{
dvander@1915
   248
		player_chaninfo_t *player;
dvander@1915
   249
dvander@1915
   250
		player = &m_PlayerHuds[client];
dvander@1915
   251
		player->chan_times[channel] = *g_pUniversalTime;
dvander@1915
   252
		player->chan_syncobjs[channel] = NULL;
dvander@1915
   253
dvander@1915
   254
		return channel;
dvander@1915
   255
	}
dvander@1915
   256
private:
dvander@1915
   257
	HandleType_t m_hHudSyncObj;
dvander@1915
   258
	player_chaninfo_t *m_PlayerHuds;
dvander@1915
   259
} s_HudMsgHelpers;
dvander@1915
   260
dvander@1915
   261
hud_text_parms g_hud_params;
dvander@1915
   262
dvander@1915
   263
static cell_t CreateHudSynchronizer(IPluginContext *pContext, const cell_t *params)
dvander@1915
   264
{
dvander@1915
   265
	return s_HudMsgHelpers.CreateHudSyncObj(pContext->GetIdentity());
dvander@1915
   266
}
dvander@1915
   267
dvander@1915
   268
static cell_t SetHudTextParams(IPluginContext *pContext, const cell_t *params)
dvander@1915
   269
{
dvander@1915
   270
	g_hud_params.x = sp_ctof(params[1]);
dvander@1915
   271
	g_hud_params.y = sp_ctof(params[2]);
dvander@1915
   272
	g_hud_params.holdTime = sp_ctof(params[3]);
dvander@1915
   273
	g_hud_params.r1 = static_cast<byte>(params[4]);
dvander@1915
   274
	g_hud_params.g1 = static_cast<byte>(params[5]);
dvander@1915
   275
	g_hud_params.b1 = static_cast<byte>(params[6]);
dvander@1915
   276
	g_hud_params.a1 = static_cast<byte>(params[7]);
dvander@1915
   277
	g_hud_params.effect = params[8];
dvander@1915
   278
	g_hud_params.fxTime = sp_ctof(params[9]);
dvander@1915
   279
	g_hud_params.fadeinTime = sp_ctof(params[10]);
dvander@1915
   280
	g_hud_params.fadeoutTime = sp_ctof(params[11]);
dvander@1915
   281
	g_hud_params.r2 = 255;
dvander@1915
   282
	g_hud_params.g2 = 255;
dvander@1915
   283
	g_hud_params.b2 = 250;
dvander@1915
   284
	g_hud_params.a2 = 0;
dvander@1915
   285
dvander@1915
   286
	return 1;
dvander@1915
   287
}
dvander@1915
   288
dvander@1915
   289
static cell_t SetHudTextParamsEx(IPluginContext *pContext, const cell_t *params)
dvander@1915
   290
{
dvander@1915
   291
	cell_t *color1, *color2;
dvander@1915
   292
dvander@1915
   293
	pContext->LocalToPhysAddr(params[4], &color1);
dvander@1915
   294
	pContext->LocalToPhysAddr(params[5], &color2);
dvander@1915
   295
dvander@1915
   296
	g_hud_params.x = sp_ctof(params[1]);
dvander@1915
   297
	g_hud_params.y = sp_ctof(params[2]);
dvander@1915
   298
	g_hud_params.holdTime = sp_ctof(params[3]);
dvander@1915
   299
	g_hud_params.r1 = static_cast<byte>(color1[0]);
dvander@1915
   300
	g_hud_params.g1 = static_cast<byte>(color1[1]);
dvander@1915
   301
	g_hud_params.b1 = static_cast<byte>(color1[2]);
dvander@1915
   302
	g_hud_params.a1 = static_cast<byte>(color1[3]);
dvander@1915
   303
	g_hud_params.effect = params[6];
dvander@1915
   304
	g_hud_params.fxTime = sp_ctof(params[7]);
dvander@1915
   305
	g_hud_params.fadeinTime = sp_ctof(params[8]);
dvander@1915
   306
	g_hud_params.fadeoutTime = sp_ctof(params[9]);
dvander@1915
   307
	g_hud_params.r2 = static_cast<byte>(color2[0]);
dvander@1915
   308
	g_hud_params.g2 = static_cast<byte>(color2[1]);
dvander@1915
   309
	g_hud_params.b2 = static_cast<byte>(color2[2]);
dvander@1915
   310
	g_hud_params.a2 = static_cast<byte>(color2[3]);
dvander@1915
   311
dvander@1915
   312
	return 1;
dvander@1915
   313
}
dvander@1915
   314
dvander@1915
   315
void UTIL_SendHudText(int client, const hud_text_parms &textparms, const char *pMessage)
dvander@1915
   316
{
dvander@1915
   317
	cell_t players[1];
dvander@1915
   318
dvander@1915
   319
	players[0] = client;
dvander@1915
   320
skamonkey@3855
   321
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3855
   322
	CUserMsg_HudMsg *msg = (CUserMsg_HudMsg *)g_UserMsgs.StartProtobufMessage(g_HudMsgNum, players, 1, 0);
skamonkey@3855
   323
	msg->set_channel(textparms.channel & 0xFF);
skamonkey@3855
   324
skamonkey@3855
   325
	msg->set_x(textparms.x);
skamonkey@3855
   326
	msg->set_y(textparms.y);
skamonkey@3855
   327
skamonkey@3855
   328
	Color c1(textparms.r1, textparms.g1, textparms.b1, textparms.a1);
skamonkey@3855
   329
	msg->set_color1(c1.GetRawColor());
skamonkey@3855
   330
skamonkey@3855
   331
	Color c2(textparms.r2, textparms.g2, textparms.b2, textparms.a2);
skamonkey@3855
   332
	msg->set_color2(c2.GetRawColor());
skamonkey@3855
   333
skamonkey@3855
   334
	msg->set_effect(textparms.effect);
skamonkey@3855
   335
	msg->set_fade_in_time(textparms.fadeinTime);
skamonkey@3855
   336
	msg->set_fade_out_time(textparms.fadeoutTime);
skamonkey@3855
   337
	msg->set_hold_time(textparms.holdTime);
skamonkey@3855
   338
	msg->set_fx_time(textparms.fxTime);
skamonkey@3855
   339
	msg->set_message(pMessage);
skamonkey@3855
   340
#elif SOURCE_ENGINE == SE_CSGO
skamonkey@3743
   341
	CCSUsrMsg_HudMsg *msg = (CCSUsrMsg_HudMsg *)g_UserMsgs.StartProtobufMessage(g_HudMsgNum, players, 1, 0);
skamonkey@3743
   342
	msg->set_channel(textparms.channel & 0xFF);
skamonkey@3743
   343
skamonkey@3743
   344
	CMsgVector2D *pos = msg->mutable_pos();
skamonkey@3743
   345
	pos->set_x(textparms.x);
skamonkey@3743
   346
	pos->set_y(textparms.y);
skamonkey@3743
   347
skamonkey@3743
   348
	CMsgRGBA *color1 = msg->mutable_clr1();
skamonkey@3743
   349
	color1->set_r(textparms.r1);
skamonkey@3743
   350
	color1->set_g(textparms.g1);
skamonkey@3743
   351
	color1->set_b(textparms.b1);
skamonkey@3743
   352
	color1->set_a(textparms.a1);
skamonkey@3743
   353
skamonkey@3743
   354
	CMsgRGBA *color2 = msg->mutable_clr2();
skamonkey@3743
   355
	color2->set_r(textparms.r2);
skamonkey@3743
   356
	color2->set_g(textparms.g2);
skamonkey@3743
   357
	color2->set_b(textparms.b2);
skamonkey@3743
   358
	color2->set_a(textparms.a2);
skamonkey@3743
   359
skamonkey@3743
   360
	msg->set_effect(textparms.effect);
skamonkey@3743
   361
	msg->set_fade_in_time(textparms.fadeinTime);
skamonkey@3743
   362
	msg->set_fade_out_time(textparms.fadeoutTime);
skamonkey@3743
   363
	msg->set_hold_time(textparms.holdTime);
skamonkey@3743
   364
	msg->set_fx_time(textparms.fxTime);
skamonkey@3743
   365
	msg->set_text(pMessage);
skamonkey@3743
   366
#else
skamonkey@3743
   367
	bf_write *bf = g_UserMsgs.StartBitBufMessage(g_HudMsgNum, players, 1, 0);
dvander@1915
   368
	bf->WriteByte(textparms.channel & 0xFF );
dvander@1915
   369
	bf->WriteFloat(textparms.x);
dvander@1915
   370
	bf->WriteFloat(textparms.y);
dvander@1915
   371
	bf->WriteByte(textparms.r1);
dvander@1915
   372
	bf->WriteByte(textparms.g1);
dvander@1915
   373
	bf->WriteByte(textparms.b1);
dvander@1915
   374
	bf->WriteByte(textparms.a1);
dvander@1915
   375
	bf->WriteByte(textparms.r2);
dvander@1915
   376
	bf->WriteByte(textparms.g2);
dvander@1915
   377
	bf->WriteByte(textparms.b2);
dvander@1915
   378
	bf->WriteByte(textparms.a2);
dvander@1915
   379
	bf->WriteByte(textparms.effect);
dvander@1915
   380
	bf->WriteFloat(textparms.fadeinTime);
dvander@1915
   381
	bf->WriteFloat(textparms.fadeoutTime);
dvander@1915
   382
	bf->WriteFloat(textparms.holdTime);
dvander@1915
   383
	bf->WriteFloat(textparms.fxTime);
dvander@1915
   384
	bf->WriteString(pMessage);
skamonkey@3743
   385
#endif
dvander@1915
   386
	g_UserMsgs.EndMessage();
dvander@1915
   387
}
dvander@1915
   388
dvander@1915
   389
static cell_t ShowSyncHudText(IPluginContext *pContext, const cell_t *params)
dvander@1915
   390
{
dvander@1915
   391
	int client;
dvander@1915
   392
	Handle_t err;
dvander@1915
   393
	CPlayer *pPlayer;
dvander@1915
   394
	hud_syncobj_t *obj;
dvander@1915
   395
	char message_buffer[255-36];
dvander@1915
   396
dvander@1915
   397
	if (!s_HudMsgHelpers.IsSupported())
dvander@1915
   398
	{
dvander@1915
   399
		return -1;
dvander@1915
   400
	}
dvander@1915
   401
dvander@1915
   402
	if ((err = s_HudMsgHelpers.ReadHudSyncObj(params[2], pContext->GetIdentity(), &obj)) != HandleError_None)
dvander@1915
   403
	{
dvander@1915
   404
		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[2], err);
dvander@1915
   405
	}
dvander@1915
   406
dvander@1915
   407
	client = params[1];
dvander@1915
   408
	if ((pPlayer = g_Players.GetPlayerByIndex(client)) == NULL)
dvander@1915
   409
	{
dvander@1915
   410
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@1915
   411
	}
dvander@1915
   412
	else if (!pPlayer->IsInGame())
dvander@1915
   413
	{
dvander@1915
   414
		return pContext->ThrowNativeError("Client %d is not in-game", client);
dvander@1915
   415
	}
dvander@1915
   416
kyle@4060
   417
	g_SourceMod.SetGlobalTarget(client);
dvander@1915
   418
	g_SourceMod.FormatString(message_buffer, sizeof(message_buffer), pContext, params, 3);
dvander@2175
   419
	if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1915
   420
	{
dvander@1915
   421
		return 0;
dvander@1915
   422
	}
dvander@1915
   423
dvander@1915
   424
	g_hud_params.channel = s_HudMsgHelpers.AutoSelectChannel(client, obj);
dvander@1915
   425
	UTIL_SendHudText(client, g_hud_params, message_buffer);
dvander@1915
   426
dvander@1915
   427
	return 1;
dvander@1915
   428
}
dvander@1915
   429
dvander@1915
   430
static cell_t ClearSyncHud(IPluginContext *pContext, const cell_t *params)
dvander@1915
   431
{
dvander@1915
   432
	int client;
dvander@1915
   433
	int channel;
dvander@1915
   434
	Handle_t err;
dvander@1915
   435
	CPlayer *pPlayer;
dvander@1915
   436
	hud_syncobj_t *obj;
dvander@1915
   437
dvander@1915
   438
	if (!s_HudMsgHelpers.IsSupported())
dvander@1915
   439
	{
dvander@1915
   440
		return -1;
dvander@1915
   441
	}
dvander@1915
   442
dvander@1915
   443
	if ((err = s_HudMsgHelpers.ReadHudSyncObj(params[2], pContext->GetIdentity(), &obj)) != HandleError_None)
dvander@1915
   444
	{
dvander@1915
   445
		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[2], err);
dvander@1915
   446
	}
dvander@1915
   447
dvander@1915
   448
	client = params[1];
dvander@1915
   449
	if ((pPlayer = g_Players.GetPlayerByIndex(client)) == NULL)
dvander@1915
   450
	{
dvander@1915
   451
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@1915
   452
	}
dvander@1915
   453
	else if (!pPlayer->IsInGame())
dvander@1915
   454
	{
dvander@1915
   455
		return pContext->ThrowNativeError("Client %d is not in-game", client);
dvander@1915
   456
	}
dvander@1915
   457
dvander@1915
   458
	if ((channel = s_HudMsgHelpers.TryReuseLastChannel(client, obj)) == -1)
dvander@1915
   459
	{
dvander@1915
   460
		return -1;
dvander@1915
   461
	}
dvander@1915
   462
dvander@1915
   463
	g_hud_params.channel = channel;
dvander@1915
   464
	UTIL_SendHudText(client, g_hud_params, "");
dvander@1915
   465
dvander@1915
   466
	return g_hud_params.channel;
dvander@1915
   467
}
dvander@1915
   468
dvander@1915
   469
static cell_t ShowHudText(IPluginContext *pContext, const cell_t *params)
dvander@1915
   470
{
dvander@1915
   471
	int client;
dvander@1915
   472
	CPlayer *pPlayer;
dvander@1915
   473
	char message_buffer[255-36];
dvander@1915
   474
dvander@1915
   475
	if (!s_HudMsgHelpers.IsSupported())
dvander@1915
   476
	{
dvander@1915
   477
		return -1;
dvander@1915
   478
	}
dvander@1915
   479
dvander@1915
   480
	client = params[1];
dvander@1915
   481
	if ((pPlayer = g_Players.GetPlayerByIndex(client)) == NULL)
dvander@1915
   482
	{
dvander@1915
   483
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@1915
   484
	}
dvander@1915
   485
	else if (!pPlayer->IsInGame())
dvander@1915
   486
	{
dvander@1915
   487
		return pContext->ThrowNativeError("Client %d is not in-game", client);
dvander@1915
   488
	}
dvander@1915
   489
kyle@4060
   490
	g_SourceMod.SetGlobalTarget(client);
dvander@1915
   491
	g_SourceMod.FormatString(message_buffer, sizeof(message_buffer), pContext, params, 3);
dvander@2175
   492
	if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1915
   493
	{
dvander@1915
   494
		return 0;
dvander@1915
   495
	}
dvander@1915
   496
dvander@1915
   497
	if (params[2] == -1)
dvander@1915
   498
	{
dvander@1915
   499
		g_hud_params.channel = s_HudMsgHelpers.AutoSelectChannel(client);
dvander@1915
   500
	}
dvander@1915
   501
	else
dvander@1915
   502
	{
dvander@1915
   503
		g_hud_params.channel = params[2] % MAX_HUD_CHANNELS;
dvander@1915
   504
		s_HudMsgHelpers.ManualSelectChannel(client, g_hud_params.channel);
dvander@1915
   505
	}
dvander@1915
   506
dvander@1915
   507
	UTIL_SendHudText(client, g_hud_params, message_buffer);
dvander@1915
   508
dvander@1915
   509
	return g_hud_params.channel;
dvander@1915
   510
}
dvander@1915
   511
dvander@1915
   512
REGISTER_NATIVES(hudNatives)
dvander@1915
   513
{
dvander@1915
   514
	{"ClearSyncHud",				ClearSyncHud},
dvander@1915
   515
	{"CreateHudSynchronizer",		CreateHudSynchronizer},
dvander@1915
   516
	{"SetHudTextParams",			SetHudTextParams},
dvander@1915
   517
	{"SetHudTextParamsEx",			SetHudTextParamsEx},
dvander@1915
   518
	{"ShowHudText",					ShowHudText},
dvander@1915
   519
	{"ShowSyncHudText",				ShowSyncHudText},
dvander@1915
   520
	{NULL,							NULL},
dvander@1915
   521
};