JimMcgil
Ученик
Меня попросили решить одну проблему не суть какую и я решил помочь человеку.
В итоге у меня получилось что то наподобии подствольного электорошокера.
В начале мода вставляем
Далее выбираем каким образом игрок будет брать электорошокер
У меня его выдает админ (ну я сам себе когда тестил выдавал)
Далее ищем паблик OnPlayerKeyStateChange(playerid, newkeys, oldkeys) и в свободное место вставляем это
Теперь обьясняю что где значит:
1)Здесь мы проверяем чтобы одновременно были нажаты 2 кнопки - кнопка прицела и кнопка бега(Зачем расскажу внизу в принципе действия)
кнопку бега можно поменять, но не советую можно напартачить и ничего работать небудет
2)Проверка на то что у человека есть шокер
3)Использовать шокер можно только в режиме прицела, а в режиме бега нельзя это и не доспускают исключение данных анимок
4)У меня шокер прикреплен к диглу вы можите выбрать любой другой ган или вообще убрать эту проверку тогда шокер будет работать на всех оружиях (включая кулак, кастет, нож и др - а это уже не РП)
5)Даже если вы промажите заряды серавно отберуться но вы всегда будите знать сколько у вас осталось
6)Анимация перезарядки - насколько я знаю все электорошокеры одно зарядные и их все время надо перезаряжать
7)Узнаем координаты игрока и куда он смотрит
8)Ищем среди всех игроков те кторые находятся возле нас на растоянии 7 метров(ну или в чем там расстояние измеряется)
Операторы continueУпрощают работу процесору исключая из цели игроков которых нет на сервере или которые неуспели авторизоваться, а также себя любимого мы же нехотим себя током ударить
9)Определяем в какой четверти находится предпологаемая цель относительно игрока (если недружите с геометрией невникайте, а если дружите то учтите что в сампе угол 0 градусов это не ось X а ось Y тоесть севере)
10)Опять геометрия если угол альфа меньше 45 градусов то протевалежащий катет А меньше прилежащего катета Б и наоборот, если альфа больше 45 градусов.
Так мы делаем для каждой четверти. Это мы делаем для большей точности. Можно было использовать синус и косинус угла зрения но даже я отличник по геометрии не хочу возиться с ними.
Для тех кто не понял обьясню условно:
Мы стоим в центре круга разделенного на 8 равных частей в одной из этих 8 частей лежит мяч
мы проверяем смотрит ли игрок на ту часть где лежит мяч.
Заканчивается это все тем что запускается сток Tazer(playerid,i);
А вот и сам он
На этом все
Теперь расскажу как это использывать
Для начала берете электорошокер (на складе или покупаете или где вы там захотите)
Далее подходите ближе к человеку прицеливаетесь и жмете кнопку бега (ну или ту на которую вы поменяете главно все зделать правильно, а то работать небудет) по дефолту бег это пробел(у меня например шифт у кого то может стоять контрл)
Если вы хорошо прицелились человек шмякнится на пол(чуть не забыл в воде не используйте а то и вас заденет
(Это кстате можно зделать))
И еще если вы попробуете во время бега нажать кнопку прицела (по дефолту ПКМ) у вас ничего не выйдет(пунк 3 в разъяснении выше) нужно сперва прицелиться, а потом стрелять.
Небольшая особенность если стрелять в толпу то одним выстрелом можно задеть нескольких людей по Рп это можно обьяснить так: шокер обычно имеет не 1 а 2 и более проводков и при выстрели они могли разлететься и задеть более 1 игрока.
Вроде все написал если есть какие то вопросы пишите в лс или скайп.
Урок/Мануал расчитан на людей знающих только основы, поэтому здесь все так подробно
P.S. Это мой (писал сам, любые совпадения совершенно случайно) первый мануал прошу простить за любые ошибки. Возможно, что то подобное есть тогда тоже прошу прощения так как незнал об этом.
Надеюсь хотя бы на 1 плюсик за старания
В итоге у меня получилось что то наподобии подствольного электорошокера.
В начале мода вставляем
PHP:
#define HOLDING(%0) ((newkeys & (%0)) == (%0)) //Принцип данной штуки неособо понял брал ее с вики главное что работает
forward StopShoc(playerid);
//Для чего это узнаете дальше
У меня его выдает админ (ну я сам себе когда тестил выдавал)
PHP:
CMD:givetazer(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] < 3) return true;
if(sscanf(params, "ud", params[0], params[1]))return SendClientMessage(playerid, CL_WHITE, "/givetazer [ID][êîë-âî ïàòðîíîâ]");
if(!IsPlayerConnected(params[0])||PlayerInfo[params[0]][pLogged] == false) return SendClientMessage(playerid, CL_GREY, "Èãðîê íå â èãðå èëè íå óñïåë àâòîðèçîâàòüñÿ");
SetPVarInt(params[0],"NTazer",1);
SetPVarInt(params[0],"PtTazer",params[1]);
//Вся суть в последних двух строчках. Можите запихнуть их в диалог амуниции Копов\ФБР.
return true;
}
PHP:
if(HOLDING( KEY_SPRINT | KEY_HANDBRAKE)) //[1]
{
if(GetPVarInt(playerid,"NTazer") != 1 && GetPVarInt(playerid,"PtTazer") <= 0) return true; //[2]
if(GetPlayerAnimationIndex(playerid)==1257||GetPlayerAnimationIndex(playerid)==1224) return true; //[3]
if(GetPlayerWeapon(playerid) != 24) return true;//[4]
new n = GetPVarInt(playerid,"PtTazer") - 1;
SetPVarInt(playerid,"PtTazer",n);
new txt[64];
format(txt,64,"Вы выстрелили из электорошокера. Зарядов осталось %d",GetPVarInt(playerid,"PtTazer"));//[5]
SendClientMessage(playerid,CL_GREY,txt);
ApplyAnimation(playerid,"SILENCED","Silence_reload",4.1,0,0,0,1,1000,0);//[6]
new Float:PX, Float:PY, Float:PZ,
Float:CX, Float:CY, Float:CZ,
Float:fA;
GetPlayerPos(playerid,PX,PY,PZ);//[7]
for(new i;i<MAX_PLAYERS;i++)
{
if(i == playerid) continue;
if(!IsPlayerConnected(i)||PlayerInfo[i][pLogged] == false) continue;
if(IsPlayerInAnyVehicle(i)) continue;
GetPlayerPos(i,CX,CY,CZ);
if(IsPlayerInRangeOfPoint(playerid,7.0,CX,CY,CZ))//[8]
{
GetPlayerFacingAngle(playerid,fA);
if((PX>CX&&PY<CY)&&(0<fA<90))//[9]
{
if((CY-PY)>(PX-CX)&&(0<fA<45)) Tazer(playerid,i);
if((PX-CX)>(CY-PY)&&(45<fA<90)) Tazer(playerid,i);//[10]
}
if((PX > CX && PY > CY)&& (90 < fA < 180))
{
if((PX-CX)>(PY-CY)&&(90<fA<135)) Tazer(playerid,i);
if((PY-CY)>(PX-CX)&&(135<fA<180)) Tazer(playerid,i);
}
if((PX < CX && PY > CY)&& (180 < fA < 270))
{
if((PY-CY)>(CX-PX)&&(180<fA<225)) Tazer(playerid,i);
if((CX-PX)>(PY-CY)&&(225<fA<270)) Tazer(playerid,i);
}
if((PX < CX && PY < CY)&& (270 < fA < 360))
{
if((CX-PX)>(CY-PY)&&(270<fA<315)) Tazer(playerid,i);
if((CY-PY)>(CX-PX)&&(315<fA<360)) Tazer(playerid,i);
}
}
}
}
1)Здесь мы проверяем чтобы одновременно были нажаты 2 кнопки - кнопка прицела и кнопка бега(Зачем расскажу внизу в принципе действия)
кнопку бега можно поменять, но не советую можно напартачить и ничего работать небудет
2)Проверка на то что у человека есть шокер
3)Использовать шокер можно только в режиме прицела, а в режиме бега нельзя это и не доспускают исключение данных анимок
4)У меня шокер прикреплен к диглу вы можите выбрать любой другой ган или вообще убрать эту проверку тогда шокер будет работать на всех оружиях (включая кулак, кастет, нож и др - а это уже не РП)
5)Даже если вы промажите заряды серавно отберуться но вы всегда будите знать сколько у вас осталось
6)Анимация перезарядки - насколько я знаю все электорошокеры одно зарядные и их все время надо перезаряжать
7)Узнаем координаты игрока и куда он смотрит
8)Ищем среди всех игроков те кторые находятся возле нас на растоянии 7 метров(ну или в чем там расстояние измеряется)
Операторы continueУпрощают работу процесору исключая из цели игроков которых нет на сервере или которые неуспели авторизоваться, а также себя любимого мы же нехотим себя током ударить
9)Определяем в какой четверти находится предпологаемая цель относительно игрока (если недружите с геометрией невникайте, а если дружите то учтите что в сампе угол 0 градусов это не ось X а ось Y тоесть севере)
10)Опять геометрия если угол альфа меньше 45 градусов то протевалежащий катет А меньше прилежащего катета Б и наоборот, если альфа больше 45 градусов.
Так мы делаем для каждой четверти. Это мы делаем для большей точности. Можно было использовать синус и косинус угла зрения но даже я отличник по геометрии не хочу возиться с ними.
Для тех кто не понял обьясню условно:
Мы стоим в центре круга разделенного на 8 равных частей в одной из этих 8 частей лежит мяч
мы проверяем смотрит ли игрок на ту часть где лежит мяч.
Заканчивается это все тем что запускается сток Tazer(playerid,i);
А вот и сам он
PHP:
stock Tazer(playerid,targetid)
{
new txt[64];
format(txt,64,"Вы попали электорошокером в %s",PlayerInfo[targetid][pName]);
SendClientMessage(playerid,CL_GREY,txt);
format(txt,64,"В вас попали электорошокером",PlayerInfo[targetid][pName]);
SendClientMessage(targetid,CL_GREY,txt);//Говорим радостные (а для когото не очень) новости
TogglePlayerControllable(targetid,0);//Незнаю почему но без этого неработает контузия
ApplyAnimation(targetid, "CRACK", "crckdeth2", 4.1, 1, 0, 0, 1,0,0);//Обычно когда через человека проходит тысяча вольт его довольно сильно крючит
SetTimerEx("StopShoc",15000,0,"i",targetid);//Здесь кто незнает 15000 это 15 секунд то время сколько игрок будет в контузии
return true;
}
public StopShoc(playerid)
{
TogglePlayerControllable(playerid,1);
ApplyAnimation(playerid,"PED","IDLE_tired",4.1,0,1,1,0,1);//Останавливает контузию
return true;
}
Теперь расскажу как это использывать
Для начала берете электорошокер (на складе или покупаете или где вы там захотите)
Далее подходите ближе к человеку прицеливаетесь и жмете кнопку бега (ну или ту на которую вы поменяете главно все зделать правильно, а то работать небудет) по дефолту бег это пробел(у меня например шифт у кого то может стоять контрл)
Если вы хорошо прицелились человек шмякнится на пол(чуть не забыл в воде не используйте а то и вас заденет
И еще если вы попробуете во время бега нажать кнопку прицела (по дефолту ПКМ) у вас ничего не выйдет(пунк 3 в разъяснении выше) нужно сперва прицелиться, а потом стрелять.
Небольшая особенность если стрелять в толпу то одним выстрелом можно задеть нескольких людей по Рп это можно обьяснить так: шокер обычно имеет не 1 а 2 и более проводков и при выстрели они могли разлететься и задеть более 1 игрока.
Вроде все написал если есть какие то вопросы пишите в лс или скайп.
Урок/Мануал расчитан на людей знающих только основы, поэтому здесь все так подробно
P.S. Это мой (писал сам, любые совпадения совершенно случайно) первый мануал прошу простить за любые ошибки. Возможно, что то подобное есть тогда тоже прошу прощения так как незнал об этом.
Надеюсь хотя бы на 1 плюсик за старания
