Перейти к содержанию
Авторизация  
Max

Пишем Квест На Питоне

Рекомендуемые сообщения

Видел такое чудо на одном из серверов и вот решел реализовать на своем проекте La2Ultra.ru

В двух словах о самом квесте.

Дополнение с помощью которого мир Lineage II разделяется на две половины - светлую и темную. Игроки смогут принять одну из древних противоборствующих сторон, Ангелов или Демонов.

В славном городе Гиран перед входом в храм, игроки смогут найти Мастеров каждой стороны, и вступить в то или иное братство. После вступления игрок получает отличительный знак братства - маленькие крылья, обладающие следующими магическими свойствами: в случае смерти с персонажа не спадают заклинания, а также увеличивается скорость атаки и шанс критического удара.

Лидер Клана, достигшего 5-го уровня, получает возможность приобрести у Мастера своей стороны Крылья Лидера Клана, которые имеют более высокие статы, чем обычные крылья братства.

В случае достижения кланом 8-го уровня, Лидер такого Клана получает возможность приобрести у Мастера своего братства специальное оружие Лидера. Для каждой из противоборствующих сторон этот итем уникален и представляет из себя двуручное древковое оружие, которое по своим боевым характеристикам превосходит характеристики большинства видов оружия S грейда.

Достигнув 76-го лвл Лидеры Кланов приобретают активный навык, позволяющий немедленно призвать к себе всех членов клана, находящихся в этот момент в игре.

Каждый персонаж, вступивший в братство, получает возможность приобрести у своего Мастера персонального питомца.

У каждого братства есть свой баффер.

Теперь детали:

За неделю бессонных ночей удалось реализовать следующее....

 

Скрытый текст
#Angels_vs_Demons Quest Written By Maxon

 

qn = "2010_A_vs_D"

 

#NPC

GKBELLA_ID = 30256

ABUFFER_ID = 70000

AMASTER_ID = 71000

DMASTER_ID = 72000

DBUFFER_ID = 73000

 

#QUEST ITEMS

DLWINGS_ID = 10579

ANWINGS_ID = 10580

DEWINGS_ID = 10581

ALWINGS_ID = 10582

ADENA = 57

PDEMON_ID = 6650

PANGEL_ID = 6648

 

#MESSAGES

default='<html><body>Go away a feathery creature while I haven"t split you into slices!</body></html>'

 

class Quest (JQuest) :

 

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

 

def onEvent (self,event,st) :

htmltext = event

cond=st.getInt("cond")

 

if event == "30256-1.htm" :

if cond==0:

st.set("cond","1")

st.setState(STARTED)

else:

htmltext=default

 

if event == "72000-3.htm" :

if cond==1:

st.giveItems(DEWINGS_ID,1)

st.set("cond","2")

 

if event == "71000-3.htm" :

if cond==1:

st.giveItems(ANWINGS_ID,1)

st.set("cond","3")

 

if event == "71000-7.htm" :

if st.getQuestItemsCount(ADENA_ID) < 5000000 :

if st.getQuestItemsCount(PANGEL_ID) > 0 :

st.takeItems(ADENA_ID,5000000)

st.giveItems(PANGEL_ID,1)

else:

htmltext=default

else:

htmltext="The section to be in a development stage!"

 

if event == "72000-7.htm" :

if st.getQuestItemsCount(ADENA_ID) < 5000000 :

if st.getQuestItemsCount(PDEMON_ID) > 0 :

st.takeItems(ADENA_ID,5000000)

st.giveItems(PDEMON_ID,1)

else:

htmltext=default

else:

htmltext="The section to be in a development stage!"

 

return htmltext

 

def onTalk (self,npc,player):

htmltext = default

st = player.getQuestState(qn)

if st :

npcId = npc.getNpcId()

id = st.getState()

if id == CREATED :

st.set("cond","0")

cond = st.getInt("cond")

if npcId == 30256 and cond == 0 :

if player.getLevel() >= 1 and player.getLevel() <= 80 :

htmltext = "30256-0.htm"

 

elif id == STARTED :

if npcId == 72000 and cond == 1 :

htmltext = "72000-1.htm"

elif npcId == 72000 and cond == 2 :

htmltext = "72000-4.htm"

elif npcId == 71000 and cond == 1 :

htmltext = "71000-1.htm"

elif npcId == 71000 and cond == 3 :

htmltext = "71000-4.htm"

elif npcId == 30256 and cond == 1 :

htmltext = "30256-1.htm"

elif npcId == 30256 and cond == 2 :

htmltext = "30256-1.htm"

elif npcId == 30256 and cond == 3 :

htmltext = "30256-1.htm"

 

return htmltext

 

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

CREATED = State("Start", QUEST)

STARTED = State("Started", QUEST)

 

QUEST.setInitialState(CREATED)

QUEST.addStartNpc(30256)

 

QUEST.addTalkId(30256)

 

for i in range(70000,74000):

QUEST.addTalkId(i)

А теперь по порядку:

1. Необходимые НПС созданы и выставлены.

2. Начало квеста сделал у ГК в Глудио (т.к. через него проходят все новые чары) при этом игрок этого не заметит. (единственно добавлен новый "30256-0.htm" в котором написано "бла...бла...бла ты наконецто достиг момента чтобы отправиться в мир полный приключений но помни что опасность тебе подстерегает....бла..бла..бла", который появиться 1 раз для каждого нового чара начавшего диалог с ГК в Глудио.

Скрытый текст

def onEvent (self,event,st) :

htmltext = event

cond=st.getInt("cond")

 

if event == "30256-1.htm" :

if cond==0:

st.set("cond","1")

st.setState(STARTED)

 

def onTalk (self,npc,player):

htmltext = default

st = player.getQuestState(qn)

if st :

npcId = npc.getNpcId()

id = st.getState()

if id == CREATED :

st.set("cond","0")

cond = st.getInt("cond")

if npcId == 30256 and cond == 0 :

htmltext = "30256-0.htm"

3. Добавляем соответственно главных НПС (Мастеров братства)

post-1032-1288020283_thumb.jpg

Скрытый текст

(def onTalk (self,npc,player):drinks:

elif id == STARTED :

if npcId == 72000 and cond == 1 :

htmltext = "72000-1.htm"

elif npcId == 72000 and cond == 2 :

htmltext = "72000-4.htm"

elif npcId == 71000 and cond == 1 :

htmltext = "71000-1.htm"

elif npcId == 71000 and cond == 3 :

htmltext = "71000-4.htm"

 

(def onEvent (self,event,st) :D

if event == "72000-3.htm" :

if cond==1:

st.giveItems(DEWINGS_ID,1)

st.set("cond","2")

 

if event == "71000-3.htm" :

if cond==1:

st.giveItems(ANWINGS_ID,1)

st.set("cond","3")

В этой части любой из мастеров предложит вам вступить в его братство

post-1032-1288021078_thumb.jpgpost-1032-1288021084_thumb.jpg

и выбрав одного из них вы получаете крылья братства

post-1032-1288020696_thumb.jpg

Обратим внимание на "cond" при вступлении в братство он становиться разным (3 или 4) соответственно если вы подойдете к Мастеру чужого братства квест не продолжиться и он вас пошлет в лес за ягодами а если вы подойдете к НПС своего братства то уже попадете сразу на страницу "71000-4.htm" или "72000-4.htm"

post-1032-1288021043_thumb.jpg(т.е. второй раз вам уже не предложат вступить в братство)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь пойдем дальше:

 

В настоящее время занимаюсь реализацией пункта "получить слугу"

Скрытый текст
if event == "71000-7.htm" :

if st.getQuestItemsCount(ADENA_ID) < 5000000 :

if st.getQuestItemsCount(PANGEL_ID) > 0 :

st.takeItems(ADENA_ID,5000000)

st.giveItems(PANGEL_ID,1)

else:

htmltext=default

else:

htmltext="The section to be in a development stage!"

Слугу я сделал из baby kokabura и baby buffalo поменяв им внешний вид и статы.

По задумке эта часть квеста должна определять:

1. У персонажа есть 5кк адены и если нету написать что у него нехватает денег

2. У персонажа нет питомца PDEMON_ID и если есть то написать что питомец уже есть

А если есть деньги и нет питомца соответственно отнять деньги и выдать питомца! Но увы не работает( так что присоединяемся помогаем кто чем может.

 

Теперь дальше вопрос к знатокам по проверкам: помогите написать проверку персонажа, что он является Клан лидером и его клан имеет 5 лвл и если условия удовлетворяется забрать у него маленькие крылья ANWINGS_ID = 10580 или DEWINGS_ID = 10581 и выдать ему большие ALWINGS_ID = 10582 или DLWINGS_ID = 10579 в зависимости от братства в котором он состоит.

post-1032-1288022528_thumb.jpg

Пока вот эти 2 важных момента дальше по ходу будем вместе с вами разбирать остальные пункты.

Я так же продолжаю работать над квестом и если чтото будет получаться буду дополнять тему!

Заранее спасибо всем кто присоединиться к обсуждению!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сегодня сделал блок выхода из братства все работает нормально единственно опять же нужна проверка на количество адены так как пока адена есть она отнимается по 500кк когда у вас допустим всего 300кк то отнимется 300кк если у вас 0 соответственно ничего не отнимется но из братства вы выйдите соответственно нужна проверка что ADENA_ID>500000000 теоретически должно быть так:

 

if event == "72000-10.htm" :

if st.getQuestItemsCount(ADENA_ID) > 500000000 :

if cond==2:

st.takeItems(ADENA_ID,500000000)

st.takeItems(DEWINGS_ID,1)

st.takeItems(DLWINGS_ID,1)

st.takeItems(PDEMON_ID,1)

st.set("cond","1")

else:

htmltext="72000-11.htm" #У вас недостаточно денег чтобы покинуть братство

 

Не знаю почему но это не работает! Помогаем!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да форум оказывается мертвый может кто хоть подскажет нормальный форум где темку разместить? 56 просмотров и ни одного ответа(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

без обид но мой сервак на 256 адсл с бесплатным хостингом ито популярнее был =)

посоветую сначало поставить нормальный шаблон на сайт так как у вас сейчас он очень стрёмный и особености сервера каторые вы написали

Особенности нашего сервера:  

- безопасная заточка +3; 

- максимальная +35; 

- NPC-баффер, баффы длительностью 1 час; 

- работающие Катакомбы и Некрополи; 

- Олимпиада, герои, геройское оружие и скиллы; 

- клановая система, кланвары, клановые скилы; 

Для полного баланса: 

- осады замков, кланхоллы и клановые привилегии; 

- демоническое оружие: Зарич и Акаманахи; 

- TvT эвент и многое другое... 

  Больше вы можете увидеть, выбрав наш сервер. Только здесь каждый может создать свой клан и покорить мир, также на сервере действует система донейта. 

Удачи в игре...

совесм не особенные кеакието )

скажу как игрок зйадя на ваш сайт нечего особенного и монящего я неувидел!

так как всё както не качествено и сразу мелькнула мысль чем вы думал админ когда делала сайт ? =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

if event == "72000-10.htm" :

if st.getQuestItemsCount(57) >= 500000000 :

if cond==2:

st.takeItems(57,500000000)

st.takeItems(DEWINGS_ID,1)

st.takeItems(DLWINGS_ID,1)

st.takeItems(PDEMON_ID,1)

st.set("cond","1")

else:

htmltext="72000-11.htm" #У вас недостаточно денег чтобы покинуть братство

 

 

Попробуй и видпышы. Какая лутшая зборка под сервер Gracia Final ??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
без обид но мой сервак на 256 адсл с бесплатным хостингом ито популярнее был =)

посоветую сначало поставить нормальный шаблон на сайт так как у вас сейчас он очень стрёмный и особености сервера каторые вы написали совесм не особенные кеакието )

скажу как игрок зйадя на ваш сайт нечего особенного и монящего я неувидел!

так как всё както не качествено и сразу мелькнула мысль чем вы думал админ когда делала сайт ? =)

Был сначала офигенный сайт во флеше но изза того что невозможно разместить во флеше кнопку л2топ пришлось перейти на статику а на статике что хорошее сложно сделать но видимо когда ты заходил это самое начало мы потихоньку дорабатываем так что думаю все будет нормально в итоге. Добавлю что онлайн перейдет с другого сервера как только все настроим так что через месяцок зайди посмотри онлайн 1000+ будет как минимум и описания на сайте особо никому не нужны если честно написать можно что угодно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну што з квестом розабрался?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да) выложи нам суда весь код)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
if event == "72000-10.htm" :

if st.getQuestItemsCount(57) >= 500000000 :

if cond==2:

st.takeItems(57,500000000)

st.takeItems(DEWINGS_ID,1)

st.takeItems(DLWINGS_ID,1)

st.takeItems(PDEMON_ID,1)

st.set("cond","1")

else:

htmltext="72000-11.htm" #У вас недостаточно денег чтобы покинуть братство

 

 

Попробуй и видпышы. Какая лутшая зборка под сервер Gracia Final ??

С этой частью разобрался выглядит это так:

 

if event == "72000-10.htm" : #Выйти из братства

 

if cond==2 and count > 499999999 : #Проверка на принадлежность к братству и наличие адены

st.takeItems(ADENA_ID,500000000) #забираем 500кк

st.takeItems(DEWINGS_ID,1) #забираем маленькие крылья (если они есть)

st.takeItems(DLWINGS_ID,1) #забираем большие крылья (если они есть)

st.takeItems(PDEMON_ID,1) #забираем питомца (если он есть)

st.takeItems(DLWEPN_ID,1) #забираем оружие Лидера (если есть)

st.set("cond","1") #переводим квест в состояние когда мы можем вступить в любое братство

else:

htmltext="72000-21.htm" #У тебя недостаточно денег

 

Для Ангелов эдентично. В самом начале раздела def onEvent ввел константу count=st.getQuestItemsCount(ADENA_ID)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь е*сь вот с чем:

 

if event == "71000-5.htm" : #Получить крылья Лидера

if leader and clanLevel > 4 : #Проверка на лидера клана и лвл клана

st.takeItems(ANWINGS_ID,1) #забрать маленькие крылья

st.giveItems(ALWINGS_ID,1) #дать большие крылья

else:

htmltext="71000-19.htm" #ты не КЛ либо уровень клана меньше 5

 

ввожу константы:

 

leader=st.getPlayer().getClan(). getClanLeader()

clanLevel=st.getPlayer().getClan().getLevel()

 

в итоге ошибка:

 

Traceback (innermost last):

File "__init__.py", line 43, in onEvent

AttributeError: 'NoneType' object has no attribute 'getClanLeader'

 

Полный лог ошибки:

Скрытый текст
Traceback (innermost last):

File "__init__.py", line 43, in onEvent

AttributeError: 'NoneType' object has no attribute 'getClanLeader'

 

at org.python.core.Py.AttributeError(Unknown Source)

at org.python.core.PyObject.noAttributeError(Unknown Source)

at org.python.core.PyObject.__getattr__(Unknown Source)

at org.python.core.PyObject.invoke(Unknown Source)

at org.python.pycode._pyx43.onEvent$3(__init__.py:43)

at org.python.pycode._pyx43.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$40.onEvent(Unknown Source)

at com.l2scoria.gameserver.model.quest.Quest.onAdvEvent(Quest.java:586)

at com.l2scoria.gameserver.model.quest.Quest.notifyEvent(Quest.java:419)

at com.l2scoria.gameserver.model.actor.instance.L2PcInstance.processQuestEvent(L2Pc

Instance.java:1552)

at com.l2scoria.gameserver.network.clientpackets.RequestBypassToServer.runImpl(Requ

estBypassToServer.java:227)

at com.l2scoria.gameserver.network.clientpackets.L2GameClientPacket.run(L2GameClien

tPacket.java:99)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:662)

 

Тут есть вобще питонисты ппц я вобще не программист сам все ковыряю методом сравнения поучаствуйте хоть ктото а то я буду продолжать в одиночку так как не вижу смысла тут дальше чтото выкладывать.

Кстати баферов и питомцев тоже прикрутил все работает питомцев выдает с проверкой на наличие адены. Если ктото будет обсуждать могу делиться дальше а так ну нафик таких тем нигде больше нет поражаюсь безразличием

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. интуитивно предполагаю что чтото нужно сюда добавить:

 

def onEvent (self,event,st) :

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если все таки допишешь будь добр выложи его нам :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

все квест дописан все работает даже пет бафера вкрутил туда теперь думаю над тем как уйти от того чтобы квест начинался у телепортера в глудио так как изначально была мысль что все новые персонажи чтобы попасть в мир из нубской деревни обязательно общаются с этим телепортером НО не учел то обстоятельство, что в дальнейшем игроки используют сумонеров (варк, котовод, коневод) и сразу могут присумонить нового чара в гиран тогда квест уже не работает и они не могут общаться с нпс пока случайно не попадут в глудио. Еще 1 момент над которым я сейчас думаю это как забирать большие крылья у лидера клана и давать ему маленькие если он распускает клан но это скорее всего реализую тут впринципе нет особо сложного надо просто в квест впихнуть хтмлки виладж мастеров и зарегить их в квесте и перенести в него функцию роспуска кланов. Следующий момент это сделать чтоб при вступлении противоположной стороны в клан противоположной стороны для всех игроков этого клана переставали работать телепорты и в шаут шло сообщение "Внимание Ангелы возможны предательства...." и еще чтоб при вступлении в братство об этом тоже сообщалось в чате на весь мир игрок с ником таким то втупил в братство демонов (ангелов) ну вот впринципе и все дополнение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...