Проблема с байпасом и скриптом. l2jmobius

Статус
В этой теме нельзя размещать новые ответы.

BERG

Знаменитый
Участник
Сообщения
25
Розыгрыши
0
Репутация
0
Реакции
6
Баллы
1 235
Хроники
  1. Fafurion
Исходники
Присутствуют
Сборка
L2jmobius Fafurion
Ребят, День Добрый!
Исходники: L2jmobius.
Суть проблемы при включении в конфигах сервера фичи FindPvp, и добавлении байпаса на вызов в альт б, такая вот ошибка
в клиенте

ГС выдает такое:

Код:
Exception processing bypass from Player:Amobus[268489484]: FindPvP Cannot invoke "org.l2jmobius.gameserver.model.actor.Creature.isNpc()" because "target" is null

В логах такой варнинг

Код:
WARNING    83    org.l2jmobius.gameserver.network.PacketLogger    Exception processing bypass from Player:Amobus[268489484]: FindPvP Cannot invoke "org.l2jmobius.gameserver.model.actor.Creature.isNpc()" because "target" is null

Спасибо!
 
Решение
Попробуйте вот так... только в папочку handlers.communityboard закиньте и байпас вот такой вот bypass FindPvP и в masterhandler не забудь-те прописать :)
Java:
package handlers.communityboard;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.handler.IParseBoardHandler;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.serverpackets.CreatureSay;

/**
 * @author Mobius (based on Tenkai pvpzone)
 */
public class...
Не может найти объект таргет для функции isNpc();
В Ява исходниках не силен. По вашей сборке не помогу, вызывайте Ява любителей :)
 
  • Мне нравится
Реакции: BERG

    BERG

    Баллов: 3
    За ответ
Я аналогично не силен, лишь встал на дорогу познания 😂:pandaredlol:
.
Или же оно ругается на то что я добавил байпас в альт б, а не к НПС к примеру?
 
  • Мне нравится
Реакции: BERG
Да проблема оказалась в том что стоит проверка на таргет НПС.
Тогда прошу помочь еще с одним, как от нее избавиться или же переделать на Альт Б. Тыкните носом куда смотреть. Моих знаний пока не хватает с такой элементарной проблемой разобраться:Stressed:

Код:
package handlers.bypasshandlers;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.handler.IBypassHandler;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.serverpackets.CreatureSay;

/**
 * @author Mobius (based on Tenkai pvpzone)
 */
public class FindPvP implements IBypassHandler
{
    private static final String[] COMMANDS =
    {
        "FindPvP"
    };
    
    @Override
    public boolean useBypass(String command, Player player, Creature target)
    {
        if (!Config.ENABLE_FIND_PVP || !target.isNpc())
        {
            return false;
        }
        
        Player mostPvP = null;
        int max = -1;
        for (Player plr : World.getInstance().getPlayers())
        {
            if ((plr == null) //
                || (plr.getPvpFlag() == 0) //
                || (plr.getInstanceId() != 0) //
                || plr.isGM() //
                || plr.isInsideZone(ZoneId.PEACE) //
                || plr.isInsideZone(ZoneId.SIEGE) //
                || plr.isInsideZone(ZoneId.NO_SUMMON_FRIEND))
            {
                continue;
            }
            
            int count = 0;
            for (Player pl : World.getInstance().getVisibleObjects(plr, Player.class))
            {
                if ((pl.getPvpFlag() > 0) && !pl.isInsideZone(ZoneId.PEACE))
                {
                    count++;
                }
            }
            
            if (count > max)
            {
                max = count;
                mostPvP = plr;
            }
        }
        
        if (mostPvP != null)
        {
            // Check if the player's clan is already outnumbering the PvP
            if (player.getClan() != null)
            {
                final Map<Integer, Integer> clanNumbers = new HashMap<>();
                int allyId = player.getAllyId();
                if (allyId == 0)
                {
                    allyId = player.getClanId();
                }
                clanNumbers.put(allyId, 1);
                for (Player known : World.getInstance().getVisibleObjects(mostPvP, Player.class))
                {
                    int knownAllyId = known.getAllyId();
                    if (knownAllyId == 0)
                    {
                        knownAllyId = known.getClanId();
                    }
                    if (knownAllyId != 0)
                    {
                        if (clanNumbers.containsKey(knownAllyId))
                        {
                            clanNumbers.put(knownAllyId, clanNumbers.get(knownAllyId) + 1);
                        }
                        else
                        {
                            clanNumbers.put(knownAllyId, 1);
                        }
                    }
                }
                
                int biggestAllyId = 0;
                int biggestAmount = 2;
                for (Entry<Integer, Integer> clanNumber : clanNumbers.entrySet())
                {
                    if (clanNumber.getValue() > biggestAmount)
                    {
                        biggestAllyId = clanNumber.getKey();
                        biggestAmount = clanNumber.getValue();
                    }
                }
                
                if (biggestAllyId == allyId)
                {
                    player.sendPacket(new CreatureSay(null, ChatType.WHISPER, target.getName(), "Sorry, your clan/ally is outnumbering the place already so you can't move there."));
                    return true;
                }
            }
            
            player.teleToLocation((mostPvP.getX() + Rnd.get(300)) - 150, (mostPvP.getY() + Rnd.get(300)) - 150, mostPvP.getZ());
            player.setSpawnProtection(true);
            if (!player.isGM())
            {
                player.setPvpFlagLasts(System.currentTimeMillis() + Config.PVP_PVP_TIME);
                player.startPvPFlag();
            }
        }
        else
        {
            player.sendPacket(new CreatureSay(null, ChatType.WHISPER, target.getName(), "Sorry, I can't find anyone in flag status right now."));
        }
        return false;
    }
    
    @Override
    public String[] getBypassList()
    {
        return COMMANDS;
    }
}
 
Да проблема оказалась в том что стоит проверка на таргет НПС.
Тогда прошу помочь еще с одним, как от нее избавиться или же переделать на Альт Б. Тыкните носом куда смотреть. Моих знаний пока не хватает с такой элементарной проблемой разобраться:Stressed:

Код:
package handlers.bypasshandlers;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.handler.IBypassHandler;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.serverpackets.CreatureSay;

/**
 * @author Mobius (based on Tenkai pvpzone)
 */
public class FindPvP implements IBypassHandler
{
    private static final String[] COMMANDS =
    {
        "FindPvP"
    };
   
    @Override
    public boolean useBypass(String command, Player player, Creature target)
    {
        if (!Config.ENABLE_FIND_PVP || !target.isNpc())
        {
            return false;
        }
       
        Player mostPvP = null;
        int max = -1;
        for (Player plr : World.getInstance().getPlayers())
        {
            if ((plr == null) //
                || (plr.getPvpFlag() == 0) //
                || (plr.getInstanceId() != 0) //
                || plr.isGM() //
                || plr.isInsideZone(ZoneId.PEACE) //
                || plr.isInsideZone(ZoneId.SIEGE) //
                || plr.isInsideZone(ZoneId.NO_SUMMON_FRIEND))
            {
                continue;
            }
           
            int count = 0;
            for (Player pl : World.getInstance().getVisibleObjects(plr, Player.class))
            {
                if ((pl.getPvpFlag() > 0) && !pl.isInsideZone(ZoneId.PEACE))
                {
                    count++;
                }
            }
           
            if (count > max)
            {
                max = count;
                mostPvP = plr;
            }
        }
       
        if (mostPvP != null)
        {
            // Check if the player's clan is already outnumbering the PvP
            if (player.getClan() != null)
            {
                final Map<Integer, Integer> clanNumbers = new HashMap<>();
                int allyId = player.getAllyId();
                if (allyId == 0)
                {
                    allyId = player.getClanId();
                }
                clanNumbers.put(allyId, 1);
                for (Player known : World.getInstance().getVisibleObjects(mostPvP, Player.class))
                {
                    int knownAllyId = known.getAllyId();
                    if (knownAllyId == 0)
                    {
                        knownAllyId = known.getClanId();
                    }
                    if (knownAllyId != 0)
                    {
                        if (clanNumbers.containsKey(knownAllyId))
                        {
                            clanNumbers.put(knownAllyId, clanNumbers.get(knownAllyId) + 1);
                        }
                        else
                        {
                            clanNumbers.put(knownAllyId, 1);
                        }
                    }
                }
               
                int biggestAllyId = 0;
                int biggestAmount = 2;
                for (Entry<Integer, Integer> clanNumber : clanNumbers.entrySet())
                {
                    if (clanNumber.getValue() > biggestAmount)
                    {
                        biggestAllyId = clanNumber.getKey();
                        biggestAmount = clanNumber.getValue();
                    }
                }
               
                if (biggestAllyId == allyId)
                {
                    player.sendPacket(new CreatureSay(null, ChatType.WHISPER, target.getName(), "Sorry, your clan/ally is outnumbering the place already so you can't move there."));
                    return true;
                }
            }
           
            player.teleToLocation((mostPvP.getX() + Rnd.get(300)) - 150, (mostPvP.getY() + Rnd.get(300)) - 150, mostPvP.getZ());
            player.setSpawnProtection(true);
            if (!player.isGM())
            {
                player.setPvpFlagLasts(System.currentTimeMillis() + Config.PVP_PVP_TIME);
                player.startPvPFlag();
            }
        }
        else
        {
            player.sendPacket(new CreatureSay(null, ChatType.WHISPER, target.getName(), "Sorry, I can't find anyone in flag status right now."));
        }
        return false;
    }
   
    @Override
    public String[] getBypassList()
    {
        return COMMANDS;
    }
}
Самый главный вопрос - а какой у вас байпас ?

да и второй вопрос - зачем используете НПС bypass если есть parseCommunityBoardCommand ?
1661443514941.png
папочка, которая команды в Коммунити Борде даже отдельно выделена
 
  • Мне нравится
Реакции: BERG

    BERG

    Баллов: 7
    За помощь
C++:
public boolean useBypass(String command, Player player, Creature target)
    {
        if (!Config.ENABLE_FIND_PVP || !target.isNpc())
        {
            return false;
        }
Функция принимает стринг команды, объект игрока и обьект таргет существа, далее идёт проверка включено ли событие в конфиге и НЕ является ли таргет нпс-ом
 
  • Мне нравится
Реакции: BERG
Самый главный вопрос - а какой у вас байпас ?
Вы это имеете ввиду ?
Код:
bypass -h FindPvP

C++:
public boolean useBypass(String command, Player player, Creature target)
    {
        if (!Config.ENABLE_FIND_PVP || !target.isNpc())
        {
            return false;
        }
Функция принимает стринг команды, объект игрока и обьект таргет существа, далее идёт проверка включено ли событие в конфиге и НЕ является ли таргет нпс-ом
Логику скрипта с вашей помощью я понял, вопрос у меня заключается в том каким образом его изменить чтобы убрать привязку даного скрипта к НПС, а получить возможность вызывать данный скрипт при нажатии на "кнопку" в Альт Б.
 
Самый простой, удалить принимаемый параметр таргет из функции и удалить проверку является ли таргет НПЦ, более разумный, довести до ума передачу аргументов так, чтобы объект таргет все таки передавался, при нажатии кнопки из альт б. Для этого надо копнуть именно в том направлении, откуда вызывается функция финдпвп. был бы это исходник птс, я бы вам помог, но с архитектурой л2дж я не знаком, мистера кирилла ждите, он в мобиусе как рыба в воде))
 
  • Мне нравится
Реакции: BERG

    MrKirill1232

    Баллов: 5
    all hail mobius XD
да и второй вопрос - зачем используете НПС bypass если есть parseCommunityBoardCommand ?
Посмотреть вложение 45175
папочка, которая команды в Коммунити Борде даже отдельно выделена
Самый простой, удалить принимаемый параметр таргет из функции и удалить проверку является ли таргет НПЦ, более разумный, довести до ума передачу аргументов так, чтобы объект таргет все таки передавался, при нажатии кнопки из альт б. Для этого надо копнуть именно в том направлении, откуда вызывается функция финдпвп. был бы это исходник птс, я бы вам помог, но с архитектурой л2дж я не знаком, мистера кирилла ждите, он в мобиусе как рыба в воде))
Спасибо вам ребята, помогли! понял смысл и логику где смотретреть дальше.
 
Попробуйте вот так... только в папочку handlers.communityboard закиньте и байпас вот такой вот bypass FindPvP и в masterhandler не забудь-те прописать :)
Java:
package handlers.communityboard;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.handler.IParseBoardHandler;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.serverpackets.CreatureSay;

/**
 * @author Mobius (based on Tenkai pvpzone)
 */
public class FindPvP implements IParseBoardHandler
{
   private static final String[] COMMANDS =
      {
         "FindPvP"
      };
   
   @Override
   public String[] getCommunityBoardCommands()
   {
      return COMMANDS;
   }
   
   @Override
   public boolean parseCommunityBoardCommand(String command, Player player)
   {
      if (!Config.ENABLE_FIND_PVP)
      {
         return false;
      }
      
      Player mostPvP = null;
      int max = -1;
      for (Player plr : World.getInstance().getPlayers())
      {
         if ((plr == null) //
            || (plr.getPvpFlag() == 0) //
            || (plr.getInstanceId() != 0) //
            || plr.isGM() //
            || plr.isInsideZone(ZoneId.PEACE) //
            || plr.isInsideZone(ZoneId.SIEGE) //
            || plr.isInsideZone(ZoneId.NO_SUMMON_FRIEND))
         {
            continue;
         }
         
         int count = 0;
         for (Player pl : World.getInstance().getVisibleObjects(plr, Player.class))
         {
            if ((pl.getPvpFlag() > 0) && !pl.isInsideZone(ZoneId.PEACE))
            {
               count++;
            }
         }
         
         if (count > max)
         {
            max = count;
            mostPvP = plr;
         }
      }
      
      if (mostPvP != null)
      {
         // Check if the player's clan is already outnumbering the PvP
         if (player.getClan() != null)
         {
            final Map<Integer, Integer> clanNumbers = new HashMap<>();
            int allyId = player.getAllyId();
            if (allyId == 0)
            {
               allyId = player.getClanId();
            }
            clanNumbers.put(allyId, 1);
            for (Player known : World.getInstance().getVisibleObjects(mostPvP, Player.class))
            {
               int knownAllyId = known.getAllyId();
               if (knownAllyId == 0)
               {
                  knownAllyId = known.getClanId();
               }
               if (knownAllyId != 0)
               {
                  if (clanNumbers.containsKey(knownAllyId))
                  {
                     clanNumbers.put(knownAllyId, clanNumbers.get(knownAllyId) + 1);
                  }
                  else
                  {
                     clanNumbers.put(knownAllyId, 1);
                  }
               }
            }
            
            int biggestAllyId = 0;
            int biggestAmount = 2;
            for (Entry<Integer, Integer> clanNumber : clanNumbers.entrySet())
            {
               if (clanNumber.getValue() > biggestAmount)
               {
                  biggestAllyId = clanNumber.getKey();
                  biggestAmount = clanNumber.getValue();
               }
            }
            
            if (biggestAllyId == allyId)
            {
               player.sendPacket(new CreatureSay(null, ChatType.WHISPER, player.getName(), "Sorry, your clan/ally is outnumbering the place already so you can't move there."));
               return true;
            }
         }
         
         player.teleToLocation((mostPvP.getX() + Rnd.get(300)) - 150, (mostPvP.getY() + Rnd.get(300)) - 150, mostPvP.getZ());
         player.setSpawnProtection(true);
         if (!player.isGM())
         {
            player.setPvpFlagLasts(System.currentTimeMillis() + Config.PVP_PVP_TIME);
            player.startPvPFlag();
         }
      }
      else
      {
         player.sendPacket(new CreatureSay(null, ChatType.WHISPER, player.getName(), "Sorry, I can't find anyone in flag status right now."));
      }
      return false;
   }
}
 
Последнее редактирование:
  • Мне нравится
Реакции: BERG
Решение
Попробуйте вот так... только в папочку handlers.communityboard закиньте и байпас вот такой вот bypass FindPvP и в masterhandler не забудь-те прописать :)
Java:
package handlers.communityboard;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.handler.IParseBoardHandler;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.serverpackets.CreatureSay;

/**
 * @author Mobius (based on Tenkai pvpzone)
 */
public class FindPvP implements IParseBoardHandler
{
   private static final String[] COMMANDS =
      {
         "FindPvP"
      };
  
   @Override
   public String[] getCommunityBoardCommands()
   {
      return COMMANDS;
   }
  
   @Override
   public boolean parseCommunityBoardCommand(String command, Player player)
   {
      if (!Config.ENABLE_FIND_PVP)
      {
         return false;
      }
     
      Player mostPvP = null;
      int max = -1;
      for (Player plr : World.getInstance().getPlayers())
      {
         if ((plr == null) //
            || (plr.getPvpFlag() == 0) //
            || (plr.getInstanceId() != 0) //
            || plr.isGM() //
            || plr.isInsideZone(ZoneId.PEACE) //
            || plr.isInsideZone(ZoneId.SIEGE) //
            || plr.isInsideZone(ZoneId.NO_SUMMON_FRIEND))
         {
            continue;
         }
        
         int count = 0;
         for (Player pl : World.getInstance().getVisibleObjects(plr, Player.class))
         {
            if ((pl.getPvpFlag() > 0) && !pl.isInsideZone(ZoneId.PEACE))
            {
               count++;
            }
         }
        
         if (count > max)
         {
            max = count;
            mostPvP = plr;
         }
      }
     
      if (mostPvP != null)
      {
         // Check if the player's clan is already outnumbering the PvP
         if (player.getClan() != null)
         {
            final Map<Integer, Integer> clanNumbers = new HashMap<>();
            int allyId = player.getAllyId();
            if (allyId == 0)
            {
               allyId = player.getClanId();
            }
            clanNumbers.put(allyId, 1);
            for (Player known : World.getInstance().getVisibleObjects(mostPvP, Player.class))
            {
               int knownAllyId = known.getAllyId();
               if (knownAllyId == 0)
               {
                  knownAllyId = known.getClanId();
               }
               if (knownAllyId != 0)
               {
                  if (clanNumbers.containsKey(knownAllyId))
                  {
                     clanNumbers.put(knownAllyId, clanNumbers.get(knownAllyId) + 1);
                  }
                  else
                  {
                     clanNumbers.put(knownAllyId, 1);
                  }
               }
            }
           
            int biggestAllyId = 0;
            int biggestAmount = 2;
            for (Entry<Integer, Integer> clanNumber : clanNumbers.entrySet())
            {
               if (clanNumber.getValue() > biggestAmount)
               {
                  biggestAllyId = clanNumber.getKey();
                  biggestAmount = clanNumber.getValue();
               }
            }
           
            if (biggestAllyId == allyId)
            {
               player.sendPacket(new CreatureSay(null, ChatType.WHISPER, player.getName(), "Sorry, your clan/ally is outnumbering the place already so you can't move there."));
               return true;
            }
         }
        
         player.teleToLocation((mostPvP.getX() + Rnd.get(300)) - 150, (mostPvP.getY() + Rnd.get(300)) - 150, mostPvP.getZ());
         player.setSpawnProtection(true);
         if (!player.isGM())
         {
            player.setPvpFlagLasts(System.currentTimeMillis() + Config.PVP_PVP_TIME);
            player.startPvPFlag();
         }
      }
      else
      {
         player.sendPacket(new CreatureSay(null, ChatType.WHISPER, player.getName(), "Sorry, I can't find anyone in flag status right now."));
      }
      return false;
   }
}

Все получилось, работает. Спасибо огромное :)(y)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу