GUSTAVO 11 Опубликовано 15 декабря, 2017 Приветствую форумчан ! Подскажите как реализовать костюмизацию (менять внешний вид шмота и пух)? сборка l2j high five , искал на просторах инэта и нашел только что нужно смотреть в сторону CharInfo.java и UserInfo.java , открыл эти классы, посмотрел и чего то не лезет в голову как правильно подменять пакет с визулкой шмота и пух и где он там вообще. Пробывал по специальному эффекту смотреть, не понятно, но вроде связанно как то с теми классами. Может есть у кого примеры на l2j ? кто подскажет и может быть поделится примерами? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Falkland 51 Опубликовано 15 декабря, 2017 1 час назад, GUSTAVO сказал: Приветствую форумчан ! Подскажите как реализовать костюмизацию (менять внешний вид шмота и пух)? сборка l2j high five , искал на просторах инэта и нашел только что нужно смотреть в сторону CharInfo.java и UserInfo.java , открыл эти классы, посмотрел и чего то не лезет в голову как правильно подменять пакет с визулкой шмота и пух и где он там вообще. Пробывал по специальному эффекту смотреть, не понятно, но вроде связанно как то с теми классами. Может есть у кого примеры на l2j ? кто подскажет и может быть поделится примерами? В этих пакетах присутствуют id одетых видимых вещей (шмот, пуха), не составляет никакого труда просто заменить их на нужные. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GUSTAVO 11 Опубликовано 15 декабря, 2017 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 как понял это пушка Можете пояснить что за что отвечает? в спойлере Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Falkland 51 Опубликовано 15 декабря, 2017 (изменено) 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(). А потом под каждый нужный слот просто подменяйте значение в этом цикле. Изменено 15 декабря, 2017 пользователем Falkland 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GUSTAVO 11 Опубликовано 15 декабря, 2017 (изменено) 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 ?? Изменено 15 декабря, 2017 пользователем GUSTAVO Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Falkland 51 Опубликовано 15 декабря, 2017 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 трогать не нужно, он всего лишь содержит в себе перечисление всех возможных слотов. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
JunkyFunky 127 Опубликовано 15 декабря, 2017 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 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GUSTAVO 11 Опубликовано 15 декабря, 2017 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)); } Так получается надо? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GUSTAVO 11 Опубликовано 15 декабря, 2017 3 минуты назад, JunkyFunky сказал: public int getItemIdForPackets() { return _visualId > 0 ? _visualId : itemId; } Или сделать что-то вроде такого метода в итемах и юзать его для отсылки в пакеты CharInfo UserInfo Я тут голову уже забил первым вариантом и думаю его и надо как то доделать) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
JunkyFunky 127 Опубликовано 15 декабря, 2017 Только что, GUSTAVO сказал: Я тут голову уже забил первым вариантом и думаю его и надо как то доделать) А что за сборка то?) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GUSTAVO 11 Опубликовано 15 декабря, 2017 1 минуту назад, JunkyFunky сказал: А что за сборка то?) Лыжа) писал в первом посте l2j high five) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Falkland 51 Опубликовано 15 декабря, 2017 (изменено) 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. А уже потом можно выносить эту логику в отдельные методы (когда заработает). Изменено 15 декабря, 2017 пользователем Falkland 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GUSTAVO 11 Опубликовано 15 декабря, 2017 (изменено) 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 так делать? Изменено 15 декабря, 2017 пользователем GUSTAVO Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Falkland 51 Опубликовано 15 декабря, 2017 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. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
JunkyFunky 127 Опубликовано 15 декабря, 2017 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) установит на итем то чем он должен выглядеть. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GUSTAVO 11 Опубликовано 15 декабря, 2017 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. Спасибо за помощь!! Сегодня дома буду пробывать, отпишу сюда отчет. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты