Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
бафер для l2jfrozen
#1
Необходимо создать простого бафера для interlude, сборка l2jfrozen

Руководствуясь documentation.txt, вот этим гайдом http://forum.zone-game.info/showthread.php?t=15 и исходниками баферов из других сборок написал вот такой вот скрипт:

PHP код:
<?php 
import sys
from com
.l2jfrozen.gameserver.model.quest import State
from com
.l2jfrozen.gameserver.model.quest import QuestState
from com
.l2jfrozen.gameserver.model.quest.jython import QuestJython as JQuest
from com
.l2jfrozen.gameserver.datatables import SkillTable
from java
.util import Iterator
from com
.l2jfrozen.gameserver.model.actor.instance import L2PcInstance
from com
.l2jfrozen import L2DatabaseFactory

BUFF_LIST
=[
[
1204,2], # 0 - Wind Walk
[1032,3], # 1 - Invigore
[1035,4], # 2 - Mental Shield
[1036,2], # 3 - Magic Barrier
[1040,3], # 4 - Shield
[1043,1], # 5 - Holy Weapon
[1044,3], # 6 - Regeneration
[1045,6], # 7 - Blessed Body
[1048,6], # 8 - Blessed Soul
[1062,2], # 9 - Berserker Spirit
[1068,3], # 10 - Might
[1077,3], # 11 - Focus
[1078,6], # 12 - Concentration
[1085,3], # 13 - Acumen
[1086,2], # 14 - Haste
[1087,3], # 15 - Agility
[1182,3], # 16 - Resist Aqua
[1189,3], # 17 - Resist Wind
[1191,3], # 18 - Resist Fire
[1033,3], # 19 - Resist Potion
[1240,3], # 20 - Guidance
[1242,3], # 21 - Death Whisper
[1243,6], # 22 - Bless Shield
[1257,3], # 23 - Decrease Weight
[1259,4], # 24 - Resist Shock
[1303,2], # 25 - Wild Magic
[1304,3], # 26 - Advanced Block
[1352,1], # 27 - Elemental Protection
[1353,1], # 28 - Divine Protection
[1354,1], # 29 - Arcane Protection
[1392,1], # 30 - Holy Resistance
[1393,1], # 31 - UnHoly Resistance
[1397,3], # 32 - Clarity
[1059,3], # 33 - Greater Empower
[1268,4], # 34 - Vampiric Rage
[1073,2], # 35 - Kiss of Eve

[271,1], # 36 - Dance of Warior
[272,1], # 37 - Dance of Inspiration
[273,1], # 38 - Dance of Mystic
[274,1], # 39 - Dance of Fire
[275,1], # 40 - Dance of Fury
[276,1], # 41 - Dance of Concentration
[277,1], # 42 - Dance of Light
[307,1], # 43 - Dance of Aqua Guard
[309,1], # 44 - Dance of Earth Guard
[310,1], # 45 - Dance of the Vampire
[311,1], # 46 - Dance of Protection
[365,1], # 47 - Sirens Dance
[366,1], # 48 - Dance of Shadow

[264,1], # 49 - Song of Earth
[265,1], # 50 - Song of Life
[266,1], # 51 - Song of Water
[267,1], # 52 - Song of Warding
[268,1], # 53 - Song of Wind
[269,1], # 54 - Song of Hunter
[270,1], # 55 - Song of Invocation
[304,1], # 57 - Song of Vitality
[305,1], # 58 - Song of Vengeance
[306,1], # 59 - Song of Flame Guard
[308,1], # 60 - Song of Storm Guard
[349,1], # 61 - Song of Renewal
[363,1], # 62 - Song of Meditation
[364,1], # 63 - Song of Champion

[1003,3], # 64 - Pa agrian Gift
[1005,3], # 65 - Blessing of Pa agrio
[1004,3], # 66 - The Wisdom of Pa agrio
[1008,3], # 67 - The Glory of Pa agrio
[1249,3], # 68 - The Vision of Pa agrio
[1250,3], # 69 - Under The Protection of Pa agrio
[1260,3], # 70 - The Tact of Pa agrio
[1261,2], # 71 - The Rage of Pa agrio
[1282,2], # 72 - Pa agrio Haste
[1364,1], # 73 - The Eye of Pa agrio
[1365,1], # 74 - The Soul of Pa agrio
[1414,1], # 75 - Victories of Pa agrio
[1416,1], # 76 - Pa agrio Fist

[1002,3], # 77 - Flame Chant
[1006,3], # 78 - Chant of Fire
[1007,3], # 79 - Chant of Battle
[1009,3], # 80 - Chant of Shielding
[1251,2], # 81 - Chant of Fury
[1252,3], # 82 - Chant of Evasion
[1253,3], # 83 - Chant of Rage
[1284,3], # 84 - Chant of Revenge
[1308,3], # 85 - Chant of Predator
[1309,3], # 86 - Chant of Eagle
[1310,4], # 87 - Chant of Vampire
[1362,1], # 88 - Chant of Spirit

[1356,1], # 89 - Prophecy of Fire
[1355,1], # 90 - Prophecy of Water
[1357,1], # 91 - Prophecy of Wind
[1363,1], # 92 - Chant of Victory
[1388,3], # 93 - Greate Might
[1389,3], # 94 - Greate Shield
[1390,3], # 95 - War Chant
[1391,3], # 96 - Earth Chant

[4702,8], # 97 - Blessing of Seraphim
[4703,8], # 98 - Gift of Seraphim
[4699,8], # 99 - Blessing of Queen
[4700,8], # 100 - Gift of Queen

[67,7], # 101 - Summon Life
[1280,9], # 102 - Summon Aqua
[1328,8], # 103 - Summon Storm
[1279,9], # 104 - Summon Binding
[1281,9], # 105 - Summon Spark
[33,8], # 106 - Summon Phantom
]
# Нужно добавить номера скилов из списка выше, например,
# WARIOR_LIST = [0, 1] добавит в список бафов воина Wind Walk и Invigore
WARIOR_LIST = [0, 1]

