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

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Работа со скриптами (https://forum.zone-game.info/forumdisplay.php?f=37)
-   -   Помогите с квестом на питоне (https://forum.zone-game.info/showthread.php?t=29506)

Virrilis3 15.06.2013 19:26

Помогите с квестом на питоне
 
Всем привет. Есть квест на питоне. Мне нужно, чтобы квест запускался, когда игрок заходит в игру.
Часть скрипта:
Код:

# Made by disKret
import sys
from com.l2scoria import Config
from com.l2scoria.util.random import Rnd
from com.l2scoria.gameserver.model import Inventory
from com.l2scoria.gameserver.model.actor.instance import L2ItemInstance
from com.l2scoria.gameserver.model.quest import State
from com.l2scoria.gameserver.model.quest import QuestState
from com.l2scoria.gameserver.model.quest.jython import QuestJython as JQuest

qn = "9990_CraftSystem"

#NPC
NPC_ID = 30086

#QUEST ITEM
PACKAGE = 7263

ONE_TYPE_WEAPON = [1, 2, 3, 4]
ONE_TYPE_DROP_ID = [4037, 57, 4356, 4357, 6673]
ONE_TYPE_DROP_COUNT = 1
ONE_TYPE_DROP_CHANCE = 100
ONE_MOB_ID = [18342, 18341, 18343, 18330, 18331]

TWO_TYPE_WEAPON = [1, 2, 3, 4]
TWO_TYPE_DROP_ID = [1, 2, 3, 4, 5]
TWO_TYPE_DROP_COUNT = 1
TWO_TYPE_DROP_CHANCE = 100
TWO_MOB_ID = [111, 111, 111, 111, 111]

THREE_TYPE_WEAPON = [1, 2, 3, 4]
THREE_TYPE_DROP_ID = [1, 2, 3, 4, 5]
THREE_TYPE_DROP_COUNT = 1
THREE_TYPE_DROP_CHANCE = 100
THREE_MOB_ID = [111, 111, 111, 111, 111]

FO_TYPE_WEAPON = [1, 2, 3, 4]
FO_TYPE_DROP_ID = [1, 2, 3, 4, 5]
FO_TYPE_DROP_COUNT = 1
FO_TYPE_DROP_CHANCE = 100
FO_MOB_ID = [111, 111, 111, 111, 111]

FIVE_TYPE_WEAPON = [1, 2, 3, 4]
FIVE_TYPE_DROP_ID = [1, 2, 3, 4, 5]
FIVE_TYPE_DROP_COUNT = 1
FIVE_TYPE_DROP_CHANCE = 100
FIVE_MOB_ID = [111, 111, 111, 111, 111]


print "E6aTb KoIIaTb 3arpy3uJIocb!"

class Quest (JQuest) :

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

 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
  st.setState(State('Started', QUEST))
  return

 def onAttack (self, npc, player, damage, isPet):
  st = player.getQuestState(qn)
  if not st : return
  player = st.getPlayer()
  npcId = npc.getNpcId()
  if player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LRHAND) != None:
      type = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LRHAND)
  elif player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND) != None:
          type = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND)
  else :
      return

  itemId = type.getItemId()
  if itemId in ONE_TYPE_WEAPON and npcId in ONE_MOB_ID:
      if itemId == ONE_TYPE_WEAPON[0] :
          if ONE_TYPE_DROP_CHANCE > Rnd.get(1, 100):
              st.giveItems(ONE_TYPE_DROP_ID[0], ONE_TYPE_DROP_COUNT)
          if ONE_TYPE_DROP_CHANCE > Rnd.get(1, 100):
              st.giveItems(ONE_TYPE_DROP_ID[1], ONE_TYPE_DROP_COUNT)
  ........................................
 
  else :
      return
     
  return
 
 
QUEST      = Quest(9990, qn, "Craft System")

for i in ONE_MOB_ID :
    QUEST.addAttackId(i)
for i in TWO_MOB_ID :
    QUEST.addAttackId(i)
for i in THREE_MOB_ID :
    QUEST.addAttackId(i)
for i in FO_MOB_ID :
    QUEST.addAttackId(i)
for i in FIVE_MOB_ID :
    QUEST.addAttackId(i)

QUEST.addStartNpc(NPC_ID)
QUEST.addTalkId(NPC_ID)


Archiel 15.06.2013 19:39

Re: Помогите с квестом на питоне
 
А разве это делается через квест? Посмотрите как в ядре реализован 255_Tutorial, думаю, что найдёте ответ на свой вопрос. Самый простой способ что-то запустить при логине в игру, это засунуть это в EnterWorld.java

Virrilis3 15.06.2013 19:43

Re: Помогите с квестом на питоне
 
Цитата:

Сообщение от Archiel (Сообщение 305646)
А разве это делается через квест? Посмотрите как в ядре реализован 255_Tutorial, думаю, что найдёте ответ на свой вопрос. Самый простой способ что-то запустить при логине в игру, это засунуть это в EnterWorld.java

Через onAdvEvent?

Archiel 15.06.2013 19:48

Re: Помогите с квестом на питоне
 
Цитата:

Сообщение от Virrilis3 (Сообщение 305647)
Через onAdvEvent?

У вас исходники есть сервера, или только компил сборки?

Virrilis3 15.06.2013 19:49

Re: Помогите с квестом на питоне
 
Цитата:

Сообщение от Archiel (Сообщение 305651)
У вас исходники есть сервера, или только компил сборки?

Исходники имеются.

Archiel 15.06.2013 19:54

Re: Помогите с квестом на питоне
 
Цитата:

Сообщение от Virrilis3 (Сообщение 305652)
Исходники имеются.

Отлично. У меня в данный момент нет времени лезть в код, может через часик гляну вариант решения вопроса. А вы пока обычным виндовым поиском найдите EnterWorld.java и реализацию запуска 255_Tutorial в своей сборке. Если найдёте решение, отпишите тут, я не буду париться. Если не найдёте, то на досуге накидаю чего-нибудь.

Добавлено через 4 минуты
О, быстрое решение. В EnterWorld проверяете у игрока статус квеста своего, если его нет, тогда запускаете игроку htm, в котором будет какой-нибудь диалог и кнопка "принять" для запуска квеста через onEvent

event = htmltext
if event = ololo.htm
setQuestState(STARTED)

ну и дальше по тексту

На синтаксис не смотрите, я просто хотел, чтобы вы просто поняли суть.

Добавлено через 1 час 56 минут
Ну как у автора дела?

Map 15.06.2013 22:14

Re: Помогите с квестом на питоне
 
Хотел спросить, пытаюсь переписать данный квест себе под сборку, появилась вот такая ошибка
Код:

Traceback (innermost last):
  File "newsystem.py", line 250, in ?
TypeError: addAttackId(): 1st arg can't be coerced to int[]

Как можно ее решить?

Virrilis3 15.06.2013 22:27

Re: Помогите с квестом на питоне
 
Цитата:

Сообщение от Archiel (Сообщение 305653)
Отлично. У меня в данный момент нет времени лезть в код, может через часик гляну вариант решения вопроса. А вы пока обычным виндовым поиском найдите EnterWorld.java и реализацию запуска 255_Tutorial в своей сборке. Если найдёте решение, отпишите тут, я не буду париться. Если не найдёте, то на досуге накидаю чего-нибудь.

Добавлено через 4 минуты
О, быстрое решение. В EnterWorld проверяете у игрока статус квеста своего, если его нет, тогда запускаете игроку htm, в котором будет какой-нибудь диалог и кнопка "принять" для запуска квеста через onEvent

event = htmltext
if event = ololo.htm
setQuestState(STARTED)

ну и дальше по тексту

На синтаксис не смотрите, я просто хотел, чтобы вы просто поняли суть.

Добавлено через 1 час 56 минут
Ну как у автора дела?

Вы не поняли суть. Мне нужно, чтобы игроки не нажимали принять или начать квест, а чтобы квест был постоянно включет. Тоесть игрок зашел в игру и начал фармить.
З.Ы. Суть квеста заключается в фарме с определенных мобов, определенным оружием.

Добавлено через 4 минуты
Цитата:

Сообщение от FireaGe (Сообщение 305687)
Хотел спросить, пытаюсь переписать данный квест себе под сборку, появилась вот такая ошибка
Код:

Traceback (innermost last):
  File "newsystem.py", line 250, in ?
TypeError: addAttackId(): 1st arg can't be coerced to int[]

Как можно ее решить?

Заменить:
Код:

for i in ONE_MOB_ID :
    QUEST.addAttackId(i)

На:
Код:

QUEST.addAttackId(ONE_MOB_ID)

Archiel 15.06.2013 22:49

Re: Помогите с квестом на питоне
 
Цитата:

Сообщение от Virrilis3 (Сообщение 305699)
Вы не поняли суть. Мне нужно, чтобы игроки не нажимали принять или начать квест, а чтобы квест был постоянно включет. Тоесть игрок зашел в игру и начал фармить.
З.Ы. Суть квеста заключается в фарме с определенных мобов, определенным оружием.

Ну это почти тоже самое. Проверяем при входе в игру, есть ли квест у игрока, и если его нет, то даём его ему. Вот и всё, собственно.

EnterWorld.java
Код:

QuestState qs = activeChar.getQuestState("9990_CraftSystem");
                Quest q = QuestManager.getInstance().getQuest("9990_CraftSystem");
                if (qs == null)
                        q.newQuestState(activeChar).setState(State.STARTED);


Map 15.06.2013 22:57

Re: Помогите с квестом на питоне
 
Спасибо за первую ошибку, но появилась новая :), буду благодарен!
Traceback (innermost last):
File "newsystem.py", line 255, in ?
TypeError: addStartNpc(): 1st arg can't be coerced to int[]


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

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