18 Октябрь 2011

Java+Python / Игровые События / 3

За основу взят проект http://www.l2jserver.com/
Примеры игровых событий (установки событий+доработки кода).
Дальнейшее развитие кода и доработки...
Соблюдайте форматирование кода для работоспособности.

***

От себя...

В русско-украинском сегменте проект l2jserver сильно испохаблен сайтами
однодневками либо
полукровными малалетними пидорами якобы которые создают проект для
продажи.
При работе с проектами l2jserver рекомендуется обратиться на страницу
проекта.
Сам проект имеет статус Open Source.

***

Квестовые скрипты Jython-а по существу наследуются из классов Java
net.sf.l2j.gameserver.model.quest.Quest. Разработчики, свободно
владеющие языком Java могут посмотреть исходники этого класса, которые
размещены на сайте www.l2jserver.com проекта l2jserver, для более
детального изучения функций. Кроме того, кое-что вы сможете прочитать в
этой документации.

***

Классы...

import sys
from net.sf.l2j.gameserver.model.actor.instance import L2PcInstance
from java.util import Iterator
from net.sf.l2j.gameserver.datatables import SkillTable
from net.sf.l2j import L2DatabaseFactory
from net.sf.l2j.gameserver.model.quest import State
from net.sf.l2j.gameserver.model.quest import QuestState
from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest

Основа по работе с таблицами SkillTable (sql) в этом примере важна.

***

Переменные...


#Включение\выключение разделов. Для выключения замените ON на OFF

attack = "ON"


NPC = [40001]
prise_ID = 5575
QuestId = 912
QuestName = "buffer"
QuestDesc = "custom"
InitialHtml = "buff.htm"

#Выставление цен на события

min_level = 20
max_level = 90
min_prise = 6000
buff_prise = 2500

***

Затем мы объявляем непосредственно сам класс quest. Quest – класс
python, который расширяет java класс
net.sf.l2j.gameserver.model.quest.jython.QuestJyth on. Затем мы
объявляем метод onEvent, который вызывается Явой.

class Quest (JQuest) :

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


def onEvent(self,event,st):
htmltext = event
count=st.getQuestItemsCount(prise_ID)
if count < min_prise :
htmltext = "<html><head><body>No Many AA!.</body></html>"
if st.getPlayer().getLevel() < min_level :
htmltext = "<html><head><body>Need LvL-20!.</body></html>"
if st.getPlayer().getLevel() < max_level :
htmltext = "<html><head><body>Big LvL!.</body></html>"

else:
st.takeItems(prise_ID,0)
st.getPlayer().setTarget(st.getPlayer())


Довольно интересно но в 90% случаев описание переменной if count < min_prise
То есть проверка наличия суммы для события (if count < 6000) имеет
недоработки.
Это связано либо с тупым копипастом кода из англоязычных примеров либо
умышленное форсирование кода для малалетних издёвок на фри шарах игровых
серверов.

Пример...

Если максимальная цена события равна 10000 едениц а if count < min_prise
равен минимальной сумме проверки (6000) то достаточно иметь 5999 или 2
еденицы,
скрипт вычтет последние 2 или 5999 как разницу 5999<10000 (2<10000).
Тоесть достаточно иметь для реализации события 1 еденицу.

Дополнительной ошибкой является установка if count < min_prise = 0.
Тоесть if count < 0 или 1. Простым и быстрым фиксом без дитального
описания переменных
можно считать установку if count < min_prise по сумме равной 10000.
Тоесь максимально запрашиваемая сумма в событии. Если игрок её не имеет...

if count < min_prise :
htmltext = "<html><head><body>No Many AA!.</body></html>"


***

Если всё в порядке вести диалог и вычетание суммы prise_ID...
Установка игроку+установить таргет режим положительным на игрока...


else:
st.takeItems(prise_ID,0)
st.getPlayer().setTarget(st.getPlayer())


#Full buff fighter

if event == "124":
st.takeItems(prise_ID,Full_buff_f3_prise)
st.getPlayer().stopAllEffects()
st.getPlayer().sendMessage("Abra-Kadabra-Kerdyk!")
SkillTable.getInstance().getInfo(1068,3).getEffects(st.getPlayer(),st.getPlayer())

st.getPlayer().setCurrentHpMp(st.getPlayer().getMaxHp(),
st.getPlayer().getMaxMp())
st.playSound("ItemSound.quest_finish")
return "buff.htm"
st.setState(COMPLETED)


Обращение из htm... Проверка события.

if event == "124":
st.takeItems(prise_ID,Full_buff_f3_prise)

Произвести остановку всех события для игрока...
Вывести сис сообщение в чат.

st.getPlayer().stopAllEffects()
st.getPlayer().sendMessage("Abra-Kadabra-Kerdyk!")

Установить событие... Дополнить stats игрока.

SkillTable.getInstance().getInfo(1068,3).getEffects(st.getPlayer(),st.getPlayer())
st.getPlayer().setCurrentHpMp(st.getPlayer().getMaxHp(),
st.getPlayer().getMaxMp())

Проиграть сис звук...Возврат к buff.htm...Завершить событие.

st.playSound("ItemSound.quest_finish")
return "buff.htm"
st.setState(COMPLETED)

***

Пример ON-OFF...

if event == "2":
if attack == "ON":
st.takeItems(prise_ID,buff_prise)
SkillTable.getInstance().getInfo(1068,3).getEffects(st.getPlayer(),st.getPlayer())

st.playSound("ItemSound.quest_finish")
return "buff_attack.htm"
st.setState(COMPLETED)

else:
htmltext = "<html><head><body>Этот раздел отключен.</body></html>"

Проверка if attack == "ON" если ОК...

st.takeItems(prise_ID,buff_prise)
SkillTable.getInstance().getInfo(1068,3).getEffects(st.getPlayer(),st.getPlayer())
st.playSound("ItemSound.quest_finish")
return "buff_attack.htm"
st.setState(COMPLETED)

Проверка if attack == "OFF" если NO...

else:
htmltext = "<html><head><body>Этот раздел отключен.</body></html>"

***

Общяя инициализация функций сервером...

if htmltext != event:
st.setState(COMPLETED)
st.exitQuest(1)
return htmltext


def onTalk (self,npc,player):
st = player.getQuestState(qn)
htmltext = "<html><head><body>I have nothing to say to you</body></html>"
st.setState(STARTED)
return InitialHtml

QUEST = Quest(912,qn,"custom")
CREATED = State('Start',QUEST)
STARTED = State('Started',QUEST)
COMPLETED = State('Completed',QUEST)

QUEST.setInitialState(CREATED)

for npcId in NPC:
QUEST.addStartNpc(npcId)
QUEST.addTalkId(npcId)

0 коммент.:

Отправить комментарий

Сектора Лирики