Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
1) ты можешь во время диалога с нпц, увидеть какой хтмл она тебе предлагает прямо в систем чате(если ты за админа и конфиг включен)- и понять по какой логической ветке пошел квест, а оттуда понять что идет не такА как это можно проверить? Просто немного не до понимаю в этом. Как то в отладочном режиме это запускается, или это все в консоле выдастся?
1) ты можешь во время диалога с нпц, увидеть какой хтмл она тебе предлагает прямо в систем чате(если ты за админа и конфиг включен)- и понять по какой логической ветке пошел квест, а оттуда понять что идет не так
2) ты можешь вставить дополнительное логирование в код с описанием нужных тебе параметров(итемов например). В этой сборке для квестов уже обьявлен логгер, вставляется так: LOGGER.info("Говорю с нети, костей " + st.ownItemCount(spatois_bones));
if (st.ownItemCount(beziques_letter) > 0)
htmltext = "neti_q0403_01.htm";
Агр патч стоит, на другой шаре показывают лвл мобов. Это не суть важно так, хотелось конечно чтоб работало, если конечно тут реализовано, пока еще не все просмотрел.Вообще обычно это делают агр патчем(агр и лвл Мобов) для клиента.
Скорее всего да, через админку ничего не создавал, все по квесту, может быть рейты квеста так влияют? Стоят х5 на получение RateQuestsDrop. Думаю скорее всего нет. Еще раз проверю сегодня, посмотрю все по внимательнее, и отпишусь.Ты же вроде все нашёл, вон у тебя первым итемом на скрине свиток лежит, это письмо как раз ? Так откуда оно у тебя? Ты в админке его создал ? Или нпц его выдал, а потом не забрал ? Просто нети забирает письмо в одном экземпляре когда выдаёт лук и дагер. Может ты отменял квест, а письмо осталось с порогового раза. Попробуй удалить письмо, если кости сдадутся - удали квестовые итемы, отмени квест и начни заново. Если с нуля все будет работать, то это баг ПТС скрипта.
if (npcId == captain_bezique) {
if (st.ownItemCount(horseshoe_of_light) == 0 && st.ownItemCount(stolen_jewelry) > 0 && st.ownItemCount(stolen_tomes) > 0 && st.ownItemCount(stolen_ring) > 0 && st.ownItemCount(stolen_necklace) > 0) {
st.takeItems(netis_bow, -1);
st.takeItems(netis_dagger, -1);
st.takeItems(stolen_jewelry, 1);
st.takeItems(stolen_tomes, 1);
st.takeItems(stolen_ring, 1);
st.takeItems(stolen_necklace, 1);
st.takeItems(wanted_bill, -1);
st.giveItems(beziques_recommendation, 1);
if (GetOneTimeQuestFlag == 0) {
st.getPlayer().getPlayerVariables().set(PlayerVariables.profession_145, String.valueOf(1), -1);
if (talker_level >= 20)
st.addExpAndSp(320534, 20232);
else if (talker_level == 19)
st.addExpAndSp(456128, 26930);
else
st.addExpAndSp(591724, 33628);
st.giveItems(ADENA_ID, 163800);
}
htmltext = "captain_bezique_q0403_09.htm";
player.sendPacket(new SocialAction(st.getPlayer().getObjectId(), 3)); // Тут вроде как должен ИД итема
st.soundEffect(SOUND_FINISH);
st.exitQuest(false);
} else if (st.ownItemCount(horseshoe_of_light) == 0 && st.ownItemCount(beziques_letter) > 0)
htmltext = "captain_bezique_q0403_07.htm";
else if (st.ownItemCount(horseshoe_of_light) > 0) {
htmltext = "captain_bezique_q0403_08.htm";
st.takeItems(horseshoe_of_light, 1);
st.giveItems(wanted_bill, 1);
st.setCond(5);
} else if (st.ownItemCount(netis_bow) > 0 && st.ownItemCount(netis_dagger) > 0 && st.ownItemCount(wanted_bill) == 0)
htmltext = "captain_bezique_q0403_10.htm";
else if (st.ownItemCount(wanted_bill) > 0)
htmltext = "captain_bezique_q0403_11.htm";
}
if (npcId == captain_bezique) {
if (st.ownItemCount(horseshoe_of_light) == 0 && st.ownItemCount(stolen_jewelry) > 0 && st.ownItemCount(stolen_tomes) > 0 && st.ownItemCount(stolen_ring) > 0 && st.ownItemCount(stolen_necklace) > 0) {
st.takeItems(netis_bow, -1);
st.takeItems(netis_dagger, -1);
st.takeItems(stolen_jewelry, 1);
st.takeItems(stolen_tomes, 1);
st.takeItems(stolen_ring, 1);
st.takeItems(stolen_necklace, 1);
st.takeItems(wanted_bill, -1);
st.giveItems(beziques_recommendation, 1); // Тут рекомендация должна выдаваться
if (GetOneTimeQuestFlag == 0) {
st.getPlayer().getPlayerVariables().set(PlayerVariables.profession_145, String.valueOf(1), -1);
if (talker_level >= 20)
st.addExpAndSp(320534, 20232);
else if (talker_level == 19)
st.addExpAndSp(456128, 26930);
else
st.addExpAndSp(591724, 33628);
st.giveItems(ADENA_ID, 163800);
}
htmltext = "captain_bezique_q0403_09.htm";
player.sendPacket(new SocialAction(st.getPlayer().getObjectId(), 3));
st.soundEffect(SOUND_FINISH);
st.exitQuest(false);
} else if (st.ownItemCount(horseshoe_of_light) == 0 && st.ownItemCount(beziques_letter) > 0)
htmltext = "captain_bezique_q0403_07.htm";
else if (st.ownItemCount(horseshoe_of_light) > 0) {
htmltext = "captain_bezique_q0403_08.htm";
st.takeItems(horseshoe_of_light, 1);
st.giveItems(wanted_bill, 1);
st.setCond(5);
} else if (st.ownItemCount(netis_bow) > 0 && st.ownItemCount(netis_dagger) > 0 && st.ownItemCount(wanted_bill) == 0)
htmltext = "captain_bezique_q0403_10.htm";
else if (st.ownItemCount(wanted_bill) > 0)
htmltext = "captain_bezique_q0403_11.htm";
}
Вообще в коде уже есть выдача это рекомендации, а вверху скрипта ей должен быть присвоен итем ид.
Может она не квестовый предмет? Или итем ид не тот? Или предмета нет в датапаке в предметах?
Код:if (npcId == captain_bezique) { if (st.ownItemCount(horseshoe_of_light) == 0 && st.ownItemCount(stolen_jewelry) > 0 && st.ownItemCount(stolen_tomes) > 0 && st.ownItemCount(stolen_ring) > 0 && st.ownItemCount(stolen_necklace) > 0) { st.takeItems(netis_bow, -1); st.takeItems(netis_dagger, -1); st.takeItems(stolen_jewelry, 1); st.takeItems(stolen_tomes, 1); st.takeItems(stolen_ring, 1); st.takeItems(stolen_necklace, 1); st.takeItems(wanted_bill, -1); st.giveItems(beziques_recommendation, 1); // Тут рекомендация должна выдаваться if (GetOneTimeQuestFlag == 0) { st.getPlayer().getPlayerVariables().set(PlayerVariables.profession_145, String.valueOf(1), -1); if (talker_level >= 20) st.addExpAndSp(320534, 20232); else if (talker_level == 19) st.addExpAndSp(456128, 26930); else st.addExpAndSp(591724, 33628); st.giveItems(ADENA_ID, 163800); } htmltext = "captain_bezique_q0403_09.htm"; player.sendPacket(new SocialAction(st.getPlayer().getObjectId(), 3)); st.soundEffect(SOUND_FINISH); st.exitQuest(false); } else if (st.ownItemCount(horseshoe_of_light) == 0 && st.ownItemCount(beziques_letter) > 0) htmltext = "captain_bezique_q0403_07.htm"; else if (st.ownItemCount(horseshoe_of_light) > 0) { htmltext = "captain_bezique_q0403_08.htm"; st.takeItems(horseshoe_of_light, 1); st.giveItems(wanted_bill, 1); st.setCond(5); } else if (st.ownItemCount(netis_bow) > 0 && st.ownItemCount(netis_dagger) > 0 && st.ownItemCount(wanted_bill) == 0) htmltext = "captain_bezique_q0403_10.htm"; else if (st.ownItemCount(wanted_bill) > 0) htmltext = "captain_bezique_q0403_11.htm"; }
<data item_id="1190" name="Рекомендация Безика" description="Предмет для смены профессии. Чтобы стать Разбойником, отдайте это Великому Мастеру в Гильдии Воинов" color="1"/>
private final static int beziques_recommendation = 1190;
каким образом добыл эти самые квест итемы?Ситуация такая, когда проходишь данный квест, Безик отправляет к Нети, а Нети отправляет бить мобов Скелетов в Руинс Агойн, при помощи квест итемов. Получить необходимо 10 квест итемов, даются нормально, все набили. И тут самое веселое, Нети должна датьВы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками Вход или РегистрацияВы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками Вход или Регистрация(Подкова Света), но это не происходит.
Итемы я набивал при помощи лука и дагера, которое дала Нети. Через админку я ничего не создавал. Глюк был с параметром "RateQuestsDrop" : "5.", в место "1." стояло значение х5, по этому все так происходило. Но при параметре рейта "1.", ужасно долго набиваются квест итемы. Вопрос по этому поводу решен. Сейчас ситуация другая, что по завершению квеста, капитан Безик должен выдать итем "Безик Рекомендацию", для получении профессии, но не выдает.каким образом добыл эти самые квест итемы?
если с админки добавил сразу 10, то ясное дело оно сдаваться не будет. В таком случае нужно удалить/выбросить 1 итем и выбить с моба самостоятельно.
Вроде как квестовый, нашел по пути /data/client/itemname/ItemName-ru.xml
Код:<data item_id="1190" name="Рекомендация Безика" description="Предмет для смены профессии. Чтобы стать Разбойником, отдайте это Великому Мастеру в Гильдии Воинов" color="1"/>
И в самом коде правильно прописан тоже
Код:private final static int beziques_recommendation = 1190;
Странно вообще как то, вроде правильно все.
item_begin questitem 1190 [beziques_recommendation] item_type=questitem slot_bit_type={none} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=0 default_action=action_none consume_type=consume_type_stackable initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=steel crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=0 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={} is_olympiad_can_use=1 can_move=1 is_premium=0 /*배지크의추천장*/ item_end
1) количество ячеек в инвентаре занятых изменилось?По пробовал пройти без прав Гма, все тоже самое, а самое главное что по завершению квеста мол якобы Безик дает рекомендацию, но по факту в инвентаре нет этой рекомендации, ни в квестах, ни в основной.
этот квест нужно диписывать!По пробовал пройти без прав Гма, все тоже самое, а самое главное что по завершению квеста мол якобы Безик дает рекомендацию, но по факту в инвентаре нет этой рекомендации, ни в квестах, ни в основной.
у жтс за 2018 очень много косяков на то и шара а так возьми шару от жтс 2015 там кстати кв корретные и рабочиеПТС скриптах тоже вроде как все правильно, /data/pts_scripts/itemdata.txt. Как можно проверить, верный ли ИД? Только если по пробовать создать данный итем?
Код:item_begin questitem 1190 [beziques_recommendation] item_type=questitem slot_bit_type={none} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=0 default_action=action_none consume_type=consume_type_stackable initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=1 ex_immediate_effect=0 drop_period=10 duration=-1 use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[none] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=steel crystal_type=none crystal_count=0 is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=0 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={} is_olympiad_can_use=1 can_move=1 is_premium=0 /*배지크의추천장*/ item_end
Протокол как нибудь влияет на это? Пользуюсь клиентом на протоколе 268. Может 273 необходим, или без разницы?1) количество ячеек в инвентаре занятых изменилось?
2) Вы смотрели свой патч? а именно etcitemgrp.dat как-то так называется
3) возможно в клиенте просто отсутствуют необходимые текстуры, тоже проверьте
4) что говорят логи сервера?
5) если не разберетесь - пишите в личку, помогу
так поставьте 273 протокол и проверьтеПротокол как нибудь влияет на это? Пользуюсь клиентом на протоколе 268. Может 273 необходим, или без разницы?
/**
* Добавить предмет игроку
* By default if item is adena rates 'll be applyed, else no
*
* @param itemId
* @param count
*/
public void giveItems(final int itemId, final long count) {
final ItemTemplate template = ItemTemplateHolder.getInstance().getTemplate(itemId);
if (template == null) {
return;
}
giveItems(itemId, count, template.isStackable()); // Проверка isStackable())
}
/**
* Destroy element used by quest when quest is exited
*
* @param repeatable
* @return QuestState
*/
public QuestState exitQuest(final boolean repeatable) {
final Player player = getPlayer();
if (player == null) {
return this;
}
removePlayerOnKillListener();
// Clean drops
for (final int itemId : _quest.getItems()) {
// Get [item from] / [presence of the item in] the inventory of the player
final ItemInstance item = player.getInventory().getItemByItemId(itemId);
if (item == null || itemId == 57) {
continue;
}
final long count = item.getCount();
// If player has the item in inventory, destroy it (if not gold)
player.getInventory().destroyItemByItemId(itemId, count); //Удаление квестовых предметов
player.getWarehouse().destroyItemByItemId(itemId, count); //Удаление квестовых предметов
}
// If quest is repeatable, delete quest from list of quest of the player and from database (quest CAN be created again => repeatable)
if (repeatable) {
player.removeQuestState(_quest.getId());
CharacterQuestDAO.getInstance().delete(getPlayer().getObjectId(), _quest.getId());
_vars.clear();
} else { // Otherwise, delete variables for quest and update database (quest CANNOT be created again => not repeatable)
for (final String var : _vars.keySet()) {
if (var != null) {
removeMemo(var);
}
}
setState(Quest.COMPLETED);
}
player.sendPacket(new QuestList(player));
return this;
}
Во спасибо за разъяснение, буду смотреть и править.Вообщем решил я сегодня сам посмотреть код.
Предметы криво рейтуются из-за попытки сделать это массово для всех квестов. В QuestState.java есть кусочек где проверка template.isStackable() - почему то означает, что квест итем нужно прорейтовать.
Исправление: заменить template.isStackable() на false, а затем руками во всех квестах участки st.giveItems("название_предмета", 1); менять на st.giveItems("название_предмета", 1, true); там, где нужно рейтовать drop\reward. А еще лучше, раз уж руками придется рейтовать квесты(как это делают в птс экстендерах) создать дополнительный метод rewardItems по аналогии сКод:/** * Добавить предмет игроку * By default if item is adena rates 'll be applyed, else no * * @param itemId * @param count */ public void giveItems(final int itemId, final long count) { final ItemTemplate template = ItemTemplateHolder.getInstance().getTemplate(itemId); if (template == null) { return; } giveItems(itemId, count, template.isStackable()); // Проверка isStackable()) }
giveItems(final int itemId, long count, final boolean rate) - и прорейтовать дроп в квестах с помощью giveItems, а награду с помощью rewardItems. Квестов всего штук 500, весь фикс займет от силы несколько часов.
Далее почему не добавляется последний предмет. В QuestState.java есть кусок где все квестовые предметы удаляются после завершения квеста, чтобы почистить от лишнего дропа(под спойлером ниже). В нашем квесте при инициализации конструктора beziques_recommendation добавляется в список квестовых предметов, это выглядит вот так: addQuestItem(beziques_letter, spatois_bones, horseshoe_of_light, wanted_bill, stolen_jewelry, stolen_tomes, stolen_ring, stolen_necklace, beziques_recommendation, netis_bow, netis_dagger); И при завершении квеста, предмет считается как дропнутый по квесту и удаляется.
На птс удаления предметов по завершению квеста не происходит, а происходит только при ручной отмене квеста.
Исправление: чтобы решить эту проблему надо просто этот участок(с удалением предметов) перенести в блок public void abortQuest() либо как альтернативный вариант вручную в каждом квесте удалить из списка addQuestItem предметы которые выдаются по его завершению.Код:/** * Destroy element used by quest when quest is exited * * @param repeatable * @return QuestState */ public QuestState exitQuest(final boolean repeatable) { final Player player = getPlayer(); if (player == null) { return this; } removePlayerOnKillListener(); // Clean drops for (final int itemId : _quest.getItems()) { // Get [item from] / [presence of the item in] the inventory of the player final ItemInstance item = player.getInventory().getItemByItemId(itemId); if (item == null || itemId == 57) { continue; } final long count = item.getCount(); // If player has the item in inventory, destroy it (if not gold) player.getInventory().destroyItemByItemId(itemId, count); //Удаление квестовых предметов player.getWarehouse().destroyItemByItemId(itemId, count); //Удаление квестовых предметов } // If quest is repeatable, delete quest from list of quest of the player and from database (quest CAN be created again => repeatable) if (repeatable) { player.removeQuestState(_quest.getId()); CharacterQuestDAO.getInstance().delete(getPlayer().getObjectId(), _quest.getId()); _vars.clear(); } else { // Otherwise, delete variables for quest and update database (quest CANNOT be created again => not repeatable) for (final String var : _vars.keySet()) { if (var != null) { removeMemo(var); } } setState(Quest.COMPLETED); } player.sendPacket(new QuestList(player)); return this; }
В итоге эти 2 мелких фикса полностью исправят квестовую систему.
# An example of a complete cron-expression is the string "0 0 12 ? * WED" - which means "every Wednesday at 12:00:00 pm".
# Если поле null, ежедневный авторестарт отключен, по умолчанию 05:00 (0 0 5 * * ?)
"AutoRestartAt" : null,
configuration\gm\GMAccess.xmlНарод, подскажите как сделать следующее:
1. Нужно убрать права ГМа при создании персонажа
При выключенной опции, пытаюсь добавить ГМа по старой традиции, через таблицу characters, accesslevel 100, не срабатывает. Что не так делаю тут?# Выдавать ли всем игрокам права администратора (удобно для тестовых серверов)
# Шаблон с привилегиями находятся в файле configuration\gm\GMAccess.xml, для PlayerID set="0"
"EverybodyHasAdminRights" : "false",
Какой старой традиции? В оверах всю жизнь в конфиге указывались права админа по ид перса.Народ, подскажите как сделать следующее:
1. Нужно убрать права ГМа при создании персонажа
При выключенной опции, пытаюсь добавить ГМа по старой традиции, через таблицу characters, accesslevel 100, не срабатывает. Что не так делаю тут?# Выдавать ли всем игрокам права администратора (удобно для тестовых серверов)
# Шаблон с привилегиями находятся в файле configuration\gm\GMAccess.xml, для PlayerID set="0"
"EverybodyHasAdminRights" : "false",
2. Настройка авторестарта на 5:00
При 0 0 5 * * ?, ГС не грузится по просту.Код:# An example of a complete cron-expression is the string "0 0 12 ? * WED" - which means "every Wednesday at 12:00:00 pm". # Если поле null, ежедневный авторестарт отключен, по умолчанию 05:00 (0 0 5 * * ?) "AutoRestartAt" : null,
3. Какой файл отвечает за появление в точке респавна в деревне Камаель возле Помощника новичка? Не все рассы респавнятся в одной точке, темные эльфы появляются в точке спавна нпц Помощника новичка.