Форум Pawn.Wiki - Воплоти мечту в реальность!: IsPlayerAim - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Тема закрыта

IsPlayerAim IsPlayerAim - проверка на прицеливание! Оценка: -----

#1
Пользователь офлайн   21th year 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
IsPlayerAimed

Изображение
В чем смысл данного скрипта?:
  • 1. Проверка на прицеливание игроков, сделано после прочтения "SA-MP | О наболевшем"
  • 2. Возможно возможность отследить читы, ввиду прицеливания или нет

Что нужно для работы?:
  • Инклюд "a_samp"
  • Pawn.CMD либо dc_CMD. Скачать: Pawn.CMD DC_CMD
  • sscanf2. Скачать:

Видео работа:

Результаты Virus Total:
Изображение
Просмотреть на сайте: Переадресация
Авторство: 21th year
Помощь: MISTEV

Untitled.pwn [1К]

Сообщение отредактировал 21th year: 11 октября 2022 - 12:29

1

#2
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Это просто удали:

#include <a_samp>
#include <sscanf2>
#tryinclude <Pawn.CMD>
#tryinclude <dc_cmd>
main()
{
}
public OnPlayerDisconnect(playerid, reason)
{
    DeletePVar(playerid, "UserID");
	return 1;
}

Любой PVar автоматически удаляется при выходе игрока. Если не сделать перехват функции, то любой, кто будет использовать твой инклуд, столкнётся с проблемой уже объявленного OnPlayerDisconnect и тем более main. Подключать инклуды нужно не в твоём скрипте, а в моде, где будет использоваться твой скрипт

И сам IsPlayerAim лучше сделать на подобии простой функции проверки, а уже что выводить или не выводить - дело каждого, кто будет использовать.

Типа такого:

stock IsPlayerAim(playerid)
{
    switch(GetPlayerAnimationIndex(playerid))
    {
        case 1167,1160,1161,1162,1163: return 1;
        default: return 0;
    }
}

Можно ещё завязать работу на таймере и сделать некий callback, который будет срабатывать, как OnPlayerKeyStateChange



Также у тебя напутано с PVar, playerid, params[0] ... Ты хочешь сообщать тому, кто использует функцию, о том, на кого ты используешь... Лучше отдать эту часть пользователю, кто будет использовать твой скрипт, а свой максимально упрости

Сообщение отредактировал M I S T E V: 11 октября 2022 - 11:08

0

#3
Пользователь офлайн   21th year 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияM I S T E V (11 октября 2022 - 10:58) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

По поводу таймера, у меня есть идея его делать при смене оружия, но если ID оружие будет равняться 0, то таймер остановится. Верный пример?
0

#4
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию

Просмотр сообщения21th year (11 октября 2022 - 11:07) писал:

По поводу таймера, у меня есть идея его делать при смене оружия, но если ID оружие будет равняться 0, то таймер остановится. Верный пример?

Не совсем. Что-то на подобии такого:

new aimTimer[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
    CheckPlayerAim(playerid);

    return 1;
}

public OnPlayerDissconect(playerid, reason)
{
    KillTimer(aimTimer[playerid]);

    return 1;
}

forward CheckPlayerAim(playerid);
public CheckPlayerAim(playerid)
{
    static status;

    switch(GetPlayerAnimationIndex(playerid))
    {
        case 1167,1160,1161,1162,1163: status = 0;
        default: status = 1;
    }

    CallLocalFunction("OnPlayerAimed", "ii", playerid, status);

    return aimTimer[playerid] = SetTimerEx("CheckPlayerAim", 500, false, "i", playerid);
}

forward OnPlayerAimed(playerid, status); // каждые 500 мс будет выдавать новое состояние игрока, прицеливается ли игрок или нет (если анимацию ты верно подобрал)
public OnPlayerAimed(playerid, status)
{
    return 1;
}

Сообщение отредактировал M I S T E V: 11 октября 2022 - 11:30

0

#5
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Но я не думаю, что это поможет защититься от читеров, скорее для некой игровой составляющей только
0

#6
Пользователь офлайн   21th year 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияM I S T E V (11 октября 2022 - 11:19) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Изменил, добавил тебя в помощников.
0

#7
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию

Просмотр сообщения21th year (11 октября 2022 - 11:33) писал:

Изменил, добавил тебя в помощников.

Спасибо, но это не обязательно :wink:

Убери из темы первый файл
0

#8
Пользователь офлайн   21th year 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияM I S T E V (11 октября 2022 - 11:34) писал:

Спасибо, но это не обязательно :wink:

Убери из темы первый файл

Там уже другой
0

#9
Пользователь офлайн   Pa4enka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Вообще, то что ты пытался сделать уже существует в более адекватной реализации

А теперь по твоей реализации.
1) Команда в шапке темы, как минимум, выдаст ошибку ссканф в консоле. Задачка тебе на ночь: почему :)
2) Я бы рекомендовал тебе не нагружать "код для примера" лишними конструкциями. Например, зачем нужно указывать специфические цвета в SCM, если есть прекрасный белый цвет обозначающий как "-1"? Или зачем писать слово "[Информация]"? Вот такие вещи отвлекают от тех фишек, которые ты предлагаешь. Лучше уже проверку на коннект добавить, ей богу :)
3) Попробуй функцию IsPlayerConnected использовать так как ты использовал IsPlayerAim. Сколько ошибок получишь?) Префикс Is показывает, что функция возвращает какие-то значение, будь-то 0/1 или еще что-то. Она всегда что-то возвращает. И в большинстве случаев используется в проверках (на что собственно префикс Is и указывает).
4) forward + public? Ты уверен? У тебя точно функция IsPlayerAim автовызываемая?
5) Как и говорил выше коллега M I S T E V, ты запутался в playerid/params в PVar'ах. Впрочем, он и не нужен.

Таким образом итоговый код (на основе кода в шапке темы) получится такой:

CMD:checkaim(playerid, params[])
{
    new targetid;
    if( sscanf(params, "u", targetid) )
        return SendClientMessage(playerid, -1, "/checkaim [playerid]");

    if( targetid == INVALID_PLAYER_ID )
        return true;

    if( IsPlayerAim(targetid) )
        SendClientMessage(playerid, -1, "Игрок прицеливается.");
    else
        SendClientMessage(playerid, -1, "Игрок не прицеливается.");

    return true;
}


stock IsPlayerAim(playerid)
{
    switch(GetPlayerAnimationIndex(playerid))
    {
        case 1167,1160,1161,1162,1163: return 1;
    }
    return 0;
}

Сообщение отредактировал Pa4enka: 11 октября 2022 - 12:26

1

#10
Пользователь офлайн   21th year 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (11 октября 2022 - 12:17) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Это не проверка на аим, это проверка на прицеливание. Я написал откуда и что это. Твои домыслы не понимаю к чему, там код для примера. Код в закреплённом файле

Сообщение отредактировал 21th year: 11 октября 2022 - 12:22

0

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Тема закрыта

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика