Система пикапов в Pawn: создание и использование

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Пикапы позволяют создавать интерактивные объекты на карте. Разберем работу с ними.

Создание пикапа
Код:
CreatePickup(modelid, type, Float:x, Float:y, Float:z, worldid);
// Пример:
new pickupid = CreatePickup(1274, 1, 0.0, 0.0, 3.0, 0);

Типы пикапов:
- 1 - исчезает после подбора
- 2 - не исчезает, можно подобрать несколько раз
- 3 - исчезает через некоторое время
- 4 - не исчезает, но можно подобрать только один раз

Популярные модели:
- 1210 - деньги
- 1240 - здоровье
- 1241 - броня
- 1274 - оружие
- 1313 - информация
- 1559 - дом

Колбэки пикапов
Код:
public OnPlayerPickUpPickup(playerid, pickupid)
{
    switch(pickupid)
    {
        case PICKUP_HEALTH:
        {
            SetPlayerHealth(playerid, 100.0);
            SendClientMessage(playerid, -1, "Здоровье восстановлено");
        }
        
        case PICKUP_ARMOUR:
        {
            SetPlayerArmour(playerid, 100.0);
            SendClientMessage(playerid, -1, "Броня восстановлена");
        }
        
        case PICKUP_MONEY:
        {
            GivePlayerMoney(playerid, 1000);
            SendClientMessage(playerid, -1, "Вы получили $1000");
        }
    }
    return 1;
}

Пример: система пикапов здоровья
Код:
new PICKUP_HEALTH;
new PICKUP_ARMOUR;
new PICKUP_MONEY;

public OnGameModeInit()
{
    // Пикап здоровья
    PICKUP_HEALTH = CreatePickup(1240, 2, 1958.3783, 1343.1572, 15.3746, 0);
    
    // Пикап брони
    PICKUP_ARMOUR = CreatePickup(1241, 2, 1960.0, 1343.1572, 15.3746, 0);
    
    // Пикап денег
    PICKUP_MONEY = CreatePickup(1210, 1, 1962.0, 1343.1572, 15.3746, 0);
    
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    if(pickupid == PICKUP_HEALTH)
    {
        new Float:health;
        GetPlayerHealth(playerid, health);
        
        if(health < 100.0)
        {
            SetPlayerHealth(playerid, 100.0);
            SendClientMessage(playerid, -1, "Здоровье восстановлено");
        }
        else
        {
            SendClientMessage(playerid, -1, "У вас полное здоровье");
        }
    }
    else if(pickupid == PICKUP_ARMOUR)
    {
        new Float:armour;
        GetPlayerArmour(playerid, armour);
        
        if(armour < 100.0)
        {
            SetPlayerArmour(playerid, 100.0);
            SendClientMessage(playerid, -1, "Броня восстановлена");
        }
        else
        {
            SendClientMessage(playerid, -1, "У вас полная броня");
        }
    }
    else if(pickupid == PICKUP_MONEY)
    {
        GivePlayerMoney(playerid, 1000);
        SendClientMessage(playerid, -1, "Вы получили $1000");
    }
    
    return 1;
}

Удаление пикапа
Код:
DestroyPickup(pickupid);

Пример: динамические пикапы
Код:
enum PickupInfo
{
    pModel,
    pType,
    Float:pX,
    Float:pY,
    Float:pZ,
    pWorld,
    pPickupID
}

new PickupData[100][PickupInfo];
new TotalPickups = 0;

CreateDynamicPickup(modelid, type, Float:x, Float:y, Float:z, worldid)
{
    if(TotalPickups >= sizeof(PickupData))
    {
        return -1;
    }
    
    new pickupid = CreatePickup(modelid, type, x, y, z, worldid);
    
    PickupData[TotalPickups][pModel] = modelid;
    PickupData[TotalPickups][pType] = type;
    PickupData[TotalPickups][pX] = x;
    PickupData[TotalPickups][pY] = y;
    PickupData[TotalPickups][pZ] = z;
    PickupData[TotalPickups][pWorld] = worldid;
    PickupData[TotalPickups][pPickupID] = pickupid;
    
    TotalPickups++;
    return TotalPickups - 1;
}

RemoveDynamicPickup(pickupindex)
{
    if(pickupindex >= TotalPickups)
    {
        return 0;
    }
    
    DestroyPickup(PickupData[pickupindex][pPickupID]);
    
    // Сдвиг массива
    for(new i = pickupindex; i < TotalPickups - 1; i++)
    {
        PickupData[i] = PickupData[i + 1];
    }
    
    TotalPickups--;
    return 1;
}

Пример: пикапы оружия
Код:
new PICKUP_WEAPON_PISTOL;
new PICKUP_WEAPON_SHOTGUN;
new PICKUP_WEAPON_AK47;

public OnGameModeInit()
{
    PICKUP_WEAPON_PISTOL = CreatePickup(1274, 1, 1958.3783, 1343.1572, 15.3746, 0);
    PICKUP_WEAPON_SHOTGUN = CreatePickup(1274, 1, 1960.0, 1343.1572, 15.3746, 0);
    PICKUP_WEAPON_AK47 = CreatePickup(1274, 1, 1962.0, 1343.1572, 15.3746, 0);
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    if(pickupid == PICKUP_WEAPON_PISTOL)
    {
        GivePlayerWeapon(playerid, 22, 100);
        SendClientMessage(playerid, -1, "Вы подобрали пистолет");
    }
    else if(pickupid == PICKUP_WEAPON_SHOTGUN)
    {
        GivePlayerWeapon(playerid, 25, 50);
        SendClientMessage(playerid, -1, "Вы подобрали дробовик");
    }
    else if(pickupid == PICKUP_WEAPON_AK47)
    {
        GivePlayerWeapon(playerid, 30, 200);
        SendClientMessage(playerid, -1, "Вы подобрали AK-47");
    }
    return 1;
}

Пикапы в разных виртуальных мирах
Код:
// Пикап только в виртуальном мире 1
new pickup1 = CreatePickup(1240, 2, 0.0, 0.0, 3.0, 1);

// Пикап только в виртуальном мире 2
new pickup2 = CreatePickup(1241, 2, 0.0, 0.0, 3.0, 2);

// Пикап во всех мирах
new pickup3 = CreatePickup(1210, 1, 0.0, 0.0, 3.0, -1);

Важные моменты:
- Максимум 4096 пикапов на сервере
- Используйте разные типы для разных целей
- Сохраняйте ID пикапов для управления
- Учитывайте виртуальные миры при создании

Пикапы делают игровой мир интерактивным!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху