Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Система ХитМаркера & HitMarker - Визуальное подтверждение подтверждения

Bren

Изучающий
Пользователь
Регистрация
17 Янв 2014
Сообщения
255
Лучшие ответы
0
Репутация
39

Система визуального подтверждения попадания по игроку или по транспорту.

Возможности
  • Изменение цвета хитмаркера при попадании в разные части тела игрока, транспорта, и при полном убийстве игрока.
  • Отключение хитмаркера для всех видов оружия, включая спец оружие воздушного транспорта.
  • Установка определенного звука при попадании.
  • Настройка положение и размера хитмаркера.
  • Включение/Выключение индикации попадания по игроку и по транспорту.
Установка
  • Удалите старую систему если она есть.
  • Скачайте архив Hitmarker.zip и разархивируйте его.
  • Поместите файл Hitmarker.inc в папку include.
  • Откройте ваш мод, и подключите #include <Hitmarker>

Использование


Definition

Тип изменение цвета
Pawn:
#define HITMARKER_KILLSHOTS                     0   //При полном убийстве игрока
#define HITMARKER_VEHICLE_DAMAGE                1   //При попадании по транспорту
#define HITMARKER_BODYPART_TORSO                3   //При попадании по торсу
#define HITMARKER_BODYPART_GROIN                4   //При попадании по паху
#define HITMARKER_BODYPART_LEFT_ARM             5   //При попадании по левой руке
#define HITMARKER_BODYPART_RIGHT_ARM            6   //При попадании по правой руке
#define HITMARKER_BODYPART_LEFT_LEG             7   //При попадании по левой ноге
#define HITMARKER_BODYPART_RIGHT_LEG            8   //При попадании по правой ноге
#define HITMARKER_BODYPART_HEAD                 9   //При попадании в голову
Дополнительные определения для оружия
Pawn:
#define HITMARKER_WEAPON_FIST                   0   //Урон получен кулаком
#define HITMARKER_DEATH_UNDER_VEHICLE           50  //Игрок умер под транспортом или от винтов вертолета
#define HITMARKER_ALL_EXPLOSION                 51  //Игрок умер от взрыва
#define HITMARKER_AIR_VEHICLE_WEAPON_MINIGUN    52  //Игрок умер от спец оружие воздушного транспорта пулемет
#define HITMARKER_AIR_VEHICLE_WEAPON_ROCKETS    53  //Игрок умер от спец оружие воздушного транспорта ракета
Изменение положение хитмаркера
Pawn:
#define HITMARKER_STANDARD_CROSSHAIR            0   //Изменение положение стандартного прицела
* Используется для огнестрельного оружия (ID: 22 - 33, 37 - 38)

#define HITMARKER_CENTRE_CROSSHAIR              1   //Изменение положение прицела по центру
* Используется для холодного оружия включая транспорт

Functions
Pawn:
Включить Hitmarker
    HitmarkerEnabled(playerid);

Выключить Hitmarker
    HitmarkerDisable(playerid);

Узнать статус хитмаркера
    bool:HitmarkerStatus(playerid);
    Вернет: false если выключен
    Вернет: true если включен

Изменить цвет хитмаркера
    HitmarkerColor(playerid, type, color);

Узнать текущий цвет хитмаркера
    GetHitmarkerColor(playerid, type);

Выключить хитмаркер для определенного оружия
    HitmarkerDisableWeapon(playerid, weaponid, bool:disable);
    * При отключении огневого оружия, отключается оружие (ID: 18, 37)
    * При отключении взрывного оружия, отключается оружие (ID: 16, 35, 36, 39, 51) Не распространяется на воздушный транспорт.

Узнать статус хитмаркера у определенного оружия
    GetHitmarkerDisabledWeapon(playerid, weaponid);

Включить звук попадания
    HitmarkerSoundDamage(playerid, soundid);

Узнать текущий звук попадания
    GetHitmarkerSoundDamage(playerid);

Изменить положение хитмаркера
    HitmarkerPosition(playerid, crosshair_type, Float:x, Float:y, Float:size_x, Float:size_y);

Узнать текущие положение хитмаркера
    GetHitmarkerPosition(playerid, crosshair_type, &Float:x, &Float:y, &Float:size_x, &Float:size_y);

Включить индикацию пули по игроку
    HitmarkerEnablePlayerDamage(playerid, bool:enable);
    * По стандарту включено

Узнать статус индикации пули по игроку
    GetHitmarkerEnablePlayerDamage(playerid);

Включить индикацию пули по транспорту
    HitmarkerEnableVehicleDamage(playerid, bool:enable);

Узнать статус индикации пули по транспорту
    GetHitmarkerEnableVehicleDamage(playerid);

Пример использования
Код:
CMD:Hitmarker(playerid)
{
    if(HitmarkerStatus(playerid) == false) // Узнаем состояние хитмаркера
    {
        // Включаем хитмаркер
        HitmarkerEnabled(playerid);

        // Устанавливаем нужные цвета попадания
        HitmarkerColor(playerid, HITMARKER_BODYPART_TORSO,      0xFFFFFFFF);
        HitmarkerColor(playerid, HITMARKER_BODYPART_GROIN,      0x7CFC00FF);
        HitmarkerColor(playerid, HITMARKER_BODYPART_LEFT_ARM,   0xFFA500FF);
        HitmarkerColor(playerid, HITMARKER_BODYPART_RIGHT_ARM,  0xFFD700FF);
        HitmarkerColor(playerid, HITMARKER_BODYPART_LEFT_LEG,   0x00BFFFFF);
        HitmarkerColor(playerid, HITMARKER_BODYPART_RIGHT_LEG,  0x00FFFFFF);
        HitmarkerColor(playerid, HITMARKER_BODYPART_HEAD,       0xFF00FFFF);
        HitmarkerColor(playerid, HITMARKER_KILLSHOTS,           0xFF0000FF);
        HitmarkerColor(playerid, HITMARKER_VEHICLE_DAMAGE,      0xB03060FF);

        // Включаем индикацию урона по транспорту
        HitmarkerEnableVehicleDamage(playerid, true);

        // Отключаем индикацию урона оружием (ID: 5) - Бейсбольная бита
        HitmarkerDisableWeapon(playerid, WEAPON_BAT, true);

        // Отключаем индикацию урона наносимого воздушным транспортом при помощи пулемета
        HitmarkerDisableWeapon(playerid, HITMARKER_AIR_VEHICLE_WEAPON_MINIGUN, true);

        GameTextForPlayer(playerid, "Hitmarker ~g~~h~On", 1200, 4);
    }
    else
    {
        // Выключаем хитмаркер
        HitmarkerDisable(playerid);

        GameTextForPlayer(playerid, "Hitmarker ~r~~h~Off", 1200, 4);
    }
    return 1;
}

Готово!

Автор: Bren


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



Типы отображение
PHP:
AimingCheck[playerid][3]

0 - Выключено
1 - Включено - появляется при попадании
2 - Включено - появляется когда у игрока очень мало ХП

Ну так приступим.

Ко всем new
PHP:
new Text:Aiming[MAX_PLAYERS][2], AimingCheck[MAX_PLAYERS][6], AimingText[11] = {92, 1, 47, 126, 110, 126, 47, 1, 92}, AimingTextR[16] = {126, 114, 126, 126, 104, 126, 92, 1, 47, 126, 110, 126, 47, 1, 92};

В OnPlayerConnect добавляем сам TextDraw
PHP:
    AimingCheck[playerid][0] = 0;
    AimingCheck[playerid][1] = 0;
    AimingCheck[playerid][2] = GetTickCount()+500;//Меньшее значение иногда вызывает залипание маркера. Большое значение вызывает задержку появление маркера
    AimingCheck[playerid][3] = 1; // 0 - Выкл | 1 - Вкл тип 1 | 2 Вкл тип 2
    AimingCheck[playerid][4] = -1;//цвет (0xFFFF00FF)
    AimingCheck[playerid][5] = 0;//проверка на спавн игрока (если у вас есть своя проверка замените на свою)

    Aiming[playerid][0] = TextDrawCreate(332.5, 172.5, AimingText);
    TextDrawBackgroundColor(Aiming[playerid][0], 0);
    TextDrawFont(Aiming[playerid][0], 0);
    TextDrawLetterSize(Aiming[playerid][0], 0.33, 0.7);
    TextDrawColor(Aiming[playerid][0], AimingCheck[playerid][4]);
    TextDrawSetOutline(Aiming[playerid][0], 0);
    TextDrawSetProportional(Aiming[playerid][0], 1);
    TextDrawSetShadow(Aiming[playerid][0], 1);
    TextDrawSetSelectable(Aiming[playerid][0], 0);

    Aiming[playerid][1] = TextDrawCreate(310.5, 214.0, AimingText);
    TextDrawBackgroundColor(Aiming[playerid][1], 0);
    TextDrawFont(Aiming[playerid][1], 0);
    TextDrawLetterSize(Aiming[playerid][1], 0.46, 1.0);
    TextDrawColor(Aiming[playerid][1], AimingCheck[playerid][4]);
    TextDrawSetOutline(Aiming[playerid][1], 0);
    TextDrawSetProportional(Aiming[playerid][1], 1);
    TextDrawSetShadow(Aiming[playerid][1], 1);
    TextDrawSetSelectable(Aiming[playerid][1], 0);