# То же и для магов...
MAGUS_LIST = [13, 25]

# Минимальный уровень игрока для использования баффера - 10, максимальный - 80
PlayerLvl = [10, 80]

# ID валюты, которая будет тратиться при покупке баффа
AdenaID = 57
FA_ID
= 6673
CUR_ID
= 0
PRICE
= 0

# Бафером будет НИП с ID 100001
NPC = 100001

# Описание квеста
qn = "9998_GMSimpleBuffer"
QuestID = 9998
QuestName
= "GMSimpleBuffer"
QuestDescr = "custom"

# Html-страницы диалогов
InitialHtml = str(NPS) + "-1.htm" # страничка с выбором баффов
NotSuitableHtml = str(NPC) + "-2.htm" # lvl игрока не соответствует PlayerLvl
NoSolvencyHtml = str(NPC) + "-3.htm" # игрок не обладает нужной валютой в нужном количестве

class Quest (JQuest):

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

def onFirstTalk(self, npc, player):
st = player.getQuestState(qn)
if
not st:
st = player.newQuestState(qn)
st.setState(STARTED)
return
InitialHtml

def onEvent
(self, event, st):
htmltext = event
# Проверяем уровень персонажа, устанавливаем валюту
lvl = st.getPlayer().getLevel()
if
lvl < PlayerLvl[0] or lvl > PlayerLvl[1]:
htmltext = NotSuitableHtml
st
.setState(COMPLITED)
else:
# Если уровень игрока меньше 40, берем за бафф Адену, иначе FA
if lvl < 40:
CUR_ID = AdenaID
PRICE
= 100
else:
CUR_ID = FA_ID
PRICE
= 5
# Подсчитаем денюжки у игрока
CurCount = st.getQuestItemsCount(CUR_ID)

# Если игрок хочет бафф для воина
if event = "1":
BuffCost = len(WARIOR_LIST) * PRICE
if CurCount >= BuffCost:
#Игрок платежеспособен, берем у него деньги, даём ему бафф
st.takeItems(CUR_ID, BuffCost)
st.getPlayer().stopAllEffects()
st.getPlayer().setTarget(st.getPlayer())
for
Buff in WARIOR_LIST:
Skill = BUFF_LIST[Buff]
SkillID = Skill[0]
SkillLvl = Skill[1]
st.getPlayer().useMAgic(SkillTable.getInstance().getInfo(SkillID, SkillLvl), False, False)
st.getPlayer().setCurrentMp(st.getPlayer().getMaxMp())
return
InitialHtml
st
.setState(COMPLETED)
else:
# Игрок не платежеспособен. Предлагаем ему сначала немного подзаработать...
return NoSolvencyHtml
st
.setState(COMPLETED)

# Если игрок хочет бафф для мага
if event = "2":
BuffCost = len(MAGUS_LIST) * PRICE
if CurCount >= BuffCost:
#Игрок платежеспособен, берем у него деньги, даём ему бафф
st.takeItems(CUR_ID, BuffCost)
st.getPlayer().stopAllEffects()
st.getPlayer().setTarget(st.getPlayer())
for
Buff in MAGUS_LIST:
Skill = BUFF_LIST[Buff]
SkillID = Skill[0]
SkillLvl = Skill[1]
st.getPlayer().useMAgic(SkillTable.getInstance().getInfo(SkillID, SkillLvl), False, False)
st.getPlayer().setCurrentMp(st.getPlayer().getMaxMp())
return
InitialHtml
st
.setState(COMPLETED)
else:
# Игрок не платежеспособен. Предлагаем ему сначала немного подзаработать...
return NoSolvencyHtml
st
.setState(COMPLETED)

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

return
htmltext

QUEST
= Quest(QuestId,qn,QuestDescr)

CREATED=State('Start',QUEST)
STARTED=State('Started',QUEST)
COMPLETED=State('Completed',QUEST)

QUEST.setInitialState(CREATED)

QUEST.addStartNpc(NPC)
QUEST.addTalkId(NPC)

добавил html-файлы в папку с квестом
создал НИПа с ID = 100001, в качестве шаблона взял 'Beryl the Cat'.
добавил ссылку на квест в файл /data/scripts.cfg

запустил сервер... нип спавнится, но показывает какую-то левую страничку. Не то что мне нужно.

В указанном выше мануале обращается внимание на следующее:

Обратите внимание: в файле htm стартового NCP обязательно должна быть ссылка на квест:

PHP код:
<a action="bypass -h npc_%objectId%_Quest">


однако там нет рекомендации относительно того в какой папке датапака должен лежать файл с этой ссылкой, к сожалению. Прошу прояснить этот момент. Скорее всего существует некое соглашение о том где что должно лежать в датапаке. Буду благодарен, если кто ссылку даст.

и еще после запуска __init__.py выдал лог:
Error on: D:\L2SERVER\l2jfrozen\gameserver\data\scripts\quests\9998_GMSimpleBuffer\__init__.py.error.log
Line: -1 - Column: -1

Traceback (innermost last):
(no code object) at line 0
SyntaxError: ('Lexical error at line 1, column 1. Encountered: "\\u00ff" (255), after : ""', ('__init__.py', 1, 1, '\xFFimport sys'))


Это первый мой скрипт на питоне... впрочем это первый мой квест... прошу подсказать в чем проблема и "в каком направлении копать", чтобы побыстрее повысить квалификацию. Заранее спасибо всем откликнувшимся.

С уважением,
catchword
Ответ
#2
100001.htm добавил в data/html/default?
Ответ
#3
О сколько раз, твердили миру, а воз и ныне там..
И так, давайте рассмотрим вашу ошибку

SyntaxError: ('Lexical error at line 1, column 1. Encountered: "\\u00ff" (255), after : ""', ('__init__.py', 1, 1, '\xFFimport sys'))

Выделение - мое.
Попробуем перевести?
Ошибка синтаксиса. Лексическая ошибка в строке 1 колонке 1 Обнаружена \\u00ff (255)
Интересено, что же это такое обнаружено? Оказывается \uxxxx это обозначение UNICODE символов!
Хм, смотрим текст. Врде ничего нет, так? А в какой кодировочке у нас файл? UTF-8?
А вообще-то для текстовых файлов в UNICODE по стандарту Unicode Standard 5.0 ПРЕДПИСЫВАЕТСЯ иметь т.н. Byte-Order Mark (он же BOM). Только вот беда, ридер файлов в сборке на стандарт немного забивает, и не игронирует этот BOM а считает его значащим, и передает на исполнение. Питон понятное дело,возмущается...
Что же делать? Взять Notepad++ и сохранить в кодировке UTF-8 without BOM
Ответ
#4
Спасибо за ответы.

Файл 100001.htm в data/html/default добавил. Кодировку скрипта изменил, исправил еще пол дюжины синтаксических ошибок. Бафер начал общаться, но... выдаёт бафы только первый и последний из заданного списка. Попробовал обойтись без списка и без цикла, который этот список перебирает, закомментировал его, прописал последовательность комманд:
PHP код:
<?php 
st
.getPlayer().useMаgic(SkillTable.getInstance().getInfo(SkillID, SkillLvl), False, False)
с разными скилами, попробовал как это работает и получил то же результат - бафы накладываются только первый и последний.

В чем может быть причина?
Ответ
#5
в ИДИОТСКОМ, не побоюсь этого слова использовании бафера.
В вашем коде, внимание на экран: ЧАР БАФАЕТ КОГО-ТО. Ибо useMagic это использование магии чаром. Когда он бпфает первый баф, и вы дергаете useMagic второй раз, чар ЗАНЯТ! Он КАСТУЕТ!!!
Накладывайте бафф через getEffects() от L2Skill
Ответ
#6
Спасибо всем кто принял участие в обсуждении.
Отдельное спасибо Azagthtot за конструктивные советы.
Идиотский код заменил на:
PHP код:
<?php 
SkillTable
.getInstance().getInfo(SkillID, SkillLvl).getEffects(st.getPlayer(),st.getPlayer())

теперь бафер работает правильно.Smile
************************************************************
Тему можно закрывать
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Почему не любят l2jFrozen? RedIst 23 7,801 06-05-2016, 04:29 PM
Последний пост: Holsten
  Нужен бафер PW Megaavatar 1 1,773 04-20-2016, 04:28 PM
Последний пост: Megaavatar
  l2jfrozen проблема с кодировокой Proline29 4 1,481 03-01-2016, 11:23 AM
Последний пост: Emperor
  Бафер для interlude zane 2 1,317 10-30-2015, 05:52 PM
Последний пост: zane
  Гмшоп и баффер для l2jFrozen AndruliKxD 0 1,073 03-14-2014, 10:29 PM
Последний пост: AndruliKxD
  Бафер - Community Xuk 4 1,835 10-24-2013, 05:05 PM
Последний пост: Xuk
  [help]Бафер и гк через Community Board Bastexses 62 49,888 09-20-2013, 05:19 PM
Последний пост: Xuk
  Disconnected l2jFrozen DROIDstick 12 2,785 02-14-2013, 08:59 PM
Последний пост: Dеmon
  L2jFrozen и StressWeb 11 halaymoon 1 2,619 12-26-2012, 01:29 AM
Последний пост: NotSpecified
  Бафер запрашивает квест. adskihmind 16 5,657 11-18-2012, 09:23 PM
Последний пост: MrShyr

Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)