Евент пекло
10 replies277 viewsCurrently viewing: 1
· 11/03/2009, 07:01 PM
Помогите отредактировать евент пекло написанный на питоне.
Проблема в том, что мобы по не понятным причинам выигрывают, вроде всех мобов убили, игроки стоят ждут, проходит 5 минут и их портает обратно в город с победой монстров.
0
· 11/04/2009, 07:15 AM
Vo1N: Помогите отредактировать евент пекло написанный на питоне.
Проблема в том, что мобы по не понятным причинам выигрывают, вроде всех мобов убили, игроки стоят ждут, проходит 5 минут и их портает обратно в город с победой монстров.
CANCEL_TIME = 5 # Если в течение этого времени (минуты) мобы не атакуются - ивент считается проигранным. Пишется, что мобы выиграли и все они исчезают.
поставь
CANCEL_TIME = 20 # Если в течение этого времени (минуты) мобы не атакуются - ивент считается проигранным. Пишется, что мобы выиграли и все они исчезают.
0
· 11/04/2009, 06:48 PM
snake1: CANCEL_TIME = 5 # Если в течение этого времени (минуты) мобы не атакуются - ивент считается проигранным. Пишется, что мобы выиграли и все они исчезают.
поставь
CANCEL_TIME = 20 # Если в течение этого времени (минуты) мобы не атакуются - ивент считается проигранным. Пишется, что мобы выиграли и все они исчезают.
т.е. то люди стоят 5 минут просто ждут когда им напишут что выиграли монстры, а то теперь пусть они 20 минут стоят...
Я же написал, что они УБИВАЮТ всех мобов и просто ждут, а проходят эти 5 минут, им возвращает обратно и пишет что монстры выиграли
А вот код квеста.
Раскрывающийся текст
Код
import sys
from com.equal.gameserver.model.quest import State
from com.equal.gameserver.model.quest import QuestState
from com.equal.gameserver.model.quest.jython import QuestJython as JQuest
from com.equal.gameserver import Announcements
from com.equal import L2DatabaseFactory
from com.equal.gameserver.ai import CtrlIntention
from com.equal.util import Rnd
from java.lang import System
from com.equal.gameserver.model import L2World
from com.equal.gameserver.network.serverpackets import CreatureSay
from java.util import Date
qn = "5555_Peklo"
# =======================================
# НЕ ТРОГАЕМ
# =======================================
annom=1
ATTAKERS = []
tek = 0
nyj = 1
closed = 1
# =======================================
# КОНФИГ
# =======================================
# Название (только английские символы)
NAME = "IIeklo"
LOC = "Giran" # Место, где вы поставили регистрирующего НПЦ.
REGISTER = 55557 # Регистрирующий нпц. НЕ ЗАБЫВАЕМ ДЕЛАТЬ ЕГО БЕССМЕРТНЫМ.
locr = [[82631,147750,-3468]] # Соответственно координаты, где будет появляться НПЦ. Сколько угодно различных точек
PENI = 57 # Итем, необходимый для участия
PENI_KOL = 0 # Сколько итемов необходимо для участия. Если хотите чтобы участие было бесплатным - поставте 0
LEVEL = 75 # Минимальный уровень, на котором игрок сможет принять участие в ивенте.
AFTER_RESTART = 60 # Время, которое пройдёт от запуска сервера(перезагрузки скрипта) до начала ивента.
TIME_FOR_WAIT = 60 # Время между ивентами в минутах
TIME_FOR_REG = 10 # Время на регистрацию в минутах
ANNOUNCE_INTERVAL = 2 # Как часто аннонсить о регистрации на ивент в минутах.
MOB = 55556 # Моб, которого надо убивать. С него ничего не должно дропаться. Желательно не менять, т.к. есть защита от незарегистрированных игроков.
locf = [88361,258187,-10378] # Соответственно координаты, где будет появляться 1 моб
locfp = [88361,258187,-10378] # Соответственно координаты, куда телепортируются игроки. Здесь же и ресаются.
RADIUS = 5 # Радиус появления мобов относительно 1 моба
MOB_R = 55556 # Моб, при помощи которого выдаётся награда. Здесь должен быть прописан дроп.
YCH_MIN = 1 # Минимальное количество участников
YCH_MAX = 60 # Максимальное количество участников.
MOBS_TO_CHEL = 2 # Количество мобов на человека. Максимальное количество мобов, которое придётся убить участникам за последний заход= кл-во участников * на MOBS_TO_CHEL.
CANCEL_TIME = 5 # Если в течение этого времени (минуты) мобы не атакуются - ивент считается проигранным. Пишется, что мобы выиграли и все они исчезают.
REWARD =[[9556,50,70],[9550,50,100],[9565,50,10],[57,50,100]] # Список наград. Выдайтся каждому участнику. Формат записи: [[itemId1,countMIN1,countMAX1,chance1],[itemId2,countMIN2,countMAX2,chanceN],...[itemIdN,countMINN,countMAXN,chanceN]]
TIM = [] # Часы, в течение которых ивент не начнётся. Т.е если написано 20, то в период с 20:00:00 до 20:59:59 ивент не стартует.
RAD = 5000 # Если в момент выдачи награды игрок находится вне этого радиуса, то награда не выдаётся.
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def init_LoadGlobalData(self) :
self.startQuestTimer("open", AFTER_RESTART *60000, None, None)
return
def onTalk (Self,npc,player):
global closed
st = player.getQuestState(qn)
global ATTAKERS
npcId = npc.getNpcId()
if npcId == REGISTER:
if closed<>1 and int(Date().getHours()) not in TIM :
if not player.isInOlympiadMode() :
if player.getLevel() >= LEVEL:
if player.getName() not in ATTAKERS :
kolych = len(ATTAKERS)
if kolych <= YCH_MAX :
if PENI_KOL<>0:
if st.getQuestItemsCount(PENI)>PENI_KOL:
st.takeItems(PENI,PENI_KOL)
ATTAKERS.append(player.getName())
return "reg.htm"
else:
st.exitQuest(1)
return "nopeni.htm"
else:
ATTAKERS.append(player.getName())
return "reg.htm"
else:
return "max.htm"
else:
return "yje.htm"
else:
return "lvl.htm"
else:
return "You register in olympiad games now"
else:
return "noreg.htm"
return
def onAdvEvent (self,event,npc,player):
global tek,nyj,ATTAKERS,kolych,annom,closed
if event == "open" :
ATTAKERS=[]
closed=0
annom=1
spawncoord=locr[Rnd.get(len(locr))]
npc=self.addSpawn(REGISTER,spawncoord[0],spawncoord[1],spawncoord[2],30000,False,0)
npc.startAbnormalEffect(8192)
self.startQuestTimer("close", TIME_FOR_REG*60000, npc, None)
self.startQuestTimer("announce", ANNOUNCE_INTERVAL*60000, None, None)
Announcements.getInstance().announceToAll(str(TIME_FOR_REG - ANNOUNCE_INTERVAL * annom ) + " minutes until event "+str(NAME)+" will start! You can register in "+str(LOC)+".")
annom=annom+1
if event == "close":
tek=0
nyj=1
self.startQuestTimer("open", TIME_FOR_WAIT*60000, None, None)
kolych = len(ATTAKERS)
if kolych < YCH_MIN :
npc.deleteMe()
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" was canceled due lack of participation.")
else:
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has started!")
npc.deleteMe()
self.addSpawn(MOB,locf[0],locf[1],locf[2],30000,False,CANCEL_TIME*60000)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.stopAllEffects()
i.teleToLocation(locfp[0],locfp[1],locfp[2])
except : pass
if event == "announce" and closed==0 and (TIME_FOR_REG - ANNOUNCE_INTERVAL * annom)<>0:
self.startQuestTimer("announce", ANNOUNCE_INTERVAL*60000, None, None)
Announcements.getInstance().announceToAll(str(TIME_FOR_REG - ANNOUNCE_INTERVAL * annom) + " minutes until event "+str(NAME)+" will start! You can register in "+str(LOC)+".")
annom=annom+1
if event == "return" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Players win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.teleToLocation(83456,148208,-3406)
except : pass
if event == "return_l" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Monsters win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.teleToLocation(83456,148208,-3406)
except : pass
if event == "exit" :
ATTAKERS.remove(player.getName())
return "exit.htm"
return
def onKill(self,npc,player,isPet):
global tek,nyj,kolych
mobcount=(MOBS_TO_CHEL * kolych)+15
tek=tek+1
if tek==nyj and (2*nyj) < mobcount:
for i in range(0,2*tek) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
self.addSpawn(MOB,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,CANCEL_TIME*60000)
nyj=2*tek
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
npcppc=self.addSpawn(MOB,locf[0],locf[1],locf[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.deleteMe()
elif tek==nyj and (2*nyj) >= mobcount:
for i in range(0,mobcount) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
mobb=self.addSpawn(MOB,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,CANCEL_TIME*60000)
mobb.startAbnormalEffect(8192)
nyj=mobcount+1
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", (CANCEL_TIME)*60000, None, None)
npcppc=self.addSpawn(MOB,locf[0],locf[1],locf[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.deleteMe()
elif tek==mobcount:
for nm in ATTAKERS :
player=L2World.getInstance().getPlayer(nm)
if player<>None:
if abs(abs(player.getX())-abs(locf[0]))>RAD or abs(abs(player.getY())-abs(locf[1]))>RAD :
ATTAKERS.remove(nm)
else:
ATTAKERS.remove(nm)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try:
for id, countmin, countmax, chance in REWARD :
if Rnd.get(100)<=chance :
count=Rnd.get(countmin,countmax)
i.getQuestState(qn).giveItems(id,count)
except : pass
self.startQuestTimer("return", 30000, None, None)
self.cancelQuestTimer("return_l",None,None)
return
QUEST = Quest(5555, qn, "Peklo")
QUEST.addKillId(int(MOB))
QUEST.addAttackId(int(MOB))
QUEST.addStartNpc(int(REGISTER))
QUEST.addTalkId(int(REGISTER))
from com.equal.gameserver.model.quest import State
from com.equal.gameserver.model.quest import QuestState
from com.equal.gameserver.model.quest.jython import QuestJython as JQuest
from com.equal.gameserver import Announcements
from com.equal import L2DatabaseFactory
from com.equal.gameserver.ai import CtrlIntention
from com.equal.util import Rnd
from java.lang import System
from com.equal.gameserver.model import L2World
from com.equal.gameserver.network.serverpackets import CreatureSay
from java.util import Date
qn = "5555_Peklo"
# =======================================
# НЕ ТРОГАЕМ
# =======================================
annom=1
ATTAKERS = []
tek = 0
nyj = 1
closed = 1
# =======================================
# КОНФИГ
# =======================================
# Название (только английские символы)
NAME = "IIeklo"
LOC = "Giran" # Место, где вы поставили регистрирующего НПЦ.
REGISTER = 55557 # Регистрирующий нпц. НЕ ЗАБЫВАЕМ ДЕЛАТЬ ЕГО БЕССМЕРТНЫМ.
locr = [[82631,147750,-3468]] # Соответственно координаты, где будет появляться НПЦ. Сколько угодно различных точек
PENI = 57 # Итем, необходимый для участия
PENI_KOL = 0 # Сколько итемов необходимо для участия. Если хотите чтобы участие было бесплатным - поставте 0
LEVEL = 75 # Минимальный уровень, на котором игрок сможет принять участие в ивенте.
AFTER_RESTART = 60 # Время, которое пройдёт от запуска сервера(перезагрузки скрипта) до начала ивента.
TIME_FOR_WAIT = 60 # Время между ивентами в минутах
TIME_FOR_REG = 10 # Время на регистрацию в минутах
ANNOUNCE_INTERVAL = 2 # Как часто аннонсить о регистрации на ивент в минутах.
MOB = 55556 # Моб, которого надо убивать. С него ничего не должно дропаться. Желательно не менять, т.к. есть защита от незарегистрированных игроков.
locf = [88361,258187,-10378] # Соответственно координаты, где будет появляться 1 моб
locfp = [88361,258187,-10378] # Соответственно координаты, куда телепортируются игроки. Здесь же и ресаются.
RADIUS = 5 # Радиус появления мобов относительно 1 моба
MOB_R = 55556 # Моб, при помощи которого выдаётся награда. Здесь должен быть прописан дроп.
YCH_MIN = 1 # Минимальное количество участников
YCH_MAX = 60 # Максимальное количество участников.
MOBS_TO_CHEL = 2 # Количество мобов на человека. Максимальное количество мобов, которое придётся убить участникам за последний заход= кл-во участников * на MOBS_TO_CHEL.
CANCEL_TIME = 5 # Если в течение этого времени (минуты) мобы не атакуются - ивент считается проигранным. Пишется, что мобы выиграли и все они исчезают.
REWARD =[[9556,50,70],[9550,50,100],[9565,50,10],[57,50,100]] # Список наград. Выдайтся каждому участнику. Формат записи: [[itemId1,countMIN1,countMAX1,chance1],[itemId2,countMIN2,countMAX2,chanceN],...[itemIdN,countMINN,countMAXN,chanceN]]
TIM = [] # Часы, в течение которых ивент не начнётся. Т.е если написано 20, то в период с 20:00:00 до 20:59:59 ивент не стартует.
RAD = 5000 # Если в момент выдачи награды игрок находится вне этого радиуса, то награда не выдаётся.
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def init_LoadGlobalData(self) :
self.startQuestTimer("open", AFTER_RESTART *60000, None, None)
return
def onTalk (Self,npc,player):
global closed
st = player.getQuestState(qn)
global ATTAKERS
npcId = npc.getNpcId()
if npcId == REGISTER:
if closed<>1 and int(Date().getHours()) not in TIM :
if not player.isInOlympiadMode() :
if player.getLevel() >= LEVEL:
if player.getName() not in ATTAKERS :
kolych = len(ATTAKERS)
if kolych <= YCH_MAX :
if PENI_KOL<>0:
if st.getQuestItemsCount(PENI)>PENI_KOL:
st.takeItems(PENI,PENI_KOL)
ATTAKERS.append(player.getName())
return "reg.htm"
else:
st.exitQuest(1)
return "nopeni.htm"
else:
ATTAKERS.append(player.getName())
return "reg.htm"
else:
return "max.htm"
else:
return "yje.htm"
else:
return "lvl.htm"
else:
return "You register in olympiad games now"
else:
return "noreg.htm"
return
def onAdvEvent (self,event,npc,player):
global tek,nyj,ATTAKERS,kolych,annom,closed
if event == "open" :
ATTAKERS=[]
closed=0
annom=1
spawncoord=locr[Rnd.get(len(locr))]
npc=self.addSpawn(REGISTER,spawncoord[0],spawncoord[1],spawncoord[2],30000,False,0)
npc.startAbnormalEffect(8192)
self.startQuestTimer("close", TIME_FOR_REG*60000, npc, None)
self.startQuestTimer("announce", ANNOUNCE_INTERVAL*60000, None, None)
Announcements.getInstance().announceToAll(str(TIME_FOR_REG - ANNOUNCE_INTERVAL * annom ) + " minutes until event "+str(NAME)+" will start! You can register in "+str(LOC)+".")
annom=annom+1
if event == "close":
tek=0
nyj=1
self.startQuestTimer("open", TIME_FOR_WAIT*60000, None, None)
kolych = len(ATTAKERS)
if kolych < YCH_MIN :
npc.deleteMe()
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" was canceled due lack of participation.")
else:
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has started!")
npc.deleteMe()
self.addSpawn(MOB,locf[0],locf[1],locf[2],30000,False,CANCEL_TIME*60000)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.stopAllEffects()
i.teleToLocation(locfp[0],locfp[1],locfp[2])
except : pass
if event == "announce" and closed==0 and (TIME_FOR_REG - ANNOUNCE_INTERVAL * annom)<>0:
self.startQuestTimer("announce", ANNOUNCE_INTERVAL*60000, None, None)
Announcements.getInstance().announceToAll(str(TIME_FOR_REG - ANNOUNCE_INTERVAL * annom) + " minutes until event "+str(NAME)+" will start! You can register in "+str(LOC)+".")
annom=annom+1
if event == "return" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Players win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.teleToLocation(83456,148208,-3406)
except : pass
if event == "return_l" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Monsters win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.teleToLocation(83456,148208,-3406)
except : pass
if event == "exit" :
ATTAKERS.remove(player.getName())
return "exit.htm"
return
def onKill(self,npc,player,isPet):
global tek,nyj,kolych
mobcount=(MOBS_TO_CHEL * kolych)+15
tek=tek+1
if tek==nyj and (2*nyj) < mobcount:
for i in range(0,2*tek) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
self.addSpawn(MOB,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,CANCEL_TIME*60000)
nyj=2*tek
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
npcppc=self.addSpawn(MOB,locf[0],locf[1],locf[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.deleteMe()
elif tek==nyj and (2*nyj) >= mobcount:
for i in range(0,mobcount) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
mobb=self.addSpawn(MOB,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,CANCEL_TIME*60000)
mobb.startAbnormalEffect(8192)
nyj=mobcount+1
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", (CANCEL_TIME)*60000, None, None)
npcppc=self.addSpawn(MOB,locf[0],locf[1],locf[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.deleteMe()
elif tek==mobcount:
for nm in ATTAKERS :
player=L2World.getInstance().getPlayer(nm)
if player<>None:
if abs(abs(player.getX())-abs(locf[0]))>RAD or abs(abs(player.getY())-abs(locf[1]))>RAD :
ATTAKERS.remove(nm)
else:
ATTAKERS.remove(nm)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try:
for id, countmin, countmax, chance in REWARD :
if Rnd.get(100)<=chance :
count=Rnd.get(countmin,countmax)
i.getQuestState(qn).giveItems(id,count)
except : pass
self.startQuestTimer("return", 30000, None, None)
self.cancelQuestTimer("return_l",None,None)
return
QUEST = Quest(5555, qn, "Peklo")
QUEST.addKillId(int(MOB))
QUEST.addAttackId(int(MOB))
QUEST.addStartNpc(int(REGISTER))
QUEST.addTalkId(int(REGISTER))
0
· 11/19/2009, 09:56 PM
Цитата
MOB = 55556 # Моб, которого надо убивать. С него ничего не должно дропаться. Желательно не менять, т.к. есть защита от незарегистрированных игроков.
попробуй в одну строку чтобы это было написано. (все остальные такие-же тоже в одну строку надо)
сборка у тебя какая?
ОФФТОП.
А насчет того что написано - защита от незарегистрированных игроков - все херня, регишься один, евент начинается, сумонишь к себе все пати или клановсцев, и выигрываешь евент...
0
· 11/21/2009, 01:29 AM
чутка поделал, теперь у меня такая тема - убиваешь мобов, и все равно они выиггграли!!!
что делать?
0
· 11/22/2009, 04:44 PM
На голый вид ничего не скажешь, евент в наличии есть, да и рабочий давно..но в слепую никто не ответить на такой вопрос.
0
· 11/28/2009, 10:51 AM
Код
[code]import sys
from com.l2jarchid.gameserver.model.quest import State
from com.l2jarchid.gameserver.model.quest import QuestState
from com.l2jarchid.gameserver.model.quest.jython import QuestJython as JQuest
from com.l2jarchid.gameserver import Announcements
from com.l2jarchid import L2DatabaseFactory
from com.l2jarchid.gameserver.ai import CtrlIntention
from com.l2jarchid.tools import Rnd
from java.lang import System
from com.l2jarchid.gameserver.model import L2World
from com.l2jarchid.gameserver.network.serverpackets import CreatureSay
from java.util import Date
qn = "5555_Peklo"
# =======================================
# НЕ ТРОГАЕМ
# =======================================
ATTAKERS = []
tek = 0
nyj = 1
closed = 1
# =======================================
# КОНФИГ
# =======================================
# Название (только английские символы)
NAME = "IIeklo"
LOC = "Giran" # Место, где вы поставили регистрирующего НПЦ.
REGISTER = 55557 # Регистрирующий нпц. НЕ ЗАБЫВАЕМ ДЕЛАТЬ ЕГО БЕССМЕРТНЫМ.
locr = [[82631,147750,-3468]] # Соответственно координаты, где будет появляться НПЦ. Сколько угодно различных точек
PENI = 57 # Итем, необходимый для участия
PENI_KOL = 0 # Сколько итемов необходимо для участия. Если хотите чтобы участие было бесплатным - поставте 0
LEVEL = 75 # Минимальный уровень, на котором игрок сможет принять участие в ивенте.
AFTER_RESTART = 90 # Время, которое пройдёт от запуска сервера(перезагрузки скрипта) до начала ивента.
TIME_FOR_WAIT = 60 # Время между ивентами в минутах
TIME_FOR_REG = 10 # Время на регистрацию в минутах
MOB = 55556 # Моб, которого надо убивать. С него ничего не должно дропаться. Желательно не менять, т.к. есть защита от незарегистрированных игроков.
locf = [-19023,-52828,-10489] # Соответственно координаты, где будет появляться 1 моб
locfp = [-19023,-52828,-10489] # Соответственно координаты, куда телепортируются игроки. Здесь же и ресаются.
RADIUS = 5 # Радиус появления мобов относительно 1 моба
YCH_MIN = 1 # Минимальное количество участников
YCH_MAX = 60 # Максимальное количество участников.
MOBS_TO_CHEL = 2 # Количество мобов на человека. Максимальное количество мобов, которое придётся убить участникам за последний заход= кл-во участников * на MOBS_TO_CHEL.
CANCEL_TIME = 5 # Если в течение этого времени (минуты) мобы не атакуются - ивент считается проигранным. Пишется, что мобы выиграли и все они исчезают.
REWARD =[[9556,10,50,70],[9550,10,50,100],[9565,10,50,10],[57,50,50,100]] # Список наград. Выдайтся каждому участнику. Формат записи: [[itemId1,countMIN1,countMAX1,chance1],[itemId2,countMIN2,countMAX2,chanceN],...[itemIdN,countMINN,countMAXN,chanceN]]
TIM = [] # Часы, в течение которых ивент не начнётся. Т.е если написано 20, то в период с 20:00:00 до 20:59:59 ивент не стартует.
RAD = 5000 # Если в момент выдачи награды игрок находится вне этого радиуса, то награда не выдаётся.
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def init_LoadGlobalData(self) :
self.startQuestTimer("open", AFTER_RESTART *60000, None, None)
return
def onTalk (Self,npc,player):
global closed
st = player.getQuestState(qn)
global ATTAKERS
npcId = npc.getNpcId()
if npcId == REGISTER:
if closed<>1 and int(Date().getHours()) not in TIM :
if not player.isInOlympiadMode() :
if player.getLevel() >= LEVEL:
if player.getName() not in ATTAKERS :
kolych = len(ATTAKERS)
if kolych <= YCH_MAX :
if PENI_KOL<>0:
if st.getQuestItemsCount(PENI)>PENI_KOL:
st.takeItems(PENI,PENI_KOL)
ATTAKERS.append(player.getName())
return "reg.htm"
else:
st.exitQuest(1)
return "nopeni.htm"
else:
ATTAKERS.append(player.getName())
return "reg.htm"
else:
return "max.htm"
else:
return "yje.htm"
else:
return "lvl.htm"
else:
return "You register in olympiad games now"
else:
return "noreg.htm"
return
def onAdvEvent (self,event,npc,player):
global tek,nyj,ATTAKERS,kolych,closed
if event == "open" :
ATTAKERS=[]
closed=0
spawncoord=locr[Rnd.get(len(locr))]
npc=self.addSpawn(REGISTER,spawncoord[0],spawncoord[1],spawncoord[2],30000,False,0)
self.startQuestTimer("close", TIME_FOR_REG*60000, npc, None)
Announcements.getInstance().announceToAll(str(TIME_FOR_REG) + " minutes until event "+str(NAME)+" will start! You can register in "+str(LOC)+".")
if event == "close":
tek=0
nyj=1
self.startQuestTimer("open", TIME_FOR_WAIT*60000, None, None)
kolych = len(ATTAKERS)
if kolych < YCH_MIN :
npc.deleteMe()
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" was canceled due lack of participation.")
else:
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has started!")
npc.deleteMe()
self.addSpawn(MOB,locf[0],locf[1],locf[2],30000,False,CANCEL_TIME*60000)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.stopAllEffects()
i.teleToLocation(locfp[0],locfp[1],locfp[2])
except : pass
if event == "return" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Players win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.teleToLocation(83456,148208,-3406)
except : pass
if event == "return_l" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Monsters win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.teleToLocation(83456,148208,-3406)
except : pass
if event == "exit" :
ATTAKERS.remove(player.getName())
return "exit.htm"
return
def onKill(self,npc,player,isPet):
global tek,nyj,kolych
mobcount=(MOBS_TO_CHEL * kolych)+15
tek=tek+1
if tek==nyj and (2*nyj) < mobcount:
for i in range(0,2*tek) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
self.addSpawn(MOB,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,CANCEL_TIME*60000)
nyj=2*tek
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
npcppc=self.addSpawn(MOB,locf[0],locf[1],locf[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.deleteMe()
elif tek==nyj and (2*nyj) >= mobcount:
for i in range(0,mobcount) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
mobb=self.addSpawn(MOB,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,CANCEL_TIME*60000)
mobb.startAbnormalEffect(8192)
nyj=mobcount+1
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", (CANCEL_TIME)*60000, None, None)
npcppc=self.addSpawn(MOB,locf[0],locf[1],locf[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.deleteMe()
elif tek==mobcount:
for nm in ATTAKERS :
player=L2World.getInstance().getPlayer(nm)
if player<>None:
if abs(abs(player.getX())-abs(locf[0]))>RAD or abs(abs(player.getY())-abs(locf[1]))>RAD :
ATTAKERS.remove(nm)
else:
ATTAKERS.remove(nm)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try:
for id, countmin, countmax, chance in REWARD :
if Rnd.get(100)<=chance :
count=Rnd.get(countmin,countmax)
i.getQuestState(qn).giveItems(id,count)
except : pass
self.startQuestTimer("return", 30000, None, None)
self.cancelQuestTimer("return_l",None,None)
return
QUEST = Quest(5555, qn, "Peklo")
from com.l2jarchid.gameserver.model.quest import State
from com.l2jarchid.gameserver.model.quest import QuestState
from com.l2jarchid.gameserver.model.quest.jython import QuestJython as JQuest
from com.l2jarchid.gameserver import Announcements
from com.l2jarchid import L2DatabaseFactory
from com.l2jarchid.gameserver.ai import CtrlIntention
from com.l2jarchid.tools import Rnd
from java.lang import System
from com.l2jarchid.gameserver.model import L2World
from com.l2jarchid.gameserver.network.serverpackets import CreatureSay
from java.util import Date
qn = "5555_Peklo"
# =======================================
# НЕ ТРОГАЕМ
# =======================================
ATTAKERS = []
tek = 0
nyj = 1
closed = 1
# =======================================
# КОНФИГ
# =======================================
# Название (только английские символы)
NAME = "IIeklo"
LOC = "Giran" # Место, где вы поставили регистрирующего НПЦ.
REGISTER = 55557 # Регистрирующий нпц. НЕ ЗАБЫВАЕМ ДЕЛАТЬ ЕГО БЕССМЕРТНЫМ.
locr = [[82631,147750,-3468]] # Соответственно координаты, где будет появляться НПЦ. Сколько угодно различных точек
PENI = 57 # Итем, необходимый для участия
PENI_KOL = 0 # Сколько итемов необходимо для участия. Если хотите чтобы участие было бесплатным - поставте 0
LEVEL = 75 # Минимальный уровень, на котором игрок сможет принять участие в ивенте.
AFTER_RESTART = 90 # Время, которое пройдёт от запуска сервера(перезагрузки скрипта) до начала ивента.
TIME_FOR_WAIT = 60 # Время между ивентами в минутах
TIME_FOR_REG = 10 # Время на регистрацию в минутах
MOB = 55556 # Моб, которого надо убивать. С него ничего не должно дропаться. Желательно не менять, т.к. есть защита от незарегистрированных игроков.
locf = [-19023,-52828,-10489] # Соответственно координаты, где будет появляться 1 моб
locfp = [-19023,-52828,-10489] # Соответственно координаты, куда телепортируются игроки. Здесь же и ресаются.
RADIUS = 5 # Радиус появления мобов относительно 1 моба
YCH_MIN = 1 # Минимальное количество участников
YCH_MAX = 60 # Максимальное количество участников.
MOBS_TO_CHEL = 2 # Количество мобов на человека. Максимальное количество мобов, которое придётся убить участникам за последний заход= кл-во участников * на MOBS_TO_CHEL.
CANCEL_TIME = 5 # Если в течение этого времени (минуты) мобы не атакуются - ивент считается проигранным. Пишется, что мобы выиграли и все они исчезают.
REWARD =[[9556,10,50,70],[9550,10,50,100],[9565,10,50,10],[57,50,50,100]] # Список наград. Выдайтся каждому участнику. Формат записи: [[itemId1,countMIN1,countMAX1,chance1],[itemId2,countMIN2,countMAX2,chanceN],...[itemIdN,countMINN,countMAXN,chanceN]]
TIM = [] # Часы, в течение которых ивент не начнётся. Т.е если написано 20, то в период с 20:00:00 до 20:59:59 ивент не стартует.
RAD = 5000 # Если в момент выдачи награды игрок находится вне этого радиуса, то награда не выдаётся.
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def init_LoadGlobalData(self) :
self.startQuestTimer("open", AFTER_RESTART *60000, None, None)
return
def onTalk (Self,npc,player):
global closed
st = player.getQuestState(qn)
global ATTAKERS
npcId = npc.getNpcId()
if npcId == REGISTER:
if closed<>1 and int(Date().getHours()) not in TIM :
if not player.isInOlympiadMode() :
if player.getLevel() >= LEVEL:
if player.getName() not in ATTAKERS :
kolych = len(ATTAKERS)
if kolych <= YCH_MAX :
if PENI_KOL<>0:
if st.getQuestItemsCount(PENI)>PENI_KOL:
st.takeItems(PENI,PENI_KOL)
ATTAKERS.append(player.getName())
return "reg.htm"
else:
st.exitQuest(1)
return "nopeni.htm"
else:
ATTAKERS.append(player.getName())
return "reg.htm"
else:
return "max.htm"
else:
return "yje.htm"
else:
return "lvl.htm"
else:
return "You register in olympiad games now"
else:
return "noreg.htm"
return
def onAdvEvent (self,event,npc,player):
global tek,nyj,ATTAKERS,kolych,closed
if event == "open" :
ATTAKERS=[]
closed=0
spawncoord=locr[Rnd.get(len(locr))]
npc=self.addSpawn(REGISTER,spawncoord[0],spawncoord[1],spawncoord[2],30000,False,0)
self.startQuestTimer("close", TIME_FOR_REG*60000, npc, None)
Announcements.getInstance().announceToAll(str(TIME_FOR_REG) + " minutes until event "+str(NAME)+" will start! You can register in "+str(LOC)+".")
if event == "close":
tek=0
nyj=1
self.startQuestTimer("open", TIME_FOR_WAIT*60000, None, None)
kolych = len(ATTAKERS)
if kolych < YCH_MIN :
npc.deleteMe()
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" was canceled due lack of participation.")
else:
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has started!")
npc.deleteMe()
self.addSpawn(MOB,locf[0],locf[1],locf[2],30000,False,CANCEL_TIME*60000)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.stopAllEffects()
i.teleToLocation(locfp[0],locfp[1],locfp[2])
except : pass
if event == "return" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Players win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.teleToLocation(83456,148208,-3406)
except : pass
if event == "return_l" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Monsters win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try :
if i.isOnline() :
i.teleToLocation(83456,148208,-3406)
except : pass
if event == "exit" :
ATTAKERS.remove(player.getName())
return "exit.htm"
return
def onKill(self,npc,player,isPet):
global tek,nyj,kolych
mobcount=(MOBS_TO_CHEL * kolych)+15
tek=tek+1
if tek==nyj and (2*nyj) < mobcount:
for i in range(0,2*tek) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
self.addSpawn(MOB,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,CANCEL_TIME*60000)
nyj=2*tek
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
npcppc=self.addSpawn(MOB,locf[0],locf[1],locf[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.deleteMe()
elif tek==nyj and (2*nyj) >= mobcount:
for i in range(0,mobcount) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
mobb=self.addSpawn(MOB,locf[0] + randx, locf[1] + randy, locf[2]+100,30000,False,CANCEL_TIME*60000)
mobb.startAbnormalEffect(8192)
nyj=mobcount+1
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", (CANCEL_TIME)*60000, None, None)
npcppc=self.addSpawn(MOB,locf[0],locf[1],locf[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.deleteMe()
elif tek==mobcount:
for nm in ATTAKERS :
player=L2World.getInstance().getPlayer(nm)
if player<>None:
if abs(abs(player.getX())-abs(locf[0]))>RAD or abs(abs(player.getY())-abs(locf[1]))>RAD :
ATTAKERS.remove(nm)
else:
ATTAKERS.remove(nm)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
try:
for id, countmin, countmax, chance in REWARD :
if Rnd.get(100)<=chance :
count=Rnd.get(countmin,countmax)
i.getQuestState(qn).giveItems(id,count)
except : pass
self.startQuestTimer("return", 30000, None, None)
self.cancelQuestTimer("return_l",None,None)
return
QUEST = Quest(5555, qn, "Peklo")
QUEST.addKillId(int(MOB))
QUEST.addAttackId(int(MOB))
QUEST.addStartNpc(int(REGISTER))
QUEST.addTalkId(int(REGISTER))[/code]
в ГС пишет такую вещь
Раскрывающийся текст
WARNING could not insert char quest:
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate
entry '268448100-5555_Peklo-<state>-0' for key 'PRIMARY'
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3256)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.ja
va:1313)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java
:1585)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java
:1500)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java
:1485)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewP
roxyPreparedStatement.java:105)
at com.l2jarchid.gameserver.model.quest.Quest.createQuestVarInDb(Quest.j
ava:643)
at com.l2jarchid.gameserver.model.quest.Quest.createQuestInDb(Quest.java
:747)
at com.l2jarchid.gameserver.model.quest.Quest.newQuestState(Quest.java:1
85)
at com.l2jarchid.gameserver.model.actor.L2Npc.showQuestWindow(L2Npc.java
:1291)
at com.l2jarchid.gameserver.model.actor.L2Npc.onBypassFeedback(L2Npc.jav
a:935)
at com.l2jarchid.gameserver.model.actor.instance.L2NpcInstance.onBypassF
eedback(L2NpcInstance.java:316)
at com.l2jarchid.gameserver.network.clientpackets.RequestBypassToServer.
runImpl(RequestBypassToServer.java:153)
at com.l2jarchid.gameserver.network.clientpackets.L2GameClientPacket.run
(L2GameClientPacket.java:88)
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)
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate
entry '268448100-5555_Peklo-<state>-0' for key 'PRIMARY'
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3256)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.ja
va:1313)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java
:1585)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java
:1500)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java
:1485)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewP
roxyPreparedStatement.java:105)
at com.l2jarchid.gameserver.model.quest.Quest.createQuestVarInDb(Quest.j
ava:643)
at com.l2jarchid.gameserver.model.quest.Quest.createQuestInDb(Quest.java
:747)
at com.l2jarchid.gameserver.model.quest.Quest.newQuestState(Quest.java:1
85)
at com.l2jarchid.gameserver.model.actor.L2Npc.showQuestWindow(L2Npc.java
:1291)
at com.l2jarchid.gameserver.model.actor.L2Npc.onBypassFeedback(L2Npc.jav
a:935)
at com.l2jarchid.gameserver.model.actor.instance.L2NpcInstance.onBypassF
eedback(L2NpcInstance.java:316)
at com.l2jarchid.gameserver.network.clientpackets.RequestBypassToServer.
runImpl(RequestBypassToServer.java:153)
at com.l2jarchid.gameserver.network.clientpackets.L2GameClientPacket.run
(L2GameClientPacket.java:88)
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)
Подскажите, как обнулять значение в базе на этот квест, если его заного брать
0
· 11/29/2009, 01:45 AM
Не вижу никакого отношении между ошибкой и то что ты описал...точнее промониторь, когда он всплывает, именно в каком моменте, возможно я смогу помочь, если не хочешь ждать долго - пиши мне в асю.
0
· 11/29/2009, 03:21 AM
Можно и так сделать:
сам __init__.py
Код
import sys
from net.sf.l2j.gameserver.model.quest import State
from net.sf.l2j.gameserver.model.quest import QuestState
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
from net.sf.l2j.gameserver.model import L2World
from net.sf.l2j.gameserver.serverpackets import CreatureSay
from java.util import Date
qn = "5555_Peklo"
# =======================================
# НЕ ТРОГАЕМ
# =======================================
annom=1
ATTAKERS = []
tek = 0
nyj = 1
closed = 1
# =======================================
# КОНФИГ
# =======================================
# Название (только английские символы)
NAME = "IIeklo"
# Место, где вы поставили регистрирующего НПЦ.
LOC = "Town of Giran"
# Регистрирующий нпц. НЕ ЗАБЫВАЕМ ДЕЛАТЬ ЕГО БЕССМЕРТНЫМ.
REGISTER = 55557
# Соответственно координаты, где будет появляться НПЦ. Сколько угодно различных точек - [[x1,y1,z1],[xN,yN,zN]]
locr = [[82565,148592,-3469]]
# Итем, необходимый для участия
PENI = 57
# Сколько итемов необходимо для участия. Если хотите чтобы участие было бесплатным - поставте 0
PENI_KOL = 0
# Минимальный уровень, на котором игрок сможет принять участие в ивенте.
LEVEL = 41
# Время, которое пройдёт от запуска сервера(перезагрузки скрипта) до начала ивента.
AFTER_RESTART = 60
# Время между ивентами в минутах
TIME_FOR_WAIT = 240
# Время на регистрацию в минутах
TIME_FOR_REG = 10
# Как часто аннонсить о регистрации на ивент в минутах.
ANNOUNCE_INTERVAL = 1
# Моб, которого надо убивать. С него ничего не должно дропаться.
# Желательно не менять, т.к. есть защита от незарегистрированных игроков.
MOB = 55556
# Радиус появления мобов относительно 1 моба
RADIUS = 200
# Моб, при помощи которого выдаётся награда. Здесь должен быть прописан дроп.
MOB_R = 55555
# Минимальное количество участников
YCH_MIN = 1
# Максимальное количество участников.
YCH_MAX = 25
# Количество мобов на человека. Максимальное количество мобов,
# которое придётся убить участникам за последний заход= кл-во участников * на MOBS_TO_CHEL.
MOBS_TO_CHEL = 5
# Если в течение этого времени (минуты) мобы не атакуются - ивент считается проигранным.
# Пишется, что мобы выиграли и все они исчезают.
CANCEL_TIME = 10
# Список наград. Выдайтся каждому участнику. Формат записи:
# [[itemId1,countMIN1,countMAX1,chance1],[itemIdN,countMINN,countMAXN,chanceN]]
REWARD =[[57,25000000,50],[5575,2500000,50]]
# Часы, в течение которых ивент не начнётся.
# Т.е если написано 20, то в период с 20:00:00 до 20:59:59 ивент не стартует.
TIM = [18,19,20,21,22,23]
# Время, через которое будут ресаться убитый игрок.(указывается в секундах)
RES_TIME = 1
# Соответственно координаты, где будет появляться первый моб - [x,y,z]
t1 = [22412,118602,-8000]
# Соответственно координаты, куда телепортируются игроки - [x,y,z]
t2 = [22412,118602,-8000]
# Точка респауна игроков после того как их убьют на эвенте - [x,y,z]
t3 =[22412,118602,-8000]
# Точка респауна игроков после окончания эвента - [x,y,z]
t4 =[82565,148592,-3469]
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def init_LoadGlobalData(self) :
self.startQuestTimer("open", AFTER_RESTART *60000, None, None)
return
def onTalk (Self,npc,player):
global closed
st = player.getQuestState(qn)
global ATTAKERS
npcId = npc.getNpcId()
if npcId == REGISTER:
if closed<>1 and int(Date().getHours()) not in TIM :
if not player.isInOlympiadMode() :
if player.getLevel() >= LEVEL:
if player.getName() not in ATTAKERS :
kolych = len(ATTAKERS)
if kolych <= YCH_MAX :
if PENI_KOL<>0:
if st.getQuestItemsCount(PENI)>PENI_KOL:
st.takeItems(PENI,PENI_KOL)
ATTAKERS.append(player.getName())
return "reg.htm"
else:
st.exitQuest(1)
return "nopeni.htm"
else:
ATTAKERS.append(player.getName())
return "reg.htm"
else:
return "max.htm"
else:
return "yje.htm"
else:
return "lvl.htm"
else:
return "You register in olympiad games now"
else:
return "noreg.htm"
return
def onAdvEvent (self,event,npc,player):
global tek,nyj,ATTAKERS,kolych,annom,closed
if event == "open" :
ATTAKERS=[]
closed=0
annom=1
spawncoord=locr[Rnd.get(len(locr))]
npc=self.addSpawn(REGISTER,spawncoord[0],spawncoord[1],spawncoord[2],30000,False,0)
npc.startAbnormalEffect(8192)
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! You can register in "+str(LOC)+".")
if event == "close":
tek=0
nyj=1
res_timer = 1
self.startQuestTimer("res", RES_TIME*1000, None, None)
self.startQuestTimer("open", TIME_FOR_WAIT*60000, None, None)
kolych = len(ATTAKERS)
if kolych < YCH_MIN :
npc.deleteMe()
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" was canceled.")
else:
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has started!")
npc.deleteMe()
self.addSpawn(MOB,t1[0],t1[1],t1[2],30000,False,CANCEL_TIME*60000)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
if i<>None:
if i.isOnline() :
i.teleToLocation(t2[0]+Rnd.get(300),t2[1]+Rnd.get(300),t2[2])
if event == "announce" and closed==0 and (TIME_FOR_REG - ANNOUNCE_INTERVAL * annom)<>0:
Announcements.getInstance().announceToAll(str(TIME_FOR_REG - ANNOUNCE_INTERVAL * annom ) + " minutes until event "+str(NAME)+" will start! You can register in "+str(LOC)+".")
annom=annom+1
self.startQuestTimer("announce", ANNOUNCE_INTERVAL*60000, None, None)
if event == "return" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Players win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
if i<>None:
if i.isOnline() :
i.teleToLocation(t4[0]+Rnd.get(100),t4[1]+Rnd.get(100),t4[2])
if event == "return_l" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Monsters win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
if i<>None:
if i.isOnline() :
i.teleToLocation(t4[0]+Rnd.get(100),t4[1]+Rnd.get(100),t4[2])
if event == "exit" :
ATTAKERS.remove(player.getName())
return "exit.htm"
if event == "res" and res_timer==1:
self.startQuestTimer("res", RES_TIME*1000, None, None)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
if i<>None:
if i.isOnline() :
if i.isDead():
i.doRevive()
i.setCurrentCp(i.getMaxCp())
i.setCurrentHp(i.getMaxHp())
i.setCurrentMp(i.getMaxMp())
i.broadcastStatusUpdate()
i.broadcastUserInfo()
i.teleToLocation(t3[0]+Rnd.get(500),t3[1]+Rnd.get(500),t3[2])
return
def onAttack (self,npc,player,damage,isPet):
if player.getName() not in ATTAKERS :
try:
player.teleToLocation(147725,-56517,9999)
except : pass
return
def onKill(self,npc,player,isPet):
global tek,nyj,kolych
mobcount=(MOBS_TO_CHEL * kolych)+15
tek=tek+1
if tek==nyj and (2*nyj) < mobcount:
for i in range(0,2*tek) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
self.addSpawn(MOB,t1[0] + randx, t1[1] + randy, t1[2]+100,30000,False,CANCEL_TIME*60000)
nyj=2*tek
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
npcppc=self.addSpawn(MOB,t1[0],t1[1],t1[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.broadcastPacket(CreatureSay(npcppc.getObjectId(), 1, "Event "+str(NAME)+": ","You have "+str(CANCEL_TIME)+" minutes for kill this monsters!"))
npcppc.deleteMe()
elif tek==nyj and (2*nyj) >= mobcount:
for i in range(0,mobcount) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
mobb=self.addSpawn(MOB,t1[0] + randx, t1[1] + randy, t1[2]+100,30000,False,CANCEL_TIME*60000)
mobb.startAbnormalEffect(8192)
nyj=mobcount+1
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", (CANCEL_TIME)*60000, None, None)
npcppc=self.addSpawn(MOB,t1[0],t1[1],t1[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.broadcastPacket(CreatureSay(npcppc.getObjectId(), 1, "Event "+str(NAME)+": ","You have "+str(CANCEL_TIME)+" minutes for kill this monsters!"))
npcppc.deleteMe()
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,t1[0] + randx, t1[1] + randy, t1[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))
from net.sf.l2j.gameserver.model.quest import State
from net.sf.l2j.gameserver.model.quest import QuestState
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
from net.sf.l2j.gameserver.model import L2World
from net.sf.l2j.gameserver.serverpackets import CreatureSay
from java.util import Date
qn = "5555_Peklo"
# =======================================
# НЕ ТРОГАЕМ
# =======================================
annom=1
ATTAKERS = []
tek = 0
nyj = 1
closed = 1
# =======================================
# КОНФИГ
# =======================================
# Название (только английские символы)
NAME = "IIeklo"
# Место, где вы поставили регистрирующего НПЦ.
LOC = "Town of Giran"
# Регистрирующий нпц. НЕ ЗАБЫВАЕМ ДЕЛАТЬ ЕГО БЕССМЕРТНЫМ.
REGISTER = 55557
# Соответственно координаты, где будет появляться НПЦ. Сколько угодно различных точек - [[x1,y1,z1],[xN,yN,zN]]
locr = [[82565,148592,-3469]]
# Итем, необходимый для участия
PENI = 57
# Сколько итемов необходимо для участия. Если хотите чтобы участие было бесплатным - поставте 0
PENI_KOL = 0
# Минимальный уровень, на котором игрок сможет принять участие в ивенте.
LEVEL = 41
# Время, которое пройдёт от запуска сервера(перезагрузки скрипта) до начала ивента.
AFTER_RESTART = 60
# Время между ивентами в минутах
TIME_FOR_WAIT = 240
# Время на регистрацию в минутах
TIME_FOR_REG = 10
# Как часто аннонсить о регистрации на ивент в минутах.
ANNOUNCE_INTERVAL = 1
# Моб, которого надо убивать. С него ничего не должно дропаться.
# Желательно не менять, т.к. есть защита от незарегистрированных игроков.
MOB = 55556
# Радиус появления мобов относительно 1 моба
RADIUS = 200
# Моб, при помощи которого выдаётся награда. Здесь должен быть прописан дроп.
MOB_R = 55555
# Минимальное количество участников
YCH_MIN = 1
# Максимальное количество участников.
YCH_MAX = 25
# Количество мобов на человека. Максимальное количество мобов,
# которое придётся убить участникам за последний заход= кл-во участников * на MOBS_TO_CHEL.
MOBS_TO_CHEL = 5
# Если в течение этого времени (минуты) мобы не атакуются - ивент считается проигранным.
# Пишется, что мобы выиграли и все они исчезают.
CANCEL_TIME = 10
# Список наград. Выдайтся каждому участнику. Формат записи:
# [[itemId1,countMIN1,countMAX1,chance1],[itemIdN,countMINN,countMAXN,chanceN]]
REWARD =[[57,25000000,50],[5575,2500000,50]]
# Часы, в течение которых ивент не начнётся.
# Т.е если написано 20, то в период с 20:00:00 до 20:59:59 ивент не стартует.
TIM = [18,19,20,21,22,23]
# Время, через которое будут ресаться убитый игрок.(указывается в секундах)
RES_TIME = 1
# Соответственно координаты, где будет появляться первый моб - [x,y,z]
t1 = [22412,118602,-8000]
# Соответственно координаты, куда телепортируются игроки - [x,y,z]
t2 = [22412,118602,-8000]
# Точка респауна игроков после того как их убьют на эвенте - [x,y,z]
t3 =[22412,118602,-8000]
# Точка респауна игроков после окончания эвента - [x,y,z]
t4 =[82565,148592,-3469]
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def init_LoadGlobalData(self) :
self.startQuestTimer("open", AFTER_RESTART *60000, None, None)
return
def onTalk (Self,npc,player):
global closed
st = player.getQuestState(qn)
global ATTAKERS
npcId = npc.getNpcId()
if npcId == REGISTER:
if closed<>1 and int(Date().getHours()) not in TIM :
if not player.isInOlympiadMode() :
if player.getLevel() >= LEVEL:
if player.getName() not in ATTAKERS :
kolych = len(ATTAKERS)
if kolych <= YCH_MAX :
if PENI_KOL<>0:
if st.getQuestItemsCount(PENI)>PENI_KOL:
st.takeItems(PENI,PENI_KOL)
ATTAKERS.append(player.getName())
return "reg.htm"
else:
st.exitQuest(1)
return "nopeni.htm"
else:
ATTAKERS.append(player.getName())
return "reg.htm"
else:
return "max.htm"
else:
return "yje.htm"
else:
return "lvl.htm"
else:
return "You register in olympiad games now"
else:
return "noreg.htm"
return
def onAdvEvent (self,event,npc,player):
global tek,nyj,ATTAKERS,kolych,annom,closed
if event == "open" :
ATTAKERS=[]
closed=0
annom=1
spawncoord=locr[Rnd.get(len(locr))]
npc=self.addSpawn(REGISTER,spawncoord[0],spawncoord[1],spawncoord[2],30000,False,0)
npc.startAbnormalEffect(8192)
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! You can register in "+str(LOC)+".")
if event == "close":
tek=0
nyj=1
res_timer = 1
self.startQuestTimer("res", RES_TIME*1000, None, None)
self.startQuestTimer("open", TIME_FOR_WAIT*60000, None, None)
kolych = len(ATTAKERS)
if kolych < YCH_MIN :
npc.deleteMe()
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" was canceled.")
else:
closed=1
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has started!")
npc.deleteMe()
self.addSpawn(MOB,t1[0],t1[1],t1[2],30000,False,CANCEL_TIME*60000)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
if i<>None:
if i.isOnline() :
i.teleToLocation(t2[0]+Rnd.get(300),t2[1]+Rnd.get(300),t2[2])
if event == "announce" and closed==0 and (TIME_FOR_REG - ANNOUNCE_INTERVAL * annom)<>0:
Announcements.getInstance().announceToAll(str(TIME_FOR_REG - ANNOUNCE_INTERVAL * annom ) + " minutes until event "+str(NAME)+" will start! You can register in "+str(LOC)+".")
annom=annom+1
self.startQuestTimer("announce", ANNOUNCE_INTERVAL*60000, None, None)
if event == "return" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Players win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
if i<>None:
if i.isOnline() :
i.teleToLocation(t4[0]+Rnd.get(100),t4[1]+Rnd.get(100),t4[2])
if event == "return_l" :
Announcements.getInstance().announceToAll("Event "+str(NAME)+" has ended. Monsters win!")
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
if i<>None:
if i.isOnline() :
i.teleToLocation(t4[0]+Rnd.get(100),t4[1]+Rnd.get(100),t4[2])
if event == "exit" :
ATTAKERS.remove(player.getName())
return "exit.htm"
if event == "res" and res_timer==1:
self.startQuestTimer("res", RES_TIME*1000, None, None)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
if i<>None:
if i.isOnline() :
if i.isDead():
i.doRevive()
i.setCurrentCp(i.getMaxCp())
i.setCurrentHp(i.getMaxHp())
i.setCurrentMp(i.getMaxMp())
i.broadcastStatusUpdate()
i.broadcastUserInfo()
i.teleToLocation(t3[0]+Rnd.get(500),t3[1]+Rnd.get(500),t3[2])
return
def onAttack (self,npc,player,damage,isPet):
if player.getName() not in ATTAKERS :
try:
player.teleToLocation(147725,-56517,9999)
except : pass
return
def onKill(self,npc,player,isPet):
global tek,nyj,kolych
mobcount=(MOBS_TO_CHEL * kolych)+15
tek=tek+1
if tek==nyj and (2*nyj) < mobcount:
for i in range(0,2*tek) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
self.addSpawn(MOB,t1[0] + randx, t1[1] + randy, t1[2]+100,30000,False,CANCEL_TIME*60000)
nyj=2*tek
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", CANCEL_TIME*60000, None, None)
npcppc=self.addSpawn(MOB,t1[0],t1[1],t1[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.broadcastPacket(CreatureSay(npcppc.getObjectId(), 1, "Event "+str(NAME)+": ","You have "+str(CANCEL_TIME)+" minutes for kill this monsters!"))
npcppc.deleteMe()
elif tek==nyj and (2*nyj) >= mobcount:
for i in range(0,mobcount) :
randx = 25*(20-Rnd.get(40))
randy = 25*(20-Rnd.get(40))
mobb=self.addSpawn(MOB,t1[0] + randx, t1[1] + randy, t1[2]+100,30000,False,CANCEL_TIME*60000)
mobb.startAbnormalEffect(8192)
nyj=mobcount+1
tek=0
self.cancelQuestTimer("return_l",None,None)
self.startQuestTimer("return_l", (CANCEL_TIME)*60000, None, None)
npcppc=self.addSpawn(MOB,t1[0],t1[1],t1[2]+100,30000,False,CANCEL_TIME*60000)
npcppc.broadcastPacket(CreatureSay(npcppc.getObjectId(), 1, "Event "+str(NAME)+": ","You have "+str(CANCEL_TIME)+" minutes for kill this monsters!"))
npcppc.deleteMe()
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,t1[0] + randx, t1[1] + randy, t1[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))
Изменения думаю поймешь сам, но это ^^ самый оптимальный вариант.
После сметри ты ресаешься, за это отвечают параметры:
Небольшое обьяснение:
# Время, через которое будут ресаться убитый игрок.(указывается в секундах)
RES_TIME = 1
Код
if event == "res" and res_timer==1:
self.startQuestTimer("res", RES_TIME*1000, None, None)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
if i<>None:
if i.isOnline() :
if i.isDead():
i.doRevive()
i.setCurrentCp(i.getMaxCp())
i.setCurrentHp(i.getMaxHp())
i.setCurrentMp(i.getMaxMp())
i.broadcastStatusUpdate()
i.broadcastUserInfo()
i.teleToLocation(t3[0]+Rnd.get(500),t3[1]+Rnd.get(500),t3[2])
return
self.startQuestTimer("res", RES_TIME*1000, None, None)
for nm in ATTAKERS :
i=L2World.getInstance().getPlayer(nm)
if i<>None:
if i.isOnline() :
if i.isDead():
i.doRevive()
i.setCurrentCp(i.getMaxCp())
i.setCurrentHp(i.getMaxHp())
i.setCurrentMp(i.getMaxMp())
i.broadcastStatusUpdate()
i.broadcastUserInfo()
i.teleToLocation(t3[0]+Rnd.get(500),t3[1]+Rnd.get(500),t3[2])
return
0
Войдите или зарегистрируйтесь чтобы ответить