В секундный таймер
PHP:
if(AimingCheck[i][1] >= 1 && AimingCheck[i][3] >= 1)
{
    AimingCheck[i][1] --;
    if(AimingCheck[i][1] == 0)
    {
        AimingCheck[i][0] = 0;
        AimingCheck[i][1] = 0;
        TextDrawHideForPlayer(i, Aiming[i][0]);
        TextDrawHideForPlayer(i, Aiming[i][1]);
        TextDrawSetString(Aiming[i][0], AimingText);
        TextDrawSetString(Aiming[i][1], AimingText);
    }
}

В самый вверх OnPlayerKeyStateChange
PHP:
if(AimingCheck[playerid][3] >= 1 && AimingCheck[playerid][0] == 1 && (newkeys & 128 || newkeys & 0 || oldkeys & 132))
{
    AimingCheck[playerid][0] = 0;
    AimingCheck[playerid][1] = 0;
    AimingCheck[playerid][2] = GetTickCount()+300;//Меньшее значение иногда вызывает залипание маркера. Большое значение вызывает задержку появление маркера
    TextDrawHideForPlayer(playerid, Aiming[playerid][0]);
    TextDrawHideForPlayer(playerid, Aiming[playerid][1]);
    TextDrawSetString(Aiming[playerid][0], AimingText);
    TextDrawSetString(Aiming[playerid][1], AimingText);
}

В OnPlayerTakeDamage
PHP:
if(issuerid != INVALID_PLAYER_ID && AimingCheck[issuerid][3] >= 1 && AimingCheck[playerid][5] == 1)
{
    new Float:Health;
    GetPlayerHealth(playerid, Health);
    AimingCheck[issuerid][1] = 3;
    if(Health-amount < 20.0)
    {
        AimingCheck[issuerid][0] = 1;
        if(AimingCheck[issuerid][3] == 1)
        {
            if(weaponid == 34) TextDrawSetString(Aiming[issuerid][1], AimingTextR);
            else TextDrawSetString(Aiming[issuerid][0], AimingTextR);
        }
        else
        {
            if(weaponid == 51 || weaponid == 34)
            {
                if(weaponid == 51) AimingCheck[issuerid][0] = 0;
                TextDrawSetString(Aiming[issuerid][1], AimingTextR);
                TextDrawShowForPlayer(issuerid, Aiming[issuerid][1]);
            }
            else
            {
                TextDrawSetString(Aiming[issuerid][0], AimingTextR);
                TextDrawShowForPlayer(issuerid, Aiming[issuerid][0]);
            }
        }
    }
    if(AimingCheck[issuerid][3] == 1 && (weaponid < 22 || weaponid > 34))
    {
        if(weaponid == 51)
        {
            AimingCheck[issuerid][0] = 0;
            TextDrawShowForPlayer(issuerid, Aiming[issuerid][1]);
        }
        else
        {
            AimingCheck[issuerid][0] = 1;
            TextDrawShowForPlayer(issuerid, Aiming[issuerid][0]);
        }
    }
}

В OnPlayerWeaponShot
PHP:
if(AimingCheck[playerid][3] >= 1 && AimingCheck[playerid][2] < GetTickCount())
{
    new carmode = GetPlayerCameraMode(playerid);
    if((carmode == 7 || carmode == 53 || carmode == 55) && hittype == BULLET_HIT_TYPE_PLAYER && AimingCheck[playerid][0] == 0 && AimingCheck[playerid][3] == 1 && hitid != 65535 && AimingCheck[hitid][5] == 1)
    {
        AimingCheck[playerid][0] = 1;
        AimingCheck[playerid][1] = 2;
        if(weaponid == 34) TextDrawShowForPlayer(playerid, Aiming[playerid][1]);
        else TextDrawShowForPlayer(playerid, Aiming[playerid][0]);
    }
    else if(AimingCheck[playerid][0] != 0 && hittype != BULLET_HIT_TYPE_PLAYER)
    {
        AimingCheck[playerid][0] = 0;
        AimingCheck[playerid][1] = 0;
        TextDrawHideForPlayer(playerid, Aiming[playerid][0]);
        TextDrawHideForPlayer(playerid, Aiming[playerid][1]);
        TextDrawSetString(Aiming[playerid][0], AimingText);
        TextDrawSetString(Aiming[playerid][1], AimingText);
    }
}

В OnPlayerSpawn
PHP:
AimingCheck[playerid][5] = 1;

И в OnPlayerDeath
PHP:
AimingCheck[playerid][5] = 0;
Готово!



Автор: Bren
 

Вложения

Последнее редактирование:
Сверху Снизу