Перейти к содержанию
Авторизация  
Gaikotsu

[Share] Пример Реализации Выдачи Временного Геройства (На Овероподобных Сборках)

Рекомендуемые сообщения

Простая реализация выдачи геройства до определенного времени и с автоматическим его отбиранием по истечению этого времени.

 

Реализация дял сборок на базе овера, так же с минимальными переделками подойдет и для сборок на базе феникса - надо лишь названия нескоторых классов переименовать и все.

 

Добавляем в класс Player следующее содержимое:

 

   private boolean _isTemporalHero = false;
   private Future<?> _deleteTemporalHeroTask;

   /**
    * Выдает игроку временное геройство
    * 
    * @param endTime    - время окончания геройства в мс
    * @param broadcast    - броадкстить или нет пакет с социалкой Victory
    */
   public boolean setTemporalHero(final long endTime, boolean broadcast)
   {
       if (isHero() || isTemporalHero())
           return false;

       _isTemporalHero = true;
       setHero(true);
       Hero.addSkills(this);
       sendPacket(new SkillList(this));
       updatePledgeClass();

       if (isHero() && broadcast)
           broadcastPacket(new SocialAction(getObjectId(), 16));

       broadcastUserInfo(true);
       setVar("temporalHero", endTime);

       if (_deleteTemporalHeroTask != null)
       {
           _deleteTemporalHeroTask.cancel(false);
           _deleteTemporalHeroTask = null;
       }

       _deleteTemporalHeroTask = ThreadPoolManager.getInstance().schedule(new DeleteTemporalHeroTask(this), endTime - System.currentTimeMillis());
       return true;
   }

   /**
    * Возвращает признак того, является ли игрок временным героем
    */
   public boolean isTemporalHero()
   {
       return _isTemporalHero;
   }

   /**
    * Досрочно забирает временное геройство у игрока 
    */
   public void forceEndTemporalHero()
   {
       if (!isTemporalHero())
           return;

       if (_deleteTemporalHeroTask != null)
           _deleteTemporalHeroTask.cancel(false);

       _deleteTemporalHeroTask = ThreadPoolManager.getInstance().schedule(new DeleteTemporalHeroTask(this), 500);
   }

   /**
    * Задача на удаление временного геройства
    */
   public class DeleteTemporalHeroTask extends RunnableImpl
   {
       private final Player _player;

       public DeleteTemporalHeroTask(Player player)
       {
           _player = player;
       }

       @Override
       public void runImpl() throws Exception
       {
           if (!_player.isHero() || !_player.isTemporalHero())
               return;

           _player._isTemporalHero = false;
           _player.setHero(false);
           Hero.removeSkills(_player);
           sendPacket(new SkillList(_player));
           _player.updatePledgeClass();
           _player.broadcastUserInfo(true);
           _player.unsetVar("temporalHero");
       }
   }

что какой метод делает понятно из комментариев.

 

так же добавляем в метод restore() этого же класса, куда нибудь в конец следующие строки:

   if (!player.isHero() && player.getVar("temporalHero") != null && System.currentTimeMillis() < Long.parseLong(player.getVar("temporalHero")))
       player.setTemporalHero(Long.parseLong(player.getVar("temporalHero")), false);

это для того, чтобы имеющийся статус временного геройства восстанавливался при входе в игру.

 

пример использования:

   /**
    * Выдача временного геройства
    */
   private final static boolean getHero(final Player player, final int idx)
   {
       if (!checkConditions(player, Service.GET_HERO))
           return true;

       if (idx < 0 || idx >= Config.CB_GET_HERO_DAYS.length)
           return true;

       if (player.isHero() || player.isTemporalHero())
       {
           player.sendMessage("Вы уже герой.");
           return false;
       }

       if (!ItemFunctions.checkRequiredItems(player, Config.CB_GET_HERO_ITEM[idx], Config.CB_GET_HERO_PRICE[idx]))
           return false;

       ItemFunctions.removeItem(player, Config.CB_GET_HERO_ITEM[idx], Config.CB_GET_HERO_PRICE[idx], true);

       player.setTemporalHero(System.currentTimeMillis() + Config.CB_GET_HERO_DAYS[idx] * 24 * 60 * 60 * 1000L, true);

       player.sendPopupMessage("Вы получили статус временного героя на " + Config.CB_GET_HERO_DAYS[idx] + " дней.", true);
       Log.add("get_hero|Character " + player.getName() + " acquired temporal hero status on " + Config.CB_GET_HERO_DAYS[idx] + " days.", "services");
       return true;
   }

  • Upvote 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если под l2p подразумевается Phoenix, то я же выше написал что да - придется только скажем поменять Player на L2Player, вместо RunnableImpl использовать просто Runnable и возможно еще всякие мелочи (типа по другиму называющихся используемых методов).

 

а в целом - принцип простой всего этого и легко разобравшись можно под любую сборку переписать.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...