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

Saltfire

Постоялец
  • Публикаций

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

  • Посещение

  • Победитель дней

    27
  • Отзывы

    N/A

Весь контент Saltfire

  1. Ой не просто тут все. Клиент мульти-язычность и сервер мульти-язычность чуть разные вещи (хотя по логике, сервер должен был быть копией клиента и в нужные моменты сверяться). По этому датапак серверов, набит под жвак htm(Htm) и xml разметками, до кучи затолкнули xsd схемы для валидаций, которые нужно в ручную переводить, если еще нет например, как делают некоторые html-ru, html-en, html-etc. Ну и конечно-же если mysql будет 5.5.3 и выше, чтобы вся база, таблицы и колонки в таблицах имели кодировку utf8mb4 и utf8mb4_general_ci за место utf8 и utf8_general_ci. А вот на счет отображения в клиенте русского, то есть модификатор u (utf8-unicode) который нужно записать вместо a (ascii) в dat файлах и строковых литералах - это уже отдельная история, как и *-e.dat, *-ru.dat. Даже если зайти в любой из *-e.dat'тник: 12100 a,NameNpc\0 a,TitleNpc\0 12100 u,НазваниеНпц\0 u,ТитулНпц\0 Многие редакторы уже это делают автоматом, по этому просто русский пишите, а он сам этот модификатор меняет автоматом, много что зависит как редактировать эти файлы. По поводу, зеркальной работы языков, при переключении в клиенте, со всеми фишками и плюшками это уже в 2х словах не объяснишь, оно как бы там есть и попыток было много. Но достойного мануала, нема, к сожалению, может быть пока, а может и не пока =)
  2. Акумка же посторался, сделал, уже ссылки даже выставил. Не видно все равно. Куда еще чище?
  3. В интерлюде это зашито в самой опе, по этому, ищите рыщите.
  4. @Wollandessa, наверно. Поставь assert'ы, посмотри, что и как отрабатывает, правильно или нет рассчитывается угол и т.д. По факту, там должно бить столько, сколько попало в этот угол поворота от начального движения.
  5. Во напали! Ну про 5к я утрирую - это понятное дело, что нет. А теперь проясним ситуацию: Разработка сайта - 200 тыс. + Дизайн и проектирвоание в районе 15-20 тыс. Уже 220 тыс. Просто сайт, без рекламы. А теперь внимание!!! Сервер с нуля написать будет стоит 2.5 миллиона рублей. Вы не ослышались ребятки и того имеем уже 2.7 миллиона + исходы проекта, утвержающие, что написано было под заказчика и индивидуально только ему, нет там не лыжи, не под лыжи, ничего другого. Про клиент молчу вообще. Тут денег не наберетесь, все делать, чтобы было как вам хочется, а не то, что есть по дефолту - лежит грузом и не изменяемо. Просто я бы никогда бы не рассматривал проект под ключ, заплатив кучу бабла, чтобы ничего у меня не было, не исхода, не денег, затычка, которая в любой момент может накрыться, по причине что разраб заболел, пропал, умер, испарился. - А кроме него никто не сможет поправить, исходника то у него, а большинство клиентов дальше датапака не ходили и пользуются лишь советами и то как подключать свои скрипты, которые заказывают опять-же за бугром. Или вы имеете ввиду взять, что сейчас уже есть сервер, бесплатный, который можно скачать бесплатно, настроить НПЦ, подправить патч и продать за 100 тыс+? Без исходников, без ничего? Ну я как бы не против, делайте, на это вообще кто-то ведется?
  6. Вы наверно, про L2Character.java -> doAttackHitByPole ? Ну или тут-же есть doAttack. Смотреть нужно где-то в этой области =) А может с типом оружия накосячили где-то в xml или в базе, смотря где у вас.
  7. Есть два типа шифрации: 1. Это только на основе клиентской стороны. Такие отслеживать почти не требуется. Потому, что нам на это вообще по барабану. Мы просто сканим нужный участок памяти и делаем дамп в файлик. А дальше просто уже будет видно, что используется и как исправить, а там не долго сделать рекурсию или цикл, кому что и дампнуть полный список и все когда-то зашифрованные и уже расшифрованные данные. 2. Это на основе и клиента и сервера, уже сложнее чем просто dll. Но сложность ровно до той степени, как узнаем где получается ключик расшифровки и куда передается на расшифровку, мы сразу же узнаем адрес и легко сможем сделать дамп. Защиты клиентской стороны не существует в реалиях. Все что подразумевается под защитой, абсурд - не более, которое рано или поздно расследуется. Нельзя спрятать, чтобы не найти, иначе тогда ничего работать не будет. Клиенту никогда нельзя доверять, защищать нужно сервер, чтобы не хакнули, не дюпнули, а остальное - поведенческий анализ игроков. Чтобы не ломали клиент, сервер должен знать все о нем вдоль и поперек - это предотвратит попытки изменения (опять-же поверхностно). Ага! Ровно до того, пока кто-то не захочет под насолить в файлик, ровно до такого же crc32 или xxhash, не особо важно, что будет - солить всегда файлики, до момента той-же чек-сумы. Учитывая, что коллизия дело такое, рано или поздно выхватим нужный результат, а потом будем постоянно его корректировать, когда пишем, что-то свое в клиент. Хотя если подзалетим на зону с проверкой и валидации файлов в текущий момент, выхватим Крит. (Хотя в лыже вряд ли вообще есть такое, да и думаю это будет тоже не бесплатно для производительности, если без кэша, ну а если кеш - опять проблема, исправить можно, делать функционал, чтобы не подменили кеш, тогда зачем нужен кеш, опять проблема и затраты для производительности). Советую забить на защиту клиента. Ага! Обфускатор! спасет только от скрытия исходника своего, как БОГ писал видать =) Но это не говорит, что мы не можем сдампить все это и собрать проект в каком-нибудь нетбинсе или эклипсе да где угодно и отследить где что вызывается.
  8. Saltfire

    Harbingers of war c1

    Деревянному веку не хочу я лыжи, хочу коньки. Да по херу вообще какую брать, все они кривые до безумия.
  9. Вы ошиблись, скорее 95% будут знать, а 5% это тем, кому до звезды на вас. Но все-же, чтобы это сделать, при входе на сервер, нужно создать хранилище ип адресов, которые уже зашли на сервер, а собственно при отключении игроков, опустошать их ип-адрес из списка. Ну и если уже зашел и такой ип уже есть в списке, просто разрываем соединение. 2 вариант, более надежен от школы, если зашить в клиент условия на запуск игры. Почему надежнее? Потому, что 95% не смогут изменить dll как потребуется для них. А 5% не станут терять на это время, если конечно будет над чем терять, а не 3 секунды и все исправлено. Но 3 секунды и VPN сменить и 2 оконо запустить. На край виртуалку поднять. Ну да, усложнишь и 5% жизнь, если сделаешь и 1 и 2 варианты. Правда из 5% - 70% точно сразу сделают все. На сервере примерно выглядит так: Заходим в WorldManager.java - добавляем: private static volatile List<String> ips = new ArrayList<>(); public static void addIp(final String ip) { if (!ip.isEmpty() && !ips.contains(ip)) { ips.add(ip); } } public static boolean isIp(final String ip) { return !ip.isEmpty() && ips.contains(ip); } public static void removeIp(final String ip) { ips.remove(ip); } public static List<String> getIps() { return ips; } Далее переходим в AbstractPacket.java - добавляем: public String ip() { return this.getInetAddress().getHostAddress(); } public InetAddress getInetAddress() { return ((MMOConnection) ((MMOClient) this._client).getConnection()).getInetAddress(); } После переходим в EnterWorld.java -> runImpl(), run(), etc()... final boolean isIp = WorldManager.isIp(ip()); if (!isIp) { WorldManager.addIp(ip()); } В L2Player.java или что у вас там-> closeNetConnection() Тут придется написать так: final String ip = client.getConnection().getInetAddress().getHostAddress(); if (WorldManager.isIp(ip)) { WorldManager.removeIp(ip); } В L2GameClient.java -> CleanupTask -> run() WorldManager.removeIp(getConnection().getInetAddress().getHostAddress()); В Logout.java -> runImpl(), run(), etc()... WorldManager.removeIp(ip()); В RequestRestart.java -> runImpl(), run(), etc()... WorldManager.removeIp(ip()); В GameServerThread.java -> kickPlayer() WorldManager.removeIp(_connectionIPAddress); Думаю, намек понятен, при входе где нужно добавляем, при выходе, кике, вылетах и т.д., что вызывает отключение клиента от сервера, там просто из списка удаляем, чтобы не получилось так, что клиент подключился, его выбило или отключился, а потом подключается, а его не пустит, пока сервер не перезагрузим или во время его работы не вычистим из памяти его ип, который у нас записывается в список.
  10. Это все вилами по воде. Ограничения это лишь заглушка от лаймеров, в виде смотрим сколько коннектов с 1 ип или если в клиент вшит флажек и счетчик этих окон, который будет сбрасывать при запуски нового окна, если мол больше нельзя. Ну спасет только от незнающих машинного кода, те, кто проводят время изучая реверс, то все ваши защиты и ограничения - это так, на завтрак с чашкой кофе.
  11. Saltfire

    прокси тор

    Есть подозрения, что вы пытаетесь использовать socks в качестве http proxy или на оборот. Вам нужно подключаться через socks протоколы. http работает на другом уровне.
  12. Saltfire

    прокси тор

    Ну на сколько известно, будь это тор, или чистой воды proxy server, в любом случае он является VPN. Возможно отвалились адреса или изменились. Смотрите настройки.
  13. Серьезно, что-ли? Я случайно не только один это вижу? Это что получается, что чем выше хроны, тем глубже деревынный век? Вот это новость, ребят остановитесь. Пока не поздно, или уже все? Что серьезно spawn тоже внедрили статикой? Или осталась spawnlist таблица? Вот по этому ни чего толком и нет, связи с такими вот переносами... Чтобы создать XMLSQL - нужно тронуться умом, да уж проще было сделать JSON тот же NOSQL, куда какие XML. Да никак не для такого, он то нужен для всяких WSDL или же MANIFEST, зачем его пихать везде где не надо, не понятно. А еще понравилось до кучи XSD ха-ха. Как говорится, запихаем все.
  14. Ну на самом деле, ComunityBoard.java (если такое имеется) - тут навигация и инициализация. Происхождение окошка и навигация его, уже находится в interface.u -> BoardWnd.uc. Да собственно, ничего не поменялось и в interface.xdat тот-же BoardWnd. Чтобы менять конкретно, а не поверхностно, нужно ковырять клиент. Чтобы менять содержимое, обычно - это находится "/в папке с сервером/data/html/communityboard".
  15. Не ну, лучше новую тему создать, если не по теме. А лучше тогда в лс.
  16. Да хотелось бы тут сделать пару добрых дел, пока желание не отпало и не ушел в другую сферу. =)
  17. Как вы смотрите, на то, чтобы появилась такая надпись? Там, вход только для избранных, чтобы писать, менять, но я постараюсь максимально рассказать и показать, чтобы отпали вопросы, как поставить 2 явы, как скомпилить, как свое написать, как языки внедрять нативно в клиент, без написания новых нереальных либ и т.д., все работает из внутри, все меняется, компилится. Я покажу все базовые механизмы и все у вас всегда получится. Чтобы такие-же люди, начали помогать всем, чтобы знали все, как это работает, чтобы больше не было вопросов, что как делать и как работает... Сделать обычный такой-же раздел, только мне с правами и всем администраторам, я буду всегда пополнять информацию, с нуля напишем языки, там будет и настройка сервера и т.д., все базовое, только надо объяснить и дать людям. которые все так пытаются с какими-то нереальными догадками, начинают просто нереально напрягаться и ничего с места то не трогается вообще. все затихло, заглохло, форум превращается в однотипные темы с 3 постами и фразами, гугл в помощь. а он пытается бедняга, найти этот гугл, и сделать в нем поиск, по фразе "Не знаю какую", а потом вытрепать все нервы и бросить это дело - которое не успел начать, но все равно вернется, и будет трепать всем нервы и будут появляться ненужные вопросы и т.д.. А может быть если бы сразу узналось, не было бы проблем? И была бы тишина и только самые нужные темы и вопросы про расширяемость коллектива нубов, которые посмотрите, каких достигнут результатов. И все это даром, ребята =) Интересно мнение. Все устарело... Я бы никогда не переносил бы целиком целые таблицы в xml, когда в итоге все равно используется база, а вы то понимаете, что она не заменима, тогда рывок, была попытка перейти обратно в деревянный век, становится трагична ведь от функций: public Xml removeDropItem(int itemId) { this.tags("drop").forEach(node -> { Xml item = this.tag(node); Node parent = node.getParentNode(); if (itemId == Util.Int(item.attr("itemid"))) { Node drops = parent.getParentNode(); if (null == drops) { return; } Node parentOld = parent.removeChild(node); int countChilds = parentOld.getChildNodes().getLength(); if (0 >= countChilds) { drops.removeChild(parent); } } }); return this; } Становится страшно, хоть оно и работает довольно быстро. главное, удобства же тоже. Правда работать, не у кого не будет, но дело не в этом, вот такие вот ответы бывают, прикиньте, вы даже не поняли. что за данные там лежат вообще. Или попыткой просмотра всех сразу, как в базе... public void printDropItems() { it.forEach(itemId -> { final String fileItem = Xml.listingFileItem(itemId); if (!"".equals(fileItem)) { Xml xml = new Xml(fileItem); xml.tags("item").forEach(node -> { Xml npc = this.tag(node); final int npcId = Util.Int(npc.attr("id")); if (!allow.contains(npcId) && itemId == npcId) { allow.add(npcId); Log.log(itemId + " === " + npc.attr("name")); } }); } }); } 2397 === Tunic of Zubei 2402 === Stockings of Zubei 2406 === Avadon Robe 17 === Wooden Arrow 1868 === Thread 1873 === Silver Nugget 462 === Stockings 426 === Tunic 1895 === Metallic Fiber 4043 === Asofe 4042 === Enria 4040 === Mold Lubricant 4401 === Green Dimensional Stone 8740 === Mid-Grade Life Stone: level 67 8730 === Life Stone: level 67 1876 === Mithril Ore 955 === Scroll: Enchant Weapon (Grade D) 956 === Scroll: Enchant Armor (Grade D) 1060 === Lesser Healing Potion 1061 === Healing Potion 951 === Scroll: Enchant Weapon (Grade C) 952 === Scroll: Enchant Armor (Grade C) 1832 === Greater Antidote 1834 === Emergency Dressing 734 === Haste Potion 735 === Potion of Alacrity 1539 === Greater Healing Potion 947 === Scroll: Enchant Weapon (Grade B) 948 === Scroll: Enchant Armor (Grade B) 729 === Scroll: Enchant Weapon (Grade A) 730 === Scroll: Enchant Armor (Grade A) 81 === Dragon Slayer
  18. А, то есть ты с Нуля, сделаешь за 5 тыс? Вперед. Жду. Ой, мимо плз. Делальщики. Это просто сказка а не форум =) Все такие крутые, а ничего не могут хе-хе.
  19. Кто сказал, что у него это в БД? У него нет там droplist, npc и тех таблиц, которых чудесным образом, перенесли в папку xml. Заходим: server\gameserver\data\xml\npcs\ - ищем нужный файл "*.xml" - открываем - ищем нужный ид моба, боса и т. д. <drops> <category id="1"> <drop chance="12" itemid="2397" max="1" min="1"/> <drop chance="19" itemid="2402" max="1" min="1"/> <drop chance="8" itemid="2406" max="1" min="1"/> </category> </drops> А теперь разберемся, что тут и как работает: Тут в <drops> - пишется <category id="1"> - категорий может быть сколько угодно, с одной категории, может выпасть только 1 итем, даже если там указанно 3, они 3 никогда не выпадут, только по одному. Для дропа нескольких и более, Добавите <category id="2">, <category id="3"> и т.д. <category id="-1"> - если встретится категория с -1 - это споил. Ну а дальше все понятно и так, дроп, шанс, итем, макс. и мин.
  20. Ну дело все в том, что шифруется, то обязательно расшифровывается на этапе выполнения. Подсказка: "ПАМЯТЬ".
  21. ОМГ! У вас есть 3-4 ляма на это все дело? (Без рекламы) С нуля то все собрать, отладить, хе-хе (Уж больно много хотите). Ну да, ща услышим, что все сделают за 100 тыс., пусть делают! Уже походу сделали? Скупой платит "ПОСТОЯННО" Еще такой момент: кто вам его будет потом поддерживать, дорабатывать? Есть еще 3 ляма, чтобы купить исходники все?
×
×
  • Создать...