Написание сервера для lineage 2 chronicle 1 на node.js

space2pacman

Постоялец
Местный
Сообщения
173
Розыгрыши
0
Репутация
202
Реакции
156
Баллы
1 008
Хроники
  1. Harbingers of War
Привет

Начал разработать сеоверную часть для первых хроник на node.js. Делаю для себя в качестве хобби. Есть ли тут разработчики, которые хотели бы в этом поучаствовать?

Готово:
login server, gameserver(можно бегать, пользоваться инвентарем, анимация скилов)

Планирую закончить в концу года.

Ссылка на репозиторий:

Если у вас есть знания javascript(node.js) то буду рад видеть вас в команде))
 
Последнее редактирование модератором:

Не нужно употреблять тяжелые котики) А то доходит до ноде.жс
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Лечиться? Школу лучше закончи и врать.
Ну почему же? На Node.js вполне реально написать. c1 весьма легкий и минимум функционала и к концу года вполне реально написать. Но это нужно сильно упороться, что бы на нем реализовывать
 
Необоснованные (без доказательств) обвинения
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Ну почему же? На Node.js вполне реально написать. c1 весьма легкий и минимум функционала и к концу года вполне реально написать. Но это нужно сильно упороться, что бы на нем реализовывать
Я знаю что реально. Я я про линку на гит. Школьник, а он школьник этого не напишет. Слил и выдаёт за своё.На счёт упороться в плане реализации. Ява будет курить в сторонке. Но если и делать что-то этакое то на го.
 
Я знаю что реально. Я я про линку на гит. Школьник, а он школьник этого не напишет. Слил и выдаёт за своё.На счёт упороться в плане реализации. Ява будет курить в сторонке. Но если и делать что-то этакое то на го.
Чиго? Жаба будет курить в сторонке? Мы за Node.js будет расплачиваться теперь не один десяток лет. Это каким нужно быть укуренным, что бы клиентский язык компилировать на стороне сервера. Помимо этого не 1н проект более 1к строк не напишут жсники без помощи npm и 20 пакетов и более минимум.
То что Go уделает жабу это и ежу понятно. Как и тот же .Net Core. Да и с текущей политикой жабы, где она выступает платной не имеет смысла. Просто ее плюсом было, что она кроссплатформенная в свое время. Сейчас границ почти нету и остались единицы. Майкрософт тому показатель который разрабатывает и под другие платформы свой софт. Просто людям нужно время для написания софта на новых платформах. Помимо этого ники коммитов и не только совпадают. С чего такое решение принято?
 
Лечиться? Школу лучше закончи и врать.
Вы не адекватен ?
Причём тут школа и вранье?

Я знаю что реально. Я я про линку на гит. Школьник, а он школьник этого не напишет. Слил и выдаёт за своё.На счёт упороться в плане реализации. Ява будет курить в сторонке. Но если и делать что-то этакое то на го.
Линк на гит?))) это мой аккаунт и Линк кривой в теме кривой

Github.com/lineage2js

Никогда бы не подумал что люди будут думать что я не свое скидываю))

Ну почему же? На Node.js вполне реально написать. c1 весьма легкий и минимум функционала и к концу года вполне реально написать. Но это нужно сильно упороться, что бы на нем реализовывать
Я понимаю что конкурировать с явой или си по производительности. Но я фанат javascript и ноды и решил писать на ней))

P. S. Тут реально думают что я скинул чей-то код а не свой?)
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Чиго? Жаба будет курить в сторонке? Мы за Node.js будет расплачиваться теперь не один десяток лет. Это каким нужно быть укуренным, что бы клиентский язык компилировать на стороне сервера. Помимо этого не 1н проект более 1к строк не напишут жсники без помощи npm и 20 пакетов и более минимум.
То что Go уделает жабу это и ежу понятно. Как и тот же .Net Core. Да и с текущей политикой жабы, где она выступает платной не имеет смысла. Просто ее плюсом было, что она кроссплатформенная в свое время. Сейчас границ почти нету и остались единицы. Майкрософт тому показатель который разрабатывает и под другие платформы свой софт. Просто людям нужно время для написания софта на новых платформах. Помимо этого ники коммитов и не только совпадают. С чего такое решение принято?
Игровых серверов я не писал конечно но для решения взял веб. Собственно в гугле можете найти сравнения джавы и нода.
Да и джава интерпретируется с помощью дополнительного JIT-компилятора, а V8 чисто компилируется
 

    Bremn0n

    Баллов: -1
    АПАСНА
Игровых серверов я не писал конечно но для решения взял веб. Собственно в гугле можете найти сравнения джавы и нода.
Да и джава интерпретируется с помощью дополнительного JIT-компилятора, а V8 чисто компилируется
Ты лучше напиши зачем ты начал с наезда что мол я школьник и эти не моё.

Обидно :(

Не нужно употреблять тяжелые котики) А то доходит до ноде.жс
Да ладно) я видел как-то на паскале сервер))

Чиго? Жаба будет курить в сторонке? Мы за Node.js будет расплачиваться теперь не один десяток лет. Это каким нужно быть укуренным, что бы клиентский язык компилировать на стороне сервера. Помимо этого не 1н проект более 1к строк не напишут жсники без помощи npm и 20 пакетов и более минимум.
То что Go уделает жабу это и ежу понятно. Как и тот же .Net Core. Да и с текущей политикой жабы, где она выступает платной не имеет смысла. Просто ее плюсом было, что она кроссплатформенная в свое время. Сейчас границ почти нету и остались единицы. Майкрософт тому показатель который разрабатывает и под другие платформы свой софт. Просто людям нужно время для написания софта на новых платформах. Помимо этого ники коммитов и не только совпадают. С чего такое решение принято?
Соглашусь про npm но у меня лишь один пакет lowdb. (да да база данных на файлах =)) и больше не Планируется.
 
Соглашусь про npm но у меня лишь один пакет lowdb. (да да база данных на файлах :) и больше не Планируется.
А я забыл у ноде.жс еще нет нормальных ORM и не только и есть кривые попытки работы с бд). Но бд нужна и данных будет много так что стоит рассматривать. Если новый проект, то я рассмотрел бы например Postgress для нового проекта
 
Ну почему же? На Node.js вполне реально написать. c1 весьма легкий и минимум функционала и к концу года вполне реально написать. Но это нужно сильно упороться, что бы на нем реализовывать
Я думал что разработка затянется на год-два но когда сделал базовую архитектуру, обработку базовых пакетов, создание вещей и т.д. Понял что все будет быстрее. Две вещи, на которых я могу встрять это Ai для мобов и геодата.

А я забыл у ноде.жс еще нет нормальных ORM и не только и есть кривые попытки работы с бд). Но бд нужна и данных будет много так что стоит рассматривать. Если новый проект, то я рассмотрел бы например Postgress для нового проекта
В будущем будет либо sql либо монга. От нагрузки зависит.
 
Я думал что разработка затянется на год-два но когда сделал базовую архитектуру, обработку базовых пакетов, создание вещей и т.д. Понял что все будет быстрее. Две вещи, на которых я могу встрять это Ai для мобов и геодата.
Там все завязано на геодате с мувингом. Самая основная проблема, а на нем уже все остальное завязано. Да и разбор наска есть в том же js и не 1 скрипт и пакет для него.
 
Там все завязано на геодате с мувингом. Самая основная проблема, а на нем уже все остальное завязано. Да и разбор наска есть в том же js и не 1 скрипт и пакет для него.
Я вообще планировал остановится после enterWorld и movebackwardlocation но че-то все прёт и прет)

Там все завязано на геодате с мувингом. Самая основная проблема, а на нем уже все остальное завязано. Да и разбор наска есть в том же js и не 1 скрипт и пакет для него.
Будешь учавствовать?))

Там все завязано на геодате с мувингом. Самая основная проблема, а на нем уже все остальное завязано. Да и разбор наска есть в том же js и не 1 скрипт и пакет для него.
Тему редактировать нельзя ?

Можно ли добавить туда скриншотов ?)

2019-08-21_01-22-54.png 2019-08-20_12-42-17.png 2019-08-10_18-49-12.png
 
Любая идея имеет право на жизнь особенно если вам это нравится, продолжайте в том же духе!! :Banzai:
Не самая оптимальная реализация но компактная =р

JavaScript:
function encode(buffer) {
    if (buffer.length % 4 !== 0) {
        throw new Error('XOR: invalid buffer size');
    }

    const buf = Buffer.allocUnsafe(buffer.length);
    buffer.copy(buf);

    let edx = 0;
    let ecx = 0;
    for (let i = 0; i < buf.length; i += 4) {
        edx = buf.readInt32LE(i);
        ecx += edx;
        edx ^= ecx;
        buf.writeInt32LE(edx, i);
    }

    return {
        buffer: buf,
        key: ecx
    };
}

module.exports = { encode };

JavaScript:
const crypto = require('crypto');

const KEY = Buffer.from([0x6B, 0x60, 0xCB, 0x5B, 0x82, 0xCE, 0x90, 0xB1, 0xCC, 0x2B, 0x6C, 0x55, 0x6C, 0x6C, 0x6C, 0x6C]);

function bufferBEToLE(buffer) {
    for (let i = 0; i < buffer.length; i += 4) {
        buffer.writeInt32BE(buffer.readInt32LE(i), i);
    }
    return buffer;
}

function bufferLEToBE(buffer) {
    for (let i = 0; i < buffer.length; i += 4) {
        buffer.writeInt32LE(buffer.readInt32BE(i), i);
    }
    return buffer;
}

function encode(buffer) {
    if (buffer.length % 8 !== 0) {
        throw new Error('BlowFish: invalid buffer size');
    }

    const buf = Buffer.allocUnsafe(buffer.length);
    buffer.copy(buf);

    bufferBEToLE(buf);

    const cipher = crypto.createCipheriv('bf-ecb', KEY, '');
    cipher.setAutoPadding(false);
    const encrypted = Buffer.from(cipher.update(buf, 'buffer', 'binary') + cipher.final('binary'), 'binary');

    bufferLEToBE(encrypted);
    return encrypted;
}

function decode(buffer) {
    if (buffer.length % 8 !== 0) {
        throw new Error('BlowFish: invalid buffer size');
    }

    const buf = Buffer.allocUnsafe(buffer.length);
    buffer.copy(buf);

    bufferBEToLE(buf);

    const cipher = crypto.createDecipheriv('bf-ecb', KEY, '');
    cipher.setAutoPadding(false);
    const decrypted = Buffer.from(cipher.update(buf, 'buffer', 'binary') + cipher.final('binary'), 'binary');

    bufferLEToBE(decrypted);
    return decrypted;
}

module.exports = { encode, decode, KEY };
 
Любая идея имеет право на жизнь особенно если вам это нравится, продолжайте в том же духе!! :Banzai:
Не самая оптимальная реализация но компактная =р

JavaScript:
function encode(buffer) {
    if (buffer.length % 4 !== 0) {
        throw new Error('XOR: invalid buffer size');
    }

    const buf = Buffer.allocUnsafe(buffer.length);
    buffer.copy(buf);

    let edx = 0;
    let ecx = 0;
    for (let i = 0; i < buf.length; i += 4) {
        edx = buf.readInt32LE(i);
        ecx += edx;
        edx ^= ecx;
        buf.writeInt32LE(edx, i);
    }

    return {
        buffer: buf,
        key: ecx
    };
}

module.exports = { encode };

JavaScript:
const crypto = require('crypto');

const KEY = Buffer.from([0x6B, 0x60, 0xCB, 0x5B, 0x82, 0xCE, 0x90, 0xB1, 0xCC, 0x2B, 0x6C, 0x55, 0x6C, 0x6C, 0x6C, 0x6C]);

function bufferBEToLE(buffer) {
    for (let i = 0; i < buffer.length; i += 4) {
        buffer.writeInt32BE(buffer.readInt32LE(i), i);
    }
    return buffer;
}

function bufferLEToBE(buffer) {
    for (let i = 0; i < buffer.length; i += 4) {
        buffer.writeInt32LE(buffer.readInt32BE(i), i);
    }
    return buffer;
}

function encode(buffer) {
    if (buffer.length % 8 !== 0) {
        throw new Error('BlowFish: invalid buffer size');
    }

    const buf = Buffer.allocUnsafe(buffer.length);
    buffer.copy(buf);

    bufferBEToLE(buf);

    const cipher = crypto.createCipheriv('bf-ecb', KEY, '');
    cipher.setAutoPadding(false);
    const encrypted = Buffer.from(cipher.update(buf, 'buffer', 'binary') + cipher.final('binary'), 'binary');

    bufferLEToBE(encrypted);
    return encrypted;
}

function decode(buffer) {
    if (buffer.length % 8 !== 0) {
        throw new Error('BlowFish: invalid buffer size');
    }

    const buf = Buffer.allocUnsafe(buffer.length);
    buffer.copy(buf);

    bufferBEToLE(buf);

    const cipher = crypto.createDecipheriv('bf-ecb', KEY, '');
    cipher.setAutoPadding(false);
    const decrypted = Buffer.from(cipher.update(buf, 'buffer', 'binary') + cipher.final('binary'), 'binary');

    bufferLEToBE(decrypted);
    return decrypted;
}

module.exports = { encode, decode, KEY };
Спасибо) вот такое мотивирует ещё больше))

Кстати касаемо класса Buffer. Я на один день выпал из-за ссылок

Мне нужно было скопировать ключ ведь один на шифрование а другой не дешифрование и я использовал js'овский метод slice, который без аргументов должен копировать массив но не в случае с Buffer. Он копируется он при этом передаётся ссылка на оригинал. В итоге из-за непонимание я работал с одним ключем вместо двух. Как правильно скопировать массив байт (Buffer)?

На этом проекте я поймал, крутой для себя, баг.

Шифрование на сервере через XOR. Ключ динамический. После каждого шифрования/дешифрирования ключ меняется.

Клиент зашифровал(ключ поменял) -> отправил -> сервер расшифровал( ключ поменял)

Но иногда сервер расшифровывал криво пакет и сервер падал или отправлял рандомный пакет(в чат что-то напишет или сумку откроет). В худшем случае сервер падал

Оказывается сервер не успевал менять ключ.

Клиент зашифровал(ключ поменял) -> отправил -> сервер расшифровывает ( ключ ЕЩЕ НЕ ПОМЕНЯЛ )
Клиент зашифровал новый пакет (ключ поменял) -> отправил -> сервер расшифровывает СТАРЫМ КЛЮЧЕМ

тут то и наступают сюрпризы.

Пока решение следующие: создать очередь куда будут помешаться пакеты и по мере надобности дешифроваться.
 
Годно, держи звезду.
На ноду не советовал бы тратить время, но если уж нравится, что поделаешь :)
 
забавно наблюдать, как человек просто делится своим хобби,ничего не прося взамен
а его называют школьником и поясняют за какую-то юзлесс инфу,в которой дай бог есть понимании терминов

эх...
 
Нужно было подтянуть знания JS и непришло ничего веселее чем попробовать его в бою, в итоге всеравно переключился на другой проект и забил :)
Немого критики: Я не знаток JS и редомендаций толковых точно не да но что то в вашем стили видно явное наследие от Java эмулятора и как показывает практика так лучше не делать :)
 

Вложения

  • l2js.7z
    4,8 КБ · Просмотры: 29
Нужно было подтянуть знания JS и непришло ничего веселее чем попробовать его в бою, в итоге всеравно переключился на другой проект и забил :)
Немого критики: Я не знаток JS и редомендаций толковых точно не да но что то в вашем стили видно явное наследие от Java эмулятора и как показывает практика так лучше не делать :)
Подскажите где прослеживается наследие?) Тут схема проста. Нужен TCP сервер, который слушает пакеты от отправляет клиенту ответы. И из этого мне кажется как не делай все равно будет похоже на то, что уже есть )

Я не знаток явы не знаю есть ли там прототипы и цепочка прототипов но мне это помогло не делать файлы(классы) подобные L2Armor, L2Weapon для создания экземпляра с геттером/сеттером по типу getWeaponPower/setWeaponPower, getArmorDef/setArmorDef и т.д.

Так же я упростил получение информации о вещах на персонаже. Вместо многих файлов, классов и непонятных свойств по типу PAPPERDOLL_HEAD (Голова бумажной куклы?) я храню все состояние и информацию в одном объекте player.

P.S. посмотрел вложение. Очень хороший проект)
 
Назад
Сверху Снизу