about summary refs log tree commit diff
path: root/src/game/client/components/motd.cpp
blob: ba85f7f872f2936372e0281463bd87639f7bb1d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <engine/e_client_interface.h>
#include <engine/client/graphics.h>
#include <engine/e_config.h>
#include <game/generated/g_protocol.hpp>
#include <game/generated/gc_data.hpp>

#include <game/client/gameclient.hpp>

#include "motd.hpp"

void MOTD::clear()
{
	server_motd_time = 0;
}

bool MOTD::is_active()
{
	return time_get() < server_motd_time;	
}

void MOTD::on_statechange(int new_state, int old_state)
{
	if(old_state == CLIENTSTATE_ONLINE || old_state == CLIENTSTATE_OFFLINE)
		clear();
}

void MOTD::on_render()
{
	if(!is_active())
		return;
		
	float width = 400*3.0f*Graphics()->ScreenAspect();
	float height = 400*3.0f;

	Graphics()->MapScreen(0, 0, width, height);
	
	float h = 800.0f;
	float w = 650.0f;
	float x = width/2 - w/2;
	float y = 150.0f;

	Graphics()->BlendNormal();
	Graphics()->TextureSet(-1);
	Graphics()->QuadsBegin();
	Graphics()->SetColor(0,0,0,0.5f);
	RenderTools()->draw_round_rect(x, y, w, h, 40.0f);
	Graphics()->QuadsEnd();

	gfx_text(0, x+40.0f, y+40.0f, 32.0f, server_motd, (int)(w-80.0f));
}

void MOTD::on_message(int msgtype, void *rawmsg)
{
	if(msgtype == NETMSGTYPE_SV_MOTD)
	{
		NETMSG_SV_MOTD *msg = (NETMSG_SV_MOTD *)rawmsg;

		// process escaping			
		str_copy(server_motd, msg->message, sizeof(server_motd));
		for(int i = 0; server_motd[i]; i++)
		{
			if(server_motd[i] == '\\')
			{
				if(server_motd[i+1] == 'n')
				{
					server_motd[i] = ' ';
					server_motd[i+1] = '\n';
					i++;
				}
			}
		}

		if(server_motd[0] && config.cl_motd_time)
			server_motd_time = time_get()+time_freq()*config.cl_motd_time;
		else
			server_motd_time = 0;
	}
}

bool MOTD::on_input(INPUT_EVENT e)
{
	if(is_active() && e.flags&INPFLAG_PRESS && e.key == KEY_ESCAPE)
	{
		clear();
		return true;
	}
	return false;
}