Убрать зависимость грейда - соски/точки

Статус
В этой теме нельзя размещать новые ответы.

Psycho

Жнец
Модератор
Орден Золотого Заката
Победитель в номинации 2023
Победитель в номинации 2022
Победитель в номинации 2021
Участник Новогоднего Фонда 2021
Неукротимое пламя
Старожил II степени
Победитель в номинации 2020
Победитель в номинации 2019
Знаток великого письма
Знаток письма
Веселый флудер
Мастер реакций
Любитель реакций
Знаток Lineage2
Старожил I степени
Победитель в номинации 2017
Победитель в номинации 2016
Медаль за активность на Форуме
За веру и верность форуму
Сообщения
4 714
Розыгрыши
1
Решения
3
Репутация
4 397
Реакции
3 128
Баллы
2 543
Интересно, как можно убрать грейд для сосок/точек. Сделать по типу как у петов соски.
На пример, создать вообще левый предмет нг, и он будет точить от D до S грейда.
Аналогично с сосками, нг соски работают не зависимо от грейда.
Куда вообще копать, и возможно ли?
 
Попробуй еще глянуть в сторону AutoSoulShot-ов. Если на стороне сервера никаких проверок нет, значит захардкожено в клиенте видимо :/
private final int _type;
_type = type;
packet.writeD(_type);
Не оно ли случайно?
Код:
package l2j.gameserver.network.client.send;

import l2j.gameserver.network.client.OutgoingPackets;
import l2j.network.PacketWriter;

public class ExAutoSoulShot implements IClientOutgoingPacket
{
    private final int _itemId;
    private final boolean _enable;
    private final int _type;
    
    /**
     * @param itemId
     * @param enable
     * @param type
     */
    public ExAutoSoulShot(int itemId, boolean enable, int type)
    {
        _itemId = itemId;
        _enable = enable;
        _type = type;
    }
    
    @Override
    public boolean write(PacketWriter packet)
    {
        OutgoingPackets.EX_AUTO_SOUL_SHOT.writeId(packet);
        
        packet.writeD(_itemId);
        packet.writeD(_enable ? 0x01 : 0x00);
        packet.writeD(_type);
        return true;
    }
}
 

private final int _type;
_type = type;
packet.writeD(_type);
Не оно ли случайно?
Код:
package l2j.gameserver.network.client.send;

import l2j.gameserver.network.client.OutgoingPackets;
import l2j.network.PacketWriter;

public class ExAutoSoulShot implements IClientOutgoingPacket
{
    private final int _itemId;
    private final boolean _enable;
    private final int _type;
   
    /**
     * @param itemId
     * @param enable
     * @param type
     */
    public ExAutoSoulShot(int itemId, boolean enable, int type)
    {
        _itemId = itemId;
        _enable = enable;
        _type = type;
    }
   
    @Override
    public boolean write(PacketWriter packet)
    {
        OutgoingPackets.EX_AUTO_SOUL_SHOT.writeId(packet);
       
        packet.writeD(_itemId);
        packet.writeD(_enable ? 0x01 : 0x00);
        packet.writeD(_type);
        return true;
    }
}
Ну это серверный пакет, здесь никаких проверок нет, ясное дело. Смотри в сторону прихода RequestExAutoSoulShot и что в процессе происходит. Но мне кажется, что все же в клиенте зарыто.
 
Ну это серверный пакет, здесь никаких проверок нет, ясное дело. Смотри в сторону прихода RequestExAutoSoulShot и что в процессе происходит. Но мне кажется, что все же в клиенте зарыто.
Увы, тоже тайпы ид и тд.
Код:
package l2j.gameserver.network.client.recv;

import l2j.gameserver.enums.PrivateStoreType;
import l2j.gameserver.model.actor.Summon;
import l2j.gameserver.model.actor.instance.PlayerInstance;
import l2j.gameserver.model.items.instance.ItemInstance;
import l2j.gameserver.model.items.type.ActionType;
import l2j.gameserver.network.client.L2GameClient;
import l2j.gameserver.network.client.send.ExAutoSoulShot;
import l2j.gameserver.network.client.send.SystemMessage;
import l2j.gameserver.network.client.send.string.SystemMessageId;
import l2j.network.PacketReader;

/**
 * @author Unknown, UnAfraid
 */
public final class RequestAutoSoulShot implements IClientIncomingPacket
{
    private int _itemId;
    private boolean _enable;
    private int _type;
 
    @Override
    public boolean read(L2GameClient client, PacketReader packet)
    {
        _itemId = packet.readD();
        _enable = packet.readD() == 1;
        _type = packet.readD();
        return true;
    }
 
    @Override
    public void run(L2GameClient client)
    {
        final PlayerInstance activeChar = client.getActiveChar();
        if (activeChar == null)
        {
            return;
        }
     
        if ((activeChar.getPrivateStoreType() == PrivateStoreType.NONE) && (activeChar.getActiveRequester() == null) && !activeChar.isDead())
        {
            final ItemInstance item = activeChar.getInventory().getItemByItemId(_itemId);
            if (item == null)
            {
                return;
            }
         
            if (_enable)
            {
                if (!activeChar.getInventory().canManipulateWithItemId(item.getId()))
                {
                    activeChar.sendMessage("Cannot use this item.");
                    return;
                }
             
                switch (item.getItem().getDefaultAction())
                {
                    case SUMMON_SPIRITSHOT:
                    case SUMMON_SOULSHOT:
                    {
                        if (activeChar.hasSummon())
                        {
                            final boolean isSoulshot = item.getEtcItem().getDefaultAction() == ActionType.SUMMON_SOULSHOT;
                            final boolean isSpiritshot = item.getEtcItem().getDefaultAction() == ActionType.SUMMON_SPIRITSHOT;
                            if (isSoulshot)
                            {
                                int soulshotCount = 0;
                                final Summon pet = activeChar.getPet();
                                if (pet != null)
                                {
                                    soulshotCount += pet.getSoulShotsPerHit();
                                }
                                for (Summon servitor : activeChar.getServitors().values())
                                {
                                    soulshotCount += servitor.getSoulShotsPerHit();
                                }
                                if (soulshotCount > item.getCount())
                                {
                                    client.sendPacket(SystemMessageId.YOU_DON_T_HAVE_ENOUGH_SOULSHOTS_NEEDED_FOR_A_PET_SERVITOR);
                                    return;
                                }
                            }
                            else if (isSpiritshot)
                            {
                                int spiritshotCount = 0;
                                final Summon pet = activeChar.getPet();
                                if (pet != null)
                                {
                                    spiritshotCount += pet.getSpiritShotsPerHit();
                                }
                                for (Summon servitor : activeChar.getServitors().values())
                                {
                                    spiritshotCount += servitor.getSpiritShotsPerHit();
                                }
                                if (spiritshotCount > item.getCount())
                                {
                                    client.sendPacket(SystemMessageId.YOU_DON_T_HAVE_ENOUGH_SOULSHOTS_NEEDED_FOR_A_PET_SERVITOR);
                                    return;
                                }
                            }
                         
                            // Activate shots
                            activeChar.addAutoSoulShot(_itemId);
                            client.sendPacket(new ExAutoSoulShot(_itemId, _enable, _type));
                         
                            // Send message
                            final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_AUTOMATIC_USE_OF_S1_HAS_BEEN_ACTIVATED);
                            sm.addItemName(item);
                            client.sendPacket(sm);
                         
                            // Recharge summon's shots
                            final Summon pet = activeChar.getPet();
                            if (pet != null)
                            {
                                pet.rechargeShots(isSoulshot, isSpiritshot, false);
                            }
                            activeChar.getServitors().values().forEach(s ->
                            {
                                s.rechargeShots(isSoulshot, isSpiritshot, false);
                            });
                        }
                        else
                        {
                            client.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_A_SERVITOR_OR_PET_AND_THEREFORE_CANNOT_USE_THE_AUTOMATIC_USE_FUNCTION);
                        }
                        break;
                    }
                    case SPIRITSHOT:
                    case SOULSHOT:
                    case FISHINGSHOT:
                    {
                        final boolean isSoulshot = item.getEtcItem().getDefaultAction() == ActionType.SOULSHOT;
                        final boolean isSpiritshot = item.getEtcItem().getDefaultAction() == ActionType.SPIRITSHOT;
                        final boolean isFishingshot = item.getEtcItem().getDefaultAction() == ActionType.FISHINGSHOT;
                        if ((activeChar.getActiveWeaponItem() == activeChar.getFistsWeaponItem()) || (item.getItem().getCrystalType() != activeChar.getActiveWeaponItem().getCrystalTypePlus()))
                        {
                            client.sendPacket(isSoulshot ? SystemMessageId.THE_SOULSHOT_YOU_ARE_ATTEMPTING_TO_USE_DOES_NOT_MATCH_THE_GRADE_OF_YOUR_EQUIPPED_WEAPON : SystemMessageId.YOUR_SPIRITSHOT_DOES_NOT_MATCH_THE_WEAPON_S_GRADE);
                            return;
                        }
                     
                        // Activate shots
                        activeChar.addAutoSoulShot(_itemId);
                        client.sendPacket(new ExAutoSoulShot(_itemId, _enable, _type));
                     
                        // Send message
                        final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_AUTOMATIC_USE_OF_S1_HAS_BEEN_ACTIVATED);
                        sm.addItemName(item);
                        client.sendPacket(sm);
                     
                        // Recharge player's shots
                        activeChar.rechargeShots(isSoulshot, isSpiritshot, isFishingshot);
                        break;
                    }
                }
            }
            else
            {
                // Cancel auto shots
                activeChar.removeAutoSoulShot(_itemId);
                client.sendPacket(new ExAutoSoulShot(_itemId, _enable, _type));
             
                // Send message
                final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_AUTOMATIC_USE_OF_S1_HAS_BEEN_DEACTIVATED);
                sm.addItemName(item);
                client.sendPacket(sm);
            }
        }
    }
}
Хотя вот еще строка с крисами:
Код:
if ((activeChar.getActiveWeaponItem() == activeChar.getFistsWeaponItem()) || (item.getItem().getCrystalType() != activeChar.getActiveWeaponItem().getCrystalTypePlus()))
Мб заменить на:
Код:
if ((activeChar.getActiveWeaponItem() == activeChar.getFistsWeaponItem()))
 
Последнее редактирование:
Попробуй. А еще, как вариант:
getCrystalType() -> Find Usages -> вырезать везде, где сравнивается грейд соски с грейдом оружки.
 
а можно вобще не мучаться с этим всем, а просто для всех расчетов, где соски юзаются, всегда возвращать что ss/bsps заряжены и все.
т.е. соски как предметы не использовать вобще, а просто считать что всегда активированы бесконечные соски.
 
нужны ли ограничения на грейд?, почему бы не поставить всем вещам скажем Д грейд, поменять картинки д заточек, соул/спиритшотов на нейтральные?
 
а можно вобще не мучаться с этим всем, а просто для всех расчетов, где соски юзаются, всегда возвращать что ss/bsps заряжены и все.
т.е. соски как предметы не использовать вобще, а просто считать что всегда активированы бесконечные соски.
Неа, должны тратиться.
з.ы. Пасиб гайка, но не то.
 
У меня вопрос к людям которые задают вопросы про грейд в клиенте.
Вы вообще понимаете о чем я пишу или нет?
Поменять значения в датниках, хдатах, u и тд, для меня как покурить сходить. Клиент мне по....(я конечно не гуру, но за время научился), я не могу с серверной частью разобраться. Да и трид я создал в Java сервер>Вопросы новичков, а не в клиентской части.
 
Последнее редактирование:
Ты все ещё маешься с этими сосками ))
Там делов то ничего, сделать всю работу программиста:
- посмотри все цепочки вариантов взаимодействия с сосками в soulshots.java, autoshot в player.java, requestautosoulshot.java . Удали сравнения crystaltype. Аналогично для спиритшотов.
- посмотри все методы которые присваивают значение crystaltype, которые возвращаются в getCrystalType и getCrystalTypePlus(в ItemInstance.java). Откуда берутся значения и как присваиваются хоть прямо до парсера предметов.
- поищи все места где используются getCrystalType и getCrystalTypePlus и могут ли они как то быть связаны с сосками
- возьми itemId какой то соски и поищи это значение во всех скриптах и классах, вдруг где то есть тайный хардкод
Если что то не понятно, что где то возвращается, нужно искать что в это поле присваивается и как оно влияет - а не пытаться искать другое место. Только так это работает.
После всех этих манипуляция определи, может соска уже юзается на сервере(уничтожается предмет, добавляется урон), но нет эффекта в клиенте. В этом случае найди пакет Attack в serverpackets, там есть указание ssgrade - возможно понадобится подменять ид соски на нужную по Грейду, чтобы визуальный эффект сработал
 
  • Мне нравится
Реакции: Psycho

    Psycho

    Баллов: 47
    За помощь
Ты все ещё маешься с этими сосками ))
Там делов то ничего, сделать всю работу программиста:
- посмотри все цепочки вариантов взаимодействия с сосками в soulshots.java, autoshot в player.java, requestautosoulshot.java . Удали сравнения crystaltype. Аналогично для спиритшотов.
- посмотри все методы которые присваивают значение crystaltype, которые возвращаются в getCrystalType и getCrystalTypePlus(в ItemInstance.java). Откуда берутся значения и как присваиваются хоть прямо до парсера предметов.
- поищи все места где используются getCrystalType и getCrystalTypePlus и могут ли они как то быть связаны с сосками
- возьми itemId какой то соски и поищи это значение во всех скриптах и классах, вдруг где то есть тайный хардкод
Если что то не понятно, что где то возвращается, нужно искать что в это поле присваивается и как оно влияет - а не пытаться искать другое место. Только так это работает.
После всех этих манипуляция определи, может соска уже юзается на сервере(уничтожается предмет, добавляется урон), но нет эффекта в клиенте. В этом случае найди пакет Attack в serverpackets, там есть указание ssgrade - возможно понадобится подменять ид соски на нужную по Грейду, чтобы визуальный эффект сработал
Да я уже понял что копать в сторону крисов, спасибо за помощь всем.)
Пока просто времени нет проверять это всё.
 
Да я уже понял что копать в сторону крисов, спасибо за помощь всем.)
Пока просто времени нет проверять это всё.
Для тебя в клиенте поправить изи - возьми всю weapogrp и замени crystal_type на 0.
После в сервере (или там где парс идёт) убери грейд.
Будет юзать всегда NG соски, но тут тебе надо решать с заточкой.
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
С заточкой проблем не будет, все замечательно описано в enchantItemData.xml - делаем аналогично и у нас точит "мох и болото"
 
зачем столько геммороя? грейд нам нужен только для вставки лс, заточки и выбора сосок, провернуть с нонграде просто не получиться нет параметров для лс и заточки, берём любой грейд и регуляркой ставим его для всех итемов за 5 сек поменяешь во всех прндметах, далее в клиенте регуляркой в конце строки датника меняем на нужный грейд и всё, сделай всё одного грейда, скилы штрафа указали зайди и просто поменяй значения в xml, или выпили их в сурсах
 
  • Мне нравится
Реакции: Ethernal

    Ethernal

    Баллов: 20
    то что я имел ввиду)
зачем столько геммороя? грейд нам нужен только для вставки лс, заточки и выбора сосок, провернуть с нонграде просто не получиться нет параметров для лс и заточки, берём любой грейд и регуляркой ставим его для всех итемов за 5 сек поменяешь во всех прндметах, далее в клиенте регуляркой в конце строки датника меняем на нужный грейд и всё, сделай всё одного грейда, скилы штрафа указали зайди и просто поменяй значения в xml, или выпили их в сурсах
ЛС с НГ работает нормально (разве что на стороне сервера разрешить аугментацию НГ оружия).
Почему заточка не должна работать то? А рубашки ольфа? Она же НГ.
Проблем не будет никаких. Только поправить заточку и всё.
 
Я конечно не претендую на абсолютное мнение, но такие подмены грейдов всего для всего выглядят как какие-то жуткие костыли и нормальным решением не могут являться, потому что:
- нужно будет тестировать все что связано с грейдами, а тестировать понадобится все, связанное с грейдами
- есть некая вероятность, что вы можете создать какой-то критичный баг, который просто так не найдете
- в случае чего нужно будет проворачивать все эти действия в обратном порядке, чтобы вернуть как было
Нормальным решением будет найти только те необходимые участки, где нужно отключить проверку и сделать конфиги для: а) сосок б) заточек
 
Скрытое содержимое для пользователя(ей): Psycho
 
Я конечно не претендую на абсолютное мнение, но такие подмены грейдов всего для всего выглядят как какие-то жуткие костыли и нормальным решением не могут являться, потому что:
- нужно будет тестировать все что связано с грейдами, а тестировать понадобится все, связанное с грейдами
- есть некая вероятность, что вы можете создать какой-то критичный баг, который просто так не найдете
- в случае чего нужно будет проворачивать все эти действия в обратном порядке, чтобы вернуть как было
Нормальным решением будет найти только те необходимые участки, где нужно отключить проверку и сделать конфиги для: а) сосок б) заточек
не пишите ерунды, если не знаете как всё устроено то лучше сначала изучить

 
  • Мне нравится
Реакции: Main
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу