Raised This Month: $ Target: $400
 0% 

vote system


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
daffy4jr
Junior Member
Join Date: Apr 2007
Old 05-17-2007 , 08:58   vote system
Reply With Quote #1

hello,
I am trying to get vote system to work on my MOD which is MS:C (Mastersword Continued)

I have posted in support and realized it is not the best place to post for scripting.

http://forums.alliedmods.net/showthread.php?t=55101

I am trying to get rid of adminvote.amxx now since it doesn't work well with my MOD.
A friend of mine gave me this script for the MSC and trying to make it work with the MOD. I have been getting a lot of errors when I try to compile it.

Could you guys help me please?
the code is below.
Code:
/*
===========================================================
Adminvote for MSC by Thothie, aka "Eff this, I'll do it myself"

FUNCTIONS/FEATURES:
- Starts a vote for an adjacent map when all players touch transition
- Allows individual players to start votes for adjacent maps when they touch a transition (optional-pending)
- Allows voting for some or all MSC maps at various levels of restritiveness based on current location
- Allows voting for a list of custom maps
- Allows admins to force a vote for any map
- Allows voting to kick/ban AFK/annoying players
- Allows voting to activate/deactivate PVP mode
- Compensates for MSC key-code weirdness
- Intercepts forced change map events from MSC, allowing mappers to bypass potential crashes
- Allows MSC NPC's or events to start votes for maps via scripts or map events
- Automatically turns PVP on before going to any map prefixed with PVP_
- Integrates with Stevelafl's crash recovery system, writing to the crash.cfg before map change
- Log options for chat and for developers

COMMANDS
- votemap: In chat or console, opens vote menu (lists maps)
- votemap [map]: In chat or console, votes for specific map, if allowed (returns feedback)
- votekick [player]: In chat or console, starts a vote to kick a player (req > 2 players)
- voteban [player]: In chat or console, starts a vote to ban a player for 1 hour (req > 2 players)
- amx_votemap: In console only, treats as though transition was touched (requires ADMIN_KICK)

CVARS[defaults]
- custommaps["ww1 lowlands ms_show foutpost unrest pvp_archery pvp_arena"] - List of available custom maps, maps must be seperated by spaces
- custommaps["file"] - Use custommaps.txt for map list instead (not yet implemented)
- amx_votemap_ratio[0.50] % of voting players that need to vote yes for new map.
- amx_votekick_ratio[0.40] % of voting players that need to vote yes to kick a player.
- amx_voteban_ratio[0.80] % of voting players that need to vote yes to ban a player.
- amx_allow_kickvotes [1] allow clients to vote kick players
- amx_allow_banvotes [1] allow clients to vote ban players
- amx_allow_pvpvotes [1] allow clients to vote to enable/disable pvp
- amx_vote_time[60] seconds between votes
- ms_vote_delay[90] seconds before allowing non-trans vote after map change (prevents map hopping)
- ms_repeatvote[0] when set to 1, allows voting for the same map repeatedly
- ms_vote_on_touch [1] Gives player option to start a vote whenever he touches a transition (not yet implemented)
- ms_votemap_type [0]
   0 = Standard - Adjacent, root towns, and custom maps votable only
   1 = Restricted - Only root towns and custom maps are votable
   2 = Ultra - All maps votable except boss and gauntlet maps
   * Note: You can never vote for the map you are currently on, save through admin vote
- ms_alwaysshow_adj [0] when set to 1, always report adjacent maps, regardless of vote type
- ms_town_warp [1] when set to 0, disallows voting for root towns (does not override ms_votemap_type 2)
- ms_mazelock [1] when set to 1, disallows voting for maps adjacent to maze maps (including mscave->gatecity/goblintown)
- ms_hiddenlock [1] when set to 1, disallows voting for maps that are considered to be hidden (including Challs)

LOG OPTIONS: (do not combine with other logging plugins)
- ms_chat_log [0] when set to 1, this logs all chat in a file based on the month name (file is continuously appended)
- ms_debug_log [0] when set to 1 writes ALL server messages to dev_log.log (lags, but good for debuggary) - map must restart to take effect (dev_log.log is cleared with each map start)
   
===========================================================
*/

#include <amxmodx>
#include <amxmisc>
// #include <VexdUM>
#include <string>
#include <file.inc>

//version control
#define c_version "MAR2007b"

//constants
#define c_touch_delay 5                  //seconds to supress checking for transition generated votes after spawn (as players often spawn in transitions)
#define c_message_delay 3               //seconds between reporting entity touched when dev log > 2
#define c_votemap_type_standard 0         //constants for vote types
#define c_votemap_type_restrict 1
#define c_votemap_type_ultra 2
#define c_votetype_map 1               //vote types (stored to g_votetype, passed to task_start_vote)
#define c_votetype_kick 2
#define c_votetype_ban 3
#define c_key_yes 1                     //keys
#define c_key_no 2
#define c_key_null 3
#define c_root_towns "edana deralia helena"   //maps votable as root town maps

//adjacent maps
#define c_adj_calruin2          "sfor"
#define c_adj_challs         "sfor"
#define c_adj_daragoth          "helena deralia mines"
#define c_adj_deralia         "daragoth"
#define c_adj_edana            "thornlands edanasewers"
#define c_adj_edanasewers      "edana"
#define c_adj_gatecity         "mscave"
#define c_adj_goblintown      "mscave"
#define c_adj_helena         "thornlands daragoth keledrosprelude2"
#define c_adj_heras            "thornlands"
#define c_adj_keledrosprelude2   "helena [bossmap]"
#define c_adj_keledrosruins      "keledrosprelude2"
#define c_adj_mines            "daragoth"
#define c_adj_mscave         "gatecity goblintown thornlands"
#define c_adj_sfor            "thornlands challs"
#define c_adj_thornlands      "heras helena sfor mscave edana"
#define c_nadjacents         15 //number of maps with adjacent listings

//gauntlet maps (voting into one of these, save at trans, causes gauntlet anti-cheat to activate, so do not allow)
#define c_gauntlet_maps   "keledrosruins ww2b ww3d highlands_msc lostcastle_msc skycastle orcplace2_beta"

//maze maps (these maps do not allow adjacent voting when set to ms_mazelock set to 1) (these are not parsed)
#define   c_maze_maps      "mscave"
#define   c_maze_maps_connected   "goblintown gatecity"

//hidden maps (these maps cannot be voted for when ms_hiddenlock set to 1) (these are not parsed)
#define c_hidden_maps   "challs"

//globals
new empty[32]            //used to reset map strings
new bool:debug_mode = true   //debug mode flag, set to false before release
new cvar_ms_debug_log      //stored globally to help optimization
new g_text[256]          //text for func_message to display (may not need)
new g_cmap_list[256][32]    //holds parsed custom map names
new g_ncustom = 0         //holds number of custom maps
new g_towns_list[32][32]   //holds parsed town map names
new g_ntowns = 0         //holds number of towns
new g_adjacent_list[32][32] //holds parsed map adjacent lists (ie. which maps are adjacent)
new g_adjacent_maps[32][32] //holds parsed map adjacent maps (ie. which maps have adjacent listings)
new g_gauntlet_list[32][32] //holds parsed gauntlet map names
new g_player_vote[32]      //holds player votes
new g_votetype            //holds votemap type (0|1|2) ("votemap"|"votekicK"|"voteban")
new g_maxplayers         //holds max players
new g_nvotes            //holds number of playes that voted
new g_error[256]         //error to return
new g_maptovote[32]         //passes map string to vote for
new g_offending_player[32]   //passes player string to voteban/kick
new g_voter_id            //passes voter index (0 = server)
new g_last_touched[32]      //holds name of map the last touched transition goes to (for single touch voting)
new g_lastMessage         //holds time of last message sent

//time markers
new foat:t_lastvote         //holds time of last vote
new foat:t_lastspawn      //holds time of last player spawn

//===== Initialize
public plugin_init()
{

   register_plugin("MSC Adminvote",c_version,"by Thothie")
   
   //get max players
     new players[32]
      get_players(players, g_maxplayers, "c")

   //register cvars
   register_cvar("custommaps","ww1 lowlands ms_show foutpost nightmare_thornlands unrest pvp_archery pvp_arena");

   register_cvar("amx_votekick_ratio","0.40")   //% of voting players voting yes needed to kick a player
   register_cvar("amx_voteban_ratio","0.80")     //% of voting players voting yes needed to ban a player
   register_cvar("amx_votemap_ratio","0.50")   //% of voting players voting yes needed to vote in a new map

   register_cvar("amx_allow_kickvotes","1")   //allow kick votes
   register_cvar("amx_allow_banvotes","1")      //allow ban votes
   register_cvar("amx_allow_pvpvotes","1")      //allow votes to change ms_pklevel
   register_cvar("amx_vote_time","60")         //time between votes

   register_cvar("ms_vote_delay","90")         //time before you can vote after arriving on new map
   register_cvar("ms_repeatvote","0")         //allow voting for same map you are on (reset map)
   register_cvar("ms_vote_on_touch","1")      //allow positive respond to single_touch_XXX server messages
   register_cvar("ms_votetype","0")         //vote restriction level
   register_cvar("ms_alwaysshow_adj","0")      //always list adjacent maps
   register_cvar("ms_town_warp","1")         //always allow warping to towns
   register_cvar("ms_mazelock","1")         //do not allow map votes in mazes
   register_cvar("ms_hiddenlock","1")         //do not allow votes for hidden maps

   register_cvar("ms_chat_log","0")         //log chat (msc_chatlog_MONTH-YEAR.txt)
   register_cvar("ms_debug_log","0")         //log all server messages (dev_log.txt)

   //register commands (each of these parses params and passes to task_start_vote)
   register_concmd("amx_votemap","cmd_vote_map" ,ADMIN_KICK,"<map name>")
   register_concmd("votemap","cmd_vote_map",0,"<map name>")
   register_concmd("votekick","cmd_vote_kick",0,"<partial name or #userid>")
   register_concmd("voteban","cmd_vote_ban",0,"<partial name or #userid>")

   //register menus
   register_menucmd(register_menuid("Change map to "),(1<<0)|(1<<1),"func_tally_votes")
   register_menucmd(register_menuid("Kick "),(1<<0)|(1<<1),"func_tally_votes")
   register_menucmd(register_menuid("Ban "),(1<<0)|(1<<1),"func_tally_votes")

   //initialize adjacent map strings
   copy(g_adjacent_list[1],32,c_adj_calruin2)
   copy(g_adjacent_list[2],32,c_adj_challs)
   copy(g_adjacent_list[3],32,c_adj_daragoth)
   copy(g_adjacent_list[4],32,c_adj_deralia)
   copy(g_adjacent_list[5],32,c_adj_edana)
   copy(g_adjacent_list[6],32,c_adj_edanasewers)
   copy(g_adjacent_list[7],32,c_adj_gatecity)
   copy(g_adjacent_list[8],32,c_adj_goblintown)
   copy(g_adjacent_list[9],32,c_adj_helena)
   copy(g_adjacent_list[10],32,c_adj_heras)
   copy(g_adjacent_list[11],32,c_adj_mines)
   copy(g_adjacent_list[12],32,c_adj_mscave)
   copy(g_adjacent_list[13],32,c_adj_sfor)
   copy(g_adjacent_list[14],32,c_adj_thornlands)

   copy(g_adjacent_maps[1],32,"calruin2")
   copy(g_adjacent_maps[2],32,"challs")
   copy(g_adjacent_maps[3],32,"daragoth")
   copy(g_adjacent_maps[4],32,"deralia")
   copy(g_adjacent_maps[5],32,"edana")
   copy(g_adjacent_maps[6],32,"edanasewers")
   copy(g_adjacent_maps[7],32,"gatecity")
   copy(g_adjacent_maps[8],32,"goblintown")
   copy(g_adjacent_maps[9],32,"helena")
   copy(g_adjacent_maps[10],32,"heras")
   copy(g_adjacent_maps[11],32,"mines")
   copy(g_adjacent_maps[12],32,"mscave")
   copy(g_adjacent_maps[13],32,"sfor")
   copy(g_adjacent_maps[14],32,"c_adj_thornlands ")

   //this reads in every say_text command from the client
   //since cmd's cannot have spaces, we need to parse every one :\
   register_clcmd("say_text","event_say_text");

   //remove any previous vote from screen on load
   set_task(5.0,"task_clear_crap");

   //get debug level
   cvar_ms_debug_log = get_cvar_num("ms_debug_log");
}

//===== Quick display to both console and chat
public func_message(text[])
{
   client_print(0,print_chat,"%s",text)
   client_print(0,print_console,"%s",text)
}

//===== Vote key pressed, catalog vote
public event_tally_vote( id, key )
{
   //(1<<0)|(1<<1)|(1<<2) ext|yes|no

   new l_username
   get_user_name(id,l_username,31)

   if ( key == c_key_yes )
   {
      ++g_nvotes
      g_player_vote[id] = 1
      client_print(0,print_chat,"%s votes aye!",l_username)
   }
   if ( key == c_key_no )
   {
      ++g_nvotes
      g_player_vote[id] = 2
      client_print(0,print_chat,"%s votes neigh!",l_username)
   }
   if ( key == c_key_null || key == 0 )
   {
      g_player_vote[id] = 0
      client_print(0,print_chat,"%s obstains.",l_username)
   }

   //these are for testing
   if ( debug_mode )
   {
      if ( key == 4 ) client_print(0,print_chat,"%s pressed 4",l_username)
      if ( key == 5 )   client_print(0,print_chat,"%s pressed 5",l_username)
      if ( key == 6 )   client_print(0,print_chat,"%s pressed 6",l_username)
      if ( key == 7 )   client_print(0,print_chat,"%s pressed 7",l_username)
      if ( key == 8 )   client_print(0,print_chat,"%s pressed 8",l_username)
      if ( key == 9 )   client_print(0,print_chat,"%s pressed 9",l_username)
      if ( key == 10 ) client_print(0,print_chat,"%s pressed 0",l_username)
   }
}

//===== Count votes when vote time is up
public task_count_votes()
{
   new l_nyesvotes = 0
   new l_nnovotes = 0
   new float:l_ratio = 0
   new bool:l_passed = 0

   //count yes votes, calculate ratio vs. total votes
   for ( new i=1; i<g_maxplayers; ++i)
   {
      if ( g_player_vote[i] == 1 ) ++l_nyesvotes
      if ( g_player_vote[i] == 2 ) ++l_nnovotes
   }
   l_ratio = l_nyesvotes / g_nvotes

   //get required artio
   new l_req_ratio = 0
   if ( g_votetype == c_votetype_map ) l_req_ratio = get_cvar_float("amx_votemap_ratio")
   if ( g_votetype == c_votetype_kick ) l_req_ratio = get_cvar_float("amx_votekick_ratio")
   if ( g_votetype == c_votetype_ban ) l_req_ratio = get_cvar_float("amx_voteban_ratio")

   //flag fail/pass
   if ( l_ratio > l_req_ratio ) l_passed = true
   if ( l_ratio < l_req_ratio ) l_passed = false
   if ( l_nyesvotes == 0 ) l_passed = false
   if ( g_nvotes == 0 ) l_passed = false

   new l_out_ratio = floatround(l_ratio * 100)
   new l_out_req_ratio = floatround(l_req_ratio * 100)

   if ( l_passed ) client_print(0,print_chat,"The ayes have it! %i ayes vs. %i neighs ( %f % of votes were aye vs. the required %f % )",l_nyesvotes,l_nnovotes,l_out_ratio,l_out_req_ratio)
   if ( !l_passed ) client_print(0,print_chat,"The vote has fails. %i ayes vs. %i neighs ( %f % of votes were aye vs. the required %f % )",l_nyesvotes,l_nnovotes,l_out_ratio,l_out_req_ratio)

   if ( l_passed )
   {
      if ( g_votetype == c_votetype_map ) event_votemap_pass()
      if ( g_votetype == c_votetype_map ) event_votekick_pass()
      if ( g_votetype == c_votetype_map ) event_voteban_pass()
   }
}

//===== Return true if map is valid for vote
bool:func_ismap_legit( map[] )
{
   new l_this_map[32];
   get_mapname(l_this_map, 32);

   new bool:l_is_gauntlet = ( containi(c_gauntlet_maps,map) > -1 );
   new bool:l_is_hidden = ( containi(c_hidden_maps,map) > -1 );
   new bool:l_is_adjacent = func_ismap_adjacent(l_this_map,map);
   new bool:l_is_town = func_ismap_town(map);
   new bool:l_is_custom = func_ismap_custom(map);

   new cvar_ms_hiddenlock = get_cvar_num("ms_hiddenlock");
   new cvar_ms_mazelock = get_cvar_num("ms_mazelock");
   new cvar_ms_town_warp = get_cvar_num("ms_town_warp");
   new cvar_ms_votemap_type = get_cvar_num("ms_votemap_type");

   if ( debug_mode ) client_print(0,print_console,"gaunt: %s hidden: %s adj %s town %s custom %c thismap ",l_is_gauntlet,l_is_hidden,l_is_adjacent,l_is_town,l_is_custom,l_this_map);

   if ( l_is_custom ) return true;

   if ( l_is_gauntlet > -1 )
   {
      g_error = "%s is a gauntlet or boss map. You'll have to walk.";
      return false;
   }

   if ( cvar_ms_hiddenlock == 1 )
   {
      if ( l_is_hidden > -1 )
      {
         g_error = "%s is a hidden area. You must find the entrance.";
         return false;
      }
   }

   if ( cvar_ms_mazelock == 1 )
   {
      if ( containi(c_maze_maps,l_this_map) > -1  )
      {
         g_error = "You are on a maze map. %s is around here... Somewhere. You must find the entrance.";
         return false;
      }
      if ( containi(c_maze_maps_connected,map) > -1 )
      {
         g_error = "%s is connected to a maze map. You must explore the maze to find it.";
         return false;
      }
   }

   //all possible negative conditions for ultra vote passed, return true if ultra
   if ( cvar_ms_votemap_type == c_votemap_type_ultra ) return true;


   if ( cvar_ms_votemap_type == c_votemap_type_restricted )
   {
      if ( l_is_town )
      {
         if ( cvar_ms_town_warp == 1 ) return true;
         if ( cvar_ms_town_warp == 0 )
         {
            g_error = "Town warping is not allowed on this server, you'll have to walk.";
            return true;
         }
      }
      g_error = "You cannot vote for %s on this server. You'll have to walk there.";
      return false;
   }

   //there are no more possible positive conditions for restricted voting, so return neg, if in that mode
   if ( cvar_ms_votemap_type == c_votemap_type_restricted ) return false;

   //last possiblity is server is in standard vote mode and map is adjacent
   if ( l_is_adjacent ) return true;

   //all positive possiblities exhausted
   g_error = "Unknown error - the best error report ever.";
   return false;
}

//===== Return true if map is adjacent
bool:func_ismap_adjacent ( check_map[], is_adjacent_to[] )
{
   for ( new i=1; i < c_nadjacents; ++i )
   {
      if ( equali(g_adjacent_maps[i],check_map) )
      {
         if ( containi(g_adjacent_list[i],is_adjacent_to) ) return true;
      }
   }
}

//===== Place town maps into array
public task_parse_towns()
{
   //this isn't really needed, since this array is not dynamic, but helped to debug custom maps array builder
   new bool:l_store_flag = false;
   new r = 0;
   g_ntowns = 1;

   for ( new i = 1; i < strlen(c_root_towns); i++ )
   {
      if ( c_root_towns[i] == 32 ) l_store_flag = true; //if hit space, move to next element in array
      if ( !l_store_flag )
      {
         copy(g_towns_list[g_ntowns][r],1,c_root_towns[i]);
         ++r;
      }
      if ( l_store_flag )
      {
         ++g_ntowns;
         g_towns_list[g_ntowns] = empty;
         r = 0;
      }
   }
   ++g_ntowns; //+1 as last map will not have space after it

   if ( debug_mode )
   {
      new townlist[1280];
      for ( new i = 1; i < g_ntowns, i++ )
      {
         copy(townlist,32,g_towns_list[i]);
         copy(townlist,1," ");
      }
      client_print(0,print_console,"towns: %s",townlist);
   }

}

//===== Return true if this is a town map
bool:func_ismap_town( map[] )
{
   task_parse_towns(); //puts towns into array

   //see if check map is in town array
   for ( new i = 1; i <= g_ntowns; i++ )
   {
      if ( equali(g_towns_list[i],map) ) return true;
   }
   return false;
}

//===== Place custom maps into array
public task_parse_custom()
{
   new l_maplist[1280];
   get_cvar_string ("custommaps",l_maplist,1279);
   new bool:l_store_flag = false;
   new r = 0;

   if ( equali(l_maplist,"file") )
   {
      //use file method instead (pending)
      return;
   }

   g_ncustom = 1;

   for ( new i = 1; i < strlen(l_maplist); i++ )
   {
      if ( l_maplist[i] == 32 ) l_store_flag = true;   //if encounter space, store this entry, move to next element in array
      if ( !l_store_flag )
      {
         copy(g_cmap_list[g_ncustom][r],1,l_maplist[i]);
         ++r;
      }
      if ( l_store_flag )
      {
         if ( debug_mode ) client_print(0,print_console,"added_custom_map: /%s/",g_cmap_list[g_ncustom]);
         ++g_ncustom;
         g_cmap_list[g_ncustom] = empty;
         r=0;
      }
   }
   ++g_ncustom //+1 as last map will not have space after it
}

//===== Return true of map is in custom map array
bool:func_ismap_custom( map[] )
{
   task_parse_custom(); //puts custom maps into array

   for ( new i = 1; i <= g_ncustom; i++ )
   {
      if ( equali(g_cmap_list[i],map) ) return true;
   }
   return false;
}

//===== Event called with every message from the server
public alertmessage(atype, message[])
{
   //this section will generate several duplicate definition warnings
   //seems best to optimize this section by only defining the vars when an actual handled message takes place

   if ( strlen(message) < 1 ) return PLUGIN_HANDLED;

   new bool:l_handled = false;

   //script or map event attempting to force map change
   if ( containi(message,"force_map_") > -1 )
   {
      new l_scan_start = containi(message,"force_map_") + 10; //start reading string where "force_map_" ends
      new bool:l_end_mapname = false;
      new l_changemap[32];
      for ( new i = l_scan_start; i < strlen(message) && !l_end_mapname; i++ )
      {
         //build changemap string - add letters until encounter non alpha num or end of string
         if ( !isalnum(message[i]) && message[i] != 95 ) l_end_mapname = true; //95 = "_"
         if ( !l_end_mapname ) l_changemap[i - l_scan_start] = message[i];
      }
      task_change_map(l_changemap);
      l_handled = true;
   }

   //script or map event asking to vote for map change (usually called by transition with all players touching)
   if ( containi(message,"touch_trans_") > -1 && !l_handled )
   {
      new l_scan_start = containi(message,"touch_trans_") + strlen("touch_trans_"); //start reading string where "touch_trans_" ends
      new bool:l_end_mapname = false;
      g_maptovote = empty;
      for ( new i = l_scan_start; i < strlen(message) && !l_end_mapname; i++ )
      {
         //build changemap string - add letters until encounter non alpha num or end of string
         if ( !isalnum(message[i]) && message[i] != 95 ) l_end_mapname = true; //95 = "_"
         if ( !l_end_mapname ) g_maptovote[i - l_scan_start] = message[i];
      }
      g_votetype = c_votetype_map;
      g_voter_id = 0;
      task_start_vote();
      l_handled = true;
   }

   //called when individual player touched a transition
   if ( containi(message,"single_touch_") > -1 && !l_handled )
   {
      new l_scan_start = containi(message,"single_touch_") + strlen("single_touch_"); //start reading string where "touch_trans_" ends
      new bool:l_end_mapname = false;
      g_last_touched = empty;
      for ( new i = l_scan_start; i < strlen(message) && !l_end_mapname; i++ )
      {
         //build changemap string - add letters until encounter non alpha num or end of string
         if ( !isalnum(message[i]) && message[i] != 95 ) l_end_mapname = true; //95 = _
         if ( !l_end_mapname ) g_last_touched[i - l_scan_start] = message[i];
      }
      l_handled = true;
   }

   if ( cvar_ms_debug_log > 0 )
   {
      new l_logout[512];
       format(l_logout,511,"%s", message)
      if ( file_exists("dev_log.log") == 0 ) write_file("dev_log.log","logstart");
      write_file("dev_log.log",l_logout,-1);
   }
}

//===== Event called every time a client executes the saytext command
public event_say_text(id,level,cid)
{
   new cvar_ms_chat_log = get_cvar_num("ms_chat_log");
   new bool:l_handled = false; //prevents weridness if someone said, for instance, "votemap votekick"

   //read in command
   new l_saytext[256]; 
   read_args(l_saytext,255);

   if ( containi(l_saytext,"votemap") > -1 )
   {
      //grab map string player is attempting to vote for, if any
      new l_scanstart = containi(l_saytext,"votemap") + 8;
      new r = 0;
      g_maptovote = empty;
      copy(g_maptovote,4,"none"); //if task_start_vote gets "none" it should just display the available maps
      if ( l_scanstart < strlen(l_saytext) )
      {
         //if string is longer than "votemap ", assume there is a map, read in to end
         for ( new i = l_scanstart; i < strlen(l_saytext); i++ )
         {
            g_maptovote[r] = l_saytext[i];
            ++r;
         }
      }
      g_votetype = c_votetype_map;
      g_voter_id = id;
      task_start_vote();
      l_handled = true;
   }

   if ( containi(l_saytext,"votekick") > -1 && !l_handled )
   {
      new l_scanstart = containi(l_saytext,"votekick") + 9;
      new r = 0;
      g_offending_player = empty;
      copy(g_offending_player,4,"none");
      if ( l_scanstart < strlen(l_saytext) )
      {
         for ( new i = l_scanstart; i < strlen(l_saytext); i++ )
         {
            g_offending_player[r] = l_saytext[i];
            ++r;
         }
      }
      g_votetype = c_votetype_kick;
      g_voter_id = id;
      task_start_vote();
      l_handled = true;
   }

   if ( containi(l_saytext,"voteban") > -1 && !l_handled )
   {
      new l_scanstart = containi(l_saytext,"voteban") + 8;
      new r = 0;
      g_offending_player = empty;
      copy(g_offending_player,4,"none");
      if ( l_scanstart < strlen(l_saytext) )
      {
         for ( new i = l_scanstart; i < strlen(l_saytext); i++ )
         {
            g_offending_player[r] = l_saytext[i];
            ++r;
         }
      }
      g_votetype = c_votetype_ban;
      g_voter_id = id;
      task_start_vote();
      l_handled = true;
   }

   if ( cvar_ms_chat_log > 0 )
   {
      //get user info
      new name[33];
      new authid[33];
      get_user_name(id, name, 32);
      get_user_authid(id, authid, 32);

      //time stamp
      new l_time_stamp[15];
      get_time("%m/%d-%H:%M", l_time_stamp, 15);

      //map stamp
      new l_currentmap[32]
      get_mapname (l_currentmap, 31)

      //format message to log
      new l_outlog[512];
      format(l_outlog,511,"[%s]%s - '%s'<%s> says: '%s'", l_currentmap, l_time_stamp, name, authid, l_saytext);
      
      //log message
      task_write_chatlog(l_outlog)
   }

   return PLUGIN_CONTINUE;
}

//===== Remove vote from screen after map change (called from init)
public task_clear_crap()
{
   new menu_msg[256];
   new players[32];
   new numplayers;
   new keys = (1<<0)|(1<<1);
   get_players(players,numplayers,"c");

   for(numplayers--;numplayers>=0;numplayers--)
   {
      format(menu_msg,255," ", players[numplayers])
      show_menu(players[numplayers],keys,menu_msg,0.1,"nadda ")
   }
}

//===== Write out chat log
public task_write_chatlog( chatlog[] )
{
   //assemble log file name ( msc_chatlog_MMMYYYY.log )
   new l_file_stamp[22];
   get_time("%m%Y", l_file_stamp, 22);
   new l_logfile[37];
   copy(l_logfile,12, "msc_chatlog_");
   copy(l_logfile,22, l_file_stamp);
   copy(l_logfile,4, ".log");

   if ( file_exists(l_logfile) == 0 ) write_file("msc_chatlog.log","MSC Chat Log");
   write_file(l_logfile,chatlog,-1);
}

//======================================================================================= [BEGIN] CLIENT LOGGING EVENTS [BEGIN]
//===== Event fired whenever client connects
public client_connect(id)
{
   new cvar_ms_chat_log = get_cvar_num("ms_chat_log");
   if ( cvar_ms_chat_log > 0 )
   {
      //user info
      new name[33]
      new authid[33]
      get_user_name(id, name, 32)
      get_user_authid(id, authid, 32)

      //time stamp
      new l_time_stamp[15];
      get_time("%m/%d-%H:%M", l_time_stamp, 15);

      //map stamp
      new l_currentmap[32];
      get_mapname (l_currentmap, 31);

      //format message to log
      new l_outlog[512];
      format(l_outlog,511,"[%s]%s - '%s'<%s> ATTEMPTS_TO_CONNECT", l_currentmap, l_time_stamp, name, authid);

      //log message
      task_write_chatlog(l_outlog)
   }
}

//===== Event fired whenever client authorized
public client_authorized(id)
{
   new cvar_ms_chat_log = get_cvar_num("ms_chat_log");
   if ( cvar_ms_chat_log > 0 )
   {
      //user info
      new name[33]
      new authid[33]
      get_user_name(id, name, 32)
      get_user_authid(id, authid, 32)

      //time stamp
      new l_time_stamp[15];
      get_time("%m/%d-%H:%M", l_time_stamp, 15);

      //map stamp
      new l_currentmap[32];
      get_mapname (l_currentmap, 31);

      //format message to log
      new l_outlog[512];
      format(l_outlog,511,"[%s]%s - '%s'<%s> CONNECTED", l_currentmap, l_time_stamp, name, authid);

      //log message
      task_write_chatlog(l_outlog)
   }
}

//===== Event fired whenever client exits
public client_disconnect(id)
{
   new cvar_ms_chat_log = get_cvar_num("ms_chat_log");
   if ( cvar_ms_chat_log > 0 )
   {
      //user info
      new name[33]
      new authid[33]
      get_user_name(id, name, 32)
      get_user_authid(id, authid, 32)

      //time stamp
      new l_time_stamp[15];
      get_time("%m/%d-%H:%M", l_time_stamp, 15);

      //map stamp
      new l_currentmap[32];
      get_mapname (l_currentmap, 31);

      //format message to log
      new l_outlog[512];
      format(l_outlog,511,"[%s]%s - '%s'<%s> LEAVES_SERVER", l_currentmap, l_time_stamp, name, authid);

      //log message
      task_write_chatlog(l_outlog)
   }
}
//======================================================================================= [END] CLIENT LOGGING EVENTS [END]

//===== Respond to vote request from player
public task_start_vote()
{

   new Float:l_vdifference = get_gametime() - g_lastvotetime[0];
   new Float:cvar_amx_vote_time = get_cvar_float("amx_vote_time");
   if ( l_vdifference < cvar_amx_vote_time )
   {
      client_print(g_voter_id,print_chat,"Too soon to begin another vote.");
      return;
   }

   if ( g_votetype == c_votetype_map )
   {
      if ( equali(g_maptovote,"none") )
      {
         task_list_maps();
         return;
      }

      new bool:map_legit = func_ismap_legit(g_maptovote);
      
      if ( map_legit )
      {
         g_lastvotetime[0] = get_gametime(); //store vote time
         task_votemap( map_legit );
         return;
      }
      if ( !map_legit )
      {
         client_print(g_voter_id,print_chat,"%s",g_error,g_maptovote);
         return;
      }
   }
}

//====== Start a vote for a map
public task_votemap( map[] )
{

}
daffy4jr is offline
dutchmeat
Senior Member
Join Date: Sep 2006
Old 05-17-2007 , 09:26   Re: vote system
Reply With Quote #2

wrong forum...
__________________
before you criticize someone, you should walk a mile in their shoes. that way, when you criticize them, you're a mile away and you have their shoes.
dutchmeat is offline
daffy4jr
Junior Member
Join Date: Apr 2007
Old 05-17-2007 , 09:27   Re: vote system
Reply With Quote #3

why is it the wrong forum?
daffy4jr is offline
BAILOPAN
Join Date: Jan 2004
Old 05-17-2007 , 11:48   Re: vote system
Reply With Quote #4

Because you posted an AMX Mod X script and not only is this not AMX Mod X, it is Half-Life 2 and not Half-Life 1.
__________________
egg
BAILOPAN is offline
daffy4jr
Junior Member
Join Date: Apr 2007
Old 05-17-2007 , 11:48   Re: vote system
Reply With Quote #5

alright where can I actually get the help I need?
daffy4jr is offline
daffy4jr
Junior Member
Join Date: Apr 2007
Old 05-17-2007 , 22:04   Re: vote system
Reply With Quote #6

bump
daffy4jr is offline
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 10:38.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode