Вопрос по клиенту it / c4

Maksim

Легендарный
Местный
Знаток Lineage2
Любитель реакций
Неукротимое пламя
Старожил I степени
Сообщения
920
Розыгрыши
0
Решения
6
Репутация
594
Реакции
795
Баллы
1 708
Всем доброго, интересует как перенести нпц из с4 в it клиент.

Например:
Сервер java с поддержкой клиента it мог заспавнить нпц из с4 только в клиенте it.

Что именно редактировать или перенести, с картами и текстурами понятно. Не думаю что заменой датников это можно решить. Вопрос только с нпц. ☕🙂
 
Всем доброго, интересует как перенести нпц из с4 в it клиент.

Например:
Сервер java с поддержкой клиента it мог заспавнить нпц из с4 только в клиенте it.

Что именно редактировать или перенести, с картами и текстурами понятно. Не думаю что заменой датников это можно решить. Вопрос только с нпц. ☕🙂
нуууу... Можно сделать по вумному наверное?
Сделать список из ДАТ файлов по НПС которые есть только в ИЛ и только в С4.
Дальше сравнить эти 2 файла и НПС, которые есть только в ИЛ, но нету в С4 - поискать идшники в С4 нпс с такой же текстурой.
После этого сделать список НПС которых нет в С4 и сделать рядышком что-то типо "DisplayId".
На сервере, при попытке запросить пакет NPC_INFO создаем 2 пакета - один для ИЛ другой для С4, при условии если НПСа нет в С4.
В ИЛ пакете просто отправляем и не придумываем себе проблем на голову, а вот для С4... Подставляем НПС ид на то, которое есть в С4 (display id выше) и если есть возможность указания npc string id в name и title - берем значения, которые указаны в сервере.

Если не похожехо НПСа, который есть на ИЛ но нету на С4 - тут нужно думать :)

Если по простому:
На ИЛ есть НПС 2, а на С4 НПС 2 нету.
На ИЛ у НПС 2 текстура npc.texture.abracadabra
На С4 у НПС 40 текстура npc.texture.abracadabra
Значит для С4 клиента отправляем НПС с ИД 40, а на ИЛ отправляем НПС с ИД 2.


UPD
Вот у нас как раз в пакете С4 и есть данные для записи:
writeString(_name);
writeString(_title);
Java:
    @Override
    public void write()
    {
        if ((_creature == null) || ((_creature instanceof Summon) && (((Summon) _creature).getOwner() != null) && ((Summon) _creature).getOwner().getAppearance().isInvisible()))
        {
            return;
        }
        
        ServerPackets.NPC_INFO.writeId(this);
        writeInt(_creature.getObjectId());
        writeInt(_displayId + 1000000); // npctype id
        writeInt(_isAttackable);
        writeInt(_x);
        writeInt(_y);
        writeInt(_z);
        writeInt(_heading);
        writeInt(0);
        writeInt(_mAtkSpd);
        writeInt(_pAtkSpd);
        writeInt(_runSpd);
        writeInt(_walkSpd);
        writeInt(_swimRunSpd/* 0x32 */); // swimspeed
        writeInt(_swimWalkSpd/* 0x32 */); // swimspeed
        writeInt(_flRunSpd);
        writeInt(_flWalkSpd);
        writeInt(_flyRunSpd);
        writeInt(_flyWalkSpd);
        writeDouble(1.1/* _activeChar.getProperMultiplier() */);
        // writeF(1/*_activeChar.getAttackSpeedMultiplier()*/);
        writeDouble(_pAtkSpd / 277.478340719);
        writeDouble(_collisionRadius);
        writeDouble(_collisionHeight);
        writeInt(_rhand); // right hand weapon
        writeInt(0);
        writeInt(_lhand); // left hand weapon
        writeByte(1); // name above char 1=true ... ??
        writeByte(_creature.isRunning());
        writeByte(_creature.isInCombat());
        writeByte(_creature.isAlikeDead());
        writeByte(_isSummoned ? 2 : 0); // invisible ?? 0=false 1=true 2=summoned (only works if model has a summon animation)
        writeString(_name);
        writeString(_title);
        if (_creature instanceof Summon)
        {
            writeInt(1); // Title color 0=client default
            writeInt(((Summon) _creature).getPvpFlag());
            writeInt(((Summon) _creature).getKarma());
        }
        else
        {
            writeInt(0);
            writeInt(0);
            writeInt(0);
        }
        writeInt(_creature.getAbnormalEffect()); // C2
        writeInt(_clanId); // C2
        writeInt(_clanCrest); // C2
        writeInt(_allyId); // C2
        writeInt(_allyCrest); // C2
        writeByte(0); // C2
        if (Config.CHAMPION_ENABLE)
        {
            writeByte(_creature.isChampion() ? Config.CHAMPION_AURA : 0);
        }
        else
        {
            writeByte(0); // C3 team circle 1-blue, 2-red
        }
        writeDouble(_collisionRadius);
        writeDouble(_collisionHeight);
        writeInt(0); // C4
    }
 
нуууу... Можно сделать по вумному наверное?
Сделать список из ДАТ файлов по НПС которые есть только в ИЛ и только в С4.
Дальше сравнить эти 2 файла и НПС, которые есть только в ИЛ, но нету в С4 - поискать идшники в С4 нпс с такой же текстурой.
После этого сделать список НПС которых нет в С4 и сделать рядышком что-то типо "DisplayId".
На сервере, при попытке запросить пакет NPC_INFO создаем 2 пакета - один для ИЛ другой для С4, при условии если НПСа нет в С4.
В ИЛ пакете просто отправляем и не придумываем себе проблем на голову, а вот для С4... Подставляем НПС ид на то, которое есть в С4 (display id выше) и если есть возможность указания npc string id в name и title - берем значения, которые указаны в сервере.

Если не похожехо НПСа, который есть на ИЛ но нету на С4 - тут нужно думать :)

Если по простому:
На ИЛ есть НПС 2, а на С4 НПС 2 нету.
На ИЛ у НПС 2 текстура npc.texture.abracadabra
На С4 у НПС 40 текстура npc.texture.abracadabra
Значит для С4 клиента отправляем НПС с ИД 40, а на ИЛ отправляем НПС с ИД 2.
Сам сервер это как пример для тестов, с его стороны просто поддержка клиента.
Со стороны клиента it, нужны только нпц c4 как они есть без изменений и без нпц с it.
В любом случае спасибо. 🙂
 
Назад
Сверху Снизу