View Single Post
neuromancer
Member
Join Date: Apr 2007
Location: Poland
Old 07-18-2007 , 09:43   Re: TimeLeft Extender (last round mapchange block)
Reply With Quote #13

I changed it a little
Now it shows nextmap as well and when the last round ends it shows an info again and I set a 5.5 second stop to make players able to see the last man die.

Here's the updated code:
Code:
/*
 *
 *  This program is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU General Public License as published by the
 *  Free Software Foundation; either version 2 of the License, or (at
 *  your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software Foundation,
 *  Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 *  All date formats are in european format (dd.mm.yyyy)
 *
 *                                  _
 *                                 | | _
 *              _ __  _ ______  ___| |(_) __ ___  __
 *             | '_ \| '_/  _ \/  _  || |/ _' | \/ /
 *             | |_) | | \ (_) \ (_| || | (_| |\  /
 *             | .__/|_|  \____/\____||_|\__. |/ /
 *             |_|                       |___//_/
 *      
 *  File:    TimeLeftExtender.sma
 *
 *  Title:   TimeLeft Extender
 *
 *  Version: 1.1
 *
 *  Feel free to redistribute and modify this file,
 *  But please give me some credits.
 *
 *  Author:  prodigy
 *           [email protected]
 *
 *  Last Changes:     30.04.2007 (dd.mm.yyyy)
 *
 *  Credits: - Johnny got his gun @ http://forums.alliedmods.net/showthread.php?p=67909
 *             For his code about detecting a round end.. and inspiring me to write this
 *           - The AMXX Team for some code from the timeleft.sma
 *           - MaximusBrood @ http://forums.alliedmods.net/showthread.php?p=236886
 *             For the color-code
 *
 *  Purpose: This plugin removes the timelimit CATCH_MAPCHANGE_AT seconds before mapchange
 *           and makes the round end after the current round delaying the change for
 *           amx_tle_chattime seconds.
 *           When mapchange is blocked typing timeleft displays that the current round is the last.
 *
 *
 *  CVars:
 *           amx_tle_enabled [1]/0   - Controls wether the plugin is enabled or not. (default 1)
 *           amx_tle_usehud [1]/0    - Controls wether to use HUD message announcement or not. (default 1)
 *           amx_tle_chattime [7]    - Controls the time people have to chat before actual change occurs. (default 7)
 *           amx_tle_catchat [5]     - Controls at which second of timeleft the plugin should
 *                                       catch the mapchange and block it. (default 5)
 *           amx_tle_textcolor 0-[2] // Sets the color of the "This is the last round" message.
 *                                   //  0 = Normal chat color
 *                                   //  1 = Team color (CT: blue, T: red)
 *                                   //  2 = Green
 *
 *  Commands:
 *           amx_changenow          - Changes map immediatley to current amx_nextmap
 *           say changenow          - Changes map immediatley to current amx_nextmap
 *           say timeleft           - If the plugin blocked the mapchange, saying timeleft will
 *                                      display "This is the last round." in the users language.
 *
 *  Copyright (c) 2007 by Sebastian G. alias prodigy
 *
 *  Change-Log:
 *    1.1 (30.04.2007): 
 *       Features:
 *         o Added amx_tle_textcolor and functionality
 *    
 *    1.0 (29.04.2007):
 *       o initial release
 *
 *    0.1 Alpha (29.04.2007):
 *       o Added functionality for everything in 1.0,
 *         basically I just renamed the Version number.
 */

#include <amxmodx>
#include <amxmisc>

#define TLE_ENABLED "1"
#define DEFAULT_CHATTIME "7"
#define DEFAULT_USEHUD "1"
#define CATCH_MAPCHANGE_AT "5" // seconds left when mapchange should be catched and blocked
#define DEFAULT_TEXTCOLOR "2"
#define CHANGE_ACCESS ADMIN_MAP

new bool:g_mrset
new g_timelimit
new cvar_tle_enabled, cvar_tle_chattime, cvar_tle_catchat, cvar_tle_usehud, cvar_tle_textcol

public plugin_init() {
  register_plugin("TimeLeft Extender", "0.1a", "prodigy")
  register_dictionary("TimeLeftExtender.txt")
  cvar_tle_enabled  = register_cvar("amx_tle_enabled", TLE_ENABLED)
  cvar_tle_chattime = register_cvar("amx_tle_chattime", DEFAULT_CHATTIME)
  cvar_tle_catchat  = register_cvar("amx_tle_catchat", CATCH_MAPCHANGE_AT) // changes are only registered after a map change
  cvar_tle_usehud   = register_cvar("amx_tle_usehud", DEFAULT_USEHUD) // use hud message?
  cvar_tle_textcol  = register_cvar("amx_tle_textcolor", DEFAULT_TEXTCOLOR) // text color to use
  register_event("SendAudio","event_roundEnd","a","2=%!MRAD_terwin","2=%!MRAD_ctwin","2=%!MRAD_rounddraw")
  register_clcmd("amx_changenow", "changeNow", CHANGE_ACCESS, "- changes map immediately to current amx_nextmap")
  register_clcmd("say changenow", "changeNow", CHANGE_ACCESS, "- changes map immediately to current amx_nextmap")
  register_clcmd("say timeleft", "timeleftInfo", 0, "- when timelimit is 0 displays last round")

  g_mrset = false
  set_task(get_pcvar_float(cvar_tle_catchat), "initMapchangeEvent", 901337, "", 0, "d", 1) // Catch mapchange amx_tle_catchat seconds before change
}

public timeleftInfo(id)
{
  if(g_mrset == true)
  {
    new nextmap[32]
    get_cvar_string("amx_nextmap", nextmap, 31)
    client_print(0, print_chat, "%L", LANG_PLAYER, "LAST_ROUND", nextmap)
    return PLUGIN_HANDLED
  }
  return PLUGIN_CONTINUE
}

public changeNow(id)
{
  if(get_pcvar_num(cvar_tle_enabled))
  {
    if(access(id, ADMIN_MAP))
    {
      new name[64], nextmap[32]
      get_user_name(id, name, 63)
      get_cvar_string("amx_nextmap", nextmap, 31)
      switch(get_cvar_num("amx_show_activity"))
      {
        case 2: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_CHANGENOW_2", name, nextmap)
        case 1: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_CHANGENOW_1", nextmap)
      }
      initMapChange()
      return PLUGIN_HANDLED
    }
    return PLUGIN_CONTINUE
  }
  return PLUGIN_CONTINUE
}

public event_roundEnd() // roundend hook
{
  if(g_mrset == true)
  {
    g_mrset = false

    new colorstring[5]
    switch(get_pcvar_num(cvar_tle_textcol))
      {
        case 2: copy(colorstring, 4, "^x04")
        case 1: copy(colorstring, 4, "^x03")
        case 0: copy(colorstring, 4, "^x01")
      }
      new nextmap[32]
      get_cvar_string("amx_nextmap", nextmap, 31)
      new message[64]
      format(message, 61, "%s%L", colorstring, LANG_PLAYER, "ROUND_END", nextmap)
      remove_task(901337)

      new plist[32], playernum, player;
      get_players(plist, playernum, "c");
      for(new i = 0; i < playernum; i++)
      {
        player = plist[i];
        message_begin(MSG_ONE, get_user_msgid("SayText"), {0,0,0}, player);
        write_byte(player);
        write_string(message);
        message_end();
      }
      if(get_pcvar_num(cvar_tle_usehud))
      {
        set_hudmessage(0, 255, 0, -1.0, 0.1)
        show_hudmessage(0, "%L", LANG_PLAYER, "ROUND_END", nextmap)
      }
    set_task(5.5, "resetTimeLimit")
    set_task(5.5, "initMapChange")
  }
  return PLUGIN_CONTINUE
}

public initMapchangeEvent() // initiate the main event, setting timelimit to 0 etc..
{
  if(get_pcvar_num(cvar_tle_enabled))
  {
    new nextmap[32]
    get_cvar_string("amx_nextmap", nextmap, 31)
    new m_timeleft = get_timeleft()
    new colorstring[5]
    if(m_timeleft <= get_pcvar_num(cvar_tle_catchat) && g_mrset == false)
    {
      switch(get_pcvar_num(cvar_tle_textcol))
      {
        case 2: copy(colorstring, 4, "^x04")
        case 1: copy(colorstring, 4, "^x03")
        case 0: copy(colorstring, 4, "^x01")
      }
      new message[64]
      format(message, 61, "%s%L", colorstring, LANG_PLAYER, "LAST_ROUND", nextmap)
      remove_task(901337)

      new plist[32], playernum, player;
      get_players(plist, playernum, "c");
      for(new i = 0; i < playernum; i++)
      {
        player = plist[i];
        message_begin(MSG_ONE, get_user_msgid("SayText"), {0,0,0}, player);
        write_byte(player);
        write_string(message);
        message_end();
      }

      if(get_pcvar_num(cvar_tle_usehud))
      {
        set_hudmessage(0, 255, 0, -1.0, 0.1)
        show_hudmessage(0, "%L", LANG_PLAYER, "LAST_ROUND", nextmap)
      }
      g_mrset = true
      g_timelimit = get_cvar_num("mp_timelimit")
      set_cvar_num("mp_timelimit", 0)
    }
  }
}

public resetTimeLimit() // reset timelimit to value used before setting it to 0
{
  set_cvar_num("mp_timelimit", g_timelimit)
}

public initMapChange() // initiate the change
{
  message_begin(MSG_ALL, SVC_INTERMISSION) /* Taken from timeleft.sma */ // initiates a mapchange viewing the scores screen
  message_end()                                /*                         */
  set_task(get_pcvar_float(cvar_tle_chattime), "doMapChange", 901338, "", 0, "")
}

public doMapChange() // do the actual change
{
  if(task_exists(901338, 0))
  {
    remove_task(901338);
  }
  new nextmap[32]
  get_cvar_string("amx_nextmap", nextmap, 31)
  server_cmd("changelevel %s", nextmap)
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1031\\ f0\\ fs16 \n\\ par }
*/
and updated language file:
Code:
[en]
ADMIN_CHANGENOW_2 = ADMIN %s: Change to the nextmap (%s) now.
ADMIN_CHANGENOW_1 = ADMIN: Change to the nextmap (%s) now.
LAST_ROUND = Last round, the nextmap is %s
ROUND_END = Round is over, changing to %s...

[pl]
ADMIN_CHANGENOW_2 = ADMIN %s: Zmiana na nastepna mape (%s)
ADMIN_CHANGENOW_1 = ADMIN: Zmiana na nastepna mape (%s)
LAST_ROUND = Ostatnia runda, nastepna mapa to %s
ROUND_END = Runda zakonczona, zmiana mapy na %s...
neuromancer is offline