PDA

Просмотр полной версии : [Вопрос] Принцип работы команды /jail и подобных



pawno_Lyubitel
04.06.2016, 08:37
Доброго времени суток. Я надеюсь хотя бы здесь мне смогу помочь.
Суть моего интереса заключается вот в чем: Я хочу разобраться как писать команды такие как /jail и подобные, интересует меня все что касается времени, куда записывается, каким образом, как отсчиывает и т.д
Если не сложно вам, напишите пожалуйста простенькую команду /jail на dc_cmd с обьяснениями, ну типа мануала что ли, буду безмерно благодарен. Мод у меня на MYSQL R7, если что.

TheMallard
04.06.2016, 10:22
Пояснения в студию!

Wise
04.06.2016, 10:29
Уже всё давно написали, описали, расписали. Научитесь пользоваться поиском. Сообщение кликабельно. (http://pro-pawn.ru/forumdisplay.php?5-%D0%A3%D1%80%D0%BE%D0%BA%D0%B8)

pawno_Lyubitel
04.06.2016, 10:38
Ну я же вроде нормально расписал , что мне нужно. Ну допустим ввожу команду /jail 228 30 test // 228 - id // 30 minutes.
меня интересует все что касается времени, куда заносить эти 30 минут, как ведется отсчет до выхода из кпз

- - - Добавлено - - -


Уже всё давно написали, описали, расписали. Научитесь пользоваться поиском. Сообщение кликабельно. (http://pro-pawn.ru/forumdisplay.php?5-%D0%A3%D1%80%D0%BE%D0%BA%D0%B8)

Дружище, мне выпендрежников и на P-I хватило.

Wise
04.06.2016, 10:43
Ну я же вроде нормально расписал , что мне нужно. Ну допустим ввожу команду /jail 228 30 test // 228 - id // 30 minutes.
меня интересует все что касается времени, куда заносить эти 30 минут, как ведется отсчет до выхода из кпз

- - - Добавлено - - -



Дружище, мне выпендрежников и на P-I хватило.

Меня сравнивать с Г-И не надо. Я в этой дыре не был и не буду.
Это просто бессмысленно снова описывать.
Дам тебе два совета.
1) Прочитай правила раздела, они очень полезны.

Прежде чем создавать новую тему убедитесь, что подобный вопрос не рассматривался ранее, пользуйтесь поиском по форуму.
2) Когда тебе помогают - принимай, а не веди себя, как всезнающий.

pawno_Lyubitel
04.06.2016, 11:14
Если я считал бы себя всезнающим, не задавал бы вопросы на различных pawn порталах.
Я надеялся получить конкретный ответ, а не отсылку.

pawno_Lyubitel
04.06.2016, 19:27
Подскажите, почему не пишет причину?

COMMAND:jail(playerid,params[])
{
if(GetPVarInt(playerid,"logged") ==0) return 1;
if(player_info[playerid][ADMIN] < 3) return 1;
new id,
kpztime,
tmp[40];
if(sscanf(params, "ddS[40]", id, kpztime, tmp)) return SendClientMessage(playerid,0xEAD513FF,"{EAD513}[Подсказка]: {FFFFFF}используй /jail [id] [время] [причина]");
if(!IsPlayerConnected(id)) return SendClientMessage(playerid,0xEAD513FF,"{EAD513}[Подсказка]: {FFFFFF}Такого игрока нет");
if(kpztime < 10 || kpztime > 300) return SendClientMessage(playerid,0xEAD513FF,"{EAD513}[Подсказка]: {FFFFFF}время указывайте от 10 до 300 минут!");
if(player_info[id][KPZ] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "Этот игрок уже находится в кпз");
}
else
{
ResetPlayerWeapons(id);
player_info[id][KPZ] = 1;
player_info[id][KPZTIME] = kpztime;
SetPlayerPos(id, 540.0917,-190.3685,3947.2134);
SetPVarInt(id,"jail",gettime()+(kpztime*60));
static const fmt_str1[] = "Вы были посажены администратором %s на %d минут. Причина: %s";
new str1[sizeof(fmt_str1)-2-2-2+MAX_PLAYER_NAME+40];
format(str1, sizeof(str1), fmt_str1, player_info[playerid][NAME], kpztime, tmp);
SendClientMessage(id,COLOR_LITERED,str1);
static const fmt_str[] = "Администратор %s посадил игрока %s в кпз на %d минут. Причина: %s";
new str[sizeof(fmt_str)-6+MAX_PLAYER_NAME+3+40];
format(str, sizeof(str), fmt_str, player_info[playerid][NAME], player_info[id][NAME], kpztime, tmp);
SendAdminMessage(COLOR_GREY,str);
SetTimerEx("TimerForJail",2500,1,"%d",id);
SendClientMessage(player,0xFFFFFFFF,"Используйте команду /time , чтобы узнать сколько вам времени сидеть в тюрьме");
return 1;
}
return 1;
}

Sp1ke
04.06.2016, 19:29
Подскажите, почему не пишет причину?

COMMAND:jail(playerid,params[])
{
if(GetPVarInt(playerid,"logged") ==0) return 1;
if(player_info[playerid][ADMIN] < 3) return 1;
new id,
kpztime,
tmp[40];
if(sscanf(params, "ddS[40]", id, kpztime, tmp)) return SendClientMessage(playerid,0xEAD513FF,"{EAD513}[Подсказка]: {FFFFFF}используй /jail [id] [время] [причина]");
if(!IsPlayerConnected(id)) return SendClientMessage(playerid,0xEAD513FF,"{EAD513}[Подсказка]: {FFFFFF}Такого игрока нет");
if(kpztime < 10 || kpztime > 300) return SendClientMessage(playerid,0xEAD513FF,"{EAD513}[Подсказка]: {FFFFFF}время указывайте от 10 до 300 минут!");
if(player_info[id][KPZ] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "Этот игрок уже находится в кпз");
}
else
{
ResetPlayerWeapons(id);
player_info[id][KPZ] = 1;
player_info[id][KPZTIME] = kpztime;
SetPlayerPos(id, 540.0917,-190.3685,3947.2134);
SetPVarInt(id,"jail",gettime()+(kpztime*60));
static const fmt_str1[] = "Вы были посажены администратором %s на %d минут. Причина: %s";
new str1[sizeof(fmt_str1)-2-2-2+MAX_PLAYER_NAME+40];
format(str1, sizeof(str1), fmt_str1, player_info[playerid][NAME], kpztime, tmp);
SendClientMessage(id,COLOR_LITERED,str1);
static const fmt_str[] = "Администратор %s посадил игрока %s в кпз на %d минут. Причина: %s";
new str[sizeof(fmt_str)-6+MAX_PLAYER_NAME+3+40];
format(str, sizeof(str), fmt_str, player_info[playerid][NAME], player_info[id][NAME], kpztime, tmp);
SendAdminMessage(COLOR_GREY,str);
SetTimerEx("TimerForJail",2500,1,"%d",id);
SendClientMessage(player,0xFFFFFFFF,"Используйте команду /time , чтобы узнать сколько вам времени сидеть в тюрьме");
return 1;
}
return 1;
}


if(sscanf(params, "dds[40]", id, kpztime, tmp)) return SendClientMessage(playerid,0xEAD513FF,"{EAD513}[Подсказка]: {FFFFFF}используй /jail [id] [время] [причина]");

Попробуй

$continue$
04.06.2016, 22:09
Бредо-код, какой то:


CMD:jail(playerid, params[])
{
new
targetid,
time,
reason[144];
/*if(PlayerInfo[playerid][pAdmin] < 3)
return (playerid, 0xcececeAA, "Маленький лвл админки!"); */
if(sscanf(params, "ddS(not_param)[144]", targetid, time, reason))
return SendClientMessage(playerid, 0xcececeAA, "Используйте: /jail [targetid] [time] {reason}");
if(jail[targetid] == true)
return SendClientMessage(playerid, 0xcececeAA, "Игрок уже в jail!");
if(!(1 <= time <= 300))
return SendClientMessage(playerid, 0xcececeAA, "Время может быть от 1 минуты до 300 минут!");
if(0 == IsPlayerConnected(targetid))
return SendClientMessage(playerid, 0xcececeAA, "Данного игрока нет на сервере!");
static msg[] = "Администратор %s посадил игрока %s в jail на %d минут";
new fmt_msg[(sizeof(msg) - 6) + MAX_PLAYER_NAME * 2 + sizeof(reason)];
if(0 == strcmp(reason, "not_param"))
{
format(fmt_msg, sizeof(fmt_msg), msg, p_name[playerid], p_name[targetid], time);
SendClientMessageToAll(0xff5030AA, fmt_msg);
}
else
{
strcat(fmt_msg, msg);
strcat(fmt_msg, ". Причина: %s");
format(fmt_msg, sizeof(fmt_msg), fmt_msg, p_name[playerid], p_name[targetid], time, reason);
SendClientMessageToAll(0xff5030AA, fmt_msg);
}
jail[targetid] = true;
jail_minutes[targetid] = time;
return 1;
}

Ума хватит, что бы запустить таймер на отнимание времени?

Desulaid
04.06.2016, 22:52
Бредо-код, какой то:


CMD:jail(playerid, params[])
{
new
targetid,
time,
reason[144];
/*if(PlayerInfo[playerid][pAdmin] < 3)
return (playerid, 0xcececeAA, "Маленький лвл админки!"); */
if(sscanf(params, "ddS(not_param)[144]", targetid, time, reason))
return SendClientMessage(playerid, 0xcececeAA, "Используйте: /jail [targetid] [time] {reason}");
if(jail[targetid] == true)
return SendClientMessage(playerid, 0xcececeAA, "Игрок уже в jail!");
if(!(1 <= time <= 300))
return SendClientMessage(playerid, 0xcececeAA, "Время может быть от 1 минуты до 300 минут!");
if(0 == IsPlayerConnected(targetid))
return SendClientMessage(playerid, 0xcececeAA, "Данного игрока нет на сервере!");
static msg[] = "Администратор %s посадил игрока %s в jail на %d минут";
new fmt_msg[(sizeof(msg) - 6) + MAX_PLAYER_NAME * 2 + sizeof(reason)];
if(0 == strcmp(reason, "not_param"))
{
format(fmt_msg, sizeof(fmt_msg), msg, p_name[playerid], p_name[targetid], time);
SendClientMessageToAll(0xff5030AA, fmt_msg);
}
else
{
strcat(fmt_msg, msg);
strcat(fmt_msg, ". Причина: %s");
format(fmt_msg, sizeof(fmt_msg), fmt_msg, p_name[playerid], p_name[targetid], time, reason);
SendClientMessageToAll(0xff5030AA, fmt_msg);
}
jail[targetid] = true;
jail_minutes[targetid] = time;
return 1;
}

Ума хватит, что бы запустить таймер на отнимание времени?

Массив стоит посчитать. В нем явно не 144 символа будут. Исходя из вашего предпочтения к заполнения полной строки, в необходимости расчета строки, которая расчитана не качественно, нет. Всю команду можно написать куда проще.



if(jail[targetid] == true)
return SendClientMessage(playerid, 0xcececeAA, "Игрок уже в jail!");

Рофлю с фразы "Игрок уже в jail!". Мы на русском общаемся, почему нельзя написать "Игрок уже в тюрьме". Считай, помог перевести слово "jail" на русский, можешь не благодарить :)



В таймере я правда не уверен. Как и в том, что скомпилируется без ошибок.


new player_in_jail[MAX_PLAYERS char] = {-1, ...};
new timer_jail;

public OnGameModeInit()
{
// ваш код
timer_jail= SetTimer("OnPlayerJailed", 1_000, true);
return 1;
};

public OnGameModeExit()
{
// ваш код
KillTimer(timer_jail);
return 1;
};

CMD:jail(playerid, params[])
{
new targetid, time;
if (sscanf(params, "uds[67]", targetid, time, params))
return SendClientMessage(playerid, -1, "Введите [игрок] [время] [причина]");
if (player_in_jail{targetid} > -1)
return SendClientMessage(playerid, -1, "Игрок уже в тюрьме.");
if (IsPlayerConnected(targetid) == 0)
return SendClientMessage(playerid, -1, "Игрок не в сети.");
if (!(60 <= time <= 1_800))
return SendClientMessage(playerid, -1, "Время указано ошибочно.");
new str[145];
GetPlayerName(targetid, str, MAX_PLAYER_NAME);
format(str, sizeof(str), "Игрок %s было посажен в тюрьму на %d секунд. Причина: %s", str, time, params);
SendClientMessageToAll(-1, str);
player_in_jail{targetid} = time;
/* телепортируем игрока в тюрьму */
return 1;
}

forward OnPlayerJailed();
public OnPlayerJailed()
{
foreach (new i:player)
{
if (player_in_jail{i} > 0)
player_in_jail{i} --;
if (0 <= player_in_jail{i} <= -1) // чтоб наверняка :D
{
player_in_jail{i} = -1;
SpawnPlayer(i);
break;
}
}
}

$continue$
04.06.2016, 23:20
Круто. Я же сказал, что бредо-код.

De_Lay
04.06.2016, 23:34
Объясните как это правильно использовать и какое преимущество.

new player_in_jail[MAX_PLAYERS char] = {-1, ...}; {-1, ...}

$continue$
04.06.2016, 23:35
Обнуление массива.

De_Lay
05.06.2016, 02:28
Обнуление массива.
Информативненько как-то вышло! :mosking:

pawno_Lyubitel
05.06.2016, 03:43
Я НОВИЧОК, только учусь скриптить, только УЧУСЬ, когда просил помощи, меня послали в Поиск, вот я и написал команду исходя из того, что нашел в этом поиске, все остальные недочеты , я бы исправил после того, как довел бы команду до работоспособности, пересчитал бы размерность и т.д

De_Lay
05.06.2016, 04:24
Почему именно глобальный таймер, а не индивидуальный? А если глобальный то, может будет лучше запускать его когда игрок
попадает в КПЗ и удалять его после того как с КПЗ выйдет последний игрок, или нет?

А еще если в место переменной player_in_jail использовать PVar + UNIX время будет лучше или нет?

timer_jail= SetTimer("OnPlayerJailed", 1_000, true);

forward OnPlayerJailed();
public OnPlayerJailed()
{
foreach (new i:player)
{
if (player_in_jail{i} > 0)
player_in_jail{i} --;
if (0 <= player_in_jail{i} <= -1) // чтоб наверняка :D
{
player_in_jail{i} = -1;
SpawnPlayer(i);
break;
}
}
}

И вот, это если не трудно объясните.

if (0 <= player_in_jail{i} <= -1)

if (это если player_in_jail меньше 0 <= player_in_jail{i} <= если в player_in_jail значение меньше -1)
Почему стоит проверка на два условия?

pawno_Lyubitel
05.06.2016, 19:39
Проблема решена, надо было всего лишь обновить sscanf до 2.8.2 версии.