Перейти к содержанию
Авторизация  
GUSTAVO

Внешний вид шмоток и пушек

Рекомендуемые сообщения

Приветствую форумчан ! Подскажите как реализовать костюмизацию (менять внешний вид шмота и пух)? сборка l2j high five , искал на просторах инэта и нашел только что нужно смотреть в сторону CharInfo.java и UserInfo.java , открыл эти классы, посмотрел и чего то не лезет в голову как правильно подменять пакет с визулкой шмота и пух и где он там вообще. Пробывал по специальному эффекту смотреть, не понятно, но вроде связанно как то с теми классами. Может есть у кого примеры на l2j ? кто подскажет и может быть поделится примерами?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, GUSTAVO сказал:

Приветствую форумчан ! Подскажите как реализовать костюмизацию (менять внешний вид шмота и пух)? сборка l2j high five , искал на просторах инэта и нашел только что нужно смотреть в сторону CharInfo.java и UserInfo.java , открыл эти классы, посмотрел и чего то не лезет в голову как правильно подменять пакет с визулкой шмота и пух и где он там вообще. Пробывал по специальному эффекту смотреть, не понятно, но вроде связанно как то с теми классами. Может есть у кого примеры на l2j ? кто подскажет и может быть поделится примерами?

В этих пакетах присутствуют id одетых видимых вещей (шмот, пуха), не составляет никакого труда просто заменить их на нужные.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Falkland сказал:

В этих пакетах присутствуют id одетых видимых вещей (шмот, пуха), не составляет никакого труда просто заменить их на нужные.

оба класса нужно редактировать? или одного достаточно? в обеих классах нашел строки:

тык  

for (int slot : getPaperdollOrder())
        {
            writeD(_activeChar.getInventory().getPaperdollObjectId(slot));
        }
        
        for (int slot : getPaperdollOrder())
        {
            writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
        }

Hide  

в классе UserInfo.java нашел

writeD(_activeChar.getActiveWeaponItem() != null ? 40 : 20); // 20 no weapon, 40 weapon equipped

как понял это пушка

Можете пояснить что за что отвечает? в спойлере

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
13 минут назад, GUSTAVO сказал:

оба класса нужно редактировать? или одного достаточно? в обеих классах нашел строки:

тык

for (int slot : getPaperdollOrder())
        {
            writeD(_activeChar.getInventory().getPaperdollObjectId(slot));
        }
        
        for (int slot : getPaperdollOrder())
        {
            writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
        }

Скрыть

в классе UserInfo.java нашел

writeD(_activeChar.getActiveWeaponItem() != null ? 40 : 20); // 20 no weapon, 40 weapon equipped

как понял это пушка

Можете пояснить что за что отвечает? в спойлере

CharInfo.java раздается окружающим, а и UserInfo.java лично персонажу. Тут уже смотри, кто у тебя должен видеть измененный вид шмота.

Под спойлером у вас цикл, который проходит по всем слотам персонажа и вставляет в пакет (методом writeD()) ид итемов из этих слотов. Конкретно само перечисление слотов ищите в методе getPaperdollOrder(). А потом под каждый нужный слот просто подменяйте значение в этом цикле.

Изменено пользователем Falkland
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
37 минут назад, Falkland сказал:

CharInfo.java раздается окружающим, а и UserInfo.java лично персонажу. Тут уже смотри, кто у тебя должен видеть измененный вид шмота.

Под спойлером у вас цикл, который проходит по всем слотам персонажа и вставляет в пакет (методом writeD()) ид итемов из этих слотов. Конкретно само перечисление слотов ищите в методе getPaperdollOrder(). А потом под каждый нужный слот просто подменяйте значение в этом цикле.

И как лучше сделать? Допустим через кб будет добавляться id визуальной перчатки в БД. Нужно сделать новый метод на подобие getPaperdollOrder и в него добавлять условия, если в БД есть значение на перчатки то ставить id из БД, если на ботинках нет значения, тогда добавляем стандартные и тд.. ?

Вот стандартные методы:

PAPERDOLL_ORDER  

private static final int[] PAPERDOLL_ORDER = new int[]
    {
        Inventory.PAPERDOLL_UNDER,
        Inventory.PAPERDOLL_HEAD,
        Inventory.PAPERDOLL_RHAND,
        Inventory.PAPERDOLL_LHAND,
        Inventory.PAPERDOLL_GLOVES,
        Inventory.PAPERDOLL_CHEST,
        Inventory.PAPERDOLL_LEGS,
        Inventory.PAPERDOLL_FEET,
        Inventory.PAPERDOLL_CLOAK,
        Inventory.PAPERDOLL_RHAND,
        Inventory.PAPERDOLL_HAIR,
        Inventory.PAPERDOLL_HAIR2,
        Inventory.PAPERDOLL_RBRACELET,
        Inventory.PAPERDOLL_LBRACELET,
        Inventory.PAPERDOLL_DECO1,
        Inventory.PAPERDOLL_DECO2,
        Inventory.PAPERDOLL_DECO3,
        Inventory.PAPERDOLL_DECO4,
        Inventory.PAPERDOLL_DECO5,
        Inventory.PAPERDOLL_DECO6,
        Inventory.PAPERDOLL_BELT
    };

Hide  

и такой

getPaperdollOrder  

protected int[] getPaperdollOrder()
    {
        return PAPERDOLL_ORDER;
    }

Hide  

Менять нужно только первое?

Например на такое?

измененный  

private static final int[] PAPERDOLL_ORDER = new int[]
    {
        Inventory.PAPERDOLL_UNDER,
        Inventory.PAPERDOLL_HEAD,

if (есть значение в БД)

{

id из БД

} else {
        Inventory.PAPERDOLL_RHAND,

}

if (есть значение в БД)

{

id из БД

} else {

        Inventory.PAPERDOLL_LHAND,

}

if (есть значение в БД)

{

id из БД

} else {

        Inventory.PAPERDOLL_GLOVES,

}

if (есть значение в БД)

{

id из БД

} else {

        Inventory.PAPERDOLL_CHEST,

}

if (есть значение в БД)

{

id из БД

} else {

        Inventory.PAPERDOLL_LEGS,

}

if (есть значение в БД)

{

id из БД

} else {

        Inventory.PAPERDOLL_FEET,

}
        Inventory.PAPERDOLL_CLOAK,
        Inventory.PAPERDOLL_RHAND,
        Inventory.PAPERDOLL_HAIR,
        Inventory.PAPERDOLL_HAIR2,
        Inventory.PAPERDOLL_RBRACELET,
        Inventory.PAPERDOLL_LBRACELET,
        Inventory.PAPERDOLL_DECO1,
        Inventory.PAPERDOLL_DECO2,
        Inventory.PAPERDOLL_DECO3,
        Inventory.PAPERDOLL_DECO4,
        Inventory.PAPERDOLL_DECO5,
        Inventory.PAPERDOLL_DECO6,
        Inventory.PAPERDOLL_BELT
    };

Hide  

Так будет правильно?

Или я что то попутал сейчас и id он ищет в том цикле?

 

В цикле вроде он id перечисляет так: _activeChar.getInventory().getPaperdollItemDisplayId(slot) где slot - (int slot : getPaperdollOrder())

Так я выше получается не правильно написал в спойлере и id мне надо выставлять в методе getPaperdollItemDisplayId ??

Изменено пользователем GUSTAVO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
12 минут назад, GUSTAVO сказал:

И как лучше сделать? Допустим через кб будет добавляться id визуальной перчатки в БД. Нужно сделать новый метод на подобие getPaperdollOrder и в него добавлять условия, если в БД есть значение на перчатки то ставить id из БД, если на ботинках нет значения, тогда добавляем стандартные и тд.. ?

Вот стандартные методы:

PAPERDOLL_ORDER

private static final int[] PAPERDOLL_ORDER = new int[]
    {
        Inventory.PAPERDOLL_UNDER,
        Inventory.PAPERDOLL_HEAD,
        Inventory.PAPERDOLL_RHAND,
        Inventory.PAPERDOLL_LHAND,
        Inventory.PAPERDOLL_GLOVES,
        Inventory.PAPERDOLL_CHEST,
        Inventory.PAPERDOLL_LEGS,
        Inventory.PAPERDOLL_FEET,
        Inventory.PAPERDOLL_CLOAK,
        Inventory.PAPERDOLL_RHAND,
        Inventory.PAPERDOLL_HAIR,
        Inventory.PAPERDOLL_HAIR2,
        Inventory.PAPERDOLL_RBRACELET,
        Inventory.PAPERDOLL_LBRACELET,
        Inventory.PAPERDOLL_DECO1,
        Inventory.PAPERDOLL_DECO2,
        Inventory.PAPERDOLL_DECO3,
        Inventory.PAPERDOLL_DECO4,
        Inventory.PAPERDOLL_DECO5,
        Inventory.PAPERDOLL_DECO6,
        Inventory.PAPERDOLL_BELT
    };

Скрыть

и такой

getPaperdollOrder

protected int[] getPaperdollOrder()
    {
        return PAPERDOLL_ORDER;
    }

Скрыть

Менять нужно только первое?

Например на такое?

измененный

private static final int[] PAPERDOLL_ORDER = new int[]
    {
        Inventory.PAPERDOLL_UNDER,
        Inventory.PAPERDOLL_HEAD,

if (есть значение в БД)

{

id из БД

} else {
        Inventory.PAPERDOLL_RHAND,

}

if (есть значение в БД)

{

id из БД

} else {

        Inventory.PAPERDOLL_LHAND,

}

if (есть значение в БД)

{

id из БД

} else {

        Inventory.PAPERDOLL_GLOVES,

}

if (есть значение в БД)

{

id из БД

} else {

        Inventory.PAPERDOLL_CHEST,

}

if (есть значение в БД)

{

id из БД

} else {

        Inventory.PAPERDOLL_LEGS,

}

if (есть значение в БД)

{

id из БД

} else {

        Inventory.PAPERDOLL_FEET,

}
        Inventory.PAPERDOLL_CLOAK,
        Inventory.PAPERDOLL_RHAND,
        Inventory.PAPERDOLL_HAIR,
        Inventory.PAPERDOLL_HAIR2,
        Inventory.PAPERDOLL_RBRACELET,
        Inventory.PAPERDOLL_LBRACELET,
        Inventory.PAPERDOLL_DECO1,
        Inventory.PAPERDOLL_DECO2,
        Inventory.PAPERDOLL_DECO3,
        Inventory.PAPERDOLL_DECO4,
        Inventory.PAPERDOLL_DECO5,
        Inventory.PAPERDOLL_DECO6,
        Inventory.PAPERDOLL_BELT
    };

Скрыть

Так будет правильно?

Или я что то попутал сейчас и id он ищет в том цикле?

 

В цикле вроде он id перечисляет так: _activeChar.getInventory().getPaperdollItemDisplayId(slot) где slot - (int slot : getPaperdollOrder())

Так я выше получается не правильно написал в спойлере и id мне надо выставлять в методе getPaperdollItemDisplayId ??

Нет, нужно в цикле (который в пакете) делать проверку на нужный вам слот, и вставлять в него ваш ИД итема:

if(slot ==  Inventory.PAPERDOLL_GLOVES){
 	writeD(ИД_ИТЕМА_ИЗ_БД); 
}
else{
 	writeD(_activeChar.getInventory().getPaperdollObjectId(slot)); 
}

PAPERDOLL_ORDER трогать не нужно, он всего лишь содержит в себе перечисление всех возможных слотов.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, Falkland сказал:

Нет, нужно в цикле (который в пакете) делать проверку на нужный вам слот, и вставлять в него ваш ИД итема:


if(slot ==  Inventory.PAPERDOLL_GLOVES){
 	writeD(ИД_ИТЕМА_ИЗ_БД); 
}
else{
 	writeD(_activeChar.getInventory().getPaperdollObjectId(slot)); 
}

PAPERDOLL_ORDER трогать не нужно, он всего лишь содержит в себе перечисление всех возможных слотов.



    public int getItemIdForPackets() {
        return _visualId > 0 ? _visualId : itemId;
    }

Или сделать что-то вроде такого метода в итемах и юзать его для отсылки в пакеты CharInfo UserInfo

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, Falkland сказал:

Нет, нужно в цикле (который в пакете) делать проверку на нужный вам слот, и вставлять в него ваш ИД итема:


if(slot ==  Inventory.PAPERDOLL_GLOVES){
 	writeD(ИД_ИТЕМА_ИЗ_БД); 
}
else{
 	writeD(_activeChar.getInventory().getPaperdollObjectId(slot)); 
}

PAPERDOLL_ORDER трогать не нужно, он всего лишь содержит в себе перечисление всех возможных слотов.

Условие не понял: slot == Inventory.PAPERDOLL_GLOVES

if(slot ==  Inventory.PAPERDOLL_GLOVES && в БД используется визуально другая перчатка){
 	writeD(ИД_ИТЕМА_ИЗ_БД); 
}
else{
 	writeD(_activeChar.getInventory().getPaperdollObjectId(slot));
}

Так получается надо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, JunkyFunky сказал:


    public int getItemIdForPackets() {
        return _visualId > 0 ? _visualId : itemId;
    }

Или сделать что-то вроде такого метода в итемах и юзать его для отсылки в пакеты CharInfo UserInfo

Я тут голову уже забил первым вариантом и думаю его и надо как то доделать)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, GUSTAVO сказал:

Я тут голову уже забил первым вариантом и думаю его и надо как то доделать)

А что за сборка то?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, JunkyFunky сказал:

А что за сборка то?)

Лыжа) писал в первом посте l2j high five) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 минут назад, GUSTAVO сказал:

Условие не понял: slot == Inventory.PAPERDOLL_GLOVES


if(slot ==  Inventory.PAPERDOLL_GLOVES && в БД используется визуально другая перчатка){
 	writeD(ИД_ИТЕМА_ИЗ_БД); 
}
else{
 	writeD(_activeChar.getInventory().getPaperdollObjectId(slot));
}

Так получается надо?

if(slot == Inventory.PAPERDOLL_GLOVES) - это проверка на то, что на данной итерации цикла именно перчатка. а уже во writeD(ИД_ИТЕМА_ИЗ_БД); записывайте свой ид перчатки.

Так же нужно поступить и с остальными слотами, добавив дополнительные if, либо заменив на switch.

А уже потом можно выносить эту логику в отдельные методы (когда заработает).

Изменено пользователем Falkland
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 минут назад, Falkland сказал:

if(slot == Inventory.PAPERDOLL_GLOVES) - это проверка на то, что на данной итерации цикла именно перчатка. а уже во writeD(ИД_ИТЕМА_ИЗ_БД); записывайте свой ид перчатки.

А т.е. над этим условием надо делать еще условие на то что вообще есть в бд id другой перчатки или нет?

пример  

for (int slot : getPaperdollOrder())
        {

                if (ячейка в бд имеет id перчатки)

                       {

                                if(slot == Inventory.PAPERDOLL_GLOVES)

                                         {

                                                     writeD(ИД_ИТЕМА_ИЗ_БД);

                                         } else {

                                               writeD(_activeChar.getInventory().getPaperdollObjectId(slot));

                                         }

                       
                     } else {

                    writeD(_activeChar.getInventory().getPaperdollObjectId(slot));

                 }

     }

Hide  

так делать?

Изменено пользователем GUSTAVO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 минут назад, GUSTAVO сказал:

А т.е. над этим условием надо делать еще условие на то что вообще есть в бд id другой перчатки или нет?

пример

for (int slot : getPaperdollOrder())
        {

                if (ячейка в бд имеет id перчатки)

                       {

                                if(slot == Inventory.PAPERDOLL_GLOVES)

                                         {

                                                     writeD(ИД_ИТЕМА_ИЗ_БД);

                                         } else {

                                               writeD(_activeChar.getInventory().getPaperdollObjectId(slot));

                                         }


                     }

     }

