17.02.2012, 15:39
(
Last edited by Twisted_Insane; 18/02/2012 at 11:11 AM.
)
ZCMD - COMMAND COLLECTION [PART 1]
Hi all and welcome to my first tutorial! This tutorial is about ZCMD-commands, which are really easy to write and are easy explained! Each Part includes a few commands, step by step explained! Today, I'll show you these commands:
- The simple "energy/heal"-CMD
- The "kick"-CMD
- The "ban"-CMD
- The "clearchat"-CMD
- The "freeze/unfreeze"-CMD
- Basic knowledge of "PAWN"
- Saving/Registersystem (including an enum for the player-info)
NOTE: READ the comments given in the commands! Let's roll!
The "/energy"- command:
Description: The famous "energy-command" lets a player, which is at a high enough level, fill his health again up to 100! This is the simplest command, and I'll show it to you, because it's just the start!
First of all, let's write this CMD, while also setting the permissions:
pawn Code:
CMD:energy(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] >= 5) // I don't know what your enum includes and how it looks like, mine is with "pAdmin" defined, which is used to be the "Adminlevel"! So here we check, which level can use this command, you can change it to any level you want/need!
{
}
return 1;
}
pawn Code:
CMD:energy(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] >= 5)
{
SetPlayerHealth(playerid, 100); //if he's allowed, restore his health
SendClientMessage(playerid, COLOR_GREY, "Health has been restored to 100."); // and send him the success-message
}
else
{
SendClientMessage(playerid, COLOR_GREY, "You are not authorized to use that command!"); // if not, send him only the following message
}
return 1;
}
The "/kick"- command:
Description: What would be a server without a kick-CMD? If someone bothers you or is fuckin' around, you can easily throw him out of your server!
First, we'll set the permissions again:
pawn Code:
CMD:kick(playerid,params[])
{
if(PlayerInfo[playerid][pAdmin] >= 3) //Idk again how your enum's defined, however, here we'll set the permissions
{
}
return 1;
}
pawn Code:
stock PlayerName(playerid)
{
new pName[25];
GetPlayerName(playerid, pName, sizeof(pName));
return pName;
}
pawn Code:
CMD:kick(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] >= 3) {
new PID; //define the playerid we wanna kick
new reason[64]; //the reason, put into a string
new str[128]; //a new message string
new Playername[MAX_PLAYER_NAME], Adminname[MAX_PLAYER_NAME]; //defines the function with the playername we wanna get
GetPlayerName(playerid, Adminname, sizeof(Adminname)); //defines the function with the adminname we wanna get
GetPlayerName(PID, Playername, sizeof(Playername));
if(sscanf(params, "us[64]", PID,reason)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /kick [playerid] [reason]"); //tell sscanf if the parameters/the syntax is written wrong to return a message (PID and the reason used here)
if(!IsPlayerConnected(PID)) // if the ID is wrong or not connected, return a message! (PID used here)
return SendClientMessage(playerid, COLOR_GREY, "Player is not connected!");
format(str, sizeof(str), "'%s' has been kicked by administrator '%s'. Reason: %s ", Playername, Adminname, reason); //format the string we've defined to send the message, playername and adminname are used to receive the information about the names
SendClientMessageToAll(COLOR_RED, str); //send that message to all
Kick(PID); //kick the playerid we've defined
}
else //if he has not got the permissions
{
SendClientMessage(playerid, COLOR_GREY, "You have to be level 3 to use that command!"); //return this message
}
return 1;
}
The "/ban"- command:
Description: This one is pretty similar to the kick-CMD, just that it won't let the user come back again, while it blocks his IP!
We'll just go on like at the other commands, first the permissions:
pawn Code:
CMD:ban(playerid,params[])
{
if(PlayerInfo[playerid][pAdmin] >= 3) //again here you have to set your own enum-infos, however, here we'll set the permissions
{
}
return 1;
}
pawn Code:
CMD:ban(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] >= 3) {
new PID; //define the playerid we wanna ban
new reason[64]; //the reason, put into a string
new str[128]; //a new message string
new Playername[MAX_PLAYER_NAME], Adminname[MAX_PLAYER_NAME]; //defines the function with the playername we wanna get
GetPlayerName(playerid, Adminname, sizeof(Adminname)); //defines the function with the adminname we wanna get
GetPlayerName(PID, Playername, sizeof(Playername));
if(sscanf(params, "us[64]", PID,reason)) return SendClientMessage(playerid, COLOR_GREY, "USAGE: /kick [playerid] [reason]"); //tell sscanf if the parameters/the syntax is written wrong to return a message (PID and the reason used here)
if(!IsPlayerConnected(PID)) // if the ID is wrong or not connected, return a message! (PID used here)
return SendClientMessage(playerid, COLOR_GREY, "Player is not connected!");
format(str, sizeof(str), "'%s' has been banned by administrator '%s'. Reason: %s ", Playername, Adminname, reason); //format the string we've defined to send the message, playername and adminname are used to receive the information about the names
SendClientMessageToAll(COLOR_RED, str); //send that message to all
Ban(PID); //Ban the playerid we've defined
}
else //if he has not got the permissions
{
SendClientMessage(playerid, COLOR_GREY, "You have to be level 5 to use that command!"); //return this message
}
return 1;
}
The "/freeze-unfreeze"- commands:
Description: If you freeze a player, he/she will not be able to move anymore until you'll unfreeze him/her! (Or until she'll disconnect)!
First of all, you gotta have a saving/registersystem, which also includes an enum! I am pretty sure that you have got such a one, right?
pawn Code:
enum pInfo
{
pPass,
pCash,
pAdmin,
pKills,
pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];
pawn Code:
enum pInfo
{
pPass,
pCash,
pAdmin,
pKills,
pDeaths,
Frozen
}
pawn Code:
CMD:freeze(playerid,params[])
{
if(PlayerInfo[playerid][pAdmin] >=4 ) //setting permissions, again your enum-stuff here, don't take mine 1:1
{
}
return 1;
}
pawn Code:
COMMAND:freeze(playerid,params[])
{
if(PlayerInfo[playerid][pAdmin] >= 5)
{
new Target; //defines the playerid we wanna freeze
if(sscanf(params, "u", Target)) SendClientMessage(playerid, COLOR_LIGHTBLUE, "USAGE: /freeze [playerid]"); //tell sscanf again if the parameters/syntax is wrong to return a special message
if(!IsPlayerConnected(Target)) //if the ID doesn't exist, return an error-message
return SendClientMessage(playerid, COLOR_GREY, "ERROR:Player is not connected!");
if(!sscanf(params, "u", Target))
{
if(Target == playerid) return SendClientMessage(playerid, COLOR_RED, "ERROR: Cant perform this command on yourself!" ); //I wouldn't add this line, because it won't let you perform this CMD on yourself
if(PlayerInfo[Target][pAdmin] > PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,red,"ERROR: You cant perform this on Admins that are higher than your level!"); // if the player you're performing this command on has a higher level as you, return a message, you ain't able to freeze him
new tname[MAX_PLAYER_NAME]; //define the new target-name of the playerid
GetPlayerName(Target,tname,sizeof(tname)); //get the playername with this function
new pname[MAX_PLAYER_NAME]; //define the adminname
GetPlayerName(playerid,pname,sizeof(pname)); //get the adminname with this function
new tstring[128]; //define the string for the player (victim)
new pstring[128];// define the string for the admin which is performing
new astring[128];//define the string for all the players which are online
format(tstring,sizeof(tstring),"You have been frozen by administrator %s! You cant move!",pname); //this is formatting the player-string, while it's also getting the adminname
format(pstring,sizeof(pstring),"You have frozen player %s(%d)!",tname,Target); //this is formatting the adminname-string, while it's also getting the playername and his ID(target)
format(astring,sizeof(astring),"Administrator %s has frozen %s!",pname,tname); //this is formatting the all-string, while it's sending this message to everybody and is getting admin- and playername
SendClientMessage(Target,COLOR_GOLD,tstring);//sends the message to the victim
SendClientMessage(playerid,TEAM_GROVE_COLOR,pstring);//sends the message to the admin
SendClientMessageToAll(COLOR_LIGHTBLUE,astring);//sends the message to everybody
TogglePlayerControllable(Target,0); //with that function, the player won't be able to mov, while we're using the variable "Target" as the playerid
PlayerInfo[Target][Frozen] = 1;//IMPORTANT:we're getting the variable "[frozen]" out of the enum, and set it's value to "1', the compiler knows now that the player is frozen
}
}
// if he doesn't have permissions, return that message!
else return SendClientMessage(playerid,COLOR_RED,"ERROR: You must be level 5 to use this command!");
return 1;
}
pawn Code:
PlayerInfo[Target][Frozen] = 1;
Also that wasn't that difficult, the "unfreeze-CMD" is the same, we just have to set the enum's variable to "0" that the compiler knows that the player's unfrozen yet:
pawn Code:
COMMAND:unfreeze(playerid,params[])
{
if(PlayerInfo[playerid][pAdmin] >= 5)
{
new Target; //defines the playerid we wanna unfreeze
if(sscanf(params, "u", Target)) SendClientMessage(playerid, COLOR_LIGHTBLUE, "USAGE: /unfreeze [playerid]"); //tell sscanf again if the parameters/syntax is wrong to return a special message
if(!IsPlayerConnected(Target)) //if the ID doesn't exist, return an error-message
return SendClientMessage(playerid, COLOR_GREY, "ERROR:Player is not connected!");
if(!sscanf(params, "u", Target))
{
if(Target == playerid) return SendClientMessage(playerid, COLOR_RED, "ERROR: Cant perform this command on yourself!" ); //I wouldn't add this line, because it won't let you perform this CMD on yourself
if(PlayerInfo[Target][pAdmin] > PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,red,"ERROR: You cant perform this on Admins that are higher than your level!"); // if the player you're performing this command on has a higher level as you, return a message, you ain't able to unfreeze him
new tname[MAX_PLAYER_NAME]; //define the new target-name of the playerid
GetPlayerName(Target,tname,sizeof(tname)); //get the playername with this function
new pname[MAX_PLAYER_NAME]; //define the adminname
GetPlayerName(playerid,pname,sizeof(pname)); //get the adminname with this function
new tstring[128]; //define the string for the player (victim)
new pstring[128];// define the string for the admin which is performing
new astring[128];//define the string for all the players which are online
format(tstring,sizeof(tstring),"You have been unfrozen by administrator %s! You cant move!",pname); //this is formatting the player-string, while it's also getting the adminname
format(pstring,sizeof(pstring),"You have unfrozen player %s(%d)!",tname,Target); //this is formatting the adminname-string, while it's also getting the playername and his ID(target)
format(astring,sizeof(astring),"Administrator %s has unfrozen %s!",pname,tname); //this is formatting the all-string, while it's sending this message to everybody and is getting admin- and playername
SendClientMessage(Target,COLOR_GOLD,tstring);//sends the message to the victim
SendClientMessage(playerid,TEAM_GROVE_COLOR,pstring);//sends the message to the admin
SendClientMessageToAll(COLOR_LIGHTBLUE,astring);//sends the message to everybody
TogglePlayerControllable(Target,1); //with that function, the player will be able to move again, while we're using the variable "Target" as playerid again
PlayerInfo[Target][Frozen] = 0;//IMPORTANT:we're getting the variable "[frozen]" out of the enum, and set it's value to "0", the compiler knows now that the player is unfrozen
}
}
// if he doesn't have permissions, return that message!
else return SendClientMessage(playerid,COLOR_RED,"ERROR: You must be level 5 to use this command!");
return 1;
}
pawn Code:
public OnPlayerSpawn(playerid)
{
if(PlayerInfo[playerid][Frozen] == 1) //Get the info outta the enum and check if the player is still frozen
{
TogglePlayerControllable(playerid,0); //Won't let the player move
SendClientMessage(playerid,red,"WARNING: You are still frozen!"); //Send him a message
}
return 1;
}
The "/clearchat"- commands:
Description: This command is pretty easy and also pretty useful if you wanna clear the chat from spam, shit and stuff your players have written! First, we'll set the permissions again:
pawn Code:
CMD:clearchat(playerid,params[])
{
if(PlayerInfo[playerid][pAdmin] >= 1)
{
}
return 1;
}
We'll use a loop which will send 100 "SendClientMessageToAll"'s, and while the color is set to white, it looks like the chat got cleared, because the string is empty!
pawn Code:
COMMAND:clearchat(playerid,params[])
{
if( PlayerInfo[ playerid ][ pAdmin ] < 1 ) return SendClientMessage( playerid, COLOR_RED, "ERROR: You must be level 1 to use this command!" );
{
for( new i = 0; i <= 100; i ++ ) SendClientMessageToAll( COLOR_WHITE, "" );
} return 1;
}
Creditzz:
ZCMD - by Zeekx
sscanf2 - by Y_Less
Commands, tutorial and explanations - by Twisted_Insane