L2base платная. Эвент Пекло
Собственно после запуска сервера эвент провелся нормально, но второй раз народ не портануло, после проверки места телепортации оказалось что моб стоит и ждет своих бойцов. Ниже выкладываю ошибку и сам __init__.py
java.lang.NullPointerException
at net.sf.l2j.gameserver.model.L2Character.teleToLocation(L2Character.java:401)
at net.sf.l2j.gameserver.model.L2Character.teleToLocation(L2Character.java:425)
at sun.reflect.GeneratedMethodAccessor28.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.python.core.PyReflectedFunction.__call__(Unknown Source)
at org.python.core.PyMethod.__call__(Unknown Source)
at org.python.core.PyObject.__call__(Unknown Source)
at org.python.core.PyObject.invoke(Unknown Source)
at org.python.pycode.serializable._pyx1251098604648.onAdvEvent$5(__init__.py:108)
at org.python.pycode.serializable._pyx1251098604648.call_function(__init__.py)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyFunction.__call__(Unknown Source)
at org.python.core.PyMethod.__call__(Unknown Source)
at org.python.core.PyObject.__call__(Unknown Source)
at org.python.core.PyObject._jcallexc(Unknown Source)
at org.python.core.PyObject._jcall(Unknown Source)
at org.python.proxies.main$Quest$286.onAdvEvent(Unknown Source)
at net.sf.l2j.gameserver.model.quest.Quest.notifyEvent(Quest.java:299)
at net.sf.l2j.gameserver.model.quest.QuestTimer$ScheduleTimerTask.run(QuestTimer.java:38)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
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)
Сам инит:
from net.sf.l2j.gameserver.model.quest import State
from net.sf.l2j.gameserver.model.quest import QuestState
from net.sf.l2j.gameserver.datatables import DoorTable
from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
from net.sf.l2j.gameserver import Announcements
from net.sf.l2j import L2DatabaseFactory
from net.sf.l2j.gameserver.ai import CtrlIntention
from net.sf.l2j.util import Rnd
from java.lang import System
qn = "5555_Peklo"
ATTAKERS = []
tek = 0
nyj = 1
NAME = "peklo" # Название (только английские символы)
REGISTER = 55557 # Регистрирующий нпц. НЕ ЗАБЫВАЕМ ДЕЛАТЬ ЕГО БЕССМЕРТНЫМ.
locr = [82698,148638,-3473] # Соответственно координаты, где будет появляться НПЦ
PENI = 4037 # Итем, необходимый для участия
PENI_KOL = 0 # Сколько итемов необходимо для участия. Если хотите чтобы участие было бесплатным - поставте 0
TIME_FOR_WAIT = 90 # Время между ивентами в минутах
TIME_FOR_REG = 14 # Время на регистрацию в минутах
TEST_AFTER_RESTART = 10 # Время, через которое начнётся ивент после рестарта в минутах.
ANNOUNCE_INTERVAL = 2 # Как часто аннонсить о регистрации на ивент в минутах.
MOB = 55556 # Моб, которого надо убивать. С него ничего не должно дропаться. Желательно не менять, т.к. есть защита от незарегистрированных игроков.
locf = [98992,149040,-3240] # Соответственно координаты, где будет появляться 1 моб
RADIUS = 400 # Радиус появления мобов относительно 1 моба
MOB_R = 55555 # Моб, при помощи которого выдаётся награда. Здесь должен быть прописан дроп.
YCH_MIN = 1 # Минимальное количество участников
YCH_MAX = 20 # Максимальное количество участников.
MOBS_TO_CHEL = 5 # Количество мобов на человека. Максимальное количество мобов, которое придётся убить участникам за последний заход= кл-во участников * на MOBS_TO_CHEL.
DOORS = [] # Пишем сюда список DoorId дверей через запятую, которые необходимо закрывать/открывать по началу/окончанию ивента. Или оставляем пустым.
class Quest (JQuest) :
tek=0
nyj=1
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def init_LoadGlobalData(self) :
self.saveGlobalQuestVar("annom", "1")
closed = self.loadGlobalQuestVar("closed")
self.saveGlobalQuestVar("count", "0")
self.startQuestTimer("open", TEST_AFTER_RESTART *60000, None, None)
return
def onTalk (Self,npc,player):
npcId = npc.getNpcId()
if npcId == REGISTER:
if player not in ATTAKERS :
kolych = 0
for i in ATTAKERS :
kolych = kolych + 1
if kolych <= YCH_MAX :
if PENI_KOL<>0:
if st.getQuestItemsCount(PENI)>PENI_KOL:
st.takeItems(PENI,PENI_KOL)
ATTAKERS.append(player)
Self.saveGlobalQuestVar(str(player.getObjectId()), "in")
return "reg.htm"
else:
st.exitQuest(1)
return "nopeni.htm"
else:
ATTAKERS.append(player)
Self.saveGlobalQuestVar(str(player.getObjectId()), "in")
return "reg.htm"
else:
return "max.htm"
else:
return "yje.htm"
return
def onAdvEvent (self,event,npc,player):
global tek
global nyj
global ATTAKERS
closed = self.loadGlobalQuestVar("closed")
annom = int(self.loadGlobalQuestVar("annom"))
if event == "open" :
self.saveGlobalQuestVar("closed", "0")
self.saveGlobalQuestVar("annom", "1")
npc=self.addSpawn(REGISTER,locr[0],locr[1],locr[2],30000,False,0)
self.startQuestTimer("close", TIME_FOR_REG*60000, npc, None)
self.startQuestTimer("announce", ANNOUNCE_INTERVAL*60000, None, None)
Announcements.getInstance().announceToAll("Opened registration for "+str(NAME)+" event!")
if event == "close":
tek=0
nyj=1
self.startQuestTimer("open", TIME_FOR_WAIT*60000, None, None)
kolych = 0
for i in ATTAKERS :
kolych = kolych + 1
if kolych < YCH_MIN :
npc.deleteMe()
self.saveGlobalQuestVar("closed", "1")
Announcements.getInstance().announceToAll("Event "+str(NAME)+" was canceled.")
else:
self.saveGlobalQuestVar("kolych", str(kolych))
self.saveGlobalQuestVar("closed", "1")
if DOORS<>[]:
for i in DOORS:
DoorTable.getInstance().getDoor(int(i)).closeMe()
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has started!")
npc.deleteMe()
self.addSpawn(MOB,locf[0],locf[1],locf[2],30000,False,600000)
for i in ATTAKERS :
if i.isOnline() :
i.teleToLocation(98992,149040,-3240)
if event == "announce" and closed=="0" and (TIME_FOR_REG - ANNOUNCE_INTERVAL * int(annom))<>0:
Announcements.getInstance().announceToAll(str(TIME_FOR_REG - ANNOUNCE_INTERVAL * int(annom) ) + " minutes until event "+str(NAME)+" start!")
self.saveGlobalQuestVar("annom", str(annom+1))
self.startQuestTimer("announce", ANNOUNCE_INTERVAL*60000, None, None)
if event == "return" :
if DOORS<>[]:
for i in DOORS:
DoorTable.getInstance().getDoor(int(i)).openMe()
self.saveGlobalQuestVar("count", "0")
con=L2DatabaseFactory.getInstance().getConnection()
delchars=con.prepareStatement("DELETE FROM `quest_global_data` WHERE quest_name='5555_Peklo' AND value='in'")
try :
delchars.executeUpdate()
delchars.close()
con.close()
except :
try : con.close()
except : pass
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended!")
for i in ATTAKERS :
if i.isOnline() :
i.teleToLocation(locr[0],locr[1],locr[2])
ATTAKERS=[]
if event == "exit" :
ATTAKERS.remove(player)
con=L2DatabaseFactory.getInstance().getConnection()
delchars=con.prepareStatement("DELETE FROM `quest_global_data` WHERE quest_name='5555_Peklo' AND var=?")
delchars.setString(1, str(player.getObjectId()))
try :
delchars.executeUpdate()
delchars.close()
con.close()
except :
try : con.close()
except : pass
return "exit.htm"
return
def onAttack (self,npc,player,damage,isPet):
if player not in ATTAKERS :
if self.loadGlobalQuestVar(str(player.getObjectId())) == "in" :
ATTAKERS.append(player)
else:
player.teleToLocation(147725,-56517,9999)
return
def onKill(self,npc,player,isPet):
global tek
global nyj
mobcount=(MOBS_TO_CHEL * int(self.loadGlobalQuestVar("kolych")))
tek=tek+1
if tek==nyj and (2*nyj) < mobcount:
for i in range(0,2*tek) :
rand = Rnd.get(7)
if rand in [0,4] :
randx = 25*Rnd.get(20)
randy = 25*Rnd.get(20)
elif rand in [1,5] :
randx = -25*Rnd.get(20)
randy = -25*Rnd.get(20)
elif rand in [2,6] :
randx = 25*Rnd.get(20)
randy = -25*Rnd.get(20)
elif rand in [3,7] :
randx = -25*Rnd.get(20)
randy = 25*Rnd.get(20)
self.addSpawn(MOB,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,600000)
nyj=2*tek
tek=0
elif tek==nyj and (2*nyj) > mobcount:
for i in range(0,mobcount) :
rand = Rnd.get(7)
if rand in [0,4] :
randx = 25*Rnd.get(20)
randy = 25*Rnd.get(20)
elif rand in [1,5] :
randx = -25*Rnd.get(20)
randy = -25*Rnd.get(20)
elif rand in [2,6] :
randx = 25*Rnd.get(20)
randy = -25*Rnd.get(20)
elif rand in [3,7] :
randx = -25*Rnd.get(20)
randy = 25*Rnd.get(20)
self.addSpawn(MOB,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,600000)
nyj=mobcount+1
tek=0
elif tek==mobcount:
for i in range(0,mobcount) :
rand = Rnd.get(7)
if rand in [0,4] :
randx = 25*Rnd.get(20)
randy = 25*Rnd.get(20)
elif rand in [1,5] :
randx = -25*Rnd.get(20)
randy = -25*Rnd.get(20)
elif rand in [2,6] :
randx = 25*Rnd.get(20)
randy = -25*Rnd.get(20)
elif rand in [3,7] :
randx = -25*Rnd.get(20)
randy = 25*Rnd.get(20)
npc = self.addSpawn(MOB_R,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,600000)
npc.reduceCurrentHp(9999999,player)
npc.deleteMe()
self.startQuestTimer("return", 120000, None, None)
return
QUEST = Quest(5555, qn, "Peklo")
QUEST.addKillId(int(MOB))
QUEST.addAttackId(int(MOB))
QUEST.addStartNpc(int(REGISTER))
QUEST.addTalkId(int(REGISTER))
Мои соображения:
Вот эта строчка: at org.python.pycode.serializable._pyx1251098604648.onAdvEvent$5(__init__.py:108)
а 108 строчка в инит.ру это: i.teleToLocation(98992,149040,-3240)
Но, перед ней стоит : if i.isOnline() :
Может ошибка возникает из за того что игрок зарегистрировался но вышел из игры? И как бы портовать его нужно, но его нету.
а ты добавь в квест проверку на онлайн, если его нет то удаляем его из участников
вот по примеру этого
i=L2World.getInstance().getPlayer()
if i<>None:
if not i.isOnline():
ATTAKERS.remove()
Baium: а ты добавь в квест проверку на онлайн, если его нет то удаляем его из участников
вот по примеру этого
i=L2World.getInstance().getPlayer()
if i<>None:
if not i.isOnline():
ATTAKERS.remove()
Помоги вставить, не могу понять в какое именно место.
Baium: а ты добавь в квест проверку на онлайн, если его нет то удаляем его из участников
вот по примеру этого
i=L2World.getInstance().getPlayer()
if i<>None:
if not i.isOnline():
ATTAKERS.remove()
Идейка хорошая но как раз проверка на онлайн по словам автора есть.
Тут в чём то другом.
Пока не могу более точно сказать, беглый взгляд.
Хотя...
Я правильно понял что после рестарта сервера эвент перестаёт работать? Или просто при повторном использовании?
При повторном использовании, тоесть первый раз после рестарта он прошел нормально, потом через 90 минут опять обьявления о начале. Все записались, но портануть игроков не портануло, хотя на месте где должен стоять моб, он стоял, причем все работает - имею ввиду защиту от левых незарегестрированных игроков.
Градеск, проверка на онлайн такая что:
если онлайн то дальше портуем туда то, НО!!!!!! если не онлайн то что? Данного параметра нету:
if i.isOnline() :
i.teleToLocation(locf[0],locf[1],locf[2])
Только что решил проверить на домашнем компе этот эвент.
В этот раз убрал проверку онлайна, тоесть просто стер эту строчку, чтобы её не было. Загрузил 2 чаров, записался обоими, одним вышел. Второй остался в игре. Эвент начался - чара не портануло.
Ошибка:
WARNING: E:\Server La2Base PvP\data\scripts\quests\5555_Peklo\__init__.py
java.lang.NullPointerException
at net.sf.l2j.gameserver.model.L2Character.teleToLocation(L2Character.java:401)
at net.sf.l2j.gameserver.model.L2Character.teleToLocation(L2Character.java:425)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.python.core.PyReflectedFunction.__call__(Unknown Source)
at org.python.core.PyMethod.__call__(Unknown Source)
at org.python.core.PyObject.__call__(Unknown Source)
at org.python.core.PyObject.invoke(Unknown Source)
at org.python.pycode.serializable._pyx1251124148156.onAdvEvent$5(__init__.py:107)
at org.python.pycode.serializable._pyx1251124148156.call_function(__init__.py)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyFunction.__call__(Unknown Source)
at org.python.core.PyMethod.__call__(Unknown Source)
at org.python.core.PyObject.__call__(Unknown Source)
at org.python.core.PyObject._jcallexc(Unknown Source)
at org.python.core.PyObject._jcall(Unknown Source)
at org.python.proxies.main$Quest$18.onAdvEvent(Unknown Source)
at net.sf.l2j.gameserver.model.quest.Quest.notifyEvent(Quest.java:299)
at net.sf.l2j.gameserver.model.quest.QuestTimer$ScheduleTimerTask.run(QuestTimer.java:38)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:207)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
И еще, может ошибка в том что тут указаны координаты:
вначале было так:
нет, то что координаты указаны это нормально. Есть предположение что просто после повторного включения эвента не удаляются первоначальные параметры (список не чистится, моб не удаляется и тд и тп).
А то что иф не имеет конца это мелоч. Просто если чар не онлайн то ничего с ним делать и ненадо, по этому и действие описывать не стоит, ну можно допустим удалить его из списка... но это так... мелочи.
Тоесть можно попробовать полностью очистить все данные которые загрузил квест?
Есть другая версия пекла, там вот что:
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.stopAllEffects()
i.teleToLocation(locfp[0],locfp[1],locfp[2])
except : pass
Что такое except : pass не подскажите случаем?
ммм... видил часто но не вдавался в подробности :).
Вообще это почти тоже самое что и иф. если условие верно то одно, если нет то другое, просто выглядит иначе. Но я могу сильно заблуждаться.
И кстати, данная ошибка возникла только из за того что второго чара который записался на эвент не было в онлайне. Сейчас вставил эту гадость в квест, проверю. Чуть позже отпишусь.
Инстанс игрока надо всегда проверять на нуль перед какими-либо действиями (!!!)
В ошибке ясно сказано NPE - указатель на уже несуществующий объект.
Например на яве.
if(getClient().getActiveChar() == null) return;
Это обработка исключений (аля try-catch / try-except итд).
pass в данном случае напоминает NOP в ассемблере (оператор который ничего не делает).
В данном случае стоит тут чисто синтаксически.
т.е При возникновении исключения ничего не делает, соответственно никаких ошибок в консоль не валит, и скрипт продолжает свою работу.
Не обрабатываемые-же исключения останавливают работу скрипта или потока.
— Ålderdom - ingen glädje..
А вот и хорошая новость, третий раз рестарт нормально прошел. Проверил сам, кто зарегестрировался тот из игры не выходил. Тоесть все упирается в этот параметр. Я взял вторую версию квеста и взял из него ту часть которая отвечает за проверку онлайна и телепорт:
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.teleToLocation(locf[0],locf[1],locf[2])
except : pass
Но постоянно какая то ошибка:
(no code object) at line 0
SyntaxError: ('invalid syntax', ('__init__.py', 127, 7, ' for nm in ATTAKERS :'))
либо по поводу:
Так и не могу понять что не так, но во второй версии квеста при таком же написании все нормально.
Abst, тоесть except : pass в конце данной операции явно указывает на то что если все таки есть ошибка, то квест в любом случае продолжать грузить дальше. Но как правильно поставить этот "except : pass"?
Если сделать так:
if i.isOnline() :
i.teleToLocation(locf[0],locf[1],locf[2])
except : pass
Если можно обьясни для чего это делается:
i=L2World.getInstance().getPlayer()
Abst, тоесть except : pass в конце данной операции явно указывает на то что если все таки есть ошибка, то квест в любом случае продолжать грузить дальше. Но как правильно поставить этот "except : pass"?
Если сделать так:
if i.isOnline() :
i.teleToLocation(locf[0],locf[1],locf[2])
except : pass
Если можно обьясни для чего это делается:
i=L2World.getInstance().getPlayer()
Если так стоит:
i=L2World.getInstance().getPlayer()
try :
if i.isOnline() :
i.teleToLocation(locf[0],locf[1],locf[2])
except : pass
то ошибка:
(no code object) at line 0
SyntaxError: ('invalid syntax', ('__init__.py', 127, 7, ' for i in ATTAKERS :'))
Спасибо "AbsT".
Я понял что к чему.
Mihey™ - мне кажется у тебя ошибка в порядке строк.
Я не знаю пока как словами объяснить, стукни в асю, поглядимс, решим.
В рации получается так:
некое условие, действие, вообще всё.
except:
если условие или действие было не верным (выдало какую либо ошибку по какой либо причине) то делать то что тут описано, в данном случаее использовать "pass" что означает ничего не делать :).
Но у тебя ошибки в отступах есть. И мне кажется строка "for i in ATTAKERS :" должна быть под строкой "i=L2World.getInstance().getPlayer()" и соответственно отступы правильно выставить надо.
Так что стукни в асю, разберёмся. Мне аш самому стало интересно...
for i in ATTAKERS :
o=L2World.getInstance().getPlayer(i)
if o.isOnline() :
i.teleToLocation(98992,149040,-3240)
ну как получилось? у меня проблема с ним такая.
1) Начинается евент, портует игроков. Если 1 зареган появляется 1 моб... если 2 портануло то все равно 1 моб...
2) Защита от незарегенных не работает... начался евент я присумонил второго чара и вместе убили мобов.
3) Если мобы убивают чаров - то ничего дальше не происходит...
чутка поделал, теперь у меня такая тема - убиваешь мобов, и все равно они выиггграли!!!
Uphill: чутка поделал, теперь у меня такая тема - убиваешь мобов, и все равно они выиггграли!!!
ну так смотри что ты там изменял
L2NextGen
http://www.l2nextgen.ru
поставил другую версию, все норм






