PDA

Просмотр полной версии : [Вопрос] Перевод мода на dc_cmd



Ne_nub
05.08.2016, 04:25
Всем привет, вобщем, захотел я перевести свой мод на новый командный процессор dc_cmd, бросив стандартный "гиблый". Что можете посоветовать по переводу. Просто недавно начал изучать dc_cmd, как переводить команды, а мне нужно куда эти команды на dc_cmd писать ( в какой паблик ), последнюю версию dc_cmd, и что вместе с этим надо переводить или ничего не надо?

BadPawn
05.08.2016, 05:11
Не в паблик. В конец мода вписывай.



#include <a_samp>
#include <dc_cmd>

public OnGameModeInit()
{
return 1;
}

public OnGameModeExit()
{
return 1;
}

public OnPlayerConnect(playerid)
{
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
return 1;
}

//паблики

CMD:test(playerid)
{
print("DC_CMD работает.");
return 1;
}

gangzone.ini
05.08.2016, 05:53
http://pro-pawn.ru/showthread.php?1028-DC_CMD-v2-8-%2823-03-14%29

Ne_nub
05.08.2016, 17:58
А вот еще вопрос, как научится переводить команды со стандартного процессора на DC_CMD ? Перевести так, чтобы еще была оптимизация ( если это возможно )

vovandolg
05.08.2016, 18:42
использовать sscanf вместе с такими cmd и будет тебе оптимизация)

Ne_nub
05.08.2016, 19:01
использовать sscanf вместе с такими cmd и будет тебе оптимизация)

Можно тогда на примере моей команды ?


else if(strcmp(cmd, "/sethp", true) == 0)
{
tmp = strcharsplit(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE, "Введите: /sethp [id] [hp]");
if(anti[playerid] == 1) return SendClientMessage(playerid, COLOR_LIGHTRED, "[Анти-Наказание] Вы словили блок на наказание сроком 5 минут");
new playa = ReturnUser(tmp);
tmp = strcharsplit(cmdtext, idx);
new health = strval(tmp);
if (PlayerInfo[playerid][pAdmin] >= 10)
{
if(IsPlayerConnected(playa))
{
if(playa != INVALID_PLAYER_ID)
{
PlayerHealth[playa] = health;
antiwarn[playerid] += 8;
if(antiwarn[playerid] >= 30 && anti[playerid] == 0) anti[playerid] = 1, antiwarn[playerid] = 300;
specid = ReturnUser(tmp);
format(stringer,sizeof(stringer),"Анти-П**р: %s использовал /sethp на [ID'e: %d | HEALTH: %d]",PlayerInfo[playerid][pNames],specid,health),ABroadCast(COLOR_WHITE,stringer,1);
SetPlayerHealthAC(playa, health);
SendClientMessage(playerid, COLOR_WHITE, "Уровень HP игроку установлен!");
}
}
}
else { SendClientMessage(playerid, COLOR_GRAD1, "Вы не уполномочены использовать данную команду!"); }
return true;
}

VVWVV
05.08.2016, 19:10
Можно тогда на примере моей команды ?


else if(strcmp(cmd, "/sethp", true) == 0)
{
tmp = strcharsplit(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE, "Введите: /sethp [id] [hp]");
if(anti[playerid] == 1) return SendClientMessage(playerid, COLOR_LIGHTRED, "[Анти-Наказание] Вы словили блок на наказание сроком 5 минут");
new playa = ReturnUser(tmp);
tmp = strcharsplit(cmdtext, idx);
new health = strval(tmp);
if (PlayerInfo[playerid][pAdmin] >= 10)
{
if(IsPlayerConnected(playa))
{
if(playa != INVALID_PLAYER_ID)
{
PlayerHealth[playa] = health;
antiwarn[playerid] += 8;
if(antiwarn[playerid] >= 30 && anti[playerid] == 0) anti[playerid] = 1, antiwarn[playerid] = 300;
specid = ReturnUser(tmp);
format(stringer,sizeof(stringer),"Анти-П**р: %s использовал /sethp на [ID'e: %d | HEALTH: %d]",PlayerInfo[playerid][pNames],specid,health),ABroadCast(COLOR_WHITE,stringer,1);
SetPlayerHealthAC(playa, health);
SendClientMessage(playerid, COLOR_WHITE, "Уровень HP игроку установлен!");
}
}
}
else { SendClientMessage(playerid, COLOR_GRAD1, "Вы не уполномочены использовать данную команду!"); }
return true;
}



CMD:sethp(playerid, params[])
{
new targetid, health;
if (sscanf(params, !"dd", targetid, health))
return SendClientMessage(playerid, COLOR_WHITE,
!"Введите: /sethp [id] [hp]"
);
if(anti[playerid] == 1)
return SendClientMessage(playerid, COLOR_LIGHTRED,
!"[Анти-Наказание] Вы словили блок на наказание сроком 5 минут"
);
if (PlayerInfo[playerid][pAdmin] < 10)
return SendClientMessage(playerid, COLOR_GRAD1,
!"Вы не уполномочены использовать данную команду!"
);
PlayerHealth[targetid] = health;
antiwarn[playerid] += 8;
if(antiwarn[playerid] >= 30 && anti[playerid] == 0)
{
anti[playerid] = 1;
antiwarn[playerid] = 300;
}
format(stringer,sizeof(stringer),
"Анти-П**р: %s использовал /sethp на [ID'e: %d | HEALTH: %d]",
PlayerInfo[playerid][pNames], specid, health
);
ABroadCast(COLOR_WHITE,stringer,1);
SetPlayerHealthAC(targetid, health);
SendClientMessage(playerid, COLOR_WHITE, !"Уровень HP игроку установлен!");
return 1;
}

vovandolg
06.08.2016, 00:59
Меня смущает эта рлсовская проверка))


antiwarn[playerid] += 8;
if(antiwarn[playerid] >= 30 && anti[playerid] == 0)
{
anti[playerid] = 1;
antiwarn[playerid] = 300;
}
Когда можно всего лишь 1 переменную использовать))

Ne_nub
06.08.2016, 12:52
А вот есть какой-нибудь урок по переводу команд, в котором всё объяснено ?

Desulaid
06.08.2016, 13:05
Да нет ничего сложного в написании или переводе команд на dc_cmd. Мне в освоении подобных командных процессоров помогло осознание того, что все что мы вводим в команде (кроме ее названия) уходим в массив params[], а дальше мы просто начинаем работать с этим массивом. Обычно в работе используем sscanf. Дальше, тебе остается только научиться работать с sscanf.

Ne_nub
06.08.2016, 13:09
CMD:sethp(playerid, params[])
{
new targetid, health;
if (sscanf(params, !"dd", targetid, health))
return SendClientMessage(playerid, COLOR_WHITE,
!"Введите: /sethp [id] [hp]"
);
if(anti[playerid] == 1)
return SendClientMessage(playerid, COLOR_LIGHTRED,
!"[Анти-Наказание] Вы словили блок на наказание сроком 5 минут"
);
if (PlayerInfo[playerid][pAdmin] < 10)
return SendClientMessage(playerid, COLOR_GRAD1,
!"Вы не уполномочены использовать данную команду!"
);
PlayerHealth[targetid] = health;
antiwarn[playerid] += 8;
if(antiwarn[playerid] >= 30 && anti[playerid] == 0)
{
anti[playerid] = 1;
antiwarn[playerid] = 300;
}
format(stringer,sizeof(stringer),
"Анти-П**р: %s использовал /sethp на [ID'e: %d | HEALTH: %d]",
PlayerInfo[playerid][pNames], specid, health
);
ABroadCast(COLOR_WHITE,stringer,1);
SetPlayerHealthAC(targetid, health);
SendClientMessage(playerid, COLOR_WHITE, !"Уровень HP игроку установлен!");
return 1;
}


Команда не работает, пишу /sethp 0 50, а он свое "/sethp [id] [hp]

VVWVV
06.08.2016, 13:40
Команда не работает, пишу /sethp 0 50, а он свое "/sethp [id] [hp]

Исправьте проверку:


if (sscanf(params, "dd", targetid, health))
return SendClientMessage(playerid, COLOR_WHITE,
!"Введите: /sethp [id] [hp]"
);

Ne_nub
06.08.2016, 13:56
И можно как-нибудь чтобы прописав например 2 команды, была одна. Вот пример:


CMD:test(playerid, params[])


CMD:info(playerid, params[])

Но только как-бы их соединить в одно целое.

VVWVV
06.08.2016, 15:14
И можно как-нибудь чтобы прописав например 2 команды, была одна. Вот пример:


CMD:test(playerid, params[])


CMD:info(playerid, params[])

Но только как-бы их соединить в одно целое.

Читайте документацию (http://pro-pawn.ru/showthread.php?1028-DC_CMD-v2-8-(23-03-14)) по плагину.

StevenH
06.08.2016, 15:31
И можно как-нибудь чтобы прописав например 2 команды, была одна. Вот пример:


CMD:test(playerid, params[])


CMD:info(playerid, params[])

Но только как-бы их соединить в одно целое.



CMD:test(playerid) return SendClientMessage(playerid, -1, "Работает");
ALTX:test("/info");

Если ввести /info, выведет текст "Работает", так же и с командой /test

Ne_nub
06.08.2016, 15:46
Еще есть вопросик, вот например у меня есть case. Выбираешь пункт, и должна прописаться команда, в стандартном процессоре она
OnPlayerCommandText(playerid,"/info");

А вот на DC_CMD как тоже самое сделать, при выборе пункта, прописывалась команда автоматом ?

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


Исправьте проверку:


if (sscanf(params, "dd", targetid, health))
return SendClientMessage(playerid, COLOR_WHITE,
!"Введите: /sethp [id] [hp]"
);


И команда, которую Вы сделали, опять-же не работает. Сделал все как надо, но пишет тоже самое: /sethp [id] [hp]

$continue$
06.08.2016, 15:51
Почитайте:



В версии 2.02 был добавлен макрос "cmd::", благодаря которому можно удобно вызывать команды из любого места в моде.
Пример использования:

// без параметров
cmd::help(playerid, "");

// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d", targetid);
cmd::invite(playerid, param_str);



Убрал Ваши проверки из команды и проверил на new.pwn - работает. Логируйте места, где проверка "фелится".


CMD:sethp(playerid, params[])
{
new targetid, health;
if (sscanf(params, !"dd", targetid, health))
return SendClientMessage(playerid, -1,
!"Введите: /sethp [id] [hp]"
);
SetPlayerHealth(targetid, health);
SendClientMessage(playerid, -1, !"Уровень HP игроку установлен!");
return 1;
}



И команда, которую Вы сделали, опять-же не работает. Сделал все как надо, но пишет тоже самое: /sethp [id] [hp]

Ne_nub
06.08.2016, 16:22
А что насчет
OnPlayerCommandText(playerid,"/info"); как это использовать в DC_CMD ?

vovandolg
06.08.2016, 17:07
А что насчет
OnPlayerCommandText(playerid,"/info"); как это использовать в DC_CMD ?
Функционал плагина: п.3 читай) (http://pro-pawn.ru/showthread.php?1028-DC_CMD-v2-8-(23-03-14))

Ne_nub
06.08.2016, 17:56
А с небольшими командами тоже sscanf использовать ? Например я вот перевел команду:


CMD:donate(playerid, params[])
{
new str[256],sctring[700];
format(str,sizeof(str),"{FFFFFF}На вашем счетe: {FAAC58}%d монет\n",PlayerInfo[playerid][pDonatemoney2]);
strcat(sctring,str);
format(str,sizeof(str),"\n\n{00FF00}Введите номер желаемого действия ниже и нажмите {00FF00}'Далее'\n\n");
strcat(sctring,str);
format(str,sizeof(str),"{FFFFFF}\t1. Пополнить счет\n\t2. Donate услуги для вашего персонажа\n\t3. Donate услуги для вашего дома\n\t4. Сменить игровой ник\n\t5. Другие услуги\n");
strcat(sctring,str);
ShowPlayerDialog(playerid,5555,DIALOG_STYLE_INPUT,"{BE2D2D}Silver RolePlay {00FF00}Donate",sctring,"Далее","Выйти");
return true;
}

vovandolg
06.08.2016, 18:19
CMD:donate(playerid, params[])
В подобных командах это можно убирать чтобы глаза не мазолило

Ne_nub
06.08.2016, 18:29
Хорошо, допустим, я разобрался с маленькими командами, а что насчет огромных ? Например: /makeadmin, /goto, /makeleader и другие. Там же куча функций.


else if(strcmp(cmd, "/makeadmin", true) == 0)
{
tmp = strcharsplit(cmdtext, idx);
new para1 = ReturnUser(tmp);
tmp = strcharsplit(cmdtext, idx);
new level = strval(tmp);
if(level > 13 || level < 0) return SendClientMessage(playerid, COLOR_GREY, "Нельзя меньше установить 1 или больше 13!");
if(!strlen(tmp)) return SendClientMessage(playerid,COLOR_WHITE,"Введите: /makeadmin [id] [lvl]");
if(Sergeo || Aleksey)
{
if(PlayerInfo[playerid][pAdmin] == 13)
tmp = strcharsplit(cmdtext, idx);
{
if(IsPlayerConnected(para1))
{
if(para1 != INVALID_PLAYER_ID)
{
PlayerInfo[para1][pAdmin] = level;
if(PlayerInfo[para1][pAdmin] != 0)
{
if(PlayerInfo[para1][pDostup] == 0 || PlayerInfo[para1][pDostup] == 2038) PlayerInfo[para1][pDostup] = 124+random(8999);
}
else PlayerInfo[para1][pDostup] = 0;
SendMes(para1, 0x6495EDFF, "Администратор %s повысил/понизил вас до %d уровня администрирования",PlayerInfo[playerid][pNames], level);
SendMes(para1, COLOR_WHITE, "Ваш пароль от входа в Административную панель >> {FAAC58}%d{FFFFFF} <<", PlayerInfo[para1][pDostup]);
SendMes(playerid, 0x6495EDFF, "Вы повысили/понизили %s до %d уровня администрирования. Его админ пароль: %d", PlayerInfo[para1][pNames],level);
getdate(year, month, day);
gettime(hour,minuite,second);
FixHour(hour);
hour = shifthour;
new data2[64];
format(data2, 16, "%d-%d-%d %d:%d",day,month,year,hour,minuite);
format(stringer, sizeof(stringer), "INSERT INTO `logs_makeadmin` (`Text`, `Date`) VALUES ('%s выдал админку %s %d уровня','%s')",PlayerInfo[playerid][pNames],PlayerInfo[giveplayerid][pNames],level, data2);
mysql_function_query(connects, stringer, false, "","");
}
}
}
}
return true;
}

vovandolg
06.08.2016, 23:10
изучи как применять sscanf во всех случаях и не парься с этой темой))
а если выше не под силу, то бери любые моды на таких процессорах + sscanf, и бери оттуда примеры

Ne_nub
07.08.2016, 08:49
Есть какая-нибудь тема, а то так гуглить ?)