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

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Lineage II (https://forum.zone-game.info/forumdisplay.php?f=34)
-   -   Телепорт за определеный итем: EMU-RT 482 (https://forum.zone-game.info/showthread.php?t=4163)

Aristocrat 19.07.2009 22:49

Телепорт за определеный итем: EMU-RT 482
 
В Таблицах SQL сборки 482, в родных ТП указанна только требуемое количество итемов, а не их ID. Мне нужно сделать так, чтобы при наличии определенного итема, НПС телепортировал в определенную точку карты и забирал итем.
Пробовал переделать квест 1104_NewbieTravelToken

[SPOILER]# Newbie Travel Token Teleport - by DrLecter
import sys
from net.l2emuproject.gameserver.model.quest import State
from net.l2emuproject.gameserver.model.quest import QuestState
from net.l2emuproject.gameserver.model.quest.jython import QuestJython as JQuest

qn = "1104_NewbieTravelToken"

DATA={
30600:[ 12111, 16686,-4584], #DE
30601:[115632,-177996, -896], #DW
30599:[ 45475, 48359,-3056], #EV
30602:[-45032,-113598, -192], #OV
30598:[-84081, 243227,-3728], #TI
32135:[-119697, 44532, 360] #KM
}

class Quest (JQuest) :

def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)

def onEvent (self,event,st):
if event.isdigit() :
dest = int(event)
if dest in DATA.keys() :
x,y,z = DATA[dest]
if x and y and z :
st.getPlayer().teleToLocation(x,y,z)
st.exitQuest(1)
return

def onTalk (Self,npc,player):
st = player.getQuestState(qn)
npcId = npc.getNpcId()
if player.getLevel() >= 20 :
htmltext = "1.htm"
st.exitQuest(1)
else:
htmltext = str(npcId)+".htm"
return htmltext

QUEST = Quest(1104,qn,"Teleports")

for i in DATA.keys() :
QUEST.addStartNpc(i)
QUEST.addTalkId(i)[/SPOILER]

, для себя, но неполучилось. НПС просто игнорит. Помогите пожалуйста разобраться как самому сделать ТП за определенные итемы.

PROGRAMMATOR 20.07.2009 00:14

Ответ: Телепорт за определеный итем: EMU-RT 482
 
Хороший скрипт взяли для "фундамента", но вот одного не понял, куда Вы удалили TOKEN, в котором и был указан ID предмета, который забирают?

[SOURCE="py"]qn = "1104_NewbieTravelToken"
TOKEN = 8542 # предмет, который мы наглым образом отберем у бедного персонажа

DATA={
30600:[ 12160, 16554,-4583],# Деревня Темных Эльфов
30601:[115594,-177993, -912],# Деревня Гномов
30599:[ 45470, 48328,-3059],# Деревня Эльфов
30602:[-45067,-113563, -199],# Деревня Орков
30598:[-84053, 243343,-3729],# Деревня Людей
32135:[-119712, 44519, 368] # Деревня Камаель
}[/SOURCE]

Где указывать нужный предмет, я думаю вам понятно стало. Идем дальше.

[SOURCE="py"] def onAdvEvent (self,event,npc, player) :
htmltext = event
st = player.getQuestState(qn)
if not st : return
if event.isdigit():
dest=int(event)
if dest in DATA.keys():
x,y,z=DATA[dest]
if x and y and z:
if st.getQuestItemsCount(TOKEN): # проверка, есть ли у персонажа предмет с id 8542
st.takeItems(TOKEN,1) # предмет(ы) с id 8542 найден(ы), отберем 1 шт.
st.getPlayer().teleToLocation(x,y,z) # телепортируем на указанные в DATA координаты
else: # предмет с id 8542 не найден у персонажа, отсылаем его на... рынок
st.exitQuest(1) # выходим из квеста
return "Incorrect item count" # выводим сообщение о том, что нехватает предмета
st.exitQuest(1)
return[/SOURCE]

Все расписал, думаю вопросов не будет. И последнее, квест будет работать только у персонажей < 20 уровня, ведь там есть проверка.

[SOURCE="py"] def onTalk (Self,npc,player):
st = player.getQuestState(qn)
npcId = npc.getNpcId()
if player.getLevel() >= 20: # проверяем персонажа и если его уровень больше или равен 20, то даем отбой
htmltext="1.htm"
st.exitQuest(1)
else:
htmltext=str(npcId)+".htm"
return htmltext[/SOURCE]

Приводим все в такое состояние и радуемся жизни.

[SOURCE="py"] def onTalk (Self,npc,player):
st = player.getQuestState(qn)
npcId = npc.getNpcId()
#if player.getLevel() >= 20: # проверяем персонажа и если его уровень больше или равен 20, то даем отбой
# htmltext="1.htm"
# st.exitQuest(1)
#else:
htmltext=str(npcId)+".htm"
return htmltext[/SOURCE]

Aristocrat 20.07.2009 20:28

Ответ: Телепорт за определеный итем: EMU-RT 482
 
Спасибо Вам за правку скрипта. Сделал как Вы сказали, но скрипт не работает.

1) Итоговый вид моего скрипта:

[SPOILER]
# Newbie Travel Token Teleport - by DrLecter
import sys
from net.l2emuproject.gameserver.model.quest import State
from net.l2emuproject.gameserver.model.quest import QuestState
from net.l2emuproject.gameserver.model.quest.jython import QuestJython as JQuest

qn = "997_NewbieTP"
TOKEN = 8542

DATA={
7777:[ -112570, 87174,-12935], #1
7778:[-112381,87177, -12974], #2
7779:[ -112189, 87178,-12974], #3
}

class Quest (JQuest) :

def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)

def onAdvEvent (self,event,npc, player) :
htmltext = event
st = player.getQuestState(qn)
if not st : return
if event.isdigit():
dest=int(event)
if dest in DATA.keys():
x,y,z=DATA[dest]
if x and y and z:
if st.getQuestItemsCount(TOKEN):

st.takeItems(TOKEN,1)
else:

st.exitQuest(1)
return "Incorrect item count"
st.exitQuest(1)
return


def onTalk (Self,npc,player):
st = player.getQuestState(qn)
npcId = npc.getNpcId()
if player.getLevel() >= 20:
htmltext = "1.htm"
st.exitQuest(1)
else:
htmltext = str(npcId)+".htm"
return htmltext

QUEST = Quest(997,qn,"custom")

for i in DATA.keys() :
QUEST.addStartNpc(i)
QUEST.addTalkId(i)
[/SPOILER]

2) Файл ошибки __init__.py.error
[SPOILER]
Error on: D:\Aristo-L2jServer\Work\l2emurt-game\dist\data\scripts\custom\997_NewbieTP\__init_ _.py.error.log
Line: -1 - Column: -1

Traceback (innermost last):
(no code object) at line 0
ValueError: Strings added to sha hashes must not contain characters with value > 255

------

Дословно понял, что какое-то значение превышает допустимую длину, но как с этим бороться, не знаю.
[/SPOILER]

Буду весьма признателен, если Вы поможете мне разобраться в этом скрипте. Также буду очень благодарен, если Вы поделитесь ссылочкой на мануал по этим скриптам(основные Команды, Ввод переменных, привязка к ядру сервера.)

PROGRAMMATOR 20.07.2009 20:54

Ответ: Телепорт за определеный итем: EMU-RT 482
 
Я вам дал рабочий вариант, проверенный, то что Вы показываете что-то кривое, питон не может работать без правильных переносов\пробелов и т.д. В массиве DATA (последняя строка) ошибка, откуда там появилась запятая?

Aristocrat 20.07.2009 21:20

Ответ: Телепорт за определеный итем: EMU-RT 482
 
Спасибо. Извините, что отнял Ваше время. Буду разбираться.

Hunk 26.07.2009 08:15

Ответ: Телепорт за определеный итем: EMU-RT 482
 
Добрые люди подскажите в чем косяк. Пытаюсь сделать квест для новичков, но почему то квест не запускается и никаких ошибок не выдает. Сборка таже, хтмлки все сделаны. Вот сам квест:

[SPOILER]
Код:

import sys
from net.l2emuproject.gameserver.model.quest import State
from net.l2emuproject.gameserver.model.quest import QuestState
from net.l2emuproject.gameserver.model.quest.jython import QuestJython as JQuest

qn = "201_NewbieQuest"

ITEM_ID = 9754
ADENA = 57


class Quest (JQuest) :

 def __init__(self,id,name,descr):
    JQuest.__init__(self,id,name,descr)
    self.questItemIds = [ITEM_ID]

def onEvent (self,event,st) :
    htmltext = event
    if event == "90011-04.htm" :
      st.set("cond","1")
      st.setState(State.STARTED)
      st.playSound("ItemSound.quest_accept")
    return htmltext
       
def onTalk (self,npc,player):
  htmltext = "<html><body>You are either not on a quest that involves this NPC, or you don't meet this NPC's minimum quest requirements.</body></html>"
  st = player.getQuestState(qn)
  if not st : return htmltext
 
  npcId = npc.getNpcId()
  id = st.getState()
  if id == State.CREATED :
    st.set("cond","0")
  if st.getInt("cond")==0 :
    if player.getLevel() >= 18 :
      htmltext = "90011-03.htm"
    else:
      htmltext = "90011-02.htm"
      st.exitQuest(1)
  else :
    if st.getQuestItemsCount(ITEM_ID)<10 :
      htmltext = "90011-05.htm"
    else :
      st.takeItems(ITEM_ID,-1)
      st.rewardItems(ADENA,2000000)
      st.exitQuest(1)
      st.playSound("ItemSound.quest_finish")
      htmltext = "90011-06.htm"
  return htmltext
 
def onKill (self,npc,player,isPet) :
  st = player.getQuestState(qn)
  if not st : return
  if st.getState() != State.STARTED : return

  chance=22+(((npc.getNpcId()-20000)^34)/4)
  count=st.getQuestItemsCount(ITEM_ID)
  if count < 10 and st.getRandom(100) < chance :
    st.giveItems(ITEM_ID,1)
    if count == 9 :
      st.playSound("ItemSound.quest_middle")
      st.set("cond","2")
    else :
      st.playSound("ItemSound.quest_itemget")
  return
 
QUEST      = Quest(201,qn,"Help")

QUEST.addStartNpc(90011)

QUEST.addTalkId(90011)

QUEST.addKillId(90501)
QUEST.addKillId(90502)

[/SPOILER]

Hunk 27.07.2009 13:44

Ответ: Телепорт за определеный итем: EMU-RT 482
 
всем спасибо. сам все нашел и исправил

[SPOILER]
Код:

import sys
from net.l2emuproject.gameserver.model.quest import State
from net.l2emuproject.gameserver.model.quest import QuestState
from net.l2emuproject.gameserver.model.quest.jython import QuestJython as JQuest

qn = "201_NewbieQuest"

ITEM_ID = 9754
ADENA = 57

class Quest (JQuest) :

 def __init__(self,id,name,descr):
    JQuest.__init__(self,id,name,descr)
    self.questItemIds = [ITEM_ID]

 def onEvent (self,event,st) :
    htmltext = event
    if event == "90011-04.htm" :
      st.set("cond","1")
      st.setState(State.STARTED)
      st.playSound("ItemSound.quest_accept")
    return htmltext

 def onTalk (self,npc,player):
  htmltext = "<html><body>You are either not on a quest that involves this NPC, or you don't meet this NPC's minimum quest requirements.</body></html>"
  st = player.getQuestState(qn)
  if not st : return htmltext

  npcId = npc.getNpcId()
  id = st.getState()
  if id == State.CREATED :
    st.set("cond","0")
  if st.getInt("cond")==0 :
    if player.getLevel() >= 20 :
      htmltext = "90011-03.htm"
    else:
      htmltext = "90011-02.htm"
      st.exitQuest(1)
  else :
    if st.getQuestItemsCount(ITEM_ID)<10 :
      htmltext = "90011-05.htm"
    else :
      st.takeItems(ITEM_ID,-1)
      st.rewardItems(ADENA,2000000)
      st.exitQuest(1)
      st.playSound("ItemSound.quest_finish")
      htmltext = "90011-06.htm"
  return htmltext

 def onKill(self,npc,player,isPet):
  st = player.getQuestState(qn)
  if not st : return
  if st.getState() != State.STARTED : return

  chance=22+(((npc.getNpcId()-20000)^34)/4)
  count=st.getQuestItemsCount(ITEM_ID)
  if count < 10 and st.getRandom(100) < chance :
    st.giveItems(ITEM_ID,1)
    if count == 9 :
      st.playSound("ItemSound.quest_middle")
      st.set("cond","2")
    else :
      st.playSound("ItemSound.quest_itemget")
  return

QUEST      = Quest(201,qn,"Kill Zombi")

QUEST.addStartNpc(90011)

QUEST.addTalkId(90011)

QUEST.addKillId(90501)
QUEST.addKillId(90502)

[/SPOILER]


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

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