﻿#include <amxmodx>
#include <amxmisc>
#include <cstrike>

#define MAXSLOTS 32

enum Color
{
	YELLOW = 1, // Yellow
	GREEN, // Green Color
	TEAM_COLOR, // Red, grey, blue
	GREY, // grey
	RED, // Red
	BLUE, // Blue
}

new TeamInfo;
new SayText;
new MaxSlots;

new bool:IsConnected[MAXSLOTS + 1];

new TeamName[][] = 
{
	"",
	"TERRORIST",
	"CT",
	"SPECTATOR"
}

new ColorMode;

public plugin_init() {
	register_plugin("Color Chat", "1.03", "MaTTe");
	
	ColorMode = register_cvar("colorchat_mode", "1");
	
	register_clcmd("say", "hook_say");
	register_clcmd("say_team", "hook_team_say");
	
	TeamInfo = get_user_msgid("TeamInfo");
	SayText = get_user_msgid("SayText");
	MaxSlots = get_maxplayers();
}

public client_putinserver(player)
{
	IsConnected[player] = true;
}

public client_disconnect(player)
{
	IsConnected[player] = false;
}

public hook_say(id) {
	if(!get_pcvar_num(ColorMode))
		return PLUGIN_CONTINUE;

public chat(id)
{
	read_args(message, 200)
	remove_quotes(message)
	format(message, 200, " %s", message)
	get_user_name(id, name, 31)

	if(get_user_flags(id) & ADMIN_KICK)
	{
		admin = "管理員"
	}
	else
	{
		admin = "玩家"
	}


	static text2[200];
	read_args(text2, 199);
	remove_quotes(text2);
	trim(text2);
	
	new name[32];
	get_user_name(id, name, 31);
	
	if(equal(text2, ""))
		return PLUGIN_HANDLED;

	switch(get_pcvar_num(ColorMode)) {
		case 1: 
		{
			if(is_user_alive(id))
				ColorChat(0, RED, "^x02%s ^x01%s : ^x03%s", admin, name, text2);
			else
				ColorChat(0, RED, "^x02*陣亡* ^x02%s ^x01%s : ^x03%s", name, admin, text2);
		}
		case 2: 
		{
			if(is_user_alive(id))
				ColorChat(0, GREEN, "^x02%s ^x01%s : ^x04%s", name, text2);
			else
				ColorChat(0, GREEN, "^x02*陣亡* ^x02%s  ^x01%s : ^x04%s", name, admin, text2);
		}
		case 3: 
		{
			if(is_user_alive(id))
				ColorChat(0, BLUE, "^x02%s ^x01%s : ^x03%s", admin, name, text2);
			else
				ColorChat(0, BLUE, "^x02*陣亡* ^x02%s %s : ^x03%s", name, admin, text2);
		}
	}
	
	return PLUGIN_HANDLED;
}

public hook_team_say(id) {
	if(!get_pcvar_num(ColorMode))
		return PLUGIN_CONTINUE;
		
	static text2[200];
	read_args(text2, 199);
	remove_quotes(text2);
	trim(text2);
	
	new name[32];
	get_user_name(id, name, 31);
	
	if(equal(text2, ""))
		return PLUGIN_HANDLED;

	switch(get_pcvar_num(ColorMode)) {
		case 1: 
		{
			if((is_user_alive(id) == 0))
				ColorChat(0, RED, "^x01*陣亡* ^x02%s ^x01%s  : ^x03%s", admin, name, text2);
			else
				ColorChat(0, RED, "%s : %s", name, text2);
		}
		case 2: 
		{
			if((is_user_alive(id) == 0))
				ColorChat(0, GREEN, "^x01*陣亡* ^x02%s ^x01%s : ^x04%s", admin, name, text2);
			else
				ColorChat(0, GREEN, "%s : %s", name, text2);
		}
		case 3: 
		{
			if((is_user_alive(id) == 0))
				ColorChat(0, BLUE, "^x01*陣亡* ^x02%s ^x01%s : ^x03%s", admin, name, text2);
			else
				ColorChat(0, BLUE, "%s : %s", name, text2);
		}
	}
	
	return PLUGIN_HANDLED;
}			

public ColorChat(id, Color:type, const msg[], {Float,Sql,Result,_}:...)
{
	static message[256];

	switch(type)
	{
		case YELLOW: // Yellow
		{
			message[0] = 0x01;
		}
		case GREEN: // Green
		{
			message[0] = 0x04;
		}
		default: // White, Red, Blue
		{
			message[0] = 0x03;
		}
	}

	vformat(message[1], 251, msg, 4);

	// Make sure message is not longer than 192 character. Will crash the server.
	message[192] = '^0';

	new team, ColorChange, index, MSG_Type;
	
	if(!id)
	{
		index = FindPlayer();
		MSG_Type = MSG_ALL;
	
	} else {
		MSG_Type = MSG_ONE;
		index = id;
	}
	
	team = get_user_team(index);	
	ColorChange = ColorSelection(index, MSG_Type, type);

	ShowColorMessage(index, MSG_Type, message);
		
	if(ColorChange)
	{
		Team_Info(index, MSG_Type, TeamName[team]);
	}
}

ShowColorMessage(id, type, message[])
{
	emessage_begin(type, SayText, _, id);
	ewrite_byte(id)		
	ewrite_string(message);
	emessage_end();	
}

Team_Info(id, type, team[])
{
	emessage_begin(type, TeamInfo, _, id);
	ewrite_byte(id);
	ewrite_string(team);
	emessage_end();

	return 1;
}

ColorSelection(index, type, Color:Type)
{
	switch(Type)
	{
		case RED:
		{
			return Team_Info(index, type, TeamName[1]);
		}
		case BLUE:
		{
			return Team_Info(index, type, TeamName[2]);
		}
		case GREY:
		{
			return Team_Info(index, type, TeamName[0]);
		}
	}

	return 0;
}

FindPlayer()
{
	new i = -1;

	while(i <= MaxSlots)
	{
		if(IsConnected[++i])
		{
			return i;
		}
	}

	return -1;
}
