A
Amfy
Гость
Гость
Сабж.
Важно:
Используется инклуд sscanf, поэтому, если у вас не подключен, необходимо подключить, или переделать команды под себя.
Ко всем #define
#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
К глобальным переменным (где все new):
new ObjectBomb[MAX_PLAYERS] = {INVALID_OBJECT_ID, ...};
В начало public OnPlayerCommandText добавить (если нет):
new cmd[32],params[128];
sscanf(cmdtext,"s[32]s[128]",cmd,params);
Ну, и конечно же, сами команды в public OnPlayerCommandText
if(strcmp("/bomba",cmdtext,true, 10) == 0)
{
SendClientMessage(playerid,-1,"Установить взрывчатку - /usbomba");
SendClientMessage(playerid,-1,"Установить взрывчатку на таймер - /usbombatime");
SetPVarInt(playerid,"bomba",1);
return 1;
}
if(strcmp("/usbomba",cmdtext,true, 10) == 0)
{
if(!GetPVarInt(playerid,"bomba")) return SendClientMessage(playerid,-1,"У вас нет бомбы!");
if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid,-1,"Выйдите из машины!");
UsBomba(playerid);
return 1;
}
if(strcmp("/usbombatime",cmdtext,true, 10) == 0)
{
if(!GetPVarInt(playerid,"bomba")) return SendClientMessage(playerid,-1,"У вас нет бомбы!");
new time_explosion;
if(sscanf(params,"i",time_explosion)) return SendClientMessage(playerid,-1,"/usbombatime [время (не меньше 10 сек и не больше 60 сек)]");
if(time_explosion < 10 || time_explosion > 60) return SendClientMessage(playerid,-1,"Время должно быть от 10 сек до 60 сек");
UsBomba(playerid,time_explosion);
return 1;
}
В public OnPlayerKeyStateChange
if(PRESSED(KEY_YES) && GetPVarInt(playerid,"ActiveBomb") == 1)
{
new Float:explosion_pos[3];
explosion_pos[0] = GetPVarFloat(playerid,"x_bomb");
explosion_pos[1] = GetPVarFloat(playerid,"y_bomb");
explosion_pos[2] = GetPVarFloat(playerid,"z_bomb");
CreateExplosion(explosion_pos[0],explosion_pos[1],explosion_pos[2],6,1);
CreateExplosion(explosion_pos[0],explosion_pos[1],explosion_pos[2],7,1);
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
DeletePVar(playerid,"bomba");
DeletePVar(playerid,"x_bomb");
DeletePVar(playerid,"y_bomb");
DeletePVar(playerid,"z_bomb");
DeletePVar(playerid,"ActiveBomb");
return 1;
}
В public OnPlayerDisconnect
if(GetPVarInt(playerid,"ActiveBomb") == 1 || GetPVarInt(playerid,"ActiveBomb") == 2)
{
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
}
В конец мода:
UsBomba(playerid,time = 0)
{
new Floatos[3];
GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
ApplyAnimation(playerid,"BOMBER","BOM_Plant",4.0,0,0,0,0,0);
ObjectBomb[playerid] = CreateObject(1654,pos[0],pos[1]-0.5,pos[2]-0.8,-90.0,0.0,0.0);
if(time == 0)
{
SendClientMessage(playerid,-1,"Бомба установлена, активировать: Y");
SetPVarFloat(playerid,"x_bomb",pos[0]);
SetPVarFloat(playerid,"y_bomb",pos[1]);
SetPVarFloat(playerid,"z_bomb",pos[2]);
SetPVarInt(playerid,"ActiveBomb",1);
return 1;
}
SetTimerEx("TimerExplosion",time*1000,false,"ifff",playerid,pos[0],pos[1],pos[2]);
SetPVarInt(playerid,"ActiveBomb",2);
return 1;
}
forward TimerExplosion(playerid,Float:X,Float:Y,Float:Z);
public TimerExplosion(playerid,Float:X,Float:Y,Float:Z)
{
GameTextForPlayer(playerid,"~r~~h~Explosion",1000,1);
CreateExplosion(X,Y,Z,6,1);
CreateExplosion(X,Y,Z,7,1);
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
DeletePVar(playerid,"ActiveBomb");
DeletePVar(playerid,"bomba");
return 1;
}
Для тех, кому это кажется всё очень сложным, можете создать чистый .pwn файл и вставить туда готовый скрипт.
#include <a_samp>
#include <sscanf2>
#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
main(){ }
new ObjectBomb[MAX_PLAYERS] = {INVALID_OBJECT_ID, ...};
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[32],params[128];
sscanf(cmdtext,"s[32]s[128]",cmd,params);
if(strcmp("/bomba",cmdtext,true, 10) == 0)
{
SendClientMessage(playerid,-1,"Установить взрывчатку - /usbomba");
SendClientMessage(playerid,-1,"Установить взрывчатку на таймер - /usbombatime");
SetPVarInt(playerid,"bomba",1);
return 1;
}
if(strcmp("/usbomba",cmdtext,true, 10) == 0)
{
if(!GetPVarInt(playerid,"bomba")) return SendClientMessage(playerid,-1,"У вас нет бомбы!");
if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid,-1,"Выйдите из машины!");
UsBomba(playerid);
return 1;
}
if(strcmp("/usbombatime",cmdtext,true, 10) == 0)
{
if(!GetPVarInt(playerid,"bomba")) return SendClientMessage(playerid,-1,"У вас нет бомбы!");
new time_explosion;
if(sscanf(params,"i",time_explosion)) return SendClientMessage(playerid,-1,"/usbombatime [время (не меньше 10 сек и не больше 60 сек)]");
if(time_explosion < 10 || time_explosion > 60) return SendClientMessage(playerid,-1,"Время должно быть от 10 сек до 60 сек");
UsBomba(playerid,time_explosion);
return 1;
}
return 0;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(PRESSED(KEY_YES) && GetPVarInt(playerid,"ActiveBomb") == 1)
{
new Float:explosion_pos[3];
explosion_pos[0] = GetPVarFloat(playerid,"x_bomb");
explosion_pos[1] = GetPVarFloat(playerid,"y_bomb");
explosion_pos[2] = GetPVarFloat(playerid,"z_bomb");
CreateExplosion(explosion_pos[0],explosion_pos[1],explosion_pos[2],6,1);
CreateExplosion(explosion_pos[0],explosion_pos[1],explosion_pos[2],7,1);
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
DeletePVar(playerid,"bomba");
DeletePVar(playerid,"x_bomb");
DeletePVar(playerid,"y_bomb");
DeletePVar(playerid,"z_bomb");
DeletePVar(playerid,"ActiveBomb");
return 1;
}
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
if(GetPVarInt(playerid,"ActiveBomb") == 1 || GetPVarInt(playerid,"ActiveBomb") == 2)
{
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
}
return 1;
}
UsBomba(playerid,time = 0)
{
new Floatos[3];
GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
ApplyAnimation(playerid,"BOMBER","BOM_Plant",4.0,0,0,0,0,0);
ObjectBomb[playerid] = CreateObject(1654,pos[0],pos[1]-0.5,pos[2]-0.8,-90.0,0.0,0.0);
if(time == 0)
{
SendClientMessage(playerid,-1,"Бомба установлена, активировать: Y");
SetPVarFloat(playerid,"x_bomb",pos[0]);
SetPVarFloat(playerid,"y_bomb",pos[1]);
SetPVarFloat(playerid,"z_bomb",pos[2]);
SetPVarInt(playerid,"ActiveBomb",1);
return 1;
}
SetTimerEx("TimerExplosion",time*1000,false,"ifff",playerid,pos[0],pos[1],pos[2]);
SetPVarInt(playerid,"ActiveBomb",2);
return 1;
}
forward TimerExplosion(playerid,Float:X,Float:Y,Float:Z);
public TimerExplosion(playerid,Float:X,Float:Y,Float:Z)
{
GameTextForPlayer(playerid,"~r~~h~Explosion",1000,1);
CreateExplosion(X,Y,Z,6,1);
CreateExplosion(X,Y,Z,7,1);
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
DeletePVar(playerid,"ActiveBomb");
DeletePVar(playerid,"bomba");
return 1;
}
[green]Команды:
/bomba - получить бомбу
/usbomba - установить бомбу (активировать по клавише Y)
/usbombatime - установить бомбу на таймер (взорвется через указанное кол-во секунд)
[/green]
Автор: Amfy
Важно:
Используется инклуд sscanf, поэтому, если у вас не подключен, необходимо подключить, или переделать команды под себя.
Ко всем #define
#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
К глобальным переменным (где все new):
new ObjectBomb[MAX_PLAYERS] = {INVALID_OBJECT_ID, ...};
В начало public OnPlayerCommandText добавить (если нет):
new cmd[32],params[128];
sscanf(cmdtext,"s[32]s[128]",cmd,params);
Ну, и конечно же, сами команды в public OnPlayerCommandText
if(strcmp("/bomba",cmdtext,true, 10) == 0)
{
SendClientMessage(playerid,-1,"Установить взрывчатку - /usbomba");
SendClientMessage(playerid,-1,"Установить взрывчатку на таймер - /usbombatime");
SetPVarInt(playerid,"bomba",1);
return 1;
}
if(strcmp("/usbomba",cmdtext,true, 10) == 0)
{
if(!GetPVarInt(playerid,"bomba")) return SendClientMessage(playerid,-1,"У вас нет бомбы!");
if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid,-1,"Выйдите из машины!");
UsBomba(playerid);
return 1;
}
if(strcmp("/usbombatime",cmdtext,true, 10) == 0)
{
if(!GetPVarInt(playerid,"bomba")) return SendClientMessage(playerid,-1,"У вас нет бомбы!");
new time_explosion;
if(sscanf(params,"i",time_explosion)) return SendClientMessage(playerid,-1,"/usbombatime [время (не меньше 10 сек и не больше 60 сек)]");
if(time_explosion < 10 || time_explosion > 60) return SendClientMessage(playerid,-1,"Время должно быть от 10 сек до 60 сек");
UsBomba(playerid,time_explosion);
return 1;
}
В public OnPlayerKeyStateChange
if(PRESSED(KEY_YES) && GetPVarInt(playerid,"ActiveBomb") == 1)
{
new Float:explosion_pos[3];
explosion_pos[0] = GetPVarFloat(playerid,"x_bomb");
explosion_pos[1] = GetPVarFloat(playerid,"y_bomb");
explosion_pos[2] = GetPVarFloat(playerid,"z_bomb");
CreateExplosion(explosion_pos[0],explosion_pos[1],explosion_pos[2],6,1);
CreateExplosion(explosion_pos[0],explosion_pos[1],explosion_pos[2],7,1);
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
DeletePVar(playerid,"bomba");
DeletePVar(playerid,"x_bomb");
DeletePVar(playerid,"y_bomb");
DeletePVar(playerid,"z_bomb");
DeletePVar(playerid,"ActiveBomb");
return 1;
}
В public OnPlayerDisconnect
if(GetPVarInt(playerid,"ActiveBomb") == 1 || GetPVarInt(playerid,"ActiveBomb") == 2)
{
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
}
В конец мода:
UsBomba(playerid,time = 0)
{
new Floatos[3];
GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
ApplyAnimation(playerid,"BOMBER","BOM_Plant",4.0,0,0,0,0,0);
ObjectBomb[playerid] = CreateObject(1654,pos[0],pos[1]-0.5,pos[2]-0.8,-90.0,0.0,0.0);
if(time == 0)
{
SendClientMessage(playerid,-1,"Бомба установлена, активировать: Y");
SetPVarFloat(playerid,"x_bomb",pos[0]);
SetPVarFloat(playerid,"y_bomb",pos[1]);
SetPVarFloat(playerid,"z_bomb",pos[2]);
SetPVarInt(playerid,"ActiveBomb",1);
return 1;
}
SetTimerEx("TimerExplosion",time*1000,false,"ifff",playerid,pos[0],pos[1],pos[2]);
SetPVarInt(playerid,"ActiveBomb",2);
return 1;
}
forward TimerExplosion(playerid,Float:X,Float:Y,Float:Z);
public TimerExplosion(playerid,Float:X,Float:Y,Float:Z)
{
GameTextForPlayer(playerid,"~r~~h~Explosion",1000,1);
CreateExplosion(X,Y,Z,6,1);
CreateExplosion(X,Y,Z,7,1);
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
DeletePVar(playerid,"ActiveBomb");
DeletePVar(playerid,"bomba");
return 1;
}
Для тех, кому это кажется всё очень сложным, можете создать чистый .pwn файл и вставить туда готовый скрипт.
#include <a_samp>
#include <sscanf2>
#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
main(){ }
new ObjectBomb[MAX_PLAYERS] = {INVALID_OBJECT_ID, ...};
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[32],params[128];
sscanf(cmdtext,"s[32]s[128]",cmd,params);
if(strcmp("/bomba",cmdtext,true, 10) == 0)
{
SendClientMessage(playerid,-1,"Установить взрывчатку - /usbomba");
SendClientMessage(playerid,-1,"Установить взрывчатку на таймер - /usbombatime");
SetPVarInt(playerid,"bomba",1);
return 1;
}
if(strcmp("/usbomba",cmdtext,true, 10) == 0)
{
if(!GetPVarInt(playerid,"bomba")) return SendClientMessage(playerid,-1,"У вас нет бомбы!");
if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid,-1,"Выйдите из машины!");
UsBomba(playerid);
return 1;
}
if(strcmp("/usbombatime",cmdtext,true, 10) == 0)
{
if(!GetPVarInt(playerid,"bomba")) return SendClientMessage(playerid,-1,"У вас нет бомбы!");
new time_explosion;
if(sscanf(params,"i",time_explosion)) return SendClientMessage(playerid,-1,"/usbombatime [время (не меньше 10 сек и не больше 60 сек)]");
if(time_explosion < 10 || time_explosion > 60) return SendClientMessage(playerid,-1,"Время должно быть от 10 сек до 60 сек");
UsBomba(playerid,time_explosion);
return 1;
}
return 0;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(PRESSED(KEY_YES) && GetPVarInt(playerid,"ActiveBomb") == 1)
{
new Float:explosion_pos[3];
explosion_pos[0] = GetPVarFloat(playerid,"x_bomb");
explosion_pos[1] = GetPVarFloat(playerid,"y_bomb");
explosion_pos[2] = GetPVarFloat(playerid,"z_bomb");
CreateExplosion(explosion_pos[0],explosion_pos[1],explosion_pos[2],6,1);
CreateExplosion(explosion_pos[0],explosion_pos[1],explosion_pos[2],7,1);
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
DeletePVar(playerid,"bomba");
DeletePVar(playerid,"x_bomb");
DeletePVar(playerid,"y_bomb");
DeletePVar(playerid,"z_bomb");
DeletePVar(playerid,"ActiveBomb");
return 1;
}
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
if(GetPVarInt(playerid,"ActiveBomb") == 1 || GetPVarInt(playerid,"ActiveBomb") == 2)
{
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
}
return 1;
}
UsBomba(playerid,time = 0)
{
new Floatos[3];
GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
ApplyAnimation(playerid,"BOMBER","BOM_Plant",4.0,0,0,0,0,0);
ObjectBomb[playerid] = CreateObject(1654,pos[0],pos[1]-0.5,pos[2]-0.8,-90.0,0.0,0.0);
if(time == 0)
{
SendClientMessage(playerid,-1,"Бомба установлена, активировать: Y");
SetPVarFloat(playerid,"x_bomb",pos[0]);
SetPVarFloat(playerid,"y_bomb",pos[1]);
SetPVarFloat(playerid,"z_bomb",pos[2]);
SetPVarInt(playerid,"ActiveBomb",1);
return 1;
}
SetTimerEx("TimerExplosion",time*1000,false,"ifff",playerid,pos[0],pos[1],pos[2]);
SetPVarInt(playerid,"ActiveBomb",2);
return 1;
}
forward TimerExplosion(playerid,Float:X,Float:Y,Float:Z);
public TimerExplosion(playerid,Float:X,Float:Y,Float:Z)
{
GameTextForPlayer(playerid,"~r~~h~Explosion",1000,1);
CreateExplosion(X,Y,Z,6,1);
CreateExplosion(X,Y,Z,7,1);
DestroyObject(ObjectBomb[playerid]);
ObjectBomb[playerid] = INVALID_OBJECT_ID;
DeletePVar(playerid,"ActiveBomb");
DeletePVar(playerid,"bomba");
return 1;
}
[green]Команды:
/bomba - получить бомбу
/usbomba - установить бомбу (активировать по клавише Y)
/usbombatime - установить бомбу на таймер (взорвется через указанное кол-во секунд)
[/green]
Автор: Amfy
Последнее редактирование: