14.07.2011, 13:53 | #1 |
Новичок
Регистрация: 24.03.2010
Сообщений: 23
Сказал(а) спасибо: 7
Поблагодарили 5 раз(а) в 4 сообщениях
|
[DEV] StormCore (Java WoW Emu)
Вот, решил начать писать emu пресловутой игры на Java, так как данная игра и язык представляют для меня большой интерес. Хочется совместить приятное с полезным и углублять свои знания в Java. Может кого-нибудь заинтересует моя задумка...
На данный момент удалось реализовать аутентификацию с реалм сервером. Выкладываю исходники своего творения. Прошу строго не судить. [HIDE="Устарело"] Проект переехал с http://github.com/ШтормКоре в http://github.com/JMaNGOS git clone git://github.com/JMaNGOS/storm.git В данный момент проект storm заморожен. UPDATE: storm закрыт полностью все наработки перебрались в JMaNGOS [/HIDE] В свою очередь все наработки были перенесены в новый проект "JMaNGOS". И сейчас все работы ведутся над "JMaNGOS". Проект http://github.com/JMaNGOS git clone git://github.com/JMaNGOS/JMaNGOS.git Последний раз редактировалось mAdloVe; 14.09.2013 в 18:42. Причина: возвращение проекта |
08.08.2011, 13:12 | #81 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
у меня используется тот же метод, что у близзов между клиентом и сервером.
реалм выступает как обычный клиент и так же авторизовывается на логон сервере как обычный клиент обычным аккаунтом (у этих аккаунтов в базе флаг выставлен только isRealmAccount). так же формируется сессионый ключ. единственная разница что я шифрую весь пакет целиком, а не только заголовок. |
08.08.2011, 14:34 | #82 |
Гость
Сообщений: n/a
|
на логин сервере ( для обычных клиентов ) нет транспортного слоя (с криптозащитой пакетов) , то есть все прозрачно...если вводить шифрование по тому же каналу, то либо каждый раз проверять клиент-сервер( не шифровать - шифровать), либо в бизнес логике шифровать...
аккаунты реалмов также решил хранить как обычные, только увеличить gmlevel до 5 и все таки вы шифруете избирательно или в бизнес логике? Да и есть ли разделение? мне, например, логичнее выделить отдельный порт и таким образом физически разделить сервера отдельно, клиенты отдельно. |
09.08.2011, 23:15 | #83 |
Гость
Сообщений: n/a
|
2mAdloVe
@SuppressWarnings("unused") можно добавить перед описанием класса |
10.08.2011, 00:31 | #84 |
Новичок
Регистрация: 24.03.2010
Сообщений: 23
Сказал(а) спасибо: 7
Поблагодарили 5 раз(а) в 4 сообщениях
|
to Minimajack: знаю, но тогда можно упустить лишнее т.к. будет отключено во всем классе
|
11.08.2011, 01:12 | #85 |
Гость
Сообщений: n/a
|
кто то пробовал использовать ленивую загрузку данных из БД?
прикрутил сервер, дошел до загрузки персонажа - нужны шаблоны итемов из БД. Добавил хранилище шаблонов итемов, при запуске загружаю все шаблоны, получаю тормоза при запуске и пожирание памяти на те данные, которые могут и не понадобиться - вывод? Либо использовать ленивую загрузку и при массовом реконнекте получать тормоза ( все же один запрос быстрее, чем туча мелких), либо оставить все как есть. |
11.08.2011, 02:36 | #86 | |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
старт моего WorldServer:
это снифы 1.х, заселенки нет, три тестовых моба. 61704к памяти сожрано. если ничего этого не грузить, то 40 с чем то мегабайт. вывод: шаблоны итемов, кричеров, геймобъектов... вон дохера всего - жрут примерно 20 мегабайт. сервер запустился ровно за 4 секунды. Цитата:
ленивая загрузки приведет к тому, что на каждый нерезолвенный объект надо лезть в базу. память все равно будет жрать в итоге. только получим тормоза, размазанные во времени. иными словами лаги, от которых все умные люди почему то стараются избавляться память сейчас стоит не то что копейки, а можно на сданные бутылки ее набрать и носовать в свой "сервер" по самое небалуйся. зачем ее ТАК экономить? |
|
11.08.2011, 10:23 | #87 |
Гость
Сообщений: n/a
|
|
11.08.2011, 11:06 | #88 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
ну я вижу что не пытаетесь сэкономить память - что то много 22 мегабайта под одни только шаблоны итемов. у меня 21 мегабайт под все шаблоны, включая листы тренеров/вендоров/квестов/лута.
и я не сравниваю несравнимое вроде. да еще и в неравных условиях. какие условия неравны? у меня тоже, знаете ли, не серверная платформа, и даже не офисный комп, а старенький четырехлетний ноутбук. по моему на скорость не стоит обращать внимание, конечно же в разумных пределах. разницу между 10ю и 30ю секундами я считаю разумным пределом. 5 минут конечно уже нет. но: 1. хоть память и дешевая, но какие то шаги к ее экономии все же предпринимать нужно. 2. в наших задачах важнее всего экономить процессор. вполне очевидно, что ему легче брать данные из кеша (загруженные все шаблоны в память), чем каждый раз лазить за ними куда то, не важно даже куда. лазить. я думаю так. |
11.08.2011, 11:50 | #89 |
Гость
Сообщений: n/a
|
537 Byte на все поля шаблона
в среднем 21 Byte на имя (SELECT AVG(CHARACTER_LENGTH(name)) FROM mangos.item_template) итого ~20Mb чистых - 2 метра overhead на HashMap Да понятно, что скорость загрузки не особо важна...просто пока делаешь мелкие опкоды, надоедает ждать рестарта для проверки. 1. согласен, принимаются разумные методы 2. уже не важно, вынес дополнительный параметр в конфиг и забыл. ззы порезал шаблон, экономия полтора метра Последний раз редактировалось Minimajack; 11.08.2011 в 12:34. |
11.08.2011, 12:58 | #90 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
как 21 байт??? откуда 21? почему не 20 или не 22?
ну ребята, ну так вы долго будете в песочницах сидеть и никогда не повзрослеете. место для данных должно выделяться динамически и ровно столько, сколько они занимают. зачем, например, для кричера 6 под имя выделять 21 байт, если достаточно 7? |
11.08.2011, 14:05 | #91 | |
Гость
Сообщений: n/a
|
Цитата:
Кстати в БД полная запись в среднем занимает по 2 Кб. Реальным данным выделяется столько сколько нужно. Просто так было проще подсчитать средний размер шаблона и потери на дополнительные расходы. я не знаю как проще объяснить Последний раз редактировалось Minimajack; 11.08.2011 в 14:11. |
|
Пользователь сказал cпасибо: | RomanRom2 (11.08.2011) |
16.08.2011, 14:19 | #92 |
Гость
Сообщений: n/a
|
|
16.08.2011, 15:58 | #93 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
на классике А9 достаточно
|
Пользователь сказал cпасибо: |
16.08.2011, 16:25 | #94 |
Гость
Сообщений: n/a
|
|
16.08.2011, 16:42 | #95 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
блин, я же сказал, А9 только нужен.
|
Пользователь сказал cпасибо: |
17.08.2011, 18:07 | #96 |
Гость
Сообщений: n/a
|
|
17.08.2011, 20:02 | #97 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
что то я не уловлю хода мысли. это запросы на имена плееров, которые и так онлайн и которых "увидел" клиент. что там еще кешировать, наблюдать, спамить и бдить?
Последний раз редактировалось RomanRom2; 17.08.2011 в 20:05. |
17.08.2011, 20:14 | #98 |
Гость
Сообщений: n/a
|
|
17.08.2011, 20:23 | #99 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
ну да, для начала надо только лишь авторизоваться с валидным аккаунтом, зайти в чарлист, создать себе что нибудь и войти в мир. хороший бот будет. мне нужен такой
|
17.08.2011, 20:31 | #100 |
Гость
Сообщений: n/a
|
|
17.08.2011, 20:36 | #101 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
нуу... это не совсем то что нужно. точнее даже совсем не то.
мне придется писать самому. половина уже написана - собственно вход в чарлист - эдакий прототип собственного клиента. |
17.08.2011, 20:43 | #102 | |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
|
|
17.08.2011, 20:46 | #103 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
|
17.08.2011, 21:37 | #104 | |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
скорее всего. этот опкод из разряда "межмаповых" запросов и обрабатывается на центральном компоненте реалма. у себя я называю его CharServer. и поскольку клиент с какого то момента, не помню точно с какого, уже в процессе загрузки начал "спрашивать" сервер о таких межмаповых блоках информации, то ничего удивительного.
Цитата:
тестировать сервер, эмулировать нагрузку. как мне еще сэмулировать на одном реалме 2000 леммингов, фармящих голд и куда то бегающих? я же не близзард, 2000 одновременно желающих потестировать сервак я врят ли наберу. на первых порах |
|
17.08.2011, 22:03 | #105 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
|
17.08.2011, 22:06 | #106 | |
Гость
Сообщений: n/a
|
У вас есть ограничение на опкод, в мангосе нет. Потому и возник вопрос собственно. Кеш или бан.
Имхо 1 опкод -> 1 запрос в БД уже плохо. Лучше на низком уровне ввести счетчик частых опкодов или таймаут, и банить акк за n-попыток. Цитата:
возможно провести статистику на работающем сервере; опкоды, запросы к БД и всем этим умноженным напрячь для теста... недавно наткнулся на TDD (нужда заставила), так вот отлично помогает. Фактически без клиента, есть возможность протестировать любой компонент системы на наборе тестовых данных. Возможно реально увеличить нагрузку на "сервер" без запуска клиента вов. |
|
17.08.2011, 23:14 | #107 | ||
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
Цитата:
Цитата:
впрочем до этого еще далеко... |
||
17.08.2011, 23:48 | #108 | |
Гость
Сообщений: n/a
|
именно о
Цитата:
"реальный бот" должен "передвигатся по карте"( не застревать, слать мовмент пакеты), кучковаться в группы( мовмент, аура, аура стак, мап апдайт ), использовать скилы - вот главный подвох... такое простой генерацией команд не получится сделать для 2000 клиентов. зы Разве что воспроизвести со снифов (движение, группы, спелы )...тогда и выдумывать ничего не надо (десяток рейдов, полтишок групп - зато все реально, можно собрать статистику....а если еще и нейросеть обучить на классы - сделать AI-like player Bot) ззы уж совсем отошли от темы, мечты-мечты |
|
18.08.2011, 02:43 | #109 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
не нужно никаких скиллов, спеллов, групп. он тупо должен бегать - читай слать мув-пакеты, а это уже нехилая нагрузка. и вступать в бой. генерировать дамаг_инфо с каким то значением. убивать моба. собирать лут. бежать к вендору продавать всё. фармить голд. всё. больше ничего не нужно. остается прописать несколько тропинок к скоплениям мобов в разных локациях. все это реализовывать просто, трудоемко, но просто.
от темы не отошли. мы обсуждаем фазу тестирования. |
19.08.2011, 12:40 | #110 |
Гость
Сообщений: n/a
|
|
19.08.2011, 13:38 | #111 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
|
19.08.2011, 14:18 | #112 |
Гость
Сообщений: n/a
|
наверное наоборот? Это у одинаковых типов - может быть разный HighGuid.
Код:
case HIGHGUID_UNIT: return TYPEID_UNIT; case HIGHGUID_PET: return TYPEID_UNIT; |
19.08.2011, 14:36 | #113 | |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
Цитата:
во первых это не TypeMask, а OBJECT_TYPE используется в базовом классе объекта. для юнита например: BaseObject.ObjectType:= TYPE_OBJECT + TYPE_UNIT; и передается в А9, который вы никак не хотите раскурить, все наскоками у вас как то с ним. во вторых, причем тут HIGHGUID? это совершенно отдельное поле в А9. вы путаете теплое с зеленым. в третьих, одна маленькая уточняющая деталь: я не делаю эмулятор. я делаю сервер это немного разные подходы |
|
Пользователь сказал cпасибо: |
19.08.2011, 14:55 | #114 |
Гость
Сообщений: n/a
|
1. к сожалению, написание корректной обработки А9 требует нормального формирования гуидов...а на вопрос такой натолкнулся, в связи с наличием как TypeID так и TypeMask, так вот TypeID - как OBJECT_TYPE используется согласен, внедрен в объекты.
А вот TypeMask то зачем? 2. А9 да...раскурить окончательно надо 3. исправлюсь ) согласен OBJECT_TYPE не соответствует HIGHGUID ( фактически только из-за TYPE_CONTAINER, TYPE_ITEM) но я про TypeMask поле в объектах Последний раз редактировалось Minimajack; 19.08.2011 в 15:04. |
19.08.2011, 15:05 | #115 | |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
Цитата:
еще раз - вы путаете мягкое с зеленым. TypeID это TypeID и используется он как TypeID и никак по другому. OBJECT_TYPE_ID у близзов это называется. OBJECT_TYPE это совершенно другое. OBJECT_TYPE_ID - обозначает код типа объекта, информация по которому будет передаваться далее в А9 OBJECT_TYPE - это свойство базового объекта в partial данных. в апдейтполях. раскурите уже А9 наконец. это фундаментальная основа, без нее вы ни сервер и его эмулятор не напишете. |
|
19.08.2011, 15:08 | #116 |
Гость
Сообщений: n/a
|
TYPE_OBJECT != 2 ^ ID_OBJECT ?
|
19.08.2011, 15:23 | #117 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
странный вопрос. вы же сами можете проверить это.
да, не равно. |
Пользователь сказал cпасибо: |
19.08.2011, 17:38 | #118 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Может мои глаза меня обманывают, но как раз получается, что равно.
Код:
enum TypeMask { TYPEMASK_OBJECT = 0x0001, // 1 << TYPEID_OBJECT, TYPEMASK_ITEM = 0x0002, // 1 << TYPEID_ITEM, TYPEMASK_CONTAINER = 0x0004, // 1 << TYPEID_CONTAINER, TYPEMASK_UNIT = 0x0008, // 1 << TYPEID_UNIT, TYPEMASK_PLAYER = 0x0010, // 1 << TYPEID_PLAYER TYPEMASK_GAMEOBJECT = 0x0020, // 1 << TYPEID_GAMEOBJECT TYPEMASK_DYNAMICOBJECT = 0x0040, // 1 << TYPEID_DYNAMICOBJECT TYPEMASK_CORPSE = 0x0080, // 1 << TYPEID_CORPSE }; |
19.08.2011, 18:44 | #119 |
Гость
Сообщений: n/a
|
у плеера получается другая маска TYPEMASK_PLAYER || TYPEMASK_UNIT
дальше не смотрел... |
19.08.2011, 19:04 | #120 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
ну так и получается у плеера
Код:
TYPEMASK_OBJECT | TYPEMASK_UNIT | TYPEMASK_PLAYER Код:
(1 << TYPEID_OBJECT) | (1 << TYPEID_UNIT) | (1 << TYPEID_PLAYER) Последний раз редактировалось zergtmn; 19.08.2011 в 20:04. |