Создание НПС, разбивающего шмот на кристаллы

Теги:
 

paki

новичок
Хочу сделать НПС, который разбивает любую шмотку на кристалы, через мультисел это очень коряво выглядит и пользоваться не удобно, поэтому решил реализовать через квест. Аналогично существующим квестам написал код, но менять Ring_of_Devotion (лежащие в инвентаре) на кристалы НПС не хочет. Подскажите в чем трабла в коде.
#Crystallizer
import sys
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

Crystal_D = 1458
Ring_of_Devotion = 890

class Quest (JQuest) :

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

def onEvent (self,event,st) :
htmltext = event
if event == "7543-05.htm" :
st.set("cond","1")
st.setState(STARTED)
st.playSound("ItemSound.quest_accept")
return htmltext

def onTalk (Self,npc,st):
htmltext = "<html><head><body>Мне нечего тебе сказать</body></html>"
id = st.getState()
if id == CREATED :
st.set("cond","0")
if int(st.get("cond"))==0 :
if st.getPlayer().getLevel() >= 20 :
htmltext = "7543-03.htm"
else:
htmltext = "7543-02.htm"
st.exitQuest(1)
else :
if st.getInventoryItemsCount(Ring_of_Devotion)< 1 :
htmltext = "7543-06.htm"
else :
st.takeItems(Ring_of_Devotion,-1)
st.playSound("ItemSound.quest_finish")
st.giveItems(Crystal_D,32)
htmltext = "7543-07.htm"
st.exitQuest(1)
return htmltext

def onKill(self,npc,st) :
if st.getQuestItemsCount(Ring_of_Devotion)<1 :
st.giveItems(Ring_of_Devotion,1)
if st.getQuestItemsCount(Ring_of_Devotion) == 1 :
st.playSound("ItemSound.quest_middle")
else:
st.playSound("ItemSound.quest_itemget")
return

QUEST=Quest(777,"777_Crystallizer","Crystallizer")
CREATED=State('Start',QUEST)
STARTED=State('Started',QUEST)
COMPLETED=State('Completed',QUEST)

QUEST.setInitialState(CREATED)
QUEST.addStartNpc(7543)
STARTED.addTalkId(7543)

print "importing quests: 777: Crystallizer"


ЗЫ: Квест на сервере загружается нормально, но не работает. Сборка ST
 

Drac

разработчик l2j-сервера

А в сервере ошибки есть?
 

paki

новичок
Нет, нету загужается нормально, когда нажимаешь "здать квест" ничего просто не происходит, html'ка диалоговая закрывается и все.
 
+
-
edit
 

mrSteam

втянувшийся
Странно, а этот код относится к Java? Если нет, то что он делает в этом разделе :D
Добавлю к теме, проще сделать разбивку шмота, именно через Java, возможно потрудней, но более стабильно )

Тобиш переборка всего инвентаря игрока, с условием что шмот не надет. При каждом предмете проверять грейд, выставить определенные условия. И например не более одного за 1 клик. Ну вообщем как фантазия подскажет.
Баги для читера это средство выживания Баги для админа это веревка и мыло  
Это сообщение редактировалось 14.09.2006 в 20:06
+
-
edit
 
Вставляете в MultiSellList после проверки игрока на null

code java
  1.                 if(listId == 9997)
  2.                 {
  3.                         _listId = 9997;
  4.                         Inventory inv = player.getInventory();
  5.                         for(L2ItemInstance itm : inv.getItems())
  6.                                 if(!itm.isStackable() && itm.getItem().getCrystalType() != L2Item.CRYSTAL_NONE && itm.getItem().getCrystalCount() > 0)
  7.                                 {
  8.                                         L2Item crystal = ItemTable.getInstance().getTemplate(itm.getItem().getCrystalType() + 1457);
  9.                                         int entry = itm.getItemId() + Math.min(itm.getEnchantLevel(), 20) * 100000000;
  10.                                         MultiSellEntry possibleEntry = new MultiSellEntry();
  11.                                         possibleEntry.addIngredient(new MultiSellIngredient(itm.getItemId(), 1, itm.getEnchantLevel()));
  12.                                         possibleEntry.addIngredient(new MultiSellIngredient((short) 57, (int) (itm.getItem().getCrystalCount() * crystal.getReferencePrice() * 0.1), 0));
  13.                                         possibleEntry.setEntryId(entry);
  14.                                         possibleEntry.setProductCount(itm.getItem().getCrystalCount());
  15.                                         possibleEntry.setProductEnchant(0);
  16.                                         possibleEntry.setProductId(crystal.getItemId());
  17.                                         _possiblelist.add(possibleEntry);
  18.                                 }
  19.                 }


в RequestMultiSellChoose

code java
  1. if(_listId == 9997)
  2.                 {
  3.                         String entry = String.valueOf(_entryId);
  4.                         while(entry.length() < 10)
  5.                                 entry = "0" + entry;
  6.                         short enchant = Short.parseShort(entry.substring(0, 2));
  7.                         L2Item itemtosell = ItemTable.getInstance().getTemplate(Short.parseShort(entry.substring(6, 10)));
  8.                         L2Item crystal = ItemTable.getInstance().getTemplate(itemtosell.getCrystalType() + 1457);
  9.  
  10.                         MultiSellEntry mse = new MultiSellEntry();
  11.                         mse.addIngredient(new MultiSellIngredient(itemtosell.getItemId(), 1, enchant));
  12.                         mse.addIngredient(new MultiSellIngredient((short) 57, (int) (itemtosell.getCrystalCount() * crystal.getReferencePrice() * 0.1), 0));
  13.                         mse.setProductCount(itemtosell.getCrystalCount());
  14.                         mse.setProductEnchant(0);
  15.                         mse.setProductId(crystal.getItemId());
  16.                         doExchange(player, mse);
  17.                         return;
  18.                 }



