15.09.2012, 08:13
Well, Hi there !
After RP...I did got interest on how do Map changing gamemode works..
I saw kitten dynamic map changing..
And thought to work with it..
So to test it i made somethings to test it out here my code.
What i did ? I just added a clock and team balancer but it doesn't seem to work :/
Please help me
If possible..Please check and do it like the map changes..atm its not :/
After RP...I did got interest on how do Map changing gamemode works..
I saw kitten dynamic map changing..
And thought to work with it..
So to test it i made somethings to test it out here my code.
pawn Код:
#include <a_samp>
#include <foreach>
#include <YSI\y_ini>
//Time
//----Time System----
new GameMinutes =2;
new GameSeconds =59;
new Text:Textdraw0;
new gTeam[MAX_PLAYERS];
forward GameTime();
forward GameModeExitFunc();
///--------------//
// Defines
#define function%0(%1) forward%0(%1);public%0(%1)
#define MAX_MAPTIME 20 // Seconds before the map ends (60seconds = 1 minute)
#define MAX_RESTART_TIME 10000 // Seconds before to load the next map (10000ms = 10 seconds)
#define MAX_MAPUPDATE_TIME 180000 // Seconds to count down until the map ends this is only for the function! (to decrease the map time) (1000ms = 1 seconds)
#define MAX_END_TIME 2000 // Seconds before it ends the map with the callback OnMapUpdate (2000ms = 2 seconds)
#define MAX_MAP_FILES 2 // Change this to amount of map files you have or else the map system will be bugged
#define DIALOG_SELECT_TEAM 0
#define TEAM_1 1
#define TEAM_2 2
// Variables
new time; // Goes towards MAX_MAPTIME
new mapvar; // Variable assigning to the map timer
new mapid; // Pretty obvious
new team[MAX_PLAYERS]; // basic team system to test. (spawns etc)
new LastMapStarted = -1; // Pretty obvious
enum mapinfo
{
MapName[128],
FSMapName[128],
Float:Team1X,
Float:Team1Y,
Float:Team1Z,
Float:Team2X,
Float:Team2Y,
Float:Team2Z,
Interior,
Weather,
Time
};
new Map[mapinfo];
forward load_Map_basic(Mapid, name[], value[]);
main () {}
function StartMap()
{
foreach(Player,i)
{
SpawnPlayer(i); // Spawns the player to the new map
// Just a note you can add variables here also such as Resetting First kill or any variable just based on the map.
}
time = MAX_MAPTIME; // Setting the variable define to MAX_MAPTIME!
SetWeather(Map[Weather]); // The integer you've entered on the map file (weather)
SetWorldTime(Map[Time]); // The integer you've entered on the map file (time)
mapvar = SetTimer("OnMapUpdate",MAX_MAPUPDATE_TIME,true); // Self explained
return 1;
}
function EndMap()
{
ClearObjects(); // If your map file has objects and it's loaded in a filterscript or not, it'll delete all the objects for that specific map.
UnloadFilterScript(Map[FSMapName]); // Unloading the filterscript for the map. (you can include commands for that map, objects etc)
LoadMap(LoadNewMap()); // Loading the new map information.
LoadFilterScript(Map[FSMapName]); // Loading the new map filterscript.
SetTimer("StartMap",MAX_RESTART_TIME,false);
return 1;
}
function OnMapUpdate()
{
time -= 1; // Decreasing the map time by 60ms
if(time <= 0) KillTimer(mapvar),SetTimer("EndMap",MAX_END_TIME,false); // If the map time has reached to zero gets the next map ID in that callback then loads it
/* You can also add other variables such as if(time <= 50) SendClientMessageToAll(-1,"50 Seconds left till next map"); */
new str[64];
format(str,sizeof(str),"Time: %i",time);
SendClientMessageToAll(-1,str); // This sends how much time is left for debug purposes.
return 1;
}
public OnGameModeInit()
{
//----Textdraw Timer------
Textdraw0 = TextDrawCreate(227.000000, 3.000000, "_");
TextDrawBackgroundColor(Textdraw0, 255);
TextDrawFont(Textdraw0, 1);
TextDrawLetterSize(Textdraw0, 0.509999, 1.999999);
TextDrawColor(Textdraw0, -1);
TextDrawSetOutline(Textdraw0, 0);
TextDrawSetProportional(Textdraw0, 1);
TextDrawSetShadow(Textdraw0, 1);
SetTimer("NewMap",180000,1); // 2 min
SetTimer("GameTime",1000,1);
SetGameModeText("DYT - By Kitten");
SendRconCommand("hostname [ENG] Counter Strike TDM");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
mapid = 0; // Resetting the map ID to zero so it loads the map from zero you can also make commands to set map id's
LoadMap(LoadNewMap()); // Loading the first map in the folder list.
StartMap(); // Loading the map info
return 1;
}
public OnGameModeExit()
{
return 1;
}
public GameModeExitFunc()
{
GameModeExit();
TextDrawDestroy(Textdraw0);
}
public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
}
public OnPlayerRequestSpawn(playerid)
{
new team1 = GetPlayersInTeamFromMaxPlayers(TEAM_1);
new team2 = GetPlayersInTeamFromMaxPlayers(TEAM_2);
if(team1 > team2 && gTeam[playerid] == TEAM_1)
{
GameTextForPlayer(playerid, "~r~Team Full!~n~~w~Choose Another Team!", 3000, 5);
return 0;//And stop them from spawning..
}
else if(team2 > team1 && gTeam[playerid] == TEAM_2)
{
GameTextForPlayer(playerid, "~r~Team Full!~n~~w~Choose Another Team!", 3000, 5);
return 0;
}
return 1;
}
public OnPlayerConnect(playerid)
{
TextDrawShowForPlayer(playerid,Textdraw0);
team[playerid] = 0;
ShowPlayerDialog(playerid,DIALOG_SELECT_TEAM,DIALOG_STYLE_MSGBOX,"Team Selection","Select an team","Team 1","Team 2");
return 1;
}
public OnPlayerDisconnect(playerid, reason) return team[playerid] = 0;
public OnPlayerSpawn(playerid)
{
SetPlayerInterior(playerid,Map[Interior]); // Setting the map interior
if(team[playerid] == TEAM_1) SetPlayerPos(playerid,Map[Team1X],Map[Team1Y],Map[Team1Z]); // Setting team 1 position from the file.
if(team[playerid] == TEAM_2) SetPlayerPos(playerid,Map[Team2X],Map[Team2Y],Map[Team2Z]); // ^
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_SELECT_TEAM:
{
if(response) team[playerid] = TEAM_1,SpawnPlayer(playerid);
if(!response) team[playerid] = TEAM_2,SpawnPlayer(playerid);
}
}
return 1;
}
stock GetMapCount()
{
new mcount = 0, file[128];
for(new i = 0; i < MAX_MAP_FILES; i++)
{
format(file, sizeof(file), "/Maps/%d.ini", i);
if(fexist(file))
{
mcount ++;
}
}
return mcount;
}
stock GetFreeMapID()
{
new file[32], id = 0;
for(new i = 0; i < MAX_MAP_FILES; i++)
{
format(file, sizeof(file), "/Maps/%d.ini", i);
if(fexists(file)) continue;
id = i;
break;
}
return id;
}
stock NoMapCheck()
{
new tcount = 0, file[128];
for(new i = 0; i < MAX_MAP_FILES; i++)
{
format(file, sizeof(file), "/Maps/%d.ini", i);
if(fexist(file))
{
tcount ++;
}
}
if(tcount == 0)
{
print("_____________________________________________________________");
print("WARNING: The server has detected there are no map files!");
print("currently installed. The server has been set to");
print("automatically shut down in 25000/ MS. (25 Seconds)");
print("_____________________________________________________________");
SetTimer("No_Maps", 25000, false);
return 1;
}
return 1;
}
function No_Maps() return SendRconCommand("exit");
public load_Map_basic(Mapid, name[], value[])
{
if(strcmp(name, "FSMapName", true) == 0)
{
strmid(Map[FSMapName], value, false, strlen(value), 128);
LoadFilterScript(Map[FSMapName]);
}
/*printf("[Debug] Name: %s - Value: %s", name, value); For Debug Purposes*/
if(strcmp(name, "MapName", true) == 0)
{
new mpname[50];
strmid(Map[MapName], value, false, strlen(value), 128);
format(mpname, sizeof(mpname), "mapname %s", Map[MapName]);
SendRconCommand(mpname);
}
if(strcmp(name, "Team1X", true) == 0) Map[Team1X] = floatstr(value);
if(strcmp(name, "Team1Y", true) == 0) Map[Team1Y] = floatstr(value);
if(strcmp(name, "Team1Z", true) == 0) Map[Team1Z] = floatstr(value);
if(strcmp(name, "Team2X", true) == 0) Map[Team2X] = floatstr(value);
if(strcmp(name, "Team2Y", true) == 0) Map[Team2Y] = floatstr(value);
if(strcmp(name, "Team2Z", true) == 0) Map[Team2Z] = floatstr(value);
if(strcmp(name, "Interior", true) == 0) Map[Interior] = strval(value);
if(strcmp(name, "Weather", true) == 0)
{
Map[Weather] = strval(value);
SetWeather(Map[Weather]);
}
if(strcmp(name, "Time", true) == 0)
{
Map[Time] = strval(value);
SetWorldTime(Map[Time]);
printf("Map ID %d's Information Has Been Loaded.", Mapid);
}
return 1;
}
stock LoadMap(Mapid)
{
new Map_file[64];
format(Map_file, sizeof(Map_file), "/Maps/%d.ini", Mapid);
if(fexist(Map_file))
{
printf("loading Map %s", Map_file);
INI_ParseFile(Map_file, "load_Map_%s", .bExtra = true, .extra = Mapid);
return 1;
}
return 0;
}
stock LoadNewMap()
{
new file[64];
mapid %= MAX_MAP_FILES;
format(file, sizeof(file), "/Maps/%d.ini", mapid);
if(!fexist(file)) return printf("[NOTICE] File Bugged.");
LastMapStarted = mapid;
mapid++;
return mapid-1;
}
stock ClearObjects()
{
for(new i; i<MAX_OBJECTS; i++)
{
if(IsValidObject(i)) DestroyObject(i);
}
}
stock GetRandomMap()
{
new file[64];
new i = 0, count = 0, Maps[MAX_MAP_FILES], Mapid;
for( ; i != MAX_MAP_FILES; ++i)
{
if(LastMapStarted == i) continue;
format(file, sizeof(file), "/Maps/%d.ini", i);
if(fexist(file))
{
Maps[count] = i;
count++;
}
}
if(count == 0)
{
return NoMapCheck();
}
Mapid = Maps[random(count)];
format(file, sizeof(file), "/Maps/%d.ini", Mapid);
if(fexist(file))
{
LastMapStarted = Mapid;
return Mapid;
}
else return printf("[NOTICE] File Bugged.");
}
stock LoadFilterScript(filename[])
{
new string[128];
format(string, sizeof(string), "loadfs %s", filename);
SendRconCommand(string);
return 1;
}
stock UnloadFilterScript(filename[])
{
new string[128];
format(string, sizeof(string), "unloadfs %s", filename);
SendRconCommand(string);
return 1;
}
public GameTime()
{
if(GameSeconds || GameMinutes) {
GameSeconds--;
if(GameSeconds <= -1) {
GameMinutes--;
GameSeconds=59;
}
new TimeString[128];
format(TimeString,sizeof(TimeString),"~g~Timeleft ~w~: %02d:%02d",GameMinutes,GameSeconds);
TextDrawSetString(Textdraw0,TimeString);
}
return 1;
}
stock GetPlayersInTeamFromMaxPlayers(teamid)
{
new playercount = 0;
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(GetPlayerState(i) == PLAYER_STATE_NONE) continue;
if(gTeam[i] != teamid) continue;
playercount++;
}
return playercount;
}
Please help me
If possible..Please check and do it like the map changes..atm its not :/