02.05.2013, 02:54
i found this cage this script but players can easily escape bt /kill and how to send the all cilent 'Players has been been caged [reason .....]
pls some1 help
no one shouldbe be able to get out of cage unless admin uncage him
and message should be sent to all players [u know what i mean right]
pls some1 help
no one shouldbe be able to get out of cage unless admin uncage him
and message should be sent to all players [u know what i mean right]
Код:
/* -------------------
cage by Rachael
----------------------
*/
#include <a_samp>
#include <a_players>
#include <a_irc>
#pragma unused sztmp
#define COLOR_GREY 0xAFAFAFAA
#define COLOR_RCON 0x3399FFAA
enum obj { id, Float:ox, Float:oy, Float:oz, Float:xa, Float:ya, Float:za }
new object_ref[10][obj] =
{
{ 971 , -4.374 , -0.274 , 1.674 , 0.0000 , 0.0000 , 270.0000 },
{ 971 , 0.100 , 4.179 , 1.712 , 0.0000 , 0.0000 , 180.0000 },
{ 971 , 0.000 , -4.724 , 1.674 , 0.0000 , 0.0000 , 0.0000 },
{ 971 , 4.500 , -0.124 , 1.674 , 0.0000 , 0.0000 , 90.0000 },
{ 969 , -4.428 , 4.053 , 5.139 , 270.618 , 0.0000 , 270.0000 },
{ 969 , -1.428 , 4.053 , 5.139 , 270.618 , 0.0000 , 270.0000 },
{ 969 , 1.396 , 4.053 , 5.139 , 270.618 , 0.0000 , 270.0000 },
{ 969 , -4.428 , 4.053 , -1.76 , 270.618 , 0.0000 , 270.0000 },
{ 969 , -1.428 , 4.053 , -1.76 , 270.618 , 0.0000 , 270.0000 },
{ 969 , 1.396 , 4.053 , -1.76 , 270.618 , 0.0000 , 270.0000 }
};
new object[120];
new obj_count = 0;
new cage[20][10];
new cage_count= 0;
enum loc { Float:cx, Float:cy, Float:cz }
new cage_pos[20][loc];
new astring[255];
stock strtok(const string[], &index)
{
new length = strlen(string);
while ((index < length) && (string[index] <= ' '))
{
index++;
}
new offset = index;
new result[20];
while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
{
result[index - offset] = string[index];
index++;
}
result[index - offset] = EOS;
return result;
}
stock IsNumeric(const string[])
{
for(new i = 0, j = strlen(string); i < j; i++)
{
if(string[i] > '9' || string[i] < '0') return 0;
}
return 1;
}
stock ReturnUser(text[], playerid = INVALID_PLAYER_ID)
{
new pos = 0;
while (text[pos] < 0x21) // Strip out leading spaces
{
if (text[pos] == 0) return INVALID_PLAYER_ID; // No passed text
pos++;
}
new userid = INVALID_PLAYER_ID;
if (IsNumeric(text[pos])) // Check whole passed string
{
// If they have a numeric name you have a problem (although names are checked on id failure)
userid = strval(text[pos]);
if (userid >=0 && userid < MAX_PLAYERS)
{
if(!IsPlayerConnected(userid))
{
userid = INVALID_PLAYER_ID;
}
else
{
return userid; // A player was found
}
}
}
// They entered [part of] a name or the id search failed (check names just incase)
new len = strlen(text[pos]);
new count = 0;
new aname[MAX_PLAYER_NAME];
for (new i = 0; i < MAX_PLAYERS; i++)
{
if (IsPlayerConnected(i))
{
GetPlayerName(i, aname, sizeof (aname));
if (strcmp(aname, text[pos], true, len) == 0) // Check segment of name
{
if (len == strlen(aname)) // Exact match
{
return i; // Return the exact player on an exact match
}
else // Partial match
{
count++;
userid = i;
}
}
}
}
if (count != 1)
{
if (playerid != INVALID_PLAYER_ID)
{
if (count)
{
SendClientMessage(playerid, 0xFF0000AA, "Multiple users found, please narrow search.");
}
else
{
SendClientMessage(playerid, 0xFF0000AA, "No matching user found.");
}
}
userid = INVALID_PLAYER_ID;
}
return userid; // INVALID_PLAYER_ID for bad return
}
stock Name(playerid) // returns player's name
{
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid, pname, sizeof (pname));
return pname;
}
public OnPlayerCommandText(playerid,cmdtext[])
{
if(IsPlayerAdmin(playerid))
{
new
idx,
argument[32]
;
argument = strtok(cmdtext,idx);
if(!strcmp(argument,"/cage",true))
{
argument = strtok(cmdtext,idx);
if(!strlen(argument))
{
SendClientMessage(playerid,COLOR_GREY,"USAGE: /cage [playerID/partofname|del|send|up|dn|north|south|east|west]");
return 1;
}
new caged = ReturnUser(argument);
if(caged != INVALID_PLAYER_ID)
{
new Float:playX, Float:playY, Float:playZ;
GetPlayerPos(caged,playX,playY,playZ);
cage_count++;
cage_pos[cage_count][cx] = playX;
cage_pos[cage_count][cy] = playY;
cage_pos[cage_count][cz] = playZ;
for(new i = 0; i <= 9;i++)
{
obj_count++;
object[obj_count] = CreateObject(object_ref[i][id],
playX+object_ref[i][ox],
playY+object_ref[i][oy],
playZ+object_ref[i][oz],
object_ref[i][xa],
object_ref[i][ya],
object_ref[i][za]);
cage[cage_count][i] = obj_count;
}
format(astring,sizeof(astring), "cage %d created",cage_count);
SendClientMessage(playerid, COLOR_RCON, astring);
return 1;
}
if(!strcmp(argument,"up",true))
{
argument = strtok(cmdtext, idx);
new cagenum = strval(argument);
if(cagenum < 1 || cagenum > cage_count)
{
SendClientMessage(playerid,COLOR_GREY,"USAGE: /cage up [cage#] [distance]");
return 1;
}
argument = strtok(cmdtext, idx);
new Float:distance = floatstr(argument);
if(distance <= 0)
{
SendClientMessage(playerid,COLOR_GREY,"invalid distance [1-1000]");
return 1;
}
for(new i = 0; i <= 9;i++)
{
MoveObject(object[cage[cagenum][i]],
cage_pos[cagenum][cx]+object_ref[i][ox],
cage_pos[cagenum][cy]+object_ref[i][oy],
cage_pos[cagenum][cz]+object_ref[i][oz]+distance,
2.0);
}
cage_pos[cagenum][cz] += distance;
new movest[128];
format(movest,sizeof(movest),"cage %d moved up %.1fm",cagenum,distance);
SendClientMessage(playerid,COLOR_RCON,movest);
return 1;
}
if(!strcmp(argument,"dn",true))
{
argument = strtok(cmdtext, idx);
new cagenum = strval(argument);
if(cagenum < 1 || cagenum > cage_count)
{
SendClientMessage(playerid,COLOR_GREY,"USAGE: /cage dn [cage#] [distance]");
return 1;
}
argument = strtok(cmdtext, idx);
new Float:distance = floatstr(argument);
if(distance <= 0)
{
SendClientMessage(playerid,COLOR_GREY,"invalid distance [1-1000]");
return 1;
}
for(new i = 0; i <= 9;i++)
{
MoveObject(object[cage[cagenum][i]],
cage_pos[cagenum][cx]+object_ref[i][ox],
cage_pos[cagenum][cy]+object_ref[i][oy],
cage_pos[cagenum][cz]+object_ref[i][oz]-distance,
2.0);
}
cage_pos[cagenum][cz] -= distance;
new movest[128];
format(movest,sizeof(movest),"cage %d moved down %.1fm",cagenum,distance);
SendClientMessage(playerid,COLOR_RCON,movest);
return 1;
}
if(!strcmp(argument,"north",true))
{
argument = strtok(cmdtext, idx);
new cagenum = strval(argument);
if(cagenum < 1 || cagenum > cage_count)
{
SendClientMessage(playerid,COLOR_GREY,"USAGE: /cage north [cage#] [distance]");
return 1;
}
argument = strtok(cmdtext, idx);
new Float:distance = floatstr(argument);
if(distance <= 0)
{
SendClientMessage(playerid,COLOR_GREY,"invalid distance [1-1000]");
return 1;
}
for(new i = 0; i <= 9;i++)
{
MoveObject(object[cage[cagenum][i]],
cage_pos[cagenum][cx]+object_ref[i][ox],
cage_pos[cagenum][cy]+object_ref[i][oy]+distance,
cage_pos[cagenum][cz]+object_ref[i][oz],
2.0);
}
cage_pos[cagenum][cy] += distance;
new movest[128];
format(movest,sizeof(movest),"cage %d moved north %.1fm",cagenum,distance);
SendClientMessage(playerid,COLOR_RCON,movest);
return 1;
}
if(!strcmp(argument,"south",true))
{
argument = strtok(cmdtext, idx);
new cagenum = strval(argument);
if(cagenum < 1 || cagenum > cage_count)
{
SendClientMessage(playerid,COLOR_GREY,"USAGE: /cagesouth [cage#] [distance]");
return 1;
}
argument = strtok(cmdtext, idx);
new Float:distance = floatstr(argument);
if(distance <= 0)
{
SendClientMessage(playerid,COLOR_GREY,"invalid distance [1-1000]");
return 1;
}
for(new i = 0; i <= 9;i++)
{
MoveObject(object[cage[cagenum][i]],
cage_pos[cagenum][cx]+object_ref[i][ox],
cage_pos[cagenum][cy]+object_ref[i][oy]-distance,
cage_pos[cagenum][cz]+object_ref[i][oz],
2.0);
}
cage_pos[cagenum][cy] -= distance;
new movest[128];
format(movest,sizeof(movest),"cage %d moved south %.1fm",cagenum,distance);
SendClientMessage(playerid,COLOR_RCON,movest);
return 1;
}
if(!strcmp(argument,"east",true))
{
argument = strtok(cmdtext, idx);
new cagenum = strval(argument);
if(cagenum < 1 || cagenum > cage_count)
{
SendClientMessage(playerid,COLOR_GREY,"USAGE: /cage east [cage#] [distance]");
return 1;
}
argument = strtok(cmdtext, idx);
new Float:distance = floatstr(argument);
if(distance <= 0)
{
SendClientMessage(playerid,COLOR_GREY,"invalid distance [1-1000]");
return 1;
}
for(new i = 0; i <= 9;i++)
{
MoveObject(object[cage[cagenum][i]],
cage_pos[cagenum][cx]+object_ref[i][ox]+distance,
cage_pos[cagenum][cy]+object_ref[i][oy],
cage_pos[cagenum][cz]+object_ref[i][oz],
2.0);
}
cage_pos[cagenum][cx] += distance;
new movest[128];
format(movest,sizeof(movest),"cage %d moved east %.1fm",cagenum,distance);
SendClientMessage(playerid,COLOR_RCON,movest);
return 1;
}
if(!strcmp(argument,"west",true))
{
argument = strtok(cmdtext, idx);
new cagenum = strval(argument);
if(cagenum < 1 || cagenum > cage_count)
{
SendClientMessage(playerid,COLOR_GREY,"USAGE: /cagewest [cage#] [distance]");
return 1;
}
argument = strtok(cmdtext, idx);
new Float:distance = floatstr(argument);
if(distance <= 0)
{
SendClientMessage(playerid,COLOR_GREY,"invalid distance [1-1000]");
return 1;
}
for(new i = 0; i <= 9;i++)
{
MoveObject(object[cage[cagenum][i]],
cage_pos[cagenum][cx]+object_ref[i][ox]+distance,
cage_pos[cagenum][cy]+object_ref[i][oy],
cage_pos[cagenum][cz]+object_ref[i][oz],
2.0);
}
cage_pos[cagenum][cx] -= distance;
new movest[128];
format(movest,sizeof(movest),"cage %d moved west %.1fm",cagenum,distance);
SendClientMessage(playerid,COLOR_RCON,movest);
return 1;
}
if(!strcmp(argument,"del",true))
{
argument = strtok(cmdtext,idx);
if(!strcmp(argument,"#all",true))
{
for(new i = 1; i <= cage_count;i++)
{
for(new j = 0; j <= 9; j++)
{
cage[i][j] = 0;
}
cage_pos[i][cx] = 0;
cage_pos[i][cy] = 0;
cage_pos[i][cz] = 0;
}
cage_count = 0;
for(new i = 1; i <= obj_count;i++)
{
if(object[i])
{
DestroyObject(object[i]);
}
}
obj_count = 0;
SendClientMessage(playerid, COLOR_RCON, "all cages destroyed.");
return 1;
}
new cage_num = strval(argument);
if(cage_num < 1 || cage_num > cage_count)
{
SendClientMessage(playerid, COLOR_GREY, "USAGE: /cage del [cage num|#all]");
return 1;
}
for(new i = 0; i <= 9;i++)
{
if(object[cage[cage_num][i]])
{
DestroyObject(object[cage[cage_num][i]]);
object[cage[cage_num][i]] = 0;
cage[cage_num][i] = 0;
}
cage_pos[cage_num][cx] = 0;
cage_pos[cage_num][cy] = 0;
cage_pos[cage_num][cz] = 0;
}
format(astring,sizeof(astring), "cage number %d destroyed",cage_num);
SendClientMessage(playerid, COLOR_RCON, astring);
return 1;
}
if(!strcmp(argument,"send",true))
{
argument = strtok(cmdtext,idx);
new cage_num = strval(argument);
if(cage_num < 0 || cage_num > cage_count || cage_pos[cage_num][cx] == 0)
{
SendClientMessage(playerid, COLOR_GREY, "USAGE: /cagesend [cage num] [player]");
return 1;
}
argument = strtok(cmdtext,idx);
new player = ReturnUser(argument);
if(player == INVALID_PLAYER_ID)
{
SendClientMessage(playerid, COLOR_GREY, "Invalid player ID.");
return 1;
}
SetPlayerInterior(player,0);
SetPlayerVirtualWorld(player,0);
SetPlayerPos(player,cage_pos[cage_num][cx],cage_pos[cage_num][cy],cage_pos[cage_num][cz]);
format(astring,sizeof(astring), "%s placed inside cage number %d",Name(player),cage_num);
SendClientMessage(playerid, COLOR_RCON, astring);
return 1;
}
SendClientMessage(playerid,COLOR_GREY,"USAGE: /cage [playerID/partofname|del|send|up|dn|north|south|east|west]");
return 1;
}
return 0;
}
return 0;
}
public OnFilterScriptExit()
{
for(new i = 1; i <= obj_count;i++)
{
DestroyObject(object[i]);
}
return 1;
}


