PDA

Просмотр полной версии : [Вопрос] Как правильно перевести с обычного cmd на DC_CMD



Alexander
27.07.2015, 05:38
Доброго времени суток, меня интересует вопрос как правильно перевести с обычного cmd на DC_CMD, можно пример на этой команде и объяснить как это делать грубо говоря на пальцах.

if(!strcmp(cmdtext, "/referee", true))
{
if(IsPlayerConnected(playerid))
{
if(pData[playerid][pAdmin] < 1)
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не админ сервера!");
return 1;
}
new giveplayerid = strval(tmp);
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_WHITE, "Подсказка: /referee [playerid/PartOfName]");
return 1;
}
new para1,string[256];
para1 = ReturnUser(tmp);
tmp = strtok(cmdtext, idx);
if(IsPlayerConnected(para1))
{
if(para1 != INVALID_PLAYER_ID)
{
new sendername[32];
//GetPlayerName(para1, giveplayerid, sizeof(giveplayerid));
GetPlayerName(playerid, sendername, sizeof(sendername));
arbitro[para1] = 1;
printf("%s chooses %s as referee.", sendername, giveplayerid);
format(string, sizeof(string), "%s выбрал вас в качестве рефери", sendername);
SendClientMessage(para1, COLOR_WHITE, string);
format(string, sizeof(string), "Вы выбрыли %s как рефери.", giveplayerid);
SendClientMessage(playerid, COLOR_WHITE, string);
format(string, sizeof(string), "%s рефери следующего матча! На стадион!", giveplayerid);
SendClientMessageToAll(COLOR_GREEN, string);
skin[para1] = GetPlayerSkin(para1);
SetPlayerSkin(para1, 72);
}
}
}
return 1;
}

Glant
27.07.2015, 10:06
Ничего сложного то и нету





CMD:referee(playerid, params[])
{
if(IsPlayerConnected(playerid))
{
if(pData[playerid][pAdmin] < 1) return SendClientMessage(playerid, COLOR_WHITE, "Вы не админ сервера!");

if(sscanf(params, "u", params[0])) return SendClientMessage(playerid, COLOR_WHITE, "Подсказка: /referee [playerid/PartOfName]");

if(IsPlayerConnected(params[0]))
{
// if(params[0] != INVALID_PLAYER_ID) Если игрок подключен, то ID не может быть равно INVALID_PLAYER_ID

GetPlayerName(params[0], giveplayerid, sizeof(giveplayerid))
GetPlayerName(playerid, sendername, sizeof(sendername));
arbitro[params[0]] = 1;
printf("%s chooses %s as referee.", sendername, giveplayerid);
format(string, sizeof(string), "%s выбрал вас в качестве рефери", sendername);
SendClientMessage(params[0], COLOR_WHITE, string);
format(string, sizeof(string), "Вы выбрали %s как рефери.", giveplayerid);
SendClientMessage(playerid, COLOR_WHITE, string);
format(string, sizeof(string), "%s рефери следующего матча! На стадион!", giveplayerid);
SendClientMessageToAll(COLOR_GREEN, string);
skin[params[0]] = GetPlayerSkin(params[0]);
SetPlayerSkin(params[0], 72);
}
}

return 1;
}


Если тревожит sscanf, то скачайте плагин с инклудом http://forum.sa-mp.com/showthread.php?t=570927
и подключите инклуд в начало мода

#include <sscanf2>

Desulaid
27.07.2015, 11:17
Чтобы перевести, надо хотя бы писать команды на этом процессоре.

Alexander
27.07.2015, 14:52
Ничего сложного то и нету





CMD:referee(playerid, params[])
{
if(IsPlayerConnected(playerid))
{
if(pData[playerid][pAdmin] < 1) return SendClientMessage(playerid, COLOR_WHITE, "Вы не админ сервера!");

if(sscanf(params, "u", params[0])) return SendClientMessage(playerid, COLOR_WHITE, "Подсказка: /referee [playerid/PartOfName]");

if(IsPlayerConnected(params[0]))
{
// if(params[0] != INVALID_PLAYER_ID) Если игрок подключен, то ID не может быть равно INVALID_PLAYER_ID

GetPlayerName(params[0], giveplayerid, sizeof(giveplayerid))
GetPlayerName(playerid, sendername, sizeof(sendername));
arbitro[params[0]] = 1;
printf("%s chooses %s as referee.", sendername, giveplayerid);
format(string, sizeof(string), "%s выбрал вас в качестве рефери", sendername);
SendClientMessage(params[0], COLOR_WHITE, string);
format(string, sizeof(string), "Вы выбрали %s как рефери.", giveplayerid);
SendClientMessage(playerid, COLOR_WHITE, string);
format(string, sizeof(string), "%s рефери следующего матча! На стадион!", giveplayerid);
SendClientMessageToAll(COLOR_GREEN, string);
skin[params[0]] = GetPlayerSkin(params[0]);
SetPlayerSkin(params[0], 72);
}
}

return 1;
}


Если тревожит sscanf, то скачайте плагин с инклудом http://forum.sa-mp.com/showthread.php?t=570927
и подключите инклуд в начало мода

#include <sscanf2>

Спасибо, а можно ваш скайп есть пару вопросов еще

Sp1ke
27.07.2015, 15:42
Зачем использовать эту проверку?

if(IsPlayerConnected(playerid))
Если бы игрок не был подключен, он бы не мог использовать команду...

Alexander
27.07.2015, 16:05
а как быть с вот этим?

CMD:veh(playerid, params[])
{
if(pData[playerid][pAdmin] < 5) return 1;
//if(sscanf(params, "u", params[0])) return SendClientMessage(playerid,CRED,"{"#cYELLOW"}• [Подсказка]: {"#cWHITE"}/veh [id авто] [цвет 1] [цвет 2]");
if(sscanf(params, "s[16]dd", params, color1, color2))
return SendClientMessage(playerid, -1, "{"#cYELLOW"}• [Подсказка]: {"#cWHITE"}/veh [id авто] [цвет 1] [цвет 2]");
new c1,c2,vehmod;
vehmod = strval(tmp);
tmp = strtok(cmdtext, idx);
if(strlen(tmp)) c1 = strval(tmp);
else c1 = random(128);
tmp = strtok(cmdtext, idx);
if(strlen(tmp)) c2 = strval(tmp);
else c2 = random(128);
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid,x,y,z);
x += 1.5;
new vehid = CreateVehicle(vehmod,x,y,z,0.0,c1,c2,-1);
LinkVehicleToInterior(vehid,GetPlayerInterior(playerid));
SFCM(playerid,CWHITE,"Автомобиль %d создан",vehid);
gVehicles[vehid-1][vX] = x;
gVehicles[vehid-1][vY] = y;
gVehicles[vehid-1][vZ] = z;
gVehicles[vehid-1][vDrived] = 0;
gVehicles[vehid-1][vFuel] = gTransport[vehmod-400][trTank];
gVehicles[vehid-1][vHealth] = 1000.0;
gVehicles[vehid-1][vOwnerid] = INVALID_PLAYER_ID;
gVehicles[vehid-1][vLock] = 0;
return 1;
}

Sp1ke
27.07.2015, 16:44
а как быть с вот этим?

CMD:veh(playerid, params[])
{
if(pData[playerid][pAdmin] < 5) return 1;
//if(sscanf(params, "u", params[0])) return SendClientMessage(playerid,CRED,"{"#cYELLOW"}• [Подсказка]: {"#cWHITE"}/veh [id авто] [цвет 1] [цвет 2]");
if(sscanf(params, "s[16]dd", params, color1, color2))
return SendClientMessage(playerid, -1, "{"#cYELLOW"}• [Подсказка]: {"#cWHITE"}/veh [id авто] [цвет 1] [цвет 2]");
new c1,c2,vehmod;
vehmod = strval(tmp);
tmp = strtok(cmdtext, idx);
if(strlen(tmp)) c1 = strval(tmp);
else c1 = random(128);
tmp = strtok(cmdtext, idx);
if(strlen(tmp)) c2 = strval(tmp);
else c2 = random(128);
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid,x,y,z);
x += 1.5;
new vehid = CreateVehicle(vehmod,x,y,z,0.0,c1,c2,-1);
LinkVehicleToInterior(vehid,GetPlayerInterior(playerid));
SFCM(playerid,CWHITE,"Автомобиль %d создан",vehid);
gVehicles[vehid-1][vX] = x;
gVehicles[vehid-1][vY] = y;
gVehicles[vehid-1][vZ] = z;
gVehicles[vehid-1][vDrived] = 0;
gVehicles[vehid-1][vFuel] = gTransport[vehmod-400][trTank];
gVehicles[vehid-1][vHealth] = 1000.0;
gVehicles[vehid-1][vOwnerid] = INVALID_PLAYER_ID;
gVehicles[vehid-1][vLock] = 0;
return 1;
}

Если я правильно понял, то проблема со sscanf? ID авто, цвет 1, цвет 2 = 3 числовых.

if(sscanf(params,"iii",params[0],params[1],params[2])) return SCM(playerid, COLOR_WHITE, "/veh [carid] [color 1] [color 2]");

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

UPD: советую к прочтению, http://forum.sa-mp.com/showthread.php?t=570927

Alexander
27.07.2015, 16:47
Нет меня интересует что делать вместо
vehmod = strval(tmp);

Sp1ke
27.07.2015, 16:57
Давай тогда вместе напишем новую команду, и разберем ее.

CMD:veh(playerid, params[]) // объявили команду
{
if(pData[playerid][pAdmin] < 5) return SendClientMessage(playerid, -1, "Команда вам недоступна!"); // Проверка на админку
if(sscanf(params,"iii",params[0],params[1],params[2])) return SCM(playerid, COLOR_WHITE, "/veh [carid] [color 1] [color 2]"); // ID авто, цвет 1, цвет 2 = 3 числовых = iii.
if(params[0] < 400 || params[0] > 611) return SCM(playerid, COLOR_WHITE, "Номер авто не может быть меньше 400 и больше 611"); // Ставим проверку, чтобы избежать краша
if(params[1] < 0 || params[1] > 255) return SCM(playerid, COLOR_WHITE, "Номер цвета 1 не может быть меньше 0 и больше 255"); // так же
if(params[2] < 0 || params[2] > 255) return SCM(playerid, COLOR_WHITE, "Номер цвета 2 не может быть меньше 0 и больше 255"); // проверка, не крашимся :)
new Float:Pos[4]; // объявим переменную, в которую запишем координаты игрока [4]
GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]); // запишем координаты игрока
new carid = CreateVehicle(params[0],Pos[0],Pos[1],Pos[2],Pos[3],params[1],params[2],600000); // создаем авто на этих координатах
SetVehicleToRespawn(carid); // респавним его
PutPlayerInVehicle(playerid, carid, 0); // сажаем игрока в авто
SCM(playerid, -1, "Авто создано, бла бла бла"); // выводим текст
return true;
}

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

SCM - дефайн.

#define SCM SendClientMessage

Alexander
27.07.2015, 17:10
Спасибо конечно но меня больше интересует как заменять
strval(tmp);

Sp1ke
27.07.2015, 17:14
Спасибо конечно но меня больше интересует как заменять
strval(tmp);

https://wiki.sa-mp.com/wiki/Strval

Desulaid
27.07.2015, 18:48
Спасибо конечно но меня больше интересует как заменять
strval(tmp);


Вот по strval (http://wiki.sa-mp.com/wiki/%D0%94%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3%D0%B0#strval) и и еще немного (http://wiki.sa-mp.com/wiki/Strval)

Вот еще к прочтению по strtok (http://wiki.sa-mp.com/wiki/%D0%94%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3%D0%B0#strtok) и и вот (http://wiki.sa-mp.com/wiki/Strtok)

Немного доперевел команду.


COMMAND:referee(playerid, params[])
{
if(pData[playerid][pAdmin] < 1)
return SendClientMessage(playerid, COLOR_WHITE, "Вы не админ сервера!");

if(sscanf(params, "u", params[0]))
return SendClientMessage(playerid, COLOR_WHITE, "Подсказка: /referee [playerid/PartOfName]");

// Вроде бы так :D
if(ReturnUser(params[0]) == INVALID_PLAYER_ID) return 1;

new
// Ник игрокаможет быть до 24 ячеек.
// 20 по сам ник,
// остальное под тег
// a_samp.inc
sendername[MAX_PLAYER_NAME],
// Не надо ставить "стадартный" размер массива.
// Почитайте о массивах
string[29+MAX_PLAYER_NAME+23+4+37+4+1]
;

arbitro[params[0]] = 1;

format(string, sizeof(string), "%s выбрал вас в качестве рефери", sendername);
SendClientMessage(params[0], COLOR_WHITE, string);
format(string, sizeof(string), "Вы выбрыли %s как рефери.", giveplayerid);
SendClientMessage(playerid, COLOR_WHITE, string);
format(string, sizeof(string), "%s рефери следующего матча! На стадион!", giveplayerid);
SendClientMessageToAll(COLOR_GREEN, string);

// Если надо сохранить старый скин,
// то конечно это нужно.
// Но если вам надо сохранить скин до выхода
// Его можно засунуть в PVar =)

// SetPVarInt(params[0], "old_skin", GetPlayerSkin(params[0]));

skin[params[0]] = GetPlayerSkin(params[0]);
SetPlayerSkin(params[0], 72);
return 1
}

$continue$
27.07.2015, 18:55
Немного доперевел команду.


if(ReturnUser(params[0]) == INVALID_PLAYER_ID) return 1;

А это что?

Desulaid
27.07.2015, 18:57
А это что?


// если что :)
#include "utils"

От оригинальной команды было



...

para1 = ReturnUser(tmp);
..
{
if(para1 != INVALID_PLAYER_ID)
{
...
}
}

$continue$
27.07.2015, 18:59
// если что :)
#include "utils"

От оригинальной команды было



...

para1 = ReturnUser(tmp);
..
{
if(para1 != INVALID_PLAYER_ID)
{
...
}
}


И зачем оно?

Desulaid
27.07.2015, 19:00
И зачем оно?

Ты меня спрашиваешь? Я, если что, то без понятия. Поэтому решил оставить :D

$continue$
27.07.2015, 19:02
Ты меня спрашиваешь? Я, если что, то без понятия. Поэтому решил оставить :D

На сколько я помню это поиск игрока по нику. Но, зачем оно тут?