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

Lineage II
Дискуссии на тему создания, настройки и обслуживания серверов Lineage 2. При поддержке: Премиум услуги по рекламе

Ответ
Опции темы
Непрочитано 19.07.2009, 22:49   #1
Аватар для Aristocrat
Мастер

Автор темы (Топик Стартер) Телепорт за определеный итем: 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]

, для себя, но неполучилось. НПС просто игнорит. Помогите пожалуйста разобраться как самому сделать ТП за определенные итемы.
Aristocrat вне форума Ответить с цитированием
Непрочитано 20.07.2009, 00:14   #2
Аватар для PROGRAMMATOR
Администратор

По умолчанию Ответ: Телепорт за определеный итем: 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]
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR вне форума Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 20.07.2009, 20:28   #3
Аватар для Aristocrat
Мастер

Автор темы (Топик Стартер) Ответ: Телепорт за определеный итем: 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]

Буду весьма признателен, если Вы поможете мне разобраться в этом скрипте. Также буду очень благодарен, если Вы поделитесь ссылочкой на мануал по этим скриптам(основные Команды, Ввод переменных, привязка к ядру сервера.)
Aristocrat вне форума Ответить с цитированием
Непрочитано 20.07.2009, 20:54   #4
Аватар для PROGRAMMATOR
Администратор

По умолчанию Ответ: Телепорт за определеный итем: EMU-RT 482

Я вам дал рабочий вариант, проверенный, то что Вы показываете что-то кривое, питон не может работать без правильных переносов\пробелов и т.д. В массиве DATA (последняя строка) ошибка, откуда там появилась запятая?
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR вне форума Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 20.07.2009, 21:20   #5
Аватар для Aristocrat
Мастер

Автор темы (Топик Стартер) Ответ: Телепорт за определеный итем: EMU-RT 482

Спасибо. Извините, что отнял Ваше время. Буду разбираться.
Aristocrat вне форума Ответить с цитированием
Непрочитано 26.07.2009, 08:15   #6
Аватар для Hunk
Пользователь

По умолчанию Ответ: Телепорт за определеный итем: 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 вне форума Отправить сообщение для Hunk с помощью ICQ Ответить с цитированием
Непрочитано 27.07.2009, 13:44   #7
Аватар для Hunk
Пользователь

По умолчанию Ответ: Телепорт за определеный итем: 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]
Hunk вне форума Отправить сообщение для Hunk с помощью ICQ Ответить с цитированием
Ответ

Метки
тп телепорт за итемы


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

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

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

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


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

Вверх