Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Осада Замка
#1
Приветствую Вас, Дамы и Господа.

Помогите разобраться, где я допускаю ошибку в данной проверке. Коротко поясню все, что требуется знать - у меня L2j Freya, getSpiritId - это значение в таблице чаров ( int ) от 1 до 3х.

В
Код:
public void registerAttacker(L2PcInstance player, boolean force)

Делаю проверку на схожесть getSpiritId лидера клана, владеющего Замком и желающего записаться на осаду.

Код:
int attackclanwrite = 0;
         attackclanwrite = ClanTable.getInstance().getClan(getCastle().getOwnerId()).getLeader().getPlayerInstance().getSpiritId();

            if (attackclanwrite != player.getSpiritId())
          {
            saveSiegeClan(player.getClan(), ATTACKER, false);
          }

И если они разные, то произвести запись. Брал за основу вот это :

Код:
allyId = ClanTable.getInstance().getClan(getCastle().getOwnerId()).getAllyId();


Компилит IDEA без ошибок, но вот при записи на осаду выдает такое :

Код:
SEVERE: Client: [Character: Amiel[268479794] - Account: aaron - IP: 127.0.0.1] - Failed running: [C] a4 RequestJoinSiege - L2J Server Version: ${l2j.revision} - DP Revision: ${l2jdp.revision} ; null
java.lang.NullPointerException
    at com.l2jserver.gameserver.model.entity.Siege.registerAttacker(Siege.java:866)
    at com.l2jserver.gameserver.model.entity.Siege.registerAttacker(Siege.java:843)
    at com.l2jserver.gameserver.network.clientpackets.RequestJoinSiege.runImpl(RequestJoinSiege.java:72)
    at com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket.run(L2GameClientPacket.java:93)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Я так понимаю, что значение не считывается ?!

Прошу помочь найти верное решение, мною поставленной цели.

С уважением, Аарон.
Иной раз Нищий, решает судьбу целого Царства. (С) Аарон Салутари
Ответ
#2
переведите java.lang.NullPointerException на русский и все станет понятно
Ответ
#3
Гугл Транслейт "говорит" такой перевод - "Исключение нулевого указателя"

Я так понимаю, что возвращается нулевое значение либо он вообще не находит какого-либо значения ? Прошу прощения, не очень силен в ошибках Java.
Иной раз Нищий, решает судьбу целого Царства. (С) Аарон Салутари
Ответ
#4
все правильно... возвращается нулевое значение...
варианты решения
1. сделать проверку на null
2. копать то что вы написали на наличие ошибок в коде, вдруг вы где-то ошиблись и у вас все время получается нулевое значение...
Ответ
#5
Скорей всего второе, ибо все SpiritId имеют значение от 1 до 3х.

Возможно вот так будет более верно ?

Код:
L2PcInstance attackclanwrite = null;
         attackclanwrite = ClanTable.getInstance().getClan(getCastle().getOwnerId()).getLeader().getPlayerInstance();

            if (getCastle().getOwnerId() != 0)
            {
            if (attackclanwrite.getSpiritId() != player.getSpiritId())
          {
Иной раз Нищий, решает судьбу целого Царства. (С) Аарон Салутари
Ответ
#6
значение SpiritId из бд правильно берете?

сделайте diff чтобы было видно что добавленоSmile
Ответ
#7
рассмотрите внимательно эту строку.

attackclanwrite = ClanTable.getInstance().getClan(getCastle().getOwnerId()).getLeader().getPlayerInstance().getSpiritId();

если у замка нет владельца getCastle().getOwnerId() то тут будет скорее всего 0
и соответственно клан с ID 0 yе будет найден.
а раз ClanTable.getInstance().getClan(0) = NULL

Null.getLeader()
то при попытке получить лидера клана вызовет вашу NullPointerException

проверяйте сначала есть ли в принципе владелец у замка, а уже потом получайте данные клана.
Ответ
#8
Господа, спасибо, что стараетесь помочь.

В общем я сделал так :
Код:
L2PcInstance attackclanwrite = null;
       attackclanwrite = ClanTable.getInstance().getClan(getCastle().getOwnerId()).getLeader().getPlayerInstance();
             if (getCastle().getOwnerId() != 0)
            {
            if (attackclanwrite.getSpiritId() == player.getSpiritId())
          {
          return;
          }
            }

        if (force || checkIfCanRegister(player, ATTACKER))
        {
        saveSiegeClan(player.getClan(), ATTACKER, false); // Save to database
        }

Сделал проверку на владельца замка. IDEA показывает, что значение getSpiritId берется из PcInstance ( что есть верно, ибо именно там оно изымается из таблицы чаров ).

То, что getSpiritId извлекается из базы верно - я уверен, ибо уже делал с этой таблицей много наработок.

Я попробовал сделать такую проверку :

Код:
if (attackclanwrite == null)
           {
               return;
           }

В итоге она всегда срабатывает. Делаю проверку работоспособности attackclanwrite таким образом : Один чар(лидер клана) владелец замка Dion и имеет значение SpiritId == 3 , второй чар - владелец другого клана, имеет значение SpiritId == 2. По идее должно записывать на осаду.

Возможно, господа, я не правильно выстроил логическую цепочку в attackclanwrite ?
Просто мне нужно изъять у лидера клана, владеющего замком, его getSpiritId() из таблицы "characters".

С уважением, Аарон.

Добавлено через 4 часа 33 минуты
up.

Господа, помогите пожалуйста выстроить эту логическую цепочку.
Иной раз Нищий, решает судьбу целого Царства. (С) Аарон Салутари
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)