Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 10 из 10

Тема: Pickups

  1. #1
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±

    Pickups

    Делаю систему лута на пикапах, что то не совсем получается, вот код:
    PHP код:

    new pic_loot[MAX_PICKUPS], one_loot;

    //Вот так я создаю пикапы при смерти
    pic_loot[one_loot++] = CreatePickup(158022pos_x[playerid], pos_y[playerid] + 2.0pos_z[playerid], 0);


    public 
    OnPlayerPickUpPickup(playeridpickupid)
    {
        
    //printf("1 pickupid: %i| pic_loot[one_loot]: %i| one_loot: %i|", pickupid, pic_loot[one_loot], one_loot);
        
    if(pic_loot[1] <= pickupid <= pic_loot[one_loot])
        {
            
    //printf("2 pickupid: %i| pic_loot[one_loot]: %i| one_loot: %i|", pickupid, pic_loot[one_loot], one_loot);
            
    DestroyPickup(pickupid);
            
    one_loot--;
            
    //printf("3 pickupid: %i| pic_loot[one_loot]: %i| one_loot: %i|", pickupid, pic_loot[one_loot], one_loot);
            
    return SCM(playerid, -1, !"[TEST] Уничтожено!");
        }
        return 
    1;

    Когда я создам один пикап всё гуд, он подбирается и удаляется, когда два или более они не удаляются, как так сделать чтобы всё удалялось?
    (пример не где взять поэтому заколбасил с нуля)
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, когда ты создаёшь пикап, в качестве индекса массива ты используешь значение переменной one_loot. А когда удаляешь, уже опираешься на ID пикапа. Где логика?


    Я бы советовал использовать foreach и не париться. Создай итератор и вноси в него данные о пикапе, а после удаляй
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для Fallen A.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Адрес
    Минск, БССР
    Сообщений
    236
    Репутация:
    19 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, когда ты создаёшь пикап, в качестве индекса массива ты используешь значение переменной one_loot. А когда удаляешь, уже опираешься на ID пикапа. Где логика?


    Я бы советовал использовать foreach и не париться. Создай итератор и вноси в него данные о пикапе, а после удаляй
    А еще создание и удаление может идти неравномерно, поэтому присутствует баг, в виде выхода за пределы массива.

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

    Пересмотрел код: даже пересоздание случайного пикапа возможно.

  4. #4
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    А есть урок где нибудь как полноценно или правильно пользоваться foreach функциями/итераторами?

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

    p.s. вариант который мне надо сделать схож с этим что ниже?
      Открыть/закрыть

    Цитата Сообщение от ziggi Посмотреть сообщение
    Нет, это не прокатит. Твою проблему решить можно множеством способов, но я покажу самый удобный:
    Создадим массив итераторов TeamPlayer (константы MAX_TEAMS и MAX_TEAM_PLAYERS нужно заменить на свои):
    PHP код:
    new Iterator:TeamPlayer[MAX_TEAMS]<MAX_TEAM_PLAYERS>; 
    К сожалению, реализовать инициализацию массива итераторов во время компиляции у Y_Less не получилось, поэтому инициализируем при запуске:
    PHP код:
    public OnGameModeInit()
    {
        
    Iter_Init(TeamPlayer);

    Функция добавления игрока в команду (содержимое нужно добавить к своей)
    PHP код:
    stock AddPlayerToTeam(playeridteamid)
    {
        
    Iter_Add(TeamPlayer[teamid], playerid);

    Функция удаления игрока из команды (содержимое нужно добавить к своей):
    PHP код:
    stock RemovePlayerFromTeam(playeridteamid)
    {
        
    Iter_Remove(TeamPlayer[teamid], playerid);

    Тогда твой код можно будет написать так:
    PHP код:
    SetupFG(Iter_Random(TeamPlayer[1])); 
    Суть проста: используйте итераторы по полной, это удобно. И, чаще всего, это положительно сказывается на производительности.

    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  5. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Fallen A. Посмотреть сообщение
    А еще создание и удаление может идти неравномерно, поэтому присутствует баг, в виде выхода за пределы массива.

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

    Пересмотрел код: даже пересоздание случайного пикапа возможно.
    Я, собственно, это и имел ввиду. Если на сервере будет создан пикап от этой системы, достаточно создать 1 пикап, который к этой системе не относится, всё, код работать будет неверно.


    Цитата Сообщение от vovandolg Посмотреть сообщение
    А есть урок где нибудь как полноценно или правильно пользоваться foreach функциями/итераторами?

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

    p.s. вариант который мне надо сделать схож с этим что ниже?
      Открыть/закрыть




    Да
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #6
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Допустим вот что наколякал:
    PHP код:

    #define MAX_LOOT        (100)

    new Iterator:PickupLoot[MAX_LOOT]<MAX_PICKUPS>;

    public 
    OnGameModeInit()
    {
        
    Iter_Init(PickupLoot);
        return 
    1;
    }

    stock CreatePickupLoot(modeltypeFloat:XFloat:YFloat:Zvirtualworld 0)
    {
        new 
    pickID;
        
    pickID CreatePickup(modeltypeFloat:XFloat:YFloat:Zvirtualworld);
        
    Iter_Add(PickupLoot[pickID], pickID);
        return 
    1;
    }

    stock DestroyPickupLoot(pickupid)
    {
        
    Iter_Remove(PickupLoot[pickupid], pickupid);
        
    DestroyPickup(pickupid);
        return 
    1;
    }


    public 
    OnPlayerPickUpPickup(playeridpickupid)
    {
        if(
    PickupLoot[pickupid] == pickupid//Вот тут как правильно оформить проверку на соответствующий ID?
        
    {
            
    DestroyPickupLoot(PickupLoot[pickupid]);
            return 
    SCM(playerid, -1, !"[TEST] Del ...");
        }
        return 
    1;

    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  7. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, зачем ты создал MAX_LOOT? Двумерный массив тут не нужен. Найди тему о foreach на sa-mp.com и прочти её. Там всё о итераторах написано, если мне память не изменяет.

    Как-то так:
    PHP код:
    new Iterator:PickupLoot<MAX_PICKUPS>;

    stock CreatePickupLoot(modeltypeFloat:XFloat:YFloat:Zvirtualworld 0)
    {
        
    Iter_Add(PickupLootCreatePickup(modeltypeFloat:XFloat:YFloat:Zvirtualworld));
        return 
    1;
    }

    public 
    OnPlayerPickUpPickup(playeridpickupid)
    {
        foreach(new 
    iPickupLoot)
        {
            if(
    != pickupid) continue;
            
    DestroyPickup(i);
            
    Iter_SafeRemove(PickupLootii);
            return 
    SCM(playerid, -1, !"[TEST] Del ...");
        }    
        return 
    1;

    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. Пользователь сказал cпасибо:
    vovandolg (07.09.2016)
  9. #8
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Как-то так:
    PHP код:
    new Iterator:PickupLoot<MAX_PICKUPS>;

    stock CreatePickupLoot(modeltypeFloat:XFloat:YFloat:Zvirtualworld 0)
    {
        
    Iter_Add(PickupLootCreatePickup(modeltypeFloat:XFloat:YFloat:Zvirtualworld));
        return 
    1;
    }

    public 
    OnPlayerPickUpPickup(playeridpickupid)
    {
        foreach(new 
    iPickupLoot)
        {
            if(
    != pickupid) continue;
            
    DestroyPickup(i);
            
    Iter_SafeRemove(PickupLootii);
            return 
    SCM(playerid, -1, !"[TEST] Del ...");
        }    
        return 
    1;

    Благодарствую, ещё момент есть в игре,
    если ставить на модель ID капсулы или оружия начинает выдавать прикалюны разные как в сингле, это как нибудь отключается?
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  10. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Благодарствую, ещё момент есть в игре,
    если ставить на модель ID капсулы или оружия начинает выдавать прикалюны разные как в сингле, это как нибудь отключается?
    Хмм, попробуй поменять тип пикапа. То ли 23, то ли 21 не имеет никакого эффекта
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  11. Пользователь сказал cпасибо:
    vovandolg (08.09.2016)
  12. #10
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Вот блин, а я то думал как у меня на рп брались эти пикапы и не давали эффектов, а тут от типа зависит,
    23 не очень подошёл, 21 не было, поставил 19 то что нужно =)

    Всё спасибо, тема решена можно закрывать.
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •