Code:
/* Plugin generated by AMXX-Studio */
#define PLUGIN "Map Size Picker"
#define VERSION "1.6"
#define AUTHOR "Kobra aka kbr_Kobra aka KobraPL"
/* AMX Mod X
* Map Size Picker
*
* by Kobra
*/
#include <amxmodx>
#include <amxmisc>
// Change this if You have less/more maps in Your msp.ini config file
#define MAX_MAPS 300
// This changes the number of maps in a vote
#define MAX_VOTE_MAPS 6
new menu
new g_playerCount
new g_mspMapName[MAX_MAPS][32]
new g_mspMapMin[MAX_MAPS]
new g_mspMapMax[MAX_MAPS]
new g_mspCount=0
new g_mspCurrentMapMin
new g_mspCurrentMapMax
new g_mspCurrentMapName[32]
new g_mspCountDown=0
new g_mspVoteResults[MAX_VOTE_MAPS]
new g_mspChoices[MAX_VOTE_MAPS][32]
new g_mspNewMap[32]
new g_lastTime
new g_countDown
new g_mspNoOfMapsToChouse //added by barkli
public plugin_init()
{
register_plugin("Map Size Picker", AMXX_VERSION_STR, "Kobra")
register_clcmd("amx_msp", "writeMapConfig", ADMIN_MAP, " - saves the MSP config for current map.")
register_clcmd("amx_mspvote","forceVote",ADMIN_VOTE, " - forces the vote.")
g_playerCount = get_playersnum(0)
get_mapname(g_mspCurrentMapName,32)
new i,tmpSA[5],tmpSB[5],tmpS[16],tmpAll[2048],tmpMap[32],tmpMin=0,tmpMax=0,mspFile[128]
get_configsdir(mspFile,128)
add(mspFile,128,"/msp.ini")
i=fopen(mspFile,"rt")
if(i==0){
set_hudmessage(255, 0, 0, -1.0, 0.89, 0, 2.0, 20.0,0.1,0.1,-1)
show_hudmessage(0,"Error amx_msp loading config file!")
} else {
while (!feof(i)) // Reading msp config from msp.ini
{
fgets(i,tmpAll,3000)
if ((strlen(tmpAll) > 0) && (tmpAll[strlen(tmpAll)-1] == '^n')) //changed by barkli
tmpAll[strlen(tmpAll)-1] = 0
strbreak(tmpAll,tmpMap,31,tmpS,15)
strbreak(tmpS,tmpSA,4,tmpSB,4)
tmpMin=str_to_num(tmpSA)
tmpMax=str_to_num(tmpSB)
copy(g_mspMapName[g_mspCount],32,tmpMap)
if(tmpMin>0 && tmpMax>0){
g_mspMapMin[g_mspCount]=tmpMin
g_mspMapMax[g_mspCount]=tmpMax
if(equali(tmpMap,g_mspCurrentMapName))
{
g_mspCurrentMapMin=tmpMin
g_mspCurrentMapMax=tmpMax
}
g_mspCount++
}
}
fclose(i)
// Remove this if You don't want MSP to show vote at the end of map time.
// Update 1.4: This will help, if the server uses mp_maxrounds - vote won't show up on map's end (why should it? ;))
if(get_timeleft()>0){
set_task(15.0, "checkEndTime",0, "", 0, "b")
}
}
}
public checkEndTime(){
new timeleft = get_timeleft()
if(timeleft<30 && g_mspCountDown==0){
g_mspCountDown=1
g_countDown=0
runVote()
}
}
public writeMapConfig(id){
if(read_argc()==3)
{
new s[2],min,max,err[50]
read_argv(1,s,2)
min=str_to_num(s)
read_argv(2,s,2)
max=str_to_num(s)
if(min>max)
copy(err,50,"Min has to be larger than Max")
if(min<2)
copy(err,50,"Min has to be larger than 1")
if(max>32) //changedby barkli
copy(err,50,"Max has to be smaller than 32") //changedby barkli
if(g_mspCurrentMapMin!=0 && g_mspCurrentMapMax!=0)
copy(err,50,"Map has already got MSP config.")
if(strlen(err)==0){
new d[50],mspFile[128]
get_configsdir(mspFile,128)
add(mspFile,128,"/msp.ini")
new i=fopen(mspFile,"at")
format(d,50,"^n%s %d %d",g_mspCurrentMapName,min,max)
fputs(i,d)
fclose(i)
g_mspCurrentMapMin=min
g_mspCurrentMapMax=max
client_putinserver(id)
} else {
console_print(id,"%s",err)
}
} else {
console_print(id,"Use: amx_msp Min Max")
}
}
public client_putinserver(id)
{
new timeElapsed,time
if(g_mspCurrentMapMin==0 && g_mspCurrentMapMax==0)
{
set_hudmessage(44, 44, 129, -1.0, 0.02, 0, 2.0, 20.0,0.1,0.1,-1)
show_hudmessage(0, "The map doesn't have information about optimal player count!")
//show_hudmessage(0, "Mapa nie posiada inforamcji na temat optymalnej ilosci graczy!^nZglos na forum swoja propozycje.")
} else {
g_playerCount = get_playersnum(0)
if(g_playerCount<2)
g_playerCount=2
if(g_playerCount>32) //changed by barkli
g_playerCount=32 //changed by barkli
if ( g_playerCount > g_mspCurrentMapMax && g_mspCountDown==0)
{
if(g_lastTime==0)
{
timeElapsed=0
} else {
timeElapsed=g_lastTime-g_countDown
}
time=60/(g_playerCount-g_mspCurrentMapMax)-timeElapsed
g_countDown=time
g_lastTime=time
g_mspCountDown=1
runVote()
}
if (g_playerCount < g_mspCurrentMapMin && g_mspCountDown==0)
{
if(g_lastTime==0)
{
timeElapsed=0
} else {
timeElapsed=g_lastTime-g_countDown
}
time=180/(g_mspCurrentMapMin-g_playerCount)-timeElapsed
g_countDown=time
g_lastTime=time
g_mspCountDown=1
runVote()
}
if( g_playerCount <= g_mspCurrentMapMax && g_playerCount >= g_mspCurrentMapMin){
g_mspCountDown=0
g_lastTime=0
g_countDown=0
g_lastTime=0
}
}
g_playerCount=get_playersnum(0)
new nextmap[32],found=-1,i
get_cvar_string("amx_nextmap",nextmap,31)
for(i=0;i<g_mspCount;i++)
{
if(equali(g_mspMapName[i],nextmap))
{
found=i
}
}
log_amx("Mapa: %s Found: %d",nextmap,found)
if(found==-1 || g_mspMapMin[found]>g_playerCount || g_mspMapMax[found]<g_playerCount )
{
new goodMaps[MAX_MAPS]
new goodMapsIndex=0
for(i=0;i<g_mspCount;i++)
{
if(g_mspMapMin[i]<=g_playerCount && g_mspMapMax[i]>=g_playerCount)
{
goodMaps[goodMapsIndex]=i
goodMapsIndex++
}
}
new rand=random(goodMapsIndex)
set_cvar_string("amx_nextmap",g_mspMapName[goodMaps[rand]])
log_amx("Nextmap changed from %s to %s due to incorrect player count!",nextmap,g_mspMapName[goodMaps[rand]]);
client_print(0, print_chat, "Nextmap changed from %s to %s due to incorrect player count!",nextmap,g_mspMapName[goodMaps[rand]]);
}
}
public client_disconnect(id)
{
client_putinserver(id)
}
public runVote()
{
if(g_mspCountDown==1){
if(g_countDown>0)
{
set_hudmessage(44, 44, 129, -1.0, 0.02, 0, 2.0, 1.0,0.1,0.1,-1)
//show_hudmessage(0, "Mapa nie nadaje sie na aktualna ilosc graczy!^nZa %ds nastapi glosowanie na zmiane mapy.",g_countDown)
show_hudmessage(0, "Incorrect player count for this map!^nVote starts in %ds.",g_countDown)
g_countDown--
set_task(1.0,"runVote",0)
} else {
set_hudmessage(44, 44, 129, -1.0, 0.02, 0, 2.0, 20.0,0.8,0.8,-1)
//show_hudmessage(0, "Glosowanie na zmiane mapy!")
show_hudmessage(0, "Map vote!")
prepareMspMenu()
for(new k=1;k<=32;k++)
{
if(is_user_connected(k))
menu_display(k, menu, 0);
}
client_cmd(0, "spk Gman/Gman_Choose2")
}
} else {
set_hudmessage(44, 44, 129, -1.0, 0.02, 0, 2.0, 10.0,0.1,0.1,-1)
show_hudmessage(0, "Countdown stopped! Player count accepted!")
}
}
public prepareMspMenu()
{
if(g_playerCount<2)
g_playerCount=2
//if(g_playerCount>18)
// g_playerCount=18
new goodMaps[MAX_MAPS]
new goodMapsIndex=0
for(new i=0;i<g_mspCount;i++)
{
if(g_mspMapMin[i]<=g_playerCount && g_mspMapMax[i]>=g_playerCount)
{
goodMaps[goodMapsIndex]=i
goodMapsIndex++
}
}
for (new i = goodMapsIndex; i<g_mspCount; i++)
{
goodMaps[goodMapsIndex]= -1
}
new rand=0,i=0
new mapsLeftForChousing = goodMapsIndex //added by barkli
g_mspNoOfMapsToChouse = 0 //added by barkli
while(i<MAX_VOTE_MAPS && mapsLeftForChousing>0) //changed by barkli
{
rand=random(goodMapsIndex)
if(goodMaps[rand]>-1)
{
copy(g_mspChoices[i],32,g_mspMapName[goodMaps[rand]]) //changed by barkli
goodMaps[rand]=-1
g_mspNoOfMapsToChouse ++ //added by barkli
mapsLeftForChousing -- //added by barkli
i++
}
}
menu = menu_create("Choose map", "menu_handler")
if (g_mspNoOfMapsToChouse > MAX_VOTE_MAPS) //added by barkli
{
g_mspNoOfMapsToChouse = MAX_VOTE_MAPS
}
for(i=0;i<g_mspNoOfMapsToChouse;i++){ //changed by barkli
menu_additem(menu, g_mspChoices[i], g_mspChoices[i], ADMIN_ALL)
}
set_task(15.0,"voteEnd",0)
return PLUGIN_HANDLED
}
public menu_handler(id, menu, item) {
new name[64]
get_user_name(id, name,64)
client_print(0, print_chat, "%s has chosen %s",name,g_mspChoices[item]);
g_mspVoteResults[item]++
return PLUGIN_HANDLED;
}
public voteEnd() {
new winner
new k
for(new z=0;z<=32;z++){
for(k=g_mspNoOfMapsToChouse-1;k>=0;k--){ //changed by barkli
if(z==g_mspVoteResults[k])
winner=k
}
}
client_print(0, print_chat, "Changing map to %s!",g_mspChoices[winner]);
copy(g_mspNewMap,32,g_mspChoices[winner])
changeMap("5")
}
public changeMap(czas[3]){
new t=str_to_num(czas)
if(t>0)
{
new param[2]
set_hudmessage(44, 44, 129, -1.0, -1.00, 0, 2.0, 1.0,0.1,0.1,-1)
show_hudmessage(0, "Changing map to ^n%s^nin %ds",g_mspNewMap,t)
t--
num_to_str(t,param,2)
set_task(1.0,"changeMap",0,param,2)
} else {
log_amx("[MSP] Changing map to %s from %s with %d players.",g_mspNewMap,g_mspCurrentMapName,g_playerCount)
server_cmd("changelevel %s", g_mspNewMap)
}
}
public forceVote()
{
g_mspCountDown=1
g_countDown=0
runVote()
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
*/
I fixed some now at least it is functional.
command doesn;t work etc.
at the end of the line.