Репост с форума -----. Так как там в нечитаемом виде, кидаю сюда заранее отформатировав.
Основа любого скрипта - класс унаследованный от JythonQuest. Что же это за класс и чем он так хорош?
Класс предназначен для создания квестов на языке Python. В принципе, он просто наследуется от класса Quest, и предназначен для "логического разделения". Что мол, квест написан на Python а не на Java.
Теперь расмотрим методв этого класса и их назначение. Небольшое отсупление: Часть методов является событийными (т.е. вызываются ядром при наступлении каких-либо условий). Эти методы в дальнейшем будут именоваться событиями. Так сделано, что бы отличить их от методов, которые вызывает пользователь.
Методы, связывающие квесты с npc/мобами
addAcquireSkillId(npcId) - вызовет событие onAcquireSkill когда вы будете учить скиллы у указанного НПЦ
addAggroRangeEnterId(npcId) - вызовет событие onAggroRangeEnter когда вы войдете в зону агрессии указанного НПЦ/Моба. Абсолютно неэффективно на мобах, у которых aggrorange = 0
addAttackId(npcId) - вызовет событие onAttack когда начнут атаковать моба/НПЦ. Событие будет вызвано всегда, и до нанесения урона.
addKillId(npcId) - вызовет событие onKill при убийстве указанного моба/NPC.
addSkillSeeId(npcId) - вызовет событие onSkillSee если на указаном npc применен скилл. Т.е. магатака, атака скиллом и лечение генерируют это событие.
addStartNpc(npcId) - при разговоре указанным npc автоматически будет начат квест для чара который говорит. Т.е. квест перейдет в состояние STARTED.
addTalkId(npcId) - при разговоре с указанным npc будет вызвано событие или onTalk если имя эвента не было передано или onAdvEvent/onEvent если было передано имя эвента.
addFirstTalk(npcId) - вызывает событие onFirstTalk сразу после старта квеста (т.е. после разговора с тем NPC, который был указан в addStartNpc).
addSpawnId(npcId) - метод onSpawn будет вызван при спавне указанного npc или при его респавне после смерти
Еще одно отступление: разговор с npc - что это?
Это обработка команды bypass -h %npcObjectId%_Quest [ИмяКвеста [эвент]] или bypass -h Quest [эвент]
Т.е. если вы хотите организовать вызов onTalk то пишите bypass -h %npcObjectId%_Quest Имя_вашего_квестаЕсли вы хотите что бы npc показал все квесты, в которых он участвует то bypass -h %npcObjectId%_QuestА если вы хотите вызвать метод onAdvTalk то bypass -h Quest Имя_квеста событие
Методы, влияющие на сам процесс
addSpawn(npcId, x,y, z, heading, randomOffset, despawnDelay, isSummonSpawn, instanceId) - спавнит моба. Я привел самую полную "версию" этого метода, есть и более короткие. randomOffset - логическое, говорит о том, должен ли моб спавнится в указанных координатах или рядом. Если выставить True - отлично подходит для спавна стада мобов.
startQuestTimer(name,time,npc,player,repeating) - запускает таймер, по прошествию времени (ВРЕМЯ В МИЛИСЕКУНДАХ) вызывается событие onAdvEvent с именем таймера в качестве имени эвента и передаными параметрами (npc,player). Если repeating False то таймер однократный
cancelQuestTimer(name,npc,player) - останавливает запущенный таймер.
Вот вроде краткое описание методов JythonQuest.
События.
Что это такое? Это такой же метод класса, но который вызывается ядром в определенном случае. При написании квеста основная задача состоит в перекрытии этих методов и реализации в них функционала.
Практически все методы возвращают строку. Если строка не пустая (не None или не "") то смотрится так: если строка начинается с <html> то это считается html-текстом, и он передается на клиент. Иначе, берется файл из той же папки где и сам скрипт с указаным именем (если есть) и передается клиенту.Основными параметрам являются npc и player. npc - объект класса L2NpcInstance а player - объект класса L2PcInstance.
Я рекомендую ознакомиться с javadoc по этим двум классам.
И так, основные события.
onTalk(npc,player) - вызывается при разговоре с npc или при событии таймера. Возвращает строку
onAdvEvent(npc,player,event) - вызвается при обработке события (bypass -h Quest имя событие), event - является строкой и содержит указаное имя. Возвращает строку.
onSpawn(npc) - вызывается при спавне npcOnKill(npc,killer,isPet) - событие при убийстве npc. killer - всегда L2NpcInstance. Если убил саммон то isPet == True и "настоящий убийца" killer.getPet()
onAttack(npc,killer,damage,isPet) - событие при атаке npc. Параметры сходны с пердыдущим, damage - нанесенный урон.
onAggroRangeEnter(npc,player,isPet) - событие при входе в аггро-зону моба. Параметры - смотри onKillonSkillSee(npc,caster,skill,targets,isPet) - если был каст. caster - L2PcInstance, кастующий; skill - объект класса L2Skill, прмененный скилл; targets массив из L2Object, цели скилла (у аурных скиллов например не одна цель); isPet - кастовал чар или его саммон.
onAcquireSkill(npc,player,skill) - Возникает, когда игрок выучил новый скилл.
Это основные события, их вполне хватает для написании достаточно слложных квестов и НПЦ.
Написание квеста.
И так, пора нам написать первый кастом-квест. Пусть это будет поднадоевший всем бафер Бафать он у нас будет 4 скилла, но потом мы доведем его до ума, и он у нас будет бафать их с анимацией и с сохранением "кто чего заказывал".
Основа любого скрипта - класс унаследованный от JythonQuest. Что же это за класс и чем он так хорош?
Класс предназначен для создания квестов на языке Python. В принципе, он просто наследуется от класса Quest, и предназначен для "логического разделения". Что мол, квест написан на Python а не на Java.
Теперь расмотрим методв этого класса и их назначение. Небольшое отсупление: Часть методов является событийными (т.е. вызываются ядром при наступлении каких-либо условий). Эти методы в дальнейшем будут именоваться событиями. Так сделано, что бы отличить их от методов, которые вызывает пользователь.
Методы, связывающие квесты с npc/мобами
addAcquireSkillId(npcId) - вызовет событие onAcquireSkill когда вы будете учить скиллы у указанного НПЦ
addAggroRangeEnterId(npcId) - вызовет событие onAggroRangeEnter когда вы войдете в зону агрессии указанного НПЦ/Моба. Абсолютно неэффективно на мобах, у которых aggrorange = 0
addAttackId(npcId) - вызовет событие onAttack когда начнут атаковать моба/НПЦ. Событие будет вызвано всегда, и до нанесения урона.
addKillId(npcId) - вызовет событие onKill при убийстве указанного моба/NPC.
addSkillSeeId(npcId) - вызовет событие onSkillSee если на указаном npc применен скилл. Т.е. магатака, атака скиллом и лечение генерируют это событие.
addStartNpc(npcId) - при разговоре указанным npc автоматически будет начат квест для чара который говорит. Т.е. квест перейдет в состояние STARTED.
addTalkId(npcId) - при разговоре с указанным npc будет вызвано событие или onTalk если имя эвента не было передано или onAdvEvent/onEvent если было передано имя эвента.
addFirstTalk(npcId) - вызывает событие onFirstTalk сразу после старта квеста (т.е. после разговора с тем NPC, который был указан в addStartNpc).
addSpawnId(npcId) - метод onSpawn будет вызван при спавне указанного npc или при его респавне после смерти
Еще одно отступление: разговор с npc - что это?
Это обработка команды bypass -h %npcObjectId%_Quest [ИмяКвеста [эвент]] или bypass -h Quest [эвент]
Т.е. если вы хотите организовать вызов onTalk то пишите bypass -h %npcObjectId%_Quest Имя_вашего_квестаЕсли вы хотите что бы npc показал все квесты, в которых он участвует то bypass -h %npcObjectId%_QuestА если вы хотите вызвать метод onAdvTalk то bypass -h Quest Имя_квеста событие
Методы, влияющие на сам процесс
addSpawn(npcId, x,y, z, heading, randomOffset, despawnDelay, isSummonSpawn, instanceId) - спавнит моба. Я привел самую полную "версию" этого метода, есть и более короткие. randomOffset - логическое, говорит о том, должен ли моб спавнится в указанных координатах или рядом. Если выставить True - отлично подходит для спавна стада мобов.
startQuestTimer(name,time,npc,player,repeating) - запускает таймер, по прошествию времени (ВРЕМЯ В МИЛИСЕКУНДАХ) вызывается событие onAdvEvent с именем таймера в качестве имени эвента и передаными параметрами (npc,player). Если repeating False то таймер однократный
cancelQuestTimer(name,npc,player) - останавливает запущенный таймер.
Вот вроде краткое описание методов JythonQuest.
События.
Что это такое? Это такой же метод класса, но который вызывается ядром в определенном случае. При написании квеста основная задача состоит в перекрытии этих методов и реализации в них функционала.
Практически все методы возвращают строку. Если строка не пустая (не None или не "") то смотрится так: если строка начинается с <html> то это считается html-текстом, и он передается на клиент. Иначе, берется файл из той же папки где и сам скрипт с указаным именем (если есть) и передается клиенту.Основными параметрам являются npc и player. npc - объект класса L2NpcInstance а player - объект класса L2PcInstance.
Я рекомендую ознакомиться с javadoc по этим двум классам.
И так, основные события.
onTalk(npc,player) - вызывается при разговоре с npc или при событии таймера. Возвращает строку
onAdvEvent(npc,player,event) - вызвается при обработке события (bypass -h Quest имя событие), event - является строкой и содержит указаное имя. Возвращает строку.
onSpawn(npc) - вызывается при спавне npcOnKill(npc,killer,isPet) - событие при убийстве npc. killer - всегда L2NpcInstance. Если убил саммон то isPet == True и "настоящий убийца" killer.getPet()
onAttack(npc,killer,damage,isPet) - событие при атаке npc. Параметры сходны с пердыдущим, damage - нанесенный урон.
onAggroRangeEnter(npc,player,isPet) - событие при входе в аггро-зону моба. Параметры - смотри onKillonSkillSee(npc,caster,skill,targets,isPet) - если был каст. caster - L2PcInstance, кастующий; skill - объект класса L2Skill, прмененный скилл; targets массив из L2Object, цели скилла (у аурных скиллов например не одна цель); isPet - кастовал чар или его саммон.
onAcquireSkill(npc,player,skill) - Возникает, когда игрок выучил новый скилл.
Это основные события, их вполне хватает для написании достаточно слложных квестов и НПЦ.
Написание квеста.
И так, пора нам написать первый кастом-квест. Пусть это будет поднадоевший всем бафер Бафать он у нас будет 4 скилла, но потом мы доведем его до ума, и он у нас будет бафать их с анимацией и с сохранением "кто чего заказывал".
PHP код:
<?php
import sys
from net.sf.l2j.gameserver.model.quest import QuestJython as JQuest
from net.sf.l2j.gameserver.datatables import SkillTable
BUFFER_ID=70001
Buffs = {1204:{1:5,2:10}, 1040:{2:10,3:15}, 1044:{1:5,2:10}, 1045: {1:5,2:10,3:15}}
Сначала некоторые определения. BUFFER_ID - ид нашего бафера. Как добавлять новых NPC в таблицу и спавнить их, вы конечно знаете. Можете заменить его на того, кто вам нравится. Buffs - хэш скиллов, ключ -ид скилла, значение пары левел-цена. Скиллы у нас будут WindWalk, Shield, Regeneration и Blessed Body.
Теперь собственно сам квест
PHP код:
<?php
class MegaBuffer(JQuest):
def __init__(self):
JQuest.__init__(self, -1, "MegaBuffer", "Our First Mega Buffer")
self.addTalkId(BUFFER_ID)
self.addStartNpc(BUFFER_ID)