Осада Замка - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Архив

Архив Темы с сомнительной полезностью.
Описание темы:проверка при записи на осаду замка

Ответ
Опции темы
Непрочитано 29.08.2011, 00:24   #1
Аватар для Aaron
Пользователь

Автор темы (Топик Стартер) Осада Замка

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

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

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

С уважением, Аарон.
__________________
Иной раз Нищий, решает судьбу целого Царства. (С) Аарон Салутари
Aaron вне форума Отправить сообщение для Aaron с помощью ICQ Ответить с цитированием
Непрочитано 29.08.2011, 00:27   #2
Аватар для linliss
Герой

По умолчанию Re: Осада Замка

переведите java.lang.NullPointerException на русский и все станет понятно
linliss вне форума Ответить с цитированием
Непрочитано 29.08.2011, 00:41   #3
Аватар для Aaron
Пользователь

Автор темы (Топик Стартер) Re: Осада Замка

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

Я так понимаю, что возвращается нулевое значение либо он вообще не находит какого-либо значения ? Прошу прощения, не очень силен в ошибках Java.
__________________
Иной раз Нищий, решает судьбу целого Царства. (С) Аарон Салутари
Aaron вне форума Отправить сообщение для Aaron с помощью ICQ Ответить с цитированием
Непрочитано 29.08.2011, 01:19   #4
Аватар для linliss
Герой

По умолчанию Re: Осада Замка

все правильно... возвращается нулевое значение...
варианты решения
1. сделать проверку на null
2. копать то что вы написали на наличие ошибок в коде, вдруг вы где-то ошиблись и у вас все время получается нулевое значение...
linliss вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 29.08.2011, 01:22   #5
Аватар для Aaron
Пользователь

Автор темы (Топик Стартер) Re: Осада Замка

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

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

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

            if (getCastle().getOwnerId() != 0)
            {
            if (attackclanwrite.getSpiritId() != player.getSpiritId())
          {
__________________
Иной раз Нищий, решает судьбу целого Царства. (С) Аарон Салутари
Aaron вне форума Отправить сообщение для Aaron с помощью ICQ Ответить с цитированием
Непрочитано 29.08.2011, 04:23   #6
Аватар для linliss
Герой

По умолчанию Re: Осада Замка

значение SpiritId из бд правильно берете?

сделайте diff чтобы было видно что добавлено
linliss вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 29.08.2011, 10:13   #7
Олдфаг

По умолчанию 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

проверяйте сначала есть ли в принципе владелец у замка, а уже потом получайте данные клана.
Smiler вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 29.08.2011, 13:32   #8
Аватар для Aaron
Пользователь

Автор темы (Топик Стартер) 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.

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

Последний раз редактировалось Aaron; 29.08.2011 в 18:06. Причина: Добавлено сообщение
Aaron вне форума Отправить сообщение для Aaron с помощью ICQ Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[help]Осада 3 раза в неделю Bacek Работа со скриптами 11 06.11.2011 21:11
рабочая осада popopom Серверная часть 36 28.09.2010 14:17
Осада форт Papik Aion 3 16.09.2010 05:23
Помогите Скрипт Замка Astend Работа со скриптами 2 25.08.2010 16:53
Осада ukraina Lineage II 3 26.12.2009 23:32


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 00:08. Часовой пояс GMT +3.

Вверх