Нужны гайды?

accavit

Пляшущий с бубном
Участник
Сообщения
133
Розыгрыши
0
Решения
2
Репутация
0
Реакции
22
Баллы
220
Хроники
  1. Interlude
Исходники
Отсутствуют
Сборка
Lucera 1.7
1. Есть где-то объяснение того, как устроена работа bypass и как связать с его помощью кнопку в игре и код в ядре?
2. Как правильно подключать внешние скрипты из датапака и что в них можно писать?
3. Как устроены voice команды? Когда они срабатывают в игре и как правильно их написать самому и куда вставить?

Если есть уже готовые гайды на какие-то из этих тем, ткните, пожалуйста, пальцем туда.
Спасибо :)
 
только скрипты для интерфейса, хотя все равно слишком лень будет)
 

По вопросу #2:
В папке скриптов датапака можно создавать .java файл, в котором буду описывать любой новый созданный класс и ядро его подхватит и компилируется при загрузке сервера?
Если импортирую в этот мой созданный класс все нужные классы и пакеты, то могу переписать какую-то функцию, чтобы поменять в ней значения? Перед объявлением этой функции нужно вызывать @override ?
 
По вопросу #2:
В папке скриптов датапака можно создавать .java файл, в котором буду описывать любой новый созданный класс и ядро его подхватит и компилируется при загрузке сервера?
Если импортирую в этот мой созданный класс все нужные классы и пакеты, то могу переписать какую-то функцию, чтобы поменять в ней значения? Перед объявлением этой функции нужно вызывать @override ?
 
Psycho, да всё из этих статей понятно. Там банальные примеры с парой классов. А тут, на сервере л2 куча классов и методов. Все друг от друга перенимают и используют переменные и методы. Посмотрел я как написан TvTHandler.java в папке \data\scripts\handlers или как написан оффлайн трейд в папке \data\scripts\handlers\voice и на их примере решил написать свой новый класс L2GrandBossInstanceCustom:

Java:
package handlers;

import javolution.util.FastList;
import javolution.util.FastMap;
import ru.catssoftware.Config;
import ru.catssoftware.gameserver.model.L2Attackable;
import ru.catssoftware.gameserver.model.L2Boss;
import ru.catssoftware.gameserver.model.L2Character;
import ru.catssoftware.gameserver.model.L2Object;
import ru.catssoftware.gameserver.model.L2Skill;
import ru.catssoftware.gameserver.network.SystemMessageId;
import ru.catssoftware.gameserver.network.serverpackets.L2GameServerPacket;
import ru.catssoftware.gameserver.network.serverpackets.SystemMessage;
import ru.catssoftware.gameserver.taskmanager.AbstractIterativePeriodicTaskManager;
import ru.catssoftware.gameserver.templates.chars.L2NpcTemplate;
import ru.catssoftware.tools.random.Rnd;
import ru.catssoftware.util.Log;

public class L2GrandBossInstanceCustom extends L2GrandBossInstance {

  private byte _zoneId = 0;

  private static class GrandBossReturnHomeManager extends AbstractIterativePeriodicTaskManager<L2GrandBossInstance> {
    private static GrandBossReturnHomeManager _instance;
    
    private static GrandBossReturnHomeManager getInstance() {
      if (_instance == null)
        _instance = new GrandBossReturnHomeManager();
      return _instance;
    }
    
    private GrandBossReturnHomeManager() {
      super(5000);
    }
    
    protected void callTask(L2GrandBossInstance task) {
      task.returnHome();
    }
    
    protected String getCalledMethodName() {
      return "returnHome()";
    }
  }

  public L2GrandBossInstanceCustom(int objectId, L2NpcTemplate template) {
    super(objectId, template);
  }
 
  private void setupZone() {
    int npcId = getNpcId();
    if (npcId == 29001) {
      this._zoneId = 20;
    } else if (npcId == 29020) {
      this._zoneId = 21;
    } else if (npcId == 29022 || npcId == 13099) {
      this._zoneId = 22;
    }
  }
  @Override
  public void returnHome() {
    if (getSpawn() != null) {
      if (this._zoneId > 0) {
        if (!isDead() &&
          !isInsideRadius(getSpawn().getLocx(), getSpawn().getLocy(), 5000, false)) {
          clearAggroList();
          healFull();
          teleToLocation(getSpawn().getLocx(), getSpawn().getLocy(), getSpawn().getLocz());
          if (hasMinions())
            callMinions(true);
        }
      } else if (GrandBossReturnHomeManager.getInstance().hasTask(this)) {
        GrandBossReturnHomeManager.getInstance().stopTask(this);
      }
    } else if (GrandBossReturnHomeManager.getInstance().hasTask(this)) {
      GrandBossReturnHomeManager.getInstance().stopTask(this);
    }
  }
}
В импортах не уверен, что именно лишнее и нужно убрать. В коде убрал все ненужные public, оставил только private, конструктор класса текущего и самое нужное, что надо поменять - метод returnHome с аннотацией @override. У ТВТ класса там еще функция main прямо внутри класса.

Java:
    public static void main(String [] args) {
        // Устанавливаем хандлер для ТВТ эвента
        TvT.getInstance().setEventScript(new TVTHandler());
    }

Что именно надо прописывать для моего класса, вообще понятия не имею. А так вообще, в целом, заработает это?

Вообще, я просто хочу поменять значение вот в этой строке:
Java:
!isInsideRadius(getSpawn().getLocx(), getSpawn().getLocy(), 5000, false)
Сейчас у меня там стоит 2200. Надо сделать 5000 хотя бы. Из-за этого всех РБ невозможно далеко уводить. Тот же Баюм респавнится на свое место с фулл ХП, когда уводишь его чуть дальше середины башни.
 
Psycho, да всё из этих статей понятно. Там банальные примеры с парой классов. А тут, на сервере л2 куча классов и методов. Все друг от друга перенимают и используют переменные и методы. Посмотрел я как написан TvTHandler.java в папке \data\scripts\handlers или как написан оффлайн трейд в папке \data\scripts\handlers\voice и на их примере решил написать свой новый класс L2GrandBossInstanceCustom:

Java:
package handlers;

import javolution.util.FastList;
import javolution.util.FastMap;
import ru.catssoftware.Config;
import ru.catssoftware.gameserver.model.L2Attackable;
import ru.catssoftware.gameserver.model.L2Boss;
import ru.catssoftware.gameserver.model.L2Character;
import ru.catssoftware.gameserver.model.L2Object;
import ru.catssoftware.gameserver.model.L2Skill;
import ru.catssoftware.gameserver.network.SystemMessageId;
import ru.catssoftware.gameserver.network.serverpackets.L2GameServerPacket;
import ru.catssoftware.gameserver.network.serverpackets.SystemMessage;
import ru.catssoftware.gameserver.taskmanager.AbstractIterativePeriodicTaskManager;
import ru.catssoftware.gameserver.templates.chars.L2NpcTemplate;
import ru.catssoftware.tools.random.Rnd;
import ru.catssoftware.util.Log;

public class L2GrandBossInstanceCustom extends L2GrandBossInstance {

  private byte _zoneId = 0;

  private static class GrandBossReturnHomeManager extends AbstractIterativePeriodicTaskManager<L2GrandBossInstance> {
    private static GrandBossReturnHomeManager _instance;
   
    private static GrandBossReturnHomeManager getInstance() {
      if (_instance == null)
        _instance = new GrandBossReturnHomeManager();
      return _instance;
    }
   
    private GrandBossReturnHomeManager() {
      super(5000);
    }
   
    protected void callTask(L2GrandBossInstance task) {
      task.returnHome();
    }
   
    protected String getCalledMethodName() {
      return "returnHome()";
    }
  }

  public L2GrandBossInstanceCustom(int objectId, L2NpcTemplate template) {
    super(objectId, template);
  }
 
  private void setupZone() {
    int npcId = getNpcId();
    if (npcId == 29001) {
      this._zoneId = 20;
    } else if (npcId == 29020) {
      this._zoneId = 21;
    } else if (npcId == 29022 || npcId == 13099) {
      this._zoneId = 22;
    }
  }
  @Override
  public void returnHome() {
    if (getSpawn() != null) {
      if (this._zoneId > 0) {
        if (!isDead() &&
          !isInsideRadius(getSpawn().getLocx(), getSpawn().getLocy(), 5000, false)) {
          clearAggroList();
          healFull();
          teleToLocation(getSpawn().getLocx(), getSpawn().getLocy(), getSpawn().getLocz());
          if (hasMinions())
            callMinions(true);
        }
      } else if (GrandBossReturnHomeManager.getInstance().hasTask(this)) {
        GrandBossReturnHomeManager.getInstance().stopTask(this);
      }
    } else if (GrandBossReturnHomeManager.getInstance().hasTask(this)) {
      GrandBossReturnHomeManager.getInstance().stopTask(this);
    }
  }
}
В импортах не уверен, что именно лишнее и нужно убрать. В коде убрал все ненужные public, оставил только private, конструктор класса текущего и самое нужное, что надо поменять - метод returnHome с аннотацией @override. У ТВТ класса там еще функция main прямо внутри класса.

Java:
    public static void main(String [] args) {
        // Устанавливаем хандлер для ТВТ эвента
        TvT.getInstance().setEventScript(new TVTHandler());
    }

Что именно надо прописывать для моего класса, вообще понятия не имею. А так вообще, в целом, заработает это?

Вообще, я просто хочу поменять значение вот в этой строке:
Java:
!isInsideRadius(getSpawn().getLocx(), getSpawn().getLocy(), 5000, false)
Сейчас у меня там стоит 2200. Надо сделать 5000 хотя бы. Из-за этого всех РБ невозможно далеко уводить. Тот же Баюм респавнится на свое место с фулл ХП, когда уводишь его чуть дальше середины башни.
Так у тебя там из коробки вроде 5000 идет значение. Можешь вообще как отдельный конфиг вывести, для удобства.
Java:
package ru.catssoftware.gameserver.model.actor.instance;

import ru.catssoftware.gameserver.model.L2Boss;
import ru.catssoftware.gameserver.model.L2Character;
import ru.catssoftware.gameserver.model.L2Skill;
import ru.catssoftware.gameserver.model.zone.L2Zone;
import ru.catssoftware.gameserver.taskmanager.AbstractIterativePeriodicTaskManager;
import ru.catssoftware.gameserver.templates.chars.L2NpcTemplate;

public class L2GrandBossInstance extends L2Boss
{
    protected boolean    _isInSocialAction        = false;
    private byte        _zoneId                    = 0;

    private static class GrandBossReturnHomeManager extends AbstractIterativePeriodicTaskManager<L2GrandBossInstance>
    {
        private static GrandBossReturnHomeManager _instance;

        private static GrandBossReturnHomeManager getInstance()
        {
            if (_instance == null)
                _instance = new GrandBossReturnHomeManager();
            return _instance;
        }

        private GrandBossReturnHomeManager()
        {
            super(5000);
        }

        @Override
        protected void callTask(L2GrandBossInstance task)
        {
            task.returnHome();
        }

        @Override
        protected String getCalledMethodName()
        {
            return "returnHome()";
        }
    }

    public boolean isInSocialAction()
    {
        return _isInSocialAction;
    }

    public void setIsInSocialAction(boolean value)
    {
        _isInSocialAction = value;
    }

    public L2GrandBossInstance(int objectId, L2NpcTemplate template)
    {
        super(objectId, template);
    }

    @Override
    public boolean doDie(L2Character killer)
    {
        if (!super.doDie(killer))
            return false;

        if(_lair!=null)
            _lair.setRespawn();
        return true;
    }

    @Override
    public void reduceCurrentHp(double damage, L2Character attacker, boolean awake, boolean isDOT, L2Skill skill)
    {
        if (isInSocialAction() || isInvul())
            return;
        super.reduceCurrentHp(damage, attacker, awake, isDOT, skill);
    }

    @Override
    public void doAttack(L2Character target)
    {
        if (_isInSocialAction)
            return;
        super.doAttack(target);
    }

    @Override
    public void doCast(L2Skill skill)
    {
        if (_isInSocialAction)
            return;
        super.doCast(skill);
    }

    @Override
    public void onSpawn()
    {
        setIsRaid(true);
        setIsGrandBoss(true);
        setupZone();
        super.onSpawn();
        GrandBossReturnHomeManager.getInstance().startTask(this);
    }

    private void setupZone()
    {
        int npcId = getNpcId();
        if (npcId == 29001)
            _zoneId = L2Zone.FLAG_QUEEN;
        else if (npcId == 29020)
            _zoneId = 21;
        else if (npcId == 29022 || npcId == 13099)
            _zoneId = 22;
    }

    @Override
    public void deleteMe()
    {
        if (GrandBossReturnHomeManager.getInstance().hasTask(this))
            GrandBossReturnHomeManager.getInstance().stopTask(this);
        super.deleteMe();
    }

    public void returnHome()
    {
        
        if (getSpawn() != null)
        {
            if (_zoneId > 0)
            {
                if (!isDead())
                {
                    if (!isInsideZone(_zoneId))
                    {
                        clearAggroList();
                        healFull();
                        teleToLocation(getSpawn().getLocx(), getSpawn().getLocy(), getSpawn().getLocz());
                        if (hasMinions())
                            callMinions(true);
                    }
                }
            }
            else if (GrandBossReturnHomeManager.getInstance().hasTask(this))
                GrandBossReturnHomeManager.getInstance().stopTask(this);
        }
        else if (GrandBossReturnHomeManager.getInstance().hasTask(this))
            GrandBossReturnHomeManager.getInstance().stopTask(this);
    }

    @Override
    public L2GrandBossInstance getGrandBoss()
    {
        return this;
    }

    @Override
    public boolean isGrandBoss()
    {
        return true;
    }
}
Java:
package ru.catssoftware.gameserver.model;

import ru.catssoftware.gameserver.ThreadPoolManager;
import ru.catssoftware.gameserver.instancemanager.BossSpawnManager;
import ru.catssoftware.gameserver.instancemanager.RaidPointsManager;
import ru.catssoftware.gameserver.instancemanager.grandbosses.BossLair;
import ru.catssoftware.gameserver.model.actor.instance.L2MonsterInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.network.SystemMessageId;
import ru.catssoftware.gameserver.network.serverpackets.SystemMessage;
import ru.catssoftware.gameserver.templates.chars.L2NpcTemplate;
import ru.catssoftware.tools.random.Rnd;

public abstract class L2Boss extends L2MonsterInstance
{
    private static final int    BOSS_MAINTENANCE_INTERVAL    = 10000;

    public static final int        BOSS_INTERACTION_DISTANCE    = 500;

    public L2Boss(int objectId, L2NpcTemplate template)
    {
        super(objectId, template);
    }

    private BossSpawnManager.StatusEnum    _raidStatus;

    public BossLair _lair;
    @Override
    protected int getMaintenanceInterval()
    {
        return BOSS_MAINTENANCE_INTERVAL;
    }

    @Override
    public boolean doDie(L2Character killer)
    {
        if (!super.doDie(killer))
            return false;

        L2PcInstance player = killer.getPlayer();
        if (player != null)
        {
            broadcastPacket(new SystemMessage(SystemMessageId.RAID_WAS_SUCCESSFUL));
            if (player.getParty() != null)
            {
                for (L2PcInstance member : player.getParty().getPartyMembers())
                    rewardRaidPoints(member);
            }
            else
                rewardRaidPoints(player);
        }
        if(_lair!=null)
            _lair.setUnspawn();
        return true;
    }
    
    private void rewardRaidPoints(L2PcInstance player)
    {
        int points = (getLevel() / 2) + Rnd.get(-5, 5);
        RaidPointsManager.addPoints(player, getNpcId(), points);
        SystemMessage sm = new SystemMessage(SystemMessageId.EARNED_S1_RAID_POINTS);
        sm.addNumber(points);
        player.sendPacket(sm);
    }
    
    @Override
    public boolean hasRandomAnimation()
    {
        return false;
    }

    @Override
    protected boolean canInteract(L2PcInstance player)
    {
        return isInsideRadius(player, BOSS_INTERACTION_DISTANCE, false, false);
    }

    public void setRaidStatus(BossSpawnManager.StatusEnum status)
    {
        _raidStatus = status;
    }

    public BossSpawnManager.StatusEnum getRaidStatus()
    {
        return _raidStatus;
    }

    /**
     * Спавн всех миньенов босса
     * Если миньен не около босса, то возвращаем его к боссу
     */
    @Override
    protected void manageMinions()
    {
        _minionList.spawnMinions();
        _minionMaintainTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Runnable()
        {
            public void run()
            {
                L2Spawn bossSpawn = getSpawn();
                if (!isInsideRadius(bossSpawn.getLocx(), bossSpawn.getLocy(), bossSpawn.getLocz(), 5000, true, false))
                {
                    teleToLocation(bossSpawn.getLocx(), bossSpawn.getLocy(), bossSpawn.getLocz(), true);
                    healFull();
                }
                _minionList.maintainMinions();
            }
        }, 60000, getMaintenanceInterval() + Rnd.get(5000));
    }

    @Override
    public void reduceCurrentHp(double damage, L2Character attacker, boolean awake, boolean isDOT, L2Skill skill)
    {
        super.reduceCurrentHp(damage, attacker, awake, isDOT, skill);
    }

    public void healFull()
    {
        super.getStatus().setCurrentHp(super.getMaxHp());
        super.getStatus().setCurrentMp(super.getMaxMp());
    }

    @Override
    public boolean isBoss()
    {
        return true;
    }

    @Override
    public L2Boss getBoss()
    {
        return this;
    }
}
 
Psycho, с коробки 2200 было, я поменял уже на 5000. Все, спасибо, с этим вопросом разобрался :) Не стал делать через внешний скрипт. 10 раз перезапускал сервер после каждого исправления ерроров и все равно ни к чему не привело. В итоге нашел гайд на ютубе от одного майнкрафтера какого-то и в IntellijIDEA декомпилировал нужный класс из ядра, поменял значения, подправил косяки и скомпилировал обратно. Все получилось. :)
 
А вообще насколько реально новичку реализовать свой евент? (например батлрояль в отзеркаленных катакомбах с рандомящимися скиллами)
Новичкам я бы не советовал к релизу эвентов вообще приближаться. Для начала на простых скриптах нужно скилл набивать.
 
Назад
Сверху Снизу