Скрыть

так делать?

Не так понял ваш предыдущий вариант, да, он верный. Должно выйти что-то вроде такого:

if(slot ==  Inventory.PAPERDOLL_GLOVES && _activeChar.hasVisual(Inventory.PAPERDOLL_GLOVES)){
 	writeD(_activeChar.visualId(Inventory.PAPERDOLL_GLOVES)); 
}
else if(slot ==  Inventory.PAPERDOLL_BOOTS && _activeChar.hasVisual(Inventory.PAPERDOLL_BOOTS)){
 	writeD(_activeChar.visualId(Inventory.PAPERDOLL_BOOTS)); 
}
else{
 	writeD(_activeChar.getInventory().getPaperdollObjectId(slot));
}

(Это конечно можно еще параметризировать (и нужно), чтобы избавиться от громоздкости.)

В PcInstance (вроде так называется Player в лыже) сделать метод visualId(ид слота), который возвращает подмененный ид итема. hasVisual(ид слота) - тоже самое, только если ид итема не пуст, то возвращает true.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, GUSTAVO сказал:

Лыжа) писал в первом посте l2j high five) 

Скачал последнюю с репо лыжу, вижу там 


	public int getPaperdollItemDisplayId(int slot)
	{
		final L2ItemInstance item = _paperdoll[slot];
		return (item != null) ? item.getDisplayId() : 0;
	}

метод который собственно и используется в UserInfo CharInfo, в итоге L2ItemInstance чуток редактируем


	public int getDisplayId()
	{
		return isVisualisedItem() ? _visualId : getItem().getDisplayId();
	}

isVisualisedItem() вернёт true при _visualId > 0 

и собственно вот оно



	private int _visualId;

	public int getVisualId() {
		return _visualId;
	}

	public void setVisualId(int _visualId) {
		this._visualId = _visualId;
	}

	public boolean isVisualisedItem() {
		return getVisualId() > 0;
	}

setVisualId(int) установит на итем то чем он должен выглядеть.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
8 часов назад, Falkland сказал:

Не так понял ваш предыдущий вариант, да, он верный. Должно выйти что-то вроде такого:


if(slot ==  Inventory.PAPERDOLL_GLOVES && _activeChar.hasVisual(Inventory.PAPERDOLL_GLOVES)){
 	writeD(_activeChar.visualId(Inventory.PAPERDOLL_GLOVES)); 
}
else if(slot ==  Inventory.PAPERDOLL_BOOTS && _activeChar.hasVisual(Inventory.PAPERDOLL_BOOTS)){
 	writeD(_activeChar.visualId(Inventory.PAPERDOLL_BOOTS)); 
}
else{
 	writeD(_activeChar.getInventory().getPaperdollObjectId(slot));
}

(Это конечно можно еще парамет

 

7 часов назад, JunkyFunky сказал:

Скачал последнюю с репо лыжу, вижу там 




	public int getPaperdollItemDisplayId(int slot)
	{
		final L2ItemInstance item = _paperdoll[slot];
		return (item != null) ? item.getDisplayId() : 0;
	}

метод который собственно и используется в UserInfo CharInfo, в итоге L2ItemInstance чуток редактируем




	public int getDisplayId()
	{
		return isVisualisedItem() ? _visualId : getItem().getDisplayId();
	}

isVisualisedItem() вернёт true при _visualId > 0 

и собственно вот оно





	private int _visualId;

	public int getVisualId() {
		return _visualId;
	}

	public void setVisualId(int _visualId) {
		this._visualId = _visualId;
	}

	public boolean isVisualisedItem() {
		return getVisualId() > 0;
	}

setVisualId(int) установит на итем то чем он должен выглядеть.

ризировать (и нужно), чтобы избавиться от громоздкости.)

В PcInstance (вроде так называется Player в лыже) сделать метод visualId(ид слота), который возвращает подмененный ид итема. hasVisual(ид слота) - тоже самое, только если ид итема не пуст, то возвращает true.

Спасибо за помощь!! Сегодня дома буду пробывать, отпишу сюда отчет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...