PDA

Просмотр полной версии : [Мануал] Пистолет-электрошок



iMaddy
03.05.2014, 23:35
Ко всем new

new PistolTazer[MAX_PLAYERS];

Ко всем командам

Вариант: обычная команда

else if(strcmp(cmd,"/pistoltazer",true)==0)
{
/* AcceptWrite(playerid) - проверка на то, что игрок авторизован. Использует любую удобную вам проверку
pData[playerid][Member]: pData[playerid] - общая "структурка" параметров персонажей, выгружаемых и сохраняемых при входе/выходе; [Member] - параметр ида организации игрока, в нашем случае - Полиция
PistolTazer[playerid] - параметр, инициализированный нами в самом начале мода, отвечает за включение/выключение пистолета тазера
Все остальное - стандартные скриптовые функции */

new weap,ammo;
if(!AcceptWrite(playerid))
return 1; // проверка: авторизован или нет

if(pData[playerid][Member] != 1)
return SendClientMessage(playerid,-1,"Ошибка: вы не полицейский!");

GetPlayerWeaponData(playerid,2,weap,ammo);

if(weap != 24)
return SendClientMessage(playerid,-1,"Ошибка: у вас нет пистолета!");

if(PistolTazer[playerid])
{
PistolTazer[playerid] = 0;
return SendClientMessage(playerid,-1,"Пистолет-электрошок отключен");
}
else
{
PistolTazer[playerid] = 1;
return SendClientMessage(playerid,-1,"Пистолет-электрошок включен. Аккуратно наведите на цель и выстрелите в нее");
}
return 1;
}
Вариант: ZCMD


CMD:pistoltazer(playerid)
{
/* пометки для нубов:
AcceptWrite(playerid) - проверка на то, что игрок авторизован. Использует любую удобную вам проверку
pData[playerid][Member]: pData[playerid] - общая "структурка" параметров персонажей, выгружаемых и сохраняемых при входе/выходе; [Member] - параметр ида организации игрока, в нашем случае - Полиция
PistolTazer[playerid] - параметр, инициализированный нами в самом начале мода, отвечает за включение/выключение пистолета тазера
Все остальное - стандартные скриптовые функции */

new weap,ammo;
if(!AcceptWrite(playerid))
return 1; // проверка: авторизован или нет

if(pData[playerid][Member] != 1)
return SendClientMessage(playerid,-1,"Ошибка: вы не полицейский!");

GetPlayerWeaponData(playerid,2,weap,ammo);

if(weap != 24)
return SendClientMessage(playerid,-1,"Ошибка: у вас нет пистолета!");

if(PistolTazer[playerid])
{
PistolTazer[playerid] = 0;
return SendClientMessage(playerid,-1,"Пистолет-электрошок отключен");
}
else
{
PistolTazer[playerid] = 1;
return SendClientMessage(playerid,-1,"Пистолет-электрошок включен. Аккуратно наведите на цель и выстрелите в нее");
}

}

}

Ко всем stock

stock BulletTazer(playerid,suspectid)
{
// что ж, реализуем стандартными функциями
new string[128], name1[MAX_PLAYER_NAME], name2[MAX_PLAYER_NAME];
GetPlayerName(playerid, name1, sizeof(name1));
GetPlayerName(suspectid, name2, sizeof(name2));

// format(string, sizeof(string), "%s попал из пистолета-электрошока в %s ", getName(suspectid) ,getName(playerid));
format(string, sizeof(string), "%s попал из пистолета-электрошока в %s ", name2 ,name1);

/* COLOR_PURPLE - константное значение пурпурного/розового цвета в шестнадцатиричном формате. Говоря проше это
#define COLOR_PURPLE 0xC2A2DAAA . */

/* ProxDetector - думаю у всех есть эта функция, служит для каких-либо действий, например, /me. Но если нет, она //будет ниже */
ProxDetector(30.0, suspectid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
SetPlayerSpecialAction(suspectid,SPECIAL_ACTION_HANDSUP);

/* DIALOGINFO - константное значение не нужного мне ID'а диалога. Можете просто вставить свой ид, скажем, 1488 */
ShowPlayerDialog(suspectid,DIALOGINFO,0," ","{FF0000}Вас обезвредили электрошокером!","Закрыть","");
return 0;
}

В OnPlayerWeaponShot

if(hittype == 1 && weaponid == 24 && PistolTazer[playerid] == 1)
return BulletTazer(playerid,hitid);

В OnPlayerConnect

PistolTazer[playerid] = 0;



forward ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5);
public ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5)
{
if(IsPlayerConnected(playerid))
{
new Float:posx, Float:posy, Float:posz;
new Float:oldposx, Float:oldposy, Float:oldposz;
new Float:tempposx, Float:tempposy, Float:tempposz;
GetPlayerPos(playerid, oldposx, oldposy, oldposz);
//radi = 2.0; //Trigger Radius
foreach(new i : Player)
{
if(IsPlayerConnected(i))
{
if(IsPlayerConnected(i))
{
if(GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(i))
{
GetPlayerPos(i, posx, posy, posz);
tempposx = (oldposx -posx);
tempposy = (oldposy -posy);
tempposz = (oldposz -posz);
//printf("DEBUG: X:%f Y:%f Z:%f",posx,posy,posz);
if (((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16)))
{
SendClientMessage(i, col1, string);
}
else if (((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8)))
{
SendClientMessage(i, col2, string);
}
else if (((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4)))
{
SendClientMessage(i, col3, string);
}
else if (((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2)))
{
SendClientMessage(i, col4, string);
}
else if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
{
SendClientMessage(i, col5, string);
}
}
}
else
{
SendClientMessage(i, col1, string);
}
}
}
}//not connected
return true;
}[/code]
Ну вот и все. Суть мануала: при активации копом пистолета-электрошока он может выстрелить в нарушителя и обезвредить его. Повреждений игроку не будет наноситься, т.к. в OnPlayerWeaponShot мы возвращаем 0. Думаю будет полезно для серверов с режимом РП. Код написан за 2 минуты, работоспособность не проверял, но должно работать работоспособность проверена

Автор: iMaddy(Alexandr Bochkarev)

DeimoS
04.05.2014, 07:11
Код написан за 2 минуты, работоспособность не проверял, но должно работать

Судя по различным функциям, типа getName, код писался явно не сейчас. Можно было и убрать все макросы и заменить свои функции на обычный код.
Да и вообще, по поводу

Код пишу под свой мод, так что вам придется переделывать под себя
Читаем (http://pro-pawn.ru/showthread.php?8356-%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B0-%D0%9C%D0%B0%D0%BD%D1%83%D0%B0%D0%BB%D1%8B)

Seregamil
04.05.2014, 12:51
CMD:pistoltazer(playerid)
{
new weap;
if(!AcceptWrite(playerid)) return 1; // проверка: авторизован или нет
if(pData[playerid][Member] != 1) return SendClientMessage(playerid,-1,"Ошибка: вы не полицейский!");
GetPlayerWeaponData(playerid,2,weap,-1);
if(weap != 24) return SendClientMessage(playerid,-1,"Ошибка: у вас нет пистолета!");

if(PistolTazer[playerid])
{
PistolTazer[playerid] = 0;
return SendClientMessage(playerid,-1,"Пистолет-электрошок отключен");
}
else
{
PistolTazer[playerid] = 1;
return SendClientMessage(playerid,-1,"Пистолет-электрошок включен. Акуратно наведите на цель и выстрелите в нее");
}
return 1;
}

stock BulletTazer(playerid,suspectid)
{
new string[128];
format(string, sizeof(string), "%s попал из пистолета-электрошока в %s ", getName(suspectid) ,getName(playerid));
ProxDetector(30.0, suspectid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
SetPlayerSpecialAction(suspectid,SPECIAL_ACTION_HANDSUP);
ShowPlayerDialog(suspectid,DIALOGINFO,0," ","{FF0000}Вас обезвредили электрошокером!","Закрыть","");
return 0;
}
Кто-нибудь, удалите этот тупой копипаст с п-и нахер и поддайте ТС большого пинка.

iMaddy
04.05.2014, 17:24
Судя по различным функциям, типа getName, код писался явно не сейчас. Можно было и убрать все макросы и заменить свои функции на обычный код.
Да и вообще, по поводу

Читаем (http://pro-pawn.ru/showthread.php?8356-%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B0-%D0%9C%D0%B0%D0%BD%D1%83%D0%B0%D0%BB%D1%8B)

Учту ваши замечания и переделаю код , но думаю любой дурак сможет это сделать под себя, код то пустяковый

Seregamil
04.05.2014, 18:21
Учту ваши замечания и переделаю код , но думаю любой дурак сможет это сделать под себя, код то пустяковый

Я не смогу, переделывай.

Salvacore
04.05.2014, 18:31
if(weap != 24)
Пистолет у нас только дигл?

iMaddy
04.05.2014, 18:41
Старался объяснить все очень доступно, но, извините, дальше некуда. Теперь любой парень с раком мозга меня должен понять, мануал все таки не такой большой

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



if(weap != 24)
Пистолет у нас только дигл?

мне захотелось именно дигл. Обычно у копов на РП серверах только дигл и выдают, но можно сделать if(wep == 24 || wep == 23) и т.д.

ИМХО: мануал должен подталкивать человека на изучение что-то нового, он должен что-то переделывать под себя, пусть это даже что-то простое. Не вечно же его говном кодом с ложечки кормить

Seregamil
04.05.2014, 18:42
ProxDetector - думаю у всех есть эта функция
нету.

pData[playerid][Member]: pData[playerid] - общая "структурка" параметров персонажей, выгружаемых и сохраняемых при входе/выходе; [Member] - параметр ида организации игрока, в нашем случае - Полици
я незнаю что это.

Вариант ZCMD
я не использую ZCMD, чо делать?

stock BulletTazer(playerid,suspectid)
{
// что ж, реализуем стандартными функциями
new string[128], name1[MAX_PLAYER_NAME], name2[MAX_PLAYER_NAME];
GetPlayerName(playerid, name1, sizeof(name1));
GetPlayerName(suspectid, name2, sizeof(name2));

// format(string, sizeof(string), "%s попал из пистолета-электрошока в %s ", getName(suspectid) ,getName(playerid));
format(string, sizeof(string), "%s попал из пистолета-электрошока в %s ", name2 ,name1);

/* COLOR_PURPLE - константное значение пурпурного/розового цвета в шестнадцатиричном формате. Говоря проше это
#define COLOR_PURPLE 0xC2A2DAAA . */

/* ProxDetector - думаю у всех есть эта функция, служит для каких-либо действий, например, /me. Но если нет, она //будет ниже */
ProxDetector(30.0, suspectid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
SetPlayerSpecialAction(suspectid,SPECIAL_ACTION_HANDSUP);

/* DIALOGINFO - константное значение не нужного мне ID'а диалога. Можете просто вставить свой ид, скажем, 1488 */
ShowPlayerDialog(suspectid,DIALOGINFO,0," ","{FF0000}Вас обезвредили электрошокером!","Закрыть","");
return 0;
а диалог вернуть не судьба?

iMaddy
04.05.2014, 18:43
Работоспособность проверена. Позже напишу немного РПшности, скажем, ограниченное число зарядов тазера, подзарядка, определенное расстояние, с которого будет работать тазер и т.д. Это не сложно, но сейчас мне лень :blum3:

Seregamil
04.05.2014, 18:44
Работоспособность проверена. Позже напишу немного РПшности, скажем, ограниченное число зарядов тазера, подзарядка, определенное расстояние, с которого будет работать тазер и т.д. Это не сложно, но сейчас мне лень :blum3:

У МЕНЯ НЕ РАБОТАЕТ, ЧО ДЕЛАТЬ?! ПРОБЛЕМЫ ОПИСАЛ УЖЕ

iMaddy
04.05.2014, 18:52
а диалог вернуть не судьба?

Можно и так,но я не знаю какое значение вернет диалог, не проверял.
http://wiki.sa-mp.com/wiki/Special:Search?search=ShowPlayerDialog&go=Go

Return Values:
This function does not return any specific values.
А нам нужно возвращать значение 0 чтобы дамаг не наносился при OnPlayerWeaponShot
http://wiki.sa-mp.com/wiki/OnPlayerWeaponShot

Return Values:
0 - Prevent the bullet from causing damage.
1 - Allow the bullet to cause damage.

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


У МЕНЯ НЕ РАБОТАЕТ, ЧО ДЕЛАТЬ?! ПРОБЛЕМЫ ОПИСАЛ УЖЕ
Тогда убери из статуса "программист", не позорься

Seregamil
04.05.2014, 18:53
А нам нужно возвращать значение 0 чтобы дамаг не наносился при OnPlayerWeaponShot
http://wiki.sa-mp.com/wiki/OnPlayerWeaponShot
значит ничего не возвращай.

Тогда убери из статуса "программист", не позорься

У МЕНЯ НЕ РАБОТАЕТ, ЧО ДЕЛАТЬ?! ПРОБЛЕМЫ ОПИСАЛ УЖЕ
это был сарказм.

iMaddy
04.05.2014, 18:57
Сарказм-сарказмом, а мануал простейший и даже самый хардовый нуб поковыряется и поймет. Разжевывать им весь код значит замедлять их обучение скриптингу

Seregamil
04.05.2014, 18:59
Сарказм-сарказмом, а мануал простейший и даже самый хардовый нуб поковыряется и поймет. Разжевывать им весь код значит замедлять их обучение скриптингу

Это кто такую несусветную хуйню придумал?
И потом, я ткнул на косяки - переделывайте, мне пофиг.

DeimoS
04.05.2014, 19:01
ИМХО: мануал должен подталкивать человека на изучение что-то нового, он должен что-то переделывать под себя, пусть это даже что-то простое. Не вечно же его говном кодом с ложечки кормить

Эмм, как меня подтолкнёт к изучению языка отсутствие каких-то кастомных функций и макросов? Ну нет у меня функции getName и что мне, как новичку в Pawn, делать?

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

Подобные массивы

new string[128]
и отсутствие оптимизации так же вряд ли заставят людей изучать что-то. Наоборот, они будут впитывать то, что написали тут вы => каждый массив будет равен 128 и о табуляции можно забыть

iMaddy
04.05.2014, 19:13
Эмм, как меня подтолкнёт к изучению языка отсутствие каких-то кастомных функций и макросов? Ну нет у меня функции getName и что мне, как новичку в Pawn, делать?

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

Подобные массивы

new string[128]
и отсутствие оптимизации так же вряд ли заставят людей изучать что-то. Наоборот, они будут впитывать то, что написали тут вы => каждый массив будет равен 128 и о табуляции можно забыть

Посмотри внимательно, я сделал вариант с использованием стандартной функции.
Насчет строки: максимальным размер строки чата в SA:MP - 128 символов, и что то еще мудрить я не вижу смысла.


и что мне, как новичку в Pawn, делать?
Прочитать документацию, описание стандартных функций, покопаться в интернете, использовать другие готовые решения, импровизировать и многое другое. Мануал не на столько сложен и я залил его в целях ознакомления, заметь, я даже не реализовал его как отдельную систему - это просто 1 команда, 1 переменная и одна функция , вызываемая в простейшем паблике

DeimoS
04.05.2014, 19:24
Посмотри внимательно, я сделал вариант с использованием стандартной функции.
Это только сейчас. А я говорю про прошлый вариант.


Насчет строки: максимальным размер строки чата в SA:MP - 128 символов, и что то еще мудрить я не вижу смысла.
ПАМ-ПАМ-ПАААААМ
http://wiki.sa-mp.com/wiki/SendClientMessage

const message[] The text that will be displayed (max 144 characters).


Прочитать документацию, описание стандартных функций, покопаться в интернете, использовать другие готовые решения, импровизировать и многое другое. Мануал не на столько сложен и я залил его в целях ознакомления, заметь, я даже не реализовал его как отдельную систему - это просто 1 команда, 1 переменная и одна функция , вызываемая в простейшем паблике

Так зачем тогда вообще нужен мануал? Пусть уж новички копаются в документации и самостоятельно пишут то, что им нужно.
Мануалы созданы для того, чтоб не заморачиваться с написанием какой-то системы и просто найти готовый код.

iMaddy
04.05.2014, 19:42
ПАМ-ПАМ-ПАААААМ
http://wiki.sa-mp.com/wiki/SendClientMessage

Странно, но в других источниках было написано что 128.


Мануалы созданы для того, чтоб не заморачиваться с написанием какой-то системы и просто найти готовый код.
То есть ты хочешь сказать, что есть такие мануалы которые подходят абсолютно под все моды? А что если у меня с new.pwn? Почему мне не подходят другие готовые решения вашего форума? Все должно быть в пределах разумного и большую часть кода я разжевал так, что любой поймет, а если не поймет - пусть дальше растет, персик учит pawn.


Так зачем тогда вообще нужен мануал?
Главное донести идею, причем свежую идею, поделиться с форумчанами оригинальным ништяком, а не разжевывать каждую строку кода. Если человек не сможет вставить себе этот простейший код, то у него, простите, руки не из того места растут и не более. Я считаю вашу критику (причем очень много критики) не к месту, т.к. во-первых, мануал простой, во-вторых, кода не много и в третих - главное идея. Я бы еще понял ваши слова если бы у меня была ну ачешуеть какая большая система с разными собственными функциями и макросами, однако тот кода как кот наплакал, основная суть мануала находится в OnPlayerWeaponShot: человек стреляет в другого - другого замораживает. Вот и все, ничего сложного

DeimoS
04.05.2014, 20:01
Странно, но в других источниках было написано что 128.

Никогда не слушайте больше те источники.


То есть ты хочешь сказать, что есть такие мануалы которые подходят абсолютно под все моды? А что если у меня с new.pwn? Почему мне не подходят другие готовые решения вашего форума? Все должно быть в пределах разумного и большую часть кода я разжевал так, что любой поймет, а если не поймет - пусть дальше растет, персик учит pawn.

Есть или нет - не знаю (не помню, точнее), но что мешает учесть самые основные потребности людей, типа командных процессоров и прочего? Продублировать команды под основные командные процессоры (обычный/ZCMD (код которого и к DC_CMD подойдёт)/YCMD (если очень хочется) да и всё), а циклы под for и foreach. Уже многие найдут для себя нужный вариант и не будут просить в комментариях перевести для них код + уважение к автору мануала у людей будет over900. И всё это займёт лишние 2 минуты вашего времени, если вы знаете о чём пишете.

По поводу остального даже и говорить ничего не хочу. Делиться идеями можно и в разделе "Другое", например. А уж если давать код, давать нужно его качественным, а не "как мне нравится, так и буду делать. А вы сами разбирайтесь".

iMaddy
04.05.2014, 20:04
А уж если давать код, давать нужно его качественным
Качественным и "для всех" - 2 разные вещи, однако я понял суть ваших мыслей и сделаю несколько вариантов. В плане того, что будут просить в комментариях помощи - не вижу в этом ничего плохого и помочь всегда готов

DeimoS
04.05.2014, 20:07
Качественным и "для всех" - 2 разные вещи, однако я понял суть ваших мыслей и сделаю несколько вариантов. В плане того, что будут просить в комментариях помощи - не вижу в этом ничего плохого и помочь всегда готов

Почему же разные? Если я напишу качественный код, при этом адаптирую его под максимальное число систем - он перестанет быть качественным?

Так почему бы заранее не учесть все возможные вопросы и не ответить на них в теме?

iMaddy
04.05.2014, 20:20
Почему же разные? Если я напишу качественный код, при этом адаптирую его под максимальное число систем - он перестанет быть качественным?

Так почему бы заранее не учесть все возможные вопросы и не ответить на них в теме?

Ну в моем понимании качественный код - это код, который написан грамотно, по всем правилам оптимизации, и, по возможности, емкий. Вообщем, суть я понял, так что прекращаем набивать посты :thank_you:

DeimoS
04.05.2014, 20:27
Ну в моем понимании качественный код - это код, который написан грамотно, по всем правилам оптимизации, и, по возможности, емкий. Вообщем, суть я понял, так что прекращаем набивать посты :thank_you:

В данном подразделе статистика не засчитывается. Ни "Спасибо", ни сообщения. НИ-ЧЕ-ГО. Так что наши обсуждения кода ничего плохого не делают. Удалить х не так уж и сложно.

По поводу качественного кода. Так а что, вариативность убивает грамотность или оптимизацию?

Spectrum
04.05.2014, 20:43
Ну в моем понимании качественный код - это код, который написан грамотно, по всем правилам оптимизации, и, по возможности, емкий. Вообщем, суть я понял, так что прекращаем набивать посты :thank_you:

в данном уроке не видно этого "качественного кода"

Daniel_Cortez
05.05.2014, 11:13
Просто расставлю все точки над "ё": http://pro-pawn.ru/showthread.php?8356


Запрещается:
Создавать мануалы, которые работают только на определённых модах (например, только на RLS).
Допускается создание мануалов для GodFather, в виду относительной чистоты его кода и распространённости мода в целом.