Код перебирает вещи в инвентаре и динамически создает мультиселл. Удобно и просто.
Пытаясь понять рекурсию, следи за тем, чтобы она не поняла тебя первой...  
+
-
edit
 

mrSteam

втянувшийся
Вот вот..именно об этом я и хотел сказать )
Баги для читера это средство выживания Баги для админа это веревка и мыло  

paki

новичок
Как будет опраделяться какой шмот разбить из инвентаря, если лежит несколько,через квест я хотел сделать следующим образом: сначала НПС выдает список : Грейд шмота, затем - бижутерия, оружие, броня (которая в свою очередь разделяеися на лайт, хевик, роба) - затем уже список, из которого выбираешь что разбить (все это делается через html), разбивается естественно только 1 шмотка за один клик, поэтому проверять одета или нет необязательно.
У меня скомпилированная ST сборка, фаила RequestMultiSellChoose в ней нет, скорей всего он под другим именем лежит, хотелось бы узнать что в нем содержится.

Попробовал упростить свой код, квест перестал загружаться вовсе =)
#Crystallizer
import sys
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

Crystal_D = 1458
Crystal_C = 1459
Crystal_B = 1460
MIN_LEVEL=20

##Бижутерия Д грейд (кольца)

Ring_of_Devotion = 890
Enchanted_Ring = 879
Black_Pearl_Ring = 880
Elven_Ring = 881
Mithril_Ring = 882

class Quest(JQuest):

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

def onEvent(self,event,st):
htmltext = event

## Меняем Ring_of_Devotion на 32Д кристалла
if event == "1" and st.getQuestItemsCount(Ring_of_Devotion) >= 1 and st.getPlayer().getLevel() >= 20:
st.takeItems(Ring_of_Devotion,1)
st.giveItems(Crystal_D,32)

st.setState(COMPLETED)
htmltext = "<html><head><body>Вы разбили Ring of Devotion на 32 D-grade кристалла</body></html>"


## Меняем Enchanted_Ring на 51Д кристалл

if event == "2" and st.getQuestItemsCount(Enchanted_Ring) >= 1 and st.getPlayer().getLevel() >= 20:
st.takeItems(Enchanted_Ring,1)
st.giveItems(Crystal_D,51)

st.setState(COMPLETED)
htmltext = "<html><head><body>Вы разбили Enchanted Ring на 51 D-grade кристалл</body></html>


## Меняем Black_Pearl_Ring на 77Д кристалла

if event == "3" and st.getQuestItemsCount(Black_Pearl_Ring) >= 1 and st.getPlayer().getLevel() >= 20:
st.takeItems(Black_Pearl_Ring,1)
st.giveItems(Crystal_D,77)

st.setState(COMPLETED)
htmltext = "<html><head><body>Вы разбили Black Pearl Ring на 77 D-grade кристалла</body></html>


## Меняем Elven_Ring на 113Д кристалла

if event == "4" and st.getQuestItemsCount(Elven_Ring) >= 1 and st.getPlayer().getLevel() >= 20:
st.takeItems(Elven_Ring,1)
st.giveItems(Crystal_D,113)

st.setState(COMPLETED)
htmltext = "<html><head><body>Вы разбили Elven Ring на 113 D-grade кристалла</body></html>


## Меняем Mithril_Ring на 146Д кристалла

if event == "5" and st.getQuestItemsCount(Mithril_Ring) >= 1 and st.getPlayer().getLevel() >= 20:
st.takeItems(Mithril_Ring,1)
st.giveItems(Crystal_D,146)

st.setState(COMPLETED)
htmltext = "<html><head><body>Вы разбили Mithril Ring на 146 D-grade кристалла</body></html>


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

def onTalk (self,npc,st):
npcId = npc.getNpcId()
if npcId == 7543:
st.setState(STARTED)
htmltext = "7543-Crystallizer.htm"
return htmltext

QUEST=Quest(777,"777_Crystallizer","Crystallizer")
CREATED=State('Start',QUEST)
STARTED=State('Started',QUEST)
COMPLETED=State('Completed',QUEST)

QUEST.setInitialState(CREATED)
QUEST.addStartNpc(7543)
STARTED.addTalkId(7543)
print "importing quests: 777: Crystallizer"
 
+
-
edit
 

mrSteam

втянувшийся
Скомпилированные сборки не редактируются!
Это всеравно что открывать Project1.Exe ))
Тебе нужны исходники, где для ST брать незнаю.
Баги для читера это средство выживания Баги для админа это веревка и мыло  

paki

новичок
А если вернуть исходный java код, произвести изменения, и компелировать обратно?!
 
+
-
edit
 

mrSteam

втянувшийся
:D:D если ты имееш ввиду декомпилировать jar то флаг тебе в руки, там более 1000 файлов помоему, да и декомпилятор иногда криво их парсит, каждый править прийдется. А по одиночке даже и не пытайся )
Баги для читера это средство выживания Баги для админа это веревка и мыло  

paki

новичок
Я подозревал что по одному файлу не получится, хотел попробывать, понял, не буду даже пытаться=), продолжают делать через квест значит.
 
AD Реклама Google — средство выживания форумов :)
+
-
edit
 

mrSteam

втянувшийся
Могу дать совет, например если поставить другую сборку, скажем SF (оригинал), то скачиваеш исходники напрмиер через Tortoise Svn, затем вносиш изменения, и применяеш на нем Apache Ant. На этом форуме есть интсрукция как соеденить ANT и JAVAC итд, вся хохма в системных путях. Если заинтересовало - в поиск :)

О наличии исходников для ST, ничего не могу сказать.
Баги для читера это средство выживания Баги для админа это веревка и мыло  

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru