Перейти к содержанию

Duster

Пользователи
  • Публикаций

    14
  • Зарегистрирован

  • Посещение

  • Отзывы

    0%

Репутация

1

1 Подписчик

Информация о Duster

  • Звание
    Только пришел
  1. //telepathic_mode on О чем это я? Код в аттаче приложите, хотя бы...
  2. Угу, сейчас всё брошу, побегу писать запросы бесплатно! Ведь это такой хороший и любезный человек!
  3. Здравствуйте, уважаемые. В некоторых своих статьях и советах упомянаю "пользовательские переменные" - способ сохранять некую информацию и настройки без рефакторинга всего кода и базы. Я, к примеру, храню в них индивидуальные настройки автолутов, режим экономии трафика, отображение достижений, отображение торговцев, и прочие настройки, которые игрок выбирает сам. Так же храню в них имя супруги/супруга, если персонажи поженились. Есть такая необходимость, и это лучше, чем грузить из базы, если партнер не в сети... При входе игрока производится загрузка мапов всех переменных в память, при выходи и периодически - сохранение. При изменении/добавлении/удалении переменной обновлять базу не рекомендую - может использоваться как ДДОС и привести к перегрузкам. Сразу оговорюсь: Если у Вас сборка не на исходниках L2J - придется допиливать самостоятельно, либо покупать (или клянчить у других) адаптацию. Итак, поехали. Будем править только один класс - L2PcInstance. Для начала в самый конец класса добавим объявления и методы: private Map<String, String> _vars = new FastMap<String, String>(); //----------------------------------------------------------------- public void setVar(String vName, String vValue){ _vars.put(vName, vValue); } public void setBoolVar(String vName, boolean vValue){ if (vValue) _vars.put(vName, "true"); else _vars.put(vName, "false"); } //----------------------------------------------------------------- public String getVar(String vName){ String tmpVal = _vars.get(vName); return tmpVal != null ? tmpVal : ""; } public boolean getBoolVar(String vName){ String tmpVal = _vars.get(vName); return (tmpVal == null || tmpVal.equals("false")) ? false : true; } //----------------------------------------------------------------- public final void delVar(String vName){ _vars.remove(vName); } //----------------------------------------------------------------- private final void StoreVars(){ Connection con = null; try{ con = L2DatabaseFactory.getInstance().getConnection(); con.prepareStatement("DELETE FROM `character_variables` WHERE `OID`="+getObjectId()).executeUpdate(); if (_vars.size() > 0){ PreparedStatement statement = con.prepareStatement("INSERT INTO `character_variables` (`OID`, `VarName`, `VarValue`) VALUES (?,?,?)"); for (final String key : _vars.keySet()){ final String value = _vars.get(key); statement.setInt(1, getObjectId()); statement.setString(2, key); statement.setString(3, value); statement.executeUpdate(); statement.clearParameters(); } statement.close(); } } catch (Exception e) {_log.log(Level.WARNING, "", e);} finally {L2DatabaseFactory.close(con);} } private final void RestoreVars(){ Connection con = null; try{ con = L2DatabaseFactory.getInstance().getConnection(); ResultSet vars = con.prepareStatement("SELECT * FROM character_variables WHERE OID="+getObjectId()).executeQuery(); while (vars.next()){ _vars.put(vars.getString("VarName"),vars.getString("VarValue")); } vars.close(); } catch (Exception e) {_log.log(Level.WARNING, "", e);} finally {L2DatabaseFactory.close(con);} } После этих строк должен остаться только один символ - } - закрывающий весь класс. Дальше. Ищем метод загрузки: private static L2PcInstance restore(int objectId) Почти в самы конец метода, перед кетчами, вызываем наш метод загрузки: player.restoreZoneRestartLimitTime(); player.RestoreVars(); } catch (Exception e) {_log.log(Level.SEVERE, "Failed loading character.", e);} Метод должен быть вызван именно последним в загрузках. Почему - думайте сами. Далее. Ищем метод: public void store() Опять же, в самый конец метода добавляем наш метод сохранения: SevenSigns.getInstance().saveSevenSignsData(getObjectId()); StoreVars(); } С кодом покончено, осталось создать таблицу в базе. В Навикате/ПхпМайАдмине/другой_проге_СУБД исполняем запрос для своей базы: DROP TABLE IF EXISTS `character_variables`; CREATE TABLE `character_variables` ( `OID` int(11) NOT NULL DEFAULT '0', `VarName` varchar(50) NOT NULL DEFAULT '0', `VarValue` varchar(255) NOT NULL DEFAULT '0', UNIQUE KEY `prim` (`OID`,`VarName`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Собсна, всё. Использование простейшее: player.setVar("myoption","qwerty"); String _var = player.getVar("myoption"); player.delVar("myoption"); Соответственно: Создаст или изменит переменную. Получит значение переменной (даже после рестарта сервера, для этого и делали). Удалит переменную (после релогина/рестарта - удалит и из базы). Если кому-то из модеров так претит неоформленный текст - правьте сами, не мне это надо. Если копируете мануал - будьте добры оставлять ссылку на Автора, или на топик формума с первоисточником мануала.
  4. Duster

    Eclipse + Debug

    Вопрос отменяется. Всё исправил. Пришлось переписывать метод полностью. Есть нужда в новом методе - пишите в асю 305224880. Цена чисто символическая. Убедился в криворукости одного из разработчиков лыжы уже который раз... Тему можно закрывать.
  5. Duster

    Ошибка В Коде!

    1 - прикрепите аттачем файл класса. Без факторинга ни кто не будет даже пытаться разобраться в коде. 2 - Покажите сообщение ошибки (вместе с трейсрутом).
  6. Duster

    Вопрос

    В L2Character.java (или как там в Вашей сборке называется класс, являющийся родителем класса игрока): // Изменить: public final String getTitle(){ if (this instanceof L2PcInstance){ String tempTitle = getPvpRank() + " - " + _title; return tempTitle.length() > 16 ? tempTitle.substring(0, 15) : tempTitle; } else return _title; } // Добавить: private final String getPvpRank(){ if (((L2PcInstance) this).getPvpKills() > 1000 ){ return "Hitman"; } else if (((L2PcInstance) this).getPvpKills() > 500 ){ return "Expert Killer"; } else if (((L2PcInstance) this).getPvpKills() > 250 ){ return "Killer"; } else if (((L2PcInstance) this).getPvpKills() > 100 ){ return "Newbie"; } else { return "Elpy"; } } Только вот остается вопрос того, что игрокам не понравится бегать с нубскими титулами. А если добавлять ранк только после 500 киллов - то все нубы будут "подделывать" этот фирменный титул. Выход - при 500+ титул делать другого цвета и выводить ранг, тогда будет сразу понятно, подделал игрок титул, или настоящий. Но, так или иначе, необходимо игроку самому решить, показывать свой ранк или нет. Я для таких вещей сделал у себя "пользовательские переменные", которых хранятся в базе. А через комьюнити игрок настраивает их (автолут, достижения, экономия трафика и другое). PS: ТопикСтартер, сервер уже работает, или только балуешься? Есть ли профит от него? Могу предложить свои услуги программиста. За деньги, разумеется.
  7. Duster

    Eclipse + Debug

    Здравствуйте, уважаемые. Седня узнал про замечательную возможность править код "на лету" в Эклипсе - в режиме отладки. Настроил отладчик на запуск класса Gameserver, рабочую директорию, запустил. Сначала начал грузиться нормально, но в середине загрузки выдал ошибку: По этой строке просто инициализируются олимпиады. sortHerosToBe не вызывается. Предполагаю, что ошибка валидации или компиляции olympiad.class Перекомпиляция, удаление /bin и вообще всего компилируемоего положительных результатов не дает. Из батника в большинстве случаев запускается нормально (изредка выдает ту же ошибку, но лечится перезапуском сервера). Подскажите, в чем может быть проблемма? Исходники L2J с их СВНа.
  8. Овер я уже скачал, времени нет поковырять его... Но все равно спасибо)
  9. Здравствуйте, уважаемые! Ищу сервер (не важно исходники или откомпиленный), в котором хотя бы частично реализован инстанс (и босс) Ice Queen Freya. Перерыл уже кучу СВНов и сборок - ни где нет ID инста и хотя бы примерного АИ... Кто поможет - на спасибки не поскуплюсь!
  10. Решение найдено. Вспомнил, что при создании итемов ГМом в чате пишется название)) Из хендлера админкоманды почерпнул: L2Item template = ItemTable.getInstance().getTemplate(_itemId); String name = template.getName(); Всем спасибо за участие
  11. Нет, это не вариант. Итемов может быть сколько угодно - массив настраиваемый. Да и IF не кошернее switch`а
  12. Блин. Видимо, я не так объясняю... Сам лично я эти названия знаю. Мне надо показать их игроку. К примеру, есть массив интов с IDшниками. Берем случайный, и его название показываем пользователю, например, в HTMLку. Есть подобный код, только для другой сборки: ItemTemplate item = ItemHolder.getInstance().getTemplate(57); String name = item.getName(); Мне это дело надо перевести на исходники лыжы. ИтемХолдера я там не нашел, как и любого другого хранилища итемов. А писать заново или делать лишние запросы к БД - не кашерно... Есть ли у лыжи какое-либо хранилище или интерфейс для предметов? Уже третий час исходники курю, ни где не могу найти не хранилища, ни интерфейса, ни примера получения... Дурдом. Из интентаря пользователя можно получить название предмета, а просто так - не могу понять как...
  13. Здравствуйте, уважаемые. Подскажите, как на сборке L2J можно получить название произвольного итема? К примеру, строковое название адены (или любого другого предмета, которого может и не оказаться в инвентаре). Буду благодарен.
  14. И ни в одной из статей про Хиро Итем ни разу не нашел ссылки на изначального автора... Молодцы, копирасты
×
×
  • Создать...