Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Архив (https://forum.zone-game.info/forumdisplay.php?f=185)
-   -   Осада Замка (https://forum.zone-game.info/showthread.php?t=15714)

Aaron 29.08.2011 00:24

Осада Замка
 
Приветствую Вас, Дамы и Господа.

Помогите разобраться, где я допускаю ошибку в данной проверке. Коротко поясню все, что требуется знать - у меня 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)

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

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

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

linliss 29.08.2011 00:27

Re: Осада Замка
 
переведите java.lang.NullPointerException на русский и все станет понятно

Aaron 29.08.2011 00:41

Re: Осада Замка
 
Гугл Транслейт "говорит" такой перевод - "Исключение нулевого указателя"

Я так понимаю, что возвращается нулевое значение либо он вообще не находит какого-либо значения ? Прошу прощения, не очень силен в ошибках Java.

linliss 29.08.2011 01:19

Re: Осада Замка
 
все правильно... возвращается нулевое значение...
варианты решения
1. сделать проверку на null
2. копать то что вы написали на наличие ошибок в коде, вдруг вы где-то ошиблись и у вас все время получается нулевое значение...

Aaron 29.08.2011 01:22

Re: Осада Замка
 
Скорей всего второе, ибо все SpiritId имеют значение от 1 до 3х.

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

Код:

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

            if (getCastle().getOwnerId() != 0)
            {
            if (attackclanwrite.getSpiritId() != player.getSpiritId())
          {


linliss 29.08.2011 04:23

Re: Осада Замка
 
значение SpiritId из бд правильно берете?

сделайте diff чтобы было видно что добавлено:)

Smiler 29.08.2011 10:13

Re: Осада Замка
 
рассмотрите внимательно эту строку.

attackclanwrite = ClanTable.getInstance().getClan(getCastle().getOwn erId()).getLeader().getPlayerInstance().getSpiritI d();

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

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

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

Aaron 29.08.2011 13:32

Re: Осада Замка
 
Господа, спасибо, что стараетесь помочь.

В общем я сделал так :
Код:

        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.

Господа, помогите пожалуйста выстроить эту логическую цепочку.


Текущее время: 21:28. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot