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

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Показано с 1 по 10 из 10

Тема: Pickups

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,360
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Эмм, когда ты создаёшь пикап, в качестве индекса массива ты используешь значение переменной one_loot. А когда удаляешь, уже опираешься на ID пикапа. Где логика?


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

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

    Steve Pavlina

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

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


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

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

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

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,360
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от Fallen A. Посмотреть сообщение
    А еще создание и удаление может идти неравномерно, поэтому присутствует баг, в виде выхода за пределы массива.

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

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


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

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

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




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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,360
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Эмм, зачем ты создал 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;

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,360
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Благодарствую, ещё момент есть в игре,
    если ставить на модель ID капсулы или оружия начинает выдавать прикалюны разные как в сингле, это как нибудь отключается?
    Хмм, попробуй поменять тип пикапа. То ли 23, то ли 21 не имеет никакого эффекта
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

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

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

 

 

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

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

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

Ваши права

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