// ******************************
//  Emoticons by Venjax V1.12
//      For Counter Strike: Source
//
// * Description:
//      If players type certain Emoticons, it will appear as a bubble above their heads.
//      The emoticon bubble spins and follows the player.
//
// * Install instructions:
//       http://forums.mattie.info/cs/forums/viewtopic.php?t=13035
//
//
// * Requirements:
//      Mattie's EventScripts V1.5 (aka Artichoke) or higher.
//
// * Optional Requirement.	
//
//      Es_tools V .418a or higher. (Lesser versions will work, but may crash servers at map change)	      
//
// * Special thanks.
//	Thanks to Wonder for making the original code. (to make bubble icon appaer above head)
//      Thanks to Einlanzers and Mattie for finding an "ES Only" solution and additional code.
//      Thanks very much to Don for helping me learn how to edit and reskin models.
//
//	Note: Only about 10% or less of this script is original code by Venjax. Thanks to
//            the above mentioned people for their efforts in coding this script.
//
//	All models were created using the extras/info_speech.mdl provided with HL2.
//	All emoticons that appear on the models were from a free emoticon collection
//	found here: http://forums.mattie.info/cs/forums/viewtopic.php?t=13035 - Thanks "Daz"! 
//
// ******************************


// ******************************
//   CONFIGURABLE SETTINGS
// ******************************

// Change these 3 settings as you'd like.

block config
{

        // Set this to how long the emoticons should last for, in seconds.

        es_set emote_lifetime 5.0

        // Set this to long users must wait between emoticons, in seconds.

        es_set emote_delay 5.0

	// Set this to use EST or Not.
	//Note: EST version is more stable (at time of this script's creation), but versions prior
	//to V.418a are known to crash server on mapchange using est_setentname.
	//Highly recommended to use ES_Tools if you have V .418a or higher.

	es_set emote_est 1  //1 to use EST 0 to use ES only.
}

// Do not modify anything below this point unless you know what you're doing.

block load
{
        es_set emote_version v1.12
        es_makepublic emote_version
        es_doblock emote/config
        es_set emote 0
        es_set emote_exists 0
        es_set emote_format 0
        es_set emote_format2 0
        es_set emote_format3 0
        es_set emote_index 0
        es_set emote_isdead 0
        es_set emote_emotes 0
        es_set emote_emotelist 0
        es_set emote_vec 0
        es_set emote_x 0
        es_set emote_y 0
        es_set emote_z 0

        downloadable sound/extras/pop.wav
        es_keygroupload emote_emotes |emote
        es_foreachkey emote_emotelist in emote_emotes "es_xdoblock emote/forcedownload"
        es_delayed 1 es_keygroupdelete emote_emotes

        keygroupremove emote_ents
        keygroupremove emote_entsnew
        keygroupremove emote_wait

        es_keygroupcreate emote_wait

        es_msg #multi "#lightgreen[#greenemote#lightgreen]#green CSS Emote has been loaded!"

        if (server_var(eventscripts_currentmap) notequalto 0) do
        {
                es_precachemodel extras/smile/info_speech
                es_precachemodel extras/smile/info_speech
                es_precachemodel extras/mbang/info_speech
                es_precachemodel extras/frown/info_speech
                es_precachemodel extras/grin/info_speech
        }

}

event es_map_start
{
        es_xprecachemodel extras/smile/info_speech
        es_xprecachemodel extras/mbang/info_speech
        es_xprecachemodel extras/frown/info_speech
        es_xprecachemodel extras/grin/info_speech

        downloadable sound/extras/pop.wav
        es_keygroupload emote_emotes |emote
        es_foreachkey emote_emotelist in emote_emotes "es_xdoblock emote/forcedownload"
        es_keygroupdelete emote_emotes


        keygroupremove emote_wait
        es_keygroupcreate emote_wait
}

event round_start
{
        keygroupremove emote_wait
        es_keygroupcreate emote_wait

}

event player_say
{
        if ("m!" in event_var(text)) do
        {
                es_xset emote "prop_dynamic_create extras/mbang/info_speech.mdl"
                es_xdoblock emote/dobubble
        }

        if (":)" in event_var(text)) do
        {
                es_xset emote "prop_dynamic_create extras/smile/info_speech.mdl"
                es_xdoblock emote/dobubble
        }

        if (":(" in event_var(text)) do
        {
                es_xset emote "prop_dynamic_create extras/frown/info_speech.mdl"
                es_xdoblock emote/dobubble
        }

        if ("lol" in event_var(text)) do
        {
                es_xset emote "prop_dynamic_create extras/grin/info_speech.mdl"
                es_xdoblock emote/dobubble
        }

        if (":o" in event_var(text)) do
        {
                es_xset emote "prop_dynamic_create extras/ooh/info_speech.mdl"
                es_xdoblock emote/dobubble
        }

        if (":P" in event_var(text)) do
        {
                es_xset emote "prop_dynamic_create extras/ras/info_speech.mdl"
                es_xdoblock emote/dobubble
        }
}

block dobubble
{
        //checks to see if emote_wait key exists.

        es_exists emote_exists key emote_wait event_var(userid)
        ifx false(emote_exists) do
        {
		//Plays the pop sound when a user types an emoticon
                es_playsound event_var(userid) extras/pop.wav 1
                //Creates the wait key and then deletes it after <emote delay> seconds.
                es_keycreate emote_wait event_var(userid)
                es_keysetvalue emote_wait event_var(userid) 1
                es_delayed server_var(emote_delay) es_keydelete emote_wait event_var(userid)

                //Checks to see if a player is dead, wont allow dead players to use emoticons.
                es_getplayerprop emote_isdead event_var(userid) CBasePlayer.pl.deadflag
                ifx false(emote_isdead) do
                {
                        // Create the speech bubble.
                        es_xcreateentitylist emote_ents prop_dynamic
                        es cheatexec event_var(userid) server_var(emote)
                        es_xcreateentitylist emote_entsnew prop_dynamic

                        // Look for our speech bubble.
                        es_xforeachkey emote_index in emote_entsnew "es_xdoblock emote/dobubble_inner"

                        es_xkeygroupdelete emote_ents
                        es_xkeygroupdelete emote_entsnew
                }
        }
}

block dobubble_inner
{
        es_exists emote_exists key emote_ents server_var(emote_index)
        ifx false(emote_exists) do
        {
                // Set the entity's targetname and make it follow the user.
                es_format emote_format emote_bubble%1 event_var(userid)


		if (server_var(emote_est) equalto 0) do
		{
	                es setentname server_var(emote_index) server_var(emote_format)

		}
		else do
		{
	                es est_setentname server_var(emote_index) server_var(emote_format)
		}
                // Set the entity's origin.
                // We want it above the player's head, so get their location first and then move it along the Z-axis.
                es_getplayerlocation emote_x emote_y emote_z event_var(userid)
                es_xmath emote_z + 96
                es_createvectorstring emote_vec server_var(emote_x) server_var(emote_y) server_var(emote_z)
                es_setindexprop server_var(emote_index) CBaseEntity.m_vecOrigin server_var(emote_vec)

                es_format emote_format2 emote_user%1 event_var(userid)
                es_xformatv emote_format3 "targetname %1" emote_format2
                es_fire event_var(userid) !self addoutput server_var(emote_format3)
                es_fire event_var(userid) server_var(emote_format) SetParent server_var(emote_format2)
                es_fire event_var(userid) server_var(emote_format) SetAnimation idle
                es_fire event_var(userid) server_var(emote_format) addoutput "angles 0 0 0"
                es_fire event_var(userid) server_var(emote_format) addoutput "solid 0"
                es_xformatv emote_format2 "OnUser1 !self,Kill,,%1,1" emote_lifetime
                es_fire event_var(userid) server_var(emote_format) addoutput server_var(emote_format2)
                es_fire event_var(userid) server_var(emote_format) FireUser1
        }
}

block forcedownload
{
        //Adds models to downloadables stringtable.
        //This only happens at load and the start of each map.

        es_xset emote_variable 0
        es_xset emote_material "materials/models/extras/"
        es_xset emote_model "models/extras/"

        es_format emote_variable "%1%2/speech_info.vmt" server_var(emote_material) server_var(emote_emotelist)
        es downloadable server_var(emote_variable)
        es_format emote_variable "%1%2/speech_info.vtf" server_var(emote_material) server_var(emote_emotelist)
        es downloadable server_var(emote_variable)

        es_format emote_variable "%1%2/info_speech.dx80.vtx" server_var(emote_model) server_var(emote_emotelist)
        es downloadable server_var(emote_variable)
        es_format emote_variable "%1%2/info_speech.dx90.vtx" server_var(emote_model) server_var(emote_emotelist)
        es downloadable server_var(emote_variable)
        es_format emote_variable "%1%2/info_speech.mdl" server_var(emote_model) server_var(emote_emotelist)
        es downloadable server_var(emote_variable)
        es_format emote_variable "%1%2/info_speech.phy" server_var(emote_model) server_var(emote_emotelist)
        es downloadable server_var(emote_variable)
        es_format emote_variable "%1%2/info_speech.sw.vtx" server_var(emote_model) server_var(emote_emotelist)
        es downloadable server_var(emote_variable)
        es_format emote_variable "%1%2/info_speech.vvd" server_var(emote_model) server_var(emote_emotelist)
        es downloadable server_var(emote_variable)
}