-
Публикаций
12 -
Зарегистрирован
-
Посещение
-
Отзывы
N/A
Репутация
0Информация о Meg
-
Звание
Только пришел
Посетители профиля
Блок последних пользователей отключён и не показывается другим пользователям.
-
Meg изменил фотографию своего профиля
-
Может это для юр.лиц? Я интересовался месяц назад в тех.поддержке, они говорят что (для физ.лиц) нужно иметь кошелек в одной любой платежной системе. Так что яндекс должен прокатить. Про палку не знаю.
-
к сожалению в конфигах у меня не получилось найти этот параметр по id (id Short Sword - 1 ) сейчас пробую в ядре искать но пока пусто package main.engine.events.daily.normal.types; import java.util.ArrayList; import java.util.List; import l2j.gameserver.ThreadPoolManager; import l2j.gameserver.data.ItemData; import l2j.gameserver.model.actor.L2Npc; import l2j.gameserver.model.actor.base.ClassId; import l2j.gameserver.model.actor.instance.L2PcInstance; import l2j.gameserver.model.actor.instance.enums.TeamType; import l2j.gameserver.model.holder.LocationHolder; import l2j.gameserver.model.world.L2World; import l2j.gameserver.network.external.server.NpcHtmlMessage; import l2j.gameserver.network.external.server.PlaySound; import l2j.gameserver.network.external.server.PlaySound.PlaySoundType; import l2j.gameserver.network.external.server.SystemMessage; import l2j.gameserver.network.external.server.TutorialShowQuestionMark; import main.data.ConfigData; import main.engine.events.daily.AbstractEvent; import main.holders.objects.CharacterHolder; import main.holders.objects.NpcHolder; import main.holders.objects.PlayerHolder; import main.util.Util; import main.util.UtilMessage; import main.util.UtilSpawn; import main.util.builders.html.HtmlBuilder; /** * @author fissban */ public class NpcClassMaster extends AbstractEvent { private static final int NPC = 12371; // format: // PriceItemId // PriceItemCount // ReardItemId // RewardItemCount // Usar el 0 para no definir ningun valor private static final List<ClassMasterList> ITEM_LIST = new ArrayList<>(); { // Primer cambio de clase ---------------------- var job1 = new ClassMasterList(); job1.setPriceItemId(ConfigData.CLASSMASTER_PRICE_JOB1.getRewardId()); job1.setPriceItemCount(ConfigData.CLASSMASTER_PRICE_JOB1.getRewardCount()); job1.setRewardItemId(ConfigData.CLASSMASTER_REWARD_JOB1.getRewardId()); job1.setRewardItemCount(ConfigData.CLASSMASTER_REWARD_JOB1.getRewardCount()); ITEM_LIST.add(job1); // Segundo cambio de clase ---------------------- var job2 = new ClassMasterList(); job2.setPriceItemId(ConfigData.CLASSMASTER_PRICE_JOB2.getRewardId()); job2.setPriceItemCount(ConfigData.CLASSMASTER_PRICE_JOB2.getRewardCount()); job2.setRewardItemId(ConfigData.CLASSMASTER_REWARD_JOB2.getRewardCount()); job2.setRewardItemCount(ConfigData.CLASSMASTER_REWARD_JOB2.getRewardCount()); ITEM_LIST.add(job2); // Tercer cambio de clase ----------------------- var job3 = new ClassMasterList(); job3.setPriceItemId(ConfigData.CLASSMASTER_PRICE_JOB3.getRewardId()); job3.setPriceItemCount(ConfigData.CLASSMASTER_PRICE_JOB3.getRewardCount()); job3.setRewardItemId(ConfigData.CLASSMASTER_REWARD_JOB3.getRewardCount()); job3.setRewardItemCount(ConfigData.CLASSMASTER_REWARD_JOB3.getRewardCount()); ITEM_LIST.add(job3); } // Spawns private static final List<LocationHolder> SPAWNS = new ArrayList<>(); { SPAWNS.add(new LocationHolder(11283, 15951, -4584));// ClassChange_DE SPAWNS.add(new LocationHolder(115774, -178666, -958));// ClassChange_DW SPAWNS.add(new LocationHolder(45036, 48384, -3060));// ClassChange_E SPAWNS.add(new LocationHolder(-44747, -113865, -208));// ClassChange_ORC SPAWNS.add(new LocationHolder(-84466, 243171, -3729));// ClassChange_TI } // Html private static final String HTML_PATH = "data/html/engine/events/classmaster/"; private static final List<NpcHolder> npcs = new ArrayList<>(); public NpcClassMaster() { registerEvent(ConfigData.ENABLE_ClassMaster, ConfigData.CLASSMASTER_DATE_START, ConfigData.CLASSMASTER_DATE_END); } @Override public void onModState() { switch (getState()) { case START: UtilMessage.sendAnnounceMsg("Event Class Master: Started!", L2World.getInstance().getAllPlayers()); ThreadPoolManager.schedule(() -> { SPAWNS.forEach(loc -> npcs.add(UtilSpawn.npc(NPC, loc.getX(), loc.getY(), loc.getZ(), 0, 0, 0, TeamType.NONE, 0))); }, 20000); break; case END: UtilMessage.sendAnnounceMsg("Event Class Master: End!", L2World.getInstance().getAllPlayers()); npcs.forEach(npc -> npc.getInstance().deleteMe()); break; } } @Override public void onEnterWorld(PlayerHolder ph) { UtilMessage.sendAnnounceMsg("Event Class Master: Started!", ph); } @Override public boolean onInteract(PlayerHolder ph, CharacterHolder character) { if (Util.areObjectType(L2Npc.class, character)) { var npc = (L2Npc) character.getInstance(); if (npc.getId() == NPC) { sendHtmlFile(ph, npc, HTML_PATH + "index.htm"); return true; } } return false; } @Override public void onEvent(PlayerHolder ph, CharacterHolder npc, String event) { if (((NpcHolder) npc).getId() != NPC) { return; } if (event.startsWith("1stClass")) { showHtmlMenu(ph, npc.getObjectId(), 1); } else if (event.startsWith("2ndClass")) { showHtmlMenu(ph, npc.getObjectId(), 2); } else if (event.startsWith("3rdClass")) { showHtmlMenu(ph, npc.getObjectId(), 3); } else if (event.startsWith("change_class")) { try { int val = Integer.parseInt(event.split(" ")[1]); if (checkAndChangeClass(ph.getInstance(), val)) { // Send sound ph.getInstance().sendPacket(new PlaySound(PlaySoundType.CHAR_CHANGE)); // Send html var html = new NpcHtmlMessage(npc.getObjectId()); html.setFile(HTML_PATH + "ok.htm"); html.replace("%name%", ClassId.getById(val).getName()); ph.getInstance().sendPacket(html); } } catch (Exception e) { // } } } public static final void showHtmlMenu(PlayerHolder ph, int objectId, int level) { var html = new NpcHtmlMessage(objectId); var currentClassId = ph.getInstance().getClassId(); if (currentClassId.level() >= level) { html.setFile(HTML_PATH + "nomore.htm"); } else { var minLevel = getMinLevel(currentClassId.level()); if (ph.getInstance().getLevel() >= minLevel) { var menu = new HtmlBuilder(); for (var cid : ClassId.values()) { if (validateClassId(currentClassId, cid) && (cid.level() == level)) { String className = cid.getName(); menu.append("<img src=L2UI_CH3.br_bar2_mp width=204 height=1>"); menu.append("<table width=204>"); menu.append("<tr>"); menu.append("<td><button value=\"", className, "\" action=\"bypass -h Engine NpcClassMaster change_class ", cid.getId() + "\" width=204 height=20 back=L2UI_CH3.br_party1_back2 fore=L2UI_CH3.balloon2_2></td>>"); menu.append("</tr>"); menu.append("</table>"); } } if (menu.toString().length() > 0) { menu.append("<img src=L2UI_CH3.br_bar2_mp width=204 height=1>"); html.setFile(HTML_PATH + "template.htm"); html.replace("%name%", currentClassId.getName()); html.replace("%menu%", menu.toString()); } else { html.setFile(HTML_PATH + "comebacklater.htm"); html.replace("%level%", String.valueOf(getMinLevel(level - 1))); } } else { if (minLevel < Integer.MAX_VALUE) { html.setFile(HTML_PATH + "comebacklater.htm"); html.replace("%level%", String.valueOf(minLevel)); } else { html.setFile(HTML_PATH + "nomore.htm"); } } } html.replace("%objectId%", String.valueOf(objectId)); html.replace("%req_items%", getRequiredItems(level)); ph.getInstance().sendPacket(html); } private static final void showQuestionMark(L2PcInstance player) { var classId = player.getClassId(); if (getMinLevel(classId.level()) > player.getLevel()) { return; } player.sendPacket(new TutorialShowQuestionMark(1001)); } /** * Returns minimum player level required for next class transfer * @param level - current skillId level (0 - start, 1 - first, etc) * @return */ private static final int getMinLevel(int level) { switch (level) { case 0: return 20; case 1: return 40; case 2: return 76; default: return Integer.MAX_VALUE; } } /** * Returns true if class change is possible * @param oldCID current player ClassId * @param val new class index * @return */ private static final boolean validateClassId(ClassId oldCID, int val) { try { return validateClassId(oldCID, ClassId.getById(val)); } catch (Exception e) { // possible ArrayOutOfBoundsException } return false; } /** * Returns true if class change is possible * @param oldCID current player ClassId * @param newCID new ClassId * @return true if class change is possible */ private static final boolean validateClassId(ClassId oldCID, ClassId newCID) { if ((newCID == null) || (newCID.getRace() == null)) { return false; } if (oldCID.equals(newCID.getParent())) { return true; } return false; } private static String getRequiredItems(int level) { level--; var sb = new StringBuilder(); if ((ITEM_LIST.get(level).getPriceItemId() != 0) && (ITEM_LIST.get(level).getPriceItemCount() != 0)) { var count = ITEM_LIST.get(level).getPriceItemCount(); var itemName = ItemData.getInstance().getTemplate(ITEM_LIST.get(level).getPriceItemId()).getName(); sb.append("<tr><td><img src=L2UI_CH3.mapicon_mark width=32 height=32></td>"); sb.append("<td><font color=\"LEVEL\">[" + count + "]</font></td>"); sb.append("<td>[" + itemName + "]</td>"); sb.append("<td><img src=L2UI_CH3.mapicon_mark width=32 height=32></td></tr>"); } else { sb.append("<tr><td>None</td></tr>"); } return sb.toString(); } private static final boolean checkAndChangeClass(L2PcInstance player, int val) { var currentClassId = player.getClassId(); if (getMinLevel(currentClassId.level()) > player.getLevel()) { return false; } if (!validateClassId(currentClassId, val)) { return false; } var newJobLevel = currentClassId.level(); // Weight/Inventory check if (ITEM_LIST.get(newJobLevel).getRewardItemId() != 0) { if ((player.getWeightPenalty() >= 3) || ((player.getInventoryLimit() * 0.8) <= player.getInventory().getSize())) { player.sendPacket(SystemMessage.INVENTORY_LESS_THAN_80_PERCENT); return false; } } // get all required items for class transfer var priceCount = ITEM_LIST.get(newJobLevel).getPriceItemCount(); var priceItemId = ITEM_LIST.get(newJobLevel).getPriceItemId(); if (!player.getInventory().destroyItemByItemId("ClassMaster", priceItemId, priceCount, player, true)) { player.sendPacket(SystemMessage.NOT_ENOUGH_ITEMS); return false; } // reward player with items var rewardCount = ITEM_LIST.get(newJobLevel).getRewardItemCount(); var rewardItemId = ITEM_LIST.get(newJobLevel).getRewardItemId(); player.getInventory().addItem("ClassMaster", rewardItemId, rewardCount, player, true); player.setClassId(val); if (player.isSubClassActive()) { player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass()); } else { player.setBaseClass(player.getActiveClass()); } player.broadcastUserInfo(); if (((player.getClassId().level() == 1) && (player.getLevel() >= 40)) || ((player.getClassId().level() == 2) && (player.getLevel() >= 76))) { showQuestionMark(player); } return true; } public class ClassMasterList { private int priceItemId; private int priceItemCount; private int rewardItemId; private int rewardItemCount; public ClassMasterList() { // } public int getPriceItemId() { return priceItemId; } public void setPriceItemId(int priceItemId) { this.priceItemId = priceItemId; } public int getPriceItemCount() { return priceItemCount; } public void setPriceItemCount(int priceItemCount) { this.priceItemCount = priceItemCount; } public int getRewardItemId() { return rewardItemId; } public void setRewardItemId(int rewardItemId) { this.rewardItemId = rewardItemId; } public int getRewardItemCount() { return rewardItemCount; } public void setRewardItemCount(int rewardItemCount) { this.rewardItemCount = rewardItemCount; } } } в конфигах тоже вроде ничего такого Enable_ClassMaster = True # End of event ClassMasterDateStart = 24-2-2015 # Start of event ClassMasterDateEnd = 24-2-2020 # Message to start event ClassMasterMessageStart = Class Master Event: Start! # Define the items necessary to make the change of class. [itemId,ItemCount] ClassMasterPriceJob1 = 57,10000 # Define the items necessary to make the change of class. [itemId,ItemCount] ClassMasterPriceJob2 = 57,100000 # Define the items necessary to make the change of class. [itemId,ItemCount] ClassMasterPriceJob3 = 57,1000000 # Define the prize for making the change of class. [itemId,ItemCount] (0,0 to disable) ClassMasterRewardJob1 = 6622,1 # Define the prize for making the change of class. [itemId,ItemCount] (0,0 to disable) ClassMasterRewardJob2 = 6622,1 # Define the prize for making the change of class. [itemId,ItemCount] (0,0 to disable) ClassMasterRewardJob3 = 6622,1 Буду пробовать дальше.. если у кого-нибудь есть понимание этого напишите пожалуйста. За первую профу дает итем правильно а за вторую и третью подменяет любые итемы (кроме адены) на Short Sword
-
а можешь просто подсказать в каком направлении искать? а я уже там попробую разобраться. а там уже если не получится то обращусь на платной основе.
-
нпц должен давать указанный итем но что бы я не указывал он дает мне Short Sword (самая простая нг пушка) если я ставлю количество итемов 2 то дает Long Sword (тоже нг пушка) работает исправно только если выставить итем - адену (любые шмотки\другие валюты -автоматически заменяет на нг пушку) но вот что интересно, нпц - кот дающий профу (за каждую профу можно указать приз) за первую профу дает любой итем который укажешь! а за вторую и третью - заменяет на Short Sword. я так понимаю это какая то защита, но где ее искать не понятно, если есть идеи - напишите пожалуйста!
-
аааа... понял! кажется теперь все стало на свои места, тогда просто сделаю 3 нопки у нпц, каждую со совими цветами и ценой. Спасибо огромное!
-
Упс.. больше нельзя редактировать сообщение.. Кажется у меня какая-то путаница с else и if.. И я только сейчас опомнился что я добавил стоимость третьему типу но нигде не указал какие цвета должны стоить другую цену (3тий тип) сейчас еще подумаю может разберусь)
-
Ошибка failed to import custom : q8024_ChgColor (ничего больше не пишет) import sys from java.lang import System 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 qn = "q8024_ChgColor" NPC = 99999 PRICES = { 1: [4355, 30, "Blue Eva"], 2: [4355, 20, "Blue Eva"], 5: [4355, 10, "Blue Eva"], } COLOURS = { 1: ["16721c","1c7216"], 2: ["00FFFF","FFFF00"], 3: ["FF0000","0000FF"], 4: ["FFFB00","00FBFF"], 5: ["337fe6","e67f33"], 6: ["DDA0DD","DDA0DD"], 7: ["808080","808080"], 8: ["81c739","81c739"], 9: ["16721c","1c7216"], 10: ["00FFFF","FFFF00"], 11: ["FF0000","0000FF"], 12: ["FFFB00","00FBFF"], 13: ["337fe6","e67f33"], 14: ["DDA0DD","DDA0DD"], 15: ["808080","808080"], 16: ["81c739","81c739"], } class Quest (JQuest) : def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr) def onAdvEvent (self,event,npc,player): st = player.getQuestState(qn) if event == "step1": htmltext = "<html><body><title>Box</title><br><br><br><br1>" htmltext += " Что красим?<font color=3aebff>*</font><br><center><table width=180><tr>" htmltext += "<td><button value=\"Ник\" action=\"bypass -h Quest q8024_ChgColor var_1\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></td>" htmltext += "<td width=40></td>" htmltext += "<td><button value=\"Титул\" action=\"bypass -h Quest q8024_ChgColor var_2\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></td>" htmltext += "</body></html>" elif event.startswith("var_"): vtype = int(event.replace("var_", "")) if vtype == 1: sample = "### " + player.getName() + " ###" else: sample = "### " + player.getTitle() + " ###" htmltext = "<html><body><title>Box</title> Покраска:<br>" htmltext += " Стоимость: "+str(PRICES[vtype][1])+" "+str(PRICES[vtype][2])+"<br><br>" htmltext += "<html><body><title>Box</title> >Выберите желаемый цвет из списка:<br><br>" #< htmltext += "<table width=300>" for i in COLOURS.keys(): htmltext += "<tr><td width=20></td><td><font color="+str(COLOURS[i][1])+">"+str(sample)+"</font></td><td><a msg=\"Точно красим?\" action=\"bypass -h Quest q8024_ChgColor paint_"+str(vtype)+"_"+str(i)+"\">>>>></a></td></tr>" htmltext += "<tr><td width=20></td><td><br></td><td></td></tr>" htmltext += "</table>" #< htmltext += "<a action=\"bypass -h Quest q8024_ChgColor step1\">Вернуться.</a></body></html>" elif event.startswith("paint_"): get = str(event.replace("paint_", "")) vtype,color=get.split("_") vtype,color=int(vtype),int(color) #< paintcolor = int(COLOURS[color][0],16) if vtype == 1: if st.getQuestItemsCount(PRICES[5][0]) < int(PRICES[5][1]): htmltext = "<html><body><title>Box</title> Покраска: <font color=74bff5>"+str(PRICES[5][1])+"</font></body></html>" return htmltext player.getAppearance().setNameColor(paintcolor) if vtype == 1: if st.getQuestItemsCount(PRICES[1][0]) < int(PRICES[1][1]): htmltext = "<html><body><title>Box</title> Покраска: <font color=74bff5>"+str(PRICES[1][1])+" "+str(PRICES[1][2])+"</font></body></html>" return htmltext player.getAppearance().setNameColor(paintcolor) else: if st.getQuestItemsCount(PRICES[2][0]) < int(PRICES[2][1]): htmltext = "<html><body><title>Box</title> Покраска: <font color=74bff5>"+str(PRICES[2][1])+" "+str(PRICES[2][2])+"</font></body></html>" return htmltext player.getAppearance().setTitleColor(paintcolor) #< player.broadcastUserInfo() player.store() htmltext = "<html><body><title>Box</title> Покраска:<br> Готово.<br><br><br><a action=\"bypass -h Quest q8024_ChgColor step1\">Вернуться.</a></body></html>" else: htmltext = "<html><body><title>Box</title> Покраска:<br>Oops!</body></html>" return htmltext def onTalk (self,npc,player): st = player.getQuestState(qn) npcId = npc.getNpcId() if npcId == NPC: htmltext = "<html><body><title>Box</title><br><br><br><br1>" htmltext += " Что красим?<font color=3aebff>*</font><br><center><table width=180><tr>" htmltext += "<td><button value=\"Ник\" action=\"bypass -h Quest q8024_ChgColor var_1\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></td>" htmltext += "<td width=40></td>" htmltext += "<td><button value=\"Титул\" action=\"bypass -h Quest q8024_ChgColor var_2\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></td>" htmltext += "</body></html>" return htmltext QUEST = Quest(8024,qn,"custom") CREATED = State('Start', QUEST) QUEST.setInitialState(CREATED) QUEST.addStartNpc(NPC) QUEST.addTalkId(NPC) *цвета одинковые это я временно для теста поставил, еще не менял сами цвета
-
Ох.. замучался.. не хочет работать и все тут.. что я только не пробовал за эти 2 дня.. Скажите пожалуйста, я совсем не то делаю в поледнем примере да?
-
Я тоже об этом думал, но... Для теста добавил тут "пункт 5 за 10 блю ева; (нумерация тут это ведь как индификатор в css?) PRICES = { 1: [4355, 3, "Blue Eva"], 2: [4355, 1, "Blue Eva"], 5: [4355, 10, "Blue Eva"], } Дальше сложнее я так догадываюсь что тут нужо копировать вот этот кусочек paintcolor = int(COLOURS[color][0],16) if vtype == 1: if st.getQuestItemsCount(PRICES[1][0]) < int(PRICES[1][1]): htmltext = "<html><body>Покраска: <font color=74bff5>"+str(PRICES[1][1])+" "+str(PRICES[1][2])+"</font></body></html>" return htmltext player.getAppearance().setNameColor(paintcolor) И дописать в PRICES "5".. т.е так? paintcolor = int(COLOURS[color][0],16) if vtype == 1: if st.getQuestItemsCount(PRICES[5][0]) < int(PRICES[5][1]): htmltext = "<html><body>Покраска: <font color=74bff5>"+str(PRICES[5][1])+" return htmltext player.getAppearance().setNameColor(paintcolor) Но к моему "удивлению" эта чудо догадайка не запустилась *p.s а что за цифра 16? это максимальное количество цветов или что?
-
Что-то не выходит сделать разную стоимость для разного цвета, может сюда вообще нельзя добавить это "отдельным элементом" а нужно весь скрипт переделывать?
-
спасибо попробую) это гениально!) большое спасибо! Снова обращаюсь за помощью, просидел целый день, перезапускал скрипт наверно раз 200) но видимо интуитивно без знаний программирования это не сделать (или я недогадливый), все время ошибки.. Можете пожалуйста подсказать как добавить в этот скрипт что бы разный цвет стоил по разному? или это так просто не реализовать?
-
Програмировать не умею, пробовал сам разобраться как сделать, но увы, скрипт все время выдает ошибки. Менеджер покраски ника на PWSoft, в данный момент он забирает Blue Eva (id 4355) а нужно сделать так что бы он просто проверял есть ли предмет в инвентаре.. Можете пожалуйста подсказать как это сделать? import sys from java.lang import System 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 qn = "q8024_ChgColor" NPC = 50001 PRICES = { 1: [4355, 3, "Blue Eva"], 2: [4355, 1, "Blue Eva"], } COLOURS = { 1: ["00FF00","00FF00"], 2: ["16721c","1c7216"], 3: ["00FFFF","FFFF00"], 4: ["FF0000","0000FF"], 5: ["FFFB00","00FBFF"], 6: ["337fe6","e67f33"], 7: ["DDA0DD","DDA0DD"], 8: ["808080","808080"], 9: ["000000","000000"], 10: ["81c739","81c739"], 11: ["9120b1","b12091"], 12: ["7c2196","96217c"], 13: ["811664","641681"], 14: ["6b4558","58456b"], } class Quest (JQuest) : def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr) def onAdvEvent (self,event,npc,player): st = player.getQuestState(qn) if event == "step1": htmltext = "<html><body><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><img src=\"L2UI.SquareBlank\" width=260 height=2><br1>" htmltext += "Что красим?<font color=999966>*</font><br><center><table width=180><tr>" htmltext += "<td><button value=\"Ник\" action=\"bypass -h Quest q8024_ChgColor var_1\" width=80 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>" htmltext += "<td width=40></td>" htmltext += "<td><button value=\"Титул\" action=\"bypass -h Quest q8024_ChgColor var_2\" width=80 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>" htmltext += "</tr></table></center><br><br><font color=999966>*Изза особенностей ЖК-мониторов, цвета на чаре могут выглядить немного ярче или темнее.</font><br><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32></body></html>" elif event.startswith("var_"): vtype = int(event.replace("var_", "")) if vtype == 1: sample = "### " + player.getName() + " ###" else: sample = "### " + player.getTitle() + " ###" htmltext = "<html><body>Покраска:<br>" htmltext += "Стоимость: "+str(PRICES[vtype][1])+" "+str(PRICES[vtype][2])+"<br><br>" htmltext += "<html><body>>Выберите желаемый цвет из списка:<br><br>" #< htmltext += "<table width=300>" for i in COLOURS.keys(): htmltext += "<tr><td width=20></td><td><font color="+str(COLOURS[i][1])+">"+str(sample)+"</font></td><td><a msg=\"Точно красим?\" action=\"bypass -h Quest q8024_ChgColor paint_"+str(vtype)+"_"+str(i)+"\">>>>></a></td></tr>" htmltext += "<tr><td width=20></td><td><br></td><td></td></tr>" htmltext += "</table>" #< htmltext += "<a action=\"bypass -h Quest q8024_ChgColor step1\">Вернуться.</a></body></html>" elif event.startswith("paint_"): get = str(event.replace("paint_", "")) vtype,color=get.split("_") vtype,color=int(vtype),int(color) #< paintcolor = int(COLOURS[color][0],16) if vtype == 1: if st.getQuestItemsCount(PRICES[1][0]) < int(PRICES[1][1]): htmltext = "<html><body>Покраска: <font color=74bff5>"+str(PRICES[1][1])+" "+str(PRICES[1][2])+"</font></body></html>" return htmltext st.takeItems(PRICES[1][0],PRICES[1][1]) player.getAppearance().setNameColor(paintcolor) else: if st.getQuestItemsCount(PRICES[2][0]) < int(PRICES[2][1]): htmltext = "<html><body>Покраска: <font color=74bff5>"+str(PRICES[2][1])+" "+str(PRICES[2][2])+"</font></body></html>" return htmltext st.takeItems(PRICES[2][0],PRICES[2][1]) player.getAppearance().setTitleColor(paintcolor) #< player.broadcastUserInfo() player.store() htmltext = "<html><body>Покраска:<br>Готово.<br><br><br><a action=\"bypass -h Quest q8024_ChgColor step1\">Вернуться.</a></body></html>" else: htmltext = "<html><body>Покраска:<br>Oops!</body></html>" return htmltext def onTalk (self,npc,player): st = player.getQuestState(qn) npcId = npc.getNpcId() if npcId == NPC: htmltext = "<html><body><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><img src=\"L2UI.SquareBlank\" width=260 height=2><br1>" htmltext += "Что красим?<font color=999966>*</font><br><center><table width=180><tr>" htmltext += "<td><button value=\"Ник\" action=\"bypass -h Quest q8024_ChgColor var_1\" width=80 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>" htmltext += "<td width=40></td>" htmltext += "<td><button value=\"Титул\" action=\"bypass -h Quest q8024_ChgColor var_2\" width=80 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>" htmltext += "</tr></table></center><br><br><font color=999966>*Изза особенностей ЖК-мониторов, цвета на чаре могут выглядить немного ярче или темнее.</font><br><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32></body></html>" return htmltext QUEST = Quest(8024,qn,"custom") CREATED = State('Start', QUEST) QUEST.setInitialState(CREATED) QUEST.addStartNpc(NPC) QUEST.addTalkId(NPC) *я догадываюсь что нужно поменять takeItems на некую фенкцию которая не забирает а проверяет но ничего не выходит..