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

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

Psycho

Жнец
Модератор
Орден Золотого Заката
Победитель в номинации 2023
Победитель в номинации 2022
Победитель в номинации 2021
Участник Новогоднего Фонда 2021
Неукротимое пламя
Старожил II степени
Победитель в номинации 2020
Победитель в номинации 2019
Знаток великого письма
Знаток письма
Веселый флудер
Мастер реакций
Любитель реакций
Знаток Lineage2
Старожил I степени
Победитель в номинации 2017
Победитель в номинации 2016
Медаль за активность на Форуме
За веру и верность форуму
Сообщения
4 714
Розыгрыши
1
Решения
3
Репутация
4 397
Реакции
3 128
Баллы
2 543
Интересно, как можно убрать грейд для сосок/точек. Сделать по типу как у петов соски.
На пример, создать вообще левый предмет нг, и он будет точить от D до S грейда.
Аналогично с сосками, нг соски работают не зависимо от грейда.
Куда вообще копать, и возможно ли?
 
Интересно, как можно убрать грейд для сосок/точек. Сделать по типу как у петов соски.
На пример, создать вообще левый предмет нг, и он будет точить от D до S грейда.
Аналогично с сосками, нг соски работают не зависимо от грейда.
Куда вообще копать, и возможно ли?
SoulShots.java сюда копать
 
Это херня. Где находится зависимость по грейду то? От куда он ее берёт вообще?
upload_2018-10-5_22-48-49.png
У меня тут грейды указаны и какие соски, к какому грейду относятся и какой скил при юзе используется, дублируем ид можно юзать хоть на каком оружие
 
Посмотреть вложение 23910
У меня тут грейды указаны и какие соски, к какому грейду относятся и какой скил при юзе используется, дублируем ид можно юзать хоть на каком оружие
Я уже где только не копался, не нашел подобного.
Сам SoulShots.java
Код:
/*
 * Copyright (C) 2004-2015 L2J DataPack
 *
 * This file is part of L2J DataPack.
 *
 * L2J DataPack is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * L2J DataPack is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package l2j.scripts.handlers.itemhandlers;

import java.util.List;

import l2j.commons.util.Rnd;
import l2j.gameserver.enums.ItemSkillType;
import l2j.gameserver.enums.ShotType;
import l2j.gameserver.handler.IItemHandler;
import l2j.gameserver.handler.ItemHandler;
import l2j.gameserver.model.actor.Playable;
import l2j.gameserver.model.actor.instance.PlayerInstance;
import l2j.gameserver.model.holders.ItemSkillHolder;
import l2j.gameserver.model.items.Weapon;
import l2j.gameserver.model.items.instance.ItemInstance;
import l2j.gameserver.model.items.type.ActionType;
import l2j.gameserver.network.client.send.MagicSkillUse;
import l2j.gameserver.network.client.send.string.SystemMessageId;
import l2j.gameserver.scripting.annotations.GameScript;
import l2j.gameserver.util.Broadcast;

public class SoulShots implements IItemHandler
{
    @Override
    public boolean useItem(Playable playable, ItemInstance item, boolean forceUse)
    {
        if (!playable.isPlayer())
        {
            playable.sendPacket(SystemMessageId.YOUR_PET_CANNOT_CARRY_THIS_ITEM);
            return false;
        }
        
        final PlayerInstance activeChar = playable.getActingPlayer();
        final ItemInstance weaponInst = activeChar.getActiveWeaponInstance();
        final Weapon weaponItem = activeChar.getActiveWeaponItem();
        final List<ItemSkillHolder> skills = item.getItem().getSkills(ItemSkillType.NORMAL);
        if (skills == null)
        {
            LOGGER.warn("Item skill list is empty!");
            return false;
        }
        
        final int itemId = item.getId();
        
        // Check if Soul shot can be used
        if ((weaponInst == null) || (weaponItem.getSoulShotCount() == 0))
        {
            if (!activeChar.getAutoSoulShot().contains(itemId))
            {
                activeChar.sendPacket(SystemMessageId.CANNOT_USE_SOULSHOTS);
            }
            return false;
        }
        
        boolean gradeCheck = item.isEtcItem() && (item.getEtcItem().getDefaultAction() == ActionType.SOULSHOT) && (weaponInst.getItem().getCrystalTypePlus() == item.getItem().getCrystalTypePlus());
        
        if (!gradeCheck)
        {
            if (!activeChar.getAutoSoulShot().contains(itemId))
            {
                activeChar.sendPacket(SystemMessageId.THE_SOULSHOT_YOU_ARE_ATTEMPTING_TO_USE_DOES_NOT_MATCH_THE_GRADE_OF_YOUR_EQUIPPED_WEAPON);
            }
            return false;
        }
        
        activeChar.soulShotLock.lock();
        try
        {
            // Check if Soul shot is already active
            if (activeChar.isChargedShot(ShotType.SOULSHOTS))
            {
                return false;
            }
            
            // Consume Soul shots if player has enough of them
            int SSCount = weaponItem.getSoulShotCount();
            if ((weaponItem.getReducedSoulShot() > 0) && (Rnd.get(100) < weaponItem.getReducedSoulShotChance()))
            {
                SSCount = weaponItem.getReducedSoulShot();
            }
            
            if (!activeChar.destroyItemWithoutTrace("Consume", item.getObjectId(), SSCount, null, false))
            {
                if (!activeChar.disableAutoShot(itemId))
                {
                    activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SOULSHOTS_FOR_THAT);
                }
                return false;
            }
            // Charge soul shot
            activeChar.chargeShot(ShotType.SOULSHOTS);
        }
        finally
        {
            activeChar.soulShotLock.unlock();
        }
        
        // Send message to client
        activeChar.sendPacket(SystemMessageId.YOUR_SOULSHOTS_ARE_ENABLED);
        skills.forEach(holder -> Broadcast.toSelfAndKnownPlayersInRadius(activeChar, new MagicSkillUse(activeChar, activeChar, holder.getSkillId(), holder.getSkillLevel(), 0, 0), 600));
        return true;
    }
    
    @GameScript
    public static void main()
    {
        ItemHandler.getInstance().registerHandler(new SoulShots());
    }
}
 
Я уже где только не копался, не нашел подобного.
Сам SoulShots.java
Код:
/*
 * Copyright (C) 2004-2015 L2J DataPack
 *
 * This file is part of L2J DataPack.
 *
 * L2J DataPack is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * L2J DataPack is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package l2j.scripts.handlers.itemhandlers;

import java.util.List;

import l2j.commons.util.Rnd;
import l2j.gameserver.enums.ItemSkillType;
import l2j.gameserver.enums.ShotType;
import l2j.gameserver.handler.IItemHandler;
import l2j.gameserver.handler.ItemHandler;
import l2j.gameserver.model.actor.Playable;
import l2j.gameserver.model.actor.instance.PlayerInstance;
import l2j.gameserver.model.holders.ItemSkillHolder;
import l2j.gameserver.model.items.Weapon;
import l2j.gameserver.model.items.instance.ItemInstance;
import l2j.gameserver.model.items.type.ActionType;
import l2j.gameserver.network.client.send.MagicSkillUse;
import l2j.gameserver.network.client.send.string.SystemMessageId;
import l2j.gameserver.scripting.annotations.GameScript;
import l2j.gameserver.util.Broadcast;

public class SoulShots implements IItemHandler
{
    @Override
    public boolean useItem(Playable playable, ItemInstance item, boolean forceUse)
    {
        if (!playable.isPlayer())
        {
            playable.sendPacket(SystemMessageId.YOUR_PET_CANNOT_CARRY_THIS_ITEM);
            return false;
        }
       
        final PlayerInstance activeChar = playable.getActingPlayer();
        final ItemInstance weaponInst = activeChar.getActiveWeaponInstance();
        final Weapon weaponItem = activeChar.getActiveWeaponItem();
        final List<ItemSkillHolder> skills = item.getItem().getSkills(ItemSkillType.NORMAL);
        if (skills == null)
        {
            LOGGER.warn("Item skill list is empty!");
            return false;
        }
       
        final int itemId = item.getId();
       
        // Check if Soul shot can be used
        if ((weaponInst == null) || (weaponItem.getSoulShotCount() == 0))
        {
            if (!activeChar.getAutoSoulShot().contains(itemId))
            {
                activeChar.sendPacket(SystemMessageId.CANNOT_USE_SOULSHOTS);
            }
            return false;
        }
       
        boolean gradeCheck = item.isEtcItem() && (item.getEtcItem().getDefaultAction() == ActionType.SOULSHOT) && (weaponInst.getItem().getCrystalTypePlus() == item.getItem().getCrystalTypePlus());
       
        if (!gradeCheck)
        {
            if (!activeChar.getAutoSoulShot().contains(itemId))
            {
                activeChar.sendPacket(SystemMessageId.THE_SOULSHOT_YOU_ARE_ATTEMPTING_TO_USE_DOES_NOT_MATCH_THE_GRADE_OF_YOUR_EQUIPPED_WEAPON);
            }
            return false;
        }
       
        activeChar.soulShotLock.lock();
        try
        {
            // Check if Soul shot is already active
            if (activeChar.isChargedShot(ShotType.SOULSHOTS))
            {
                return false;
            }
           
            // Consume Soul shots if player has enough of them
            int SSCount = weaponItem.getSoulShotCount();
            if ((weaponItem.getReducedSoulShot() > 0) && (Rnd.get(100) < weaponItem.getReducedSoulShotChance()))
            {
                SSCount = weaponItem.getReducedSoulShot();
            }
           
            if (!activeChar.destroyItemWithoutTrace("Consume", item.getObjectId(), SSCount, null, false))
            {
                if (!activeChar.disableAutoShot(itemId))
                {
                    activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SOULSHOTS_FOR_THAT);
                }
                return false;
            }
            // Charge soul shot
            activeChar.chargeShot(ShotType.SOULSHOTS);
        }
        finally
        {
            activeChar.soulShotLock.unlock();
        }
       
        // Send message to client
        activeChar.sendPacket(SystemMessageId.YOUR_SOULSHOTS_ARE_ENABLED);
        skills.forEach(holder -> Broadcast.toSelfAndKnownPlayersInRadius(activeChar, new MagicSkillUse(activeChar, activeChar, holder.getSkillId(), holder.getSkillLevel(), 0, 0), 600));
        return true;
    }
   
    @GameScript
    public static void main()
    {
        ItemHandler.getInstance().registerHandler(new SoulShots());
    }
}
а в самих итемах смотрел?
 
gradeCheck от сюда отолкнись, погляди проверки мб в одной из них будет.
 
Всё что нашел в ядре по грейду
Код:
/*
 * Copyright (C) 2004-2015 L2J Unity
 *
 * This file is part of L2J Unity.
 *
 * L2J Unity is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * L2J Unity is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package l2j.gameserver.enums;

import l2j.gameserver.model.items.type.CrystalType;

/**
 * @author UnAfraid
 */
public enum ItemGrade
{
    NONE,
    D,
    C,
    B,
    A,
    S,
    R,
    EVENT;
   
    public static ItemGrade valueOf(CrystalType type)
    {
        switch (type)
        {
            case NONE:
                return NONE;
            case D:
                return D;
            case C:
                return C;
            case B:
                return B;
            case A:
                return A;
            case S:
                return S;
            case R:
                return R;
            case S80:
            case S84:
                return S;
            case R95:
            case R99:
                return R;
            case EVENT:
                return EVENT;
           
        }
        return null;
    }
}

а в самих итемах смотрел?
Только кол-во используемых сосок. Потом еще покопаюсь в дп.

Походу нашел
Код:
<item id="2509" name="Spiritshot (No-grade)" type="EtcItem">
        <set name="icon" val="icon.etc_spell_shot_white_i00" />
        <set name="default_action" val="SPIRITSHOT" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="PAPER" />
        <set name="weight" val="4" />
        <set name="price" val="15" />
        <set name="is_stackable" val="true" />
        <set name="handler" val="SpiritShot" />
        <set name="commissionItemType" val="SPIRITSHOT" />
        <set name="etcitem_type" val="SOULSHOT" />
        <set name="is_freightable" val="false" />
        <skills>
            <skill id="2047" level="1" /> <!-- Spiritshot (No-grade) -->
        </skills>
    </item>
    <item id="2510" name="Spiritshot (D-grade)" type="EtcItem">
        <set name="icon" val="icon.etc_spell_shot_blue_i00" />
        <set name="default_action" val="SPIRITSHOT" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="PAPER" />
        <set name="weight" val="4" />
        <set name="price" val="18" />
        <set name="is_stackable" val="true" />
        <set name="handler" val="SpiritShot" />
        <set name="crystal_type" val="D" />
        <set name="enchant_enabled" val="1" />
        <set name="commissionItemType" val="SPIRITSHOT" />
        <set name="etcitem_type" val="SOULSHOT" />
        <set name="is_freightable" val="false" />
        <skills>
            <skill id="2155" level="1" /> <!-- Spiritshot (D-grade) -->
        </skills>
    </item>
    <item id="2511" name="Spiritshot (C-grade)" type="EtcItem">
        <set name="icon" val="icon.etc_spell_shot_green_i00" />
        <set name="default_action" val="SPIRITSHOT" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="PAPER" />
        <set name="weight" val="2" />
        <set name="price" val="35" />
        <set name="is_stackable" val="true" />
        <set name="handler" val="SpiritShot" />
        <set name="crystal_type" val="C" />
        <set name="enchant_enabled" val="1" />
        <set name="commissionItemType" val="SPIRITSHOT" />
        <set name="etcitem_type" val="SOULSHOT" />
        <set name="is_freightable" val="false" />
        <skills>
            <skill id="2156" level="1" /> <!-- Spiritshot (C-grade) -->
        </skills>
    </item>
    <item id="2512" name="Spiritshot (B-grade)" type="EtcItem">
        <set name="icon" val="icon.etc_spell_shot_red_i00" />
        <set name="default_action" val="SPIRITSHOT" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="PAPER" />
        <set name="weight" val="2" />
        <set name="price" val="100" />
        <set name="is_stackable" val="true" />
        <set name="handler" val="SpiritShot" />
        <set name="crystal_type" val="B" />
        <set name="enchant_enabled" val="1" />
        <set name="commissionItemType" val="SPIRITSHOT" />
        <set name="etcitem_type" val="SOULSHOT" />
        <set name="is_freightable" val="false" />
        <skills>
            <skill id="2157" level="1" /> <!-- Spiritshot (B-grade) -->
        </skills>
    </item>
    <item id="2513" name="Spiritshot (A-grade)" type="EtcItem">
        <set name="icon" val="icon.etc_spell_shot_silver_i00" />
        <set name="default_action" val="SPIRITSHOT" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="PAPER" />
        <set name="weight" val="1" />
        <set name="price" val="120" />
        <set name="is_stackable" val="true" />
        <set name="handler" val="SpiritShot" />
        <set name="crystal_type" val="A" />
        <set name="enchant_enabled" val="1" />
        <set name="commissionItemType" val="SPIRITSHOT" />
        <set name="etcitem_type" val="SOULSHOT" />
        <set name="is_freightable" val="false" />
        <skills>
            <skill id="2158" level="1" /> <!-- Spiritshot (A-grade) -->
        </skills>
    </item>
    <item id="2514" name="Spiritshot (S-grade)" type="EtcItem">
        <set name="icon" val="icon.etc_spell_shot_gold_i00" />
        <set name="default_action" val="SPIRITSHOT" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="PAPER" />
        <set name="weight" val="1" />
        <set name="price" val="150" />
        <set name="is_stackable" val="true" />
        <set name="handler" val="SpiritShot" />
        <set name="crystal_type" val="S" />
        <set name="enchant_enabled" val="1" />
        <set name="commissionItemType" val="SPIRITSHOT" />
        <set name="etcitem_type" val="SOULSHOT" />
        <set name="is_freightable" val="false" />
        <skills>
            <skill id="2159" level="1" /> <!-- Spiritshot (S-grade) -->
        </skills>
    </item>
Но это сами соски. А как сделать, чтобы юзались одни на всё оружие. (нг соски к примеру)
Чё-то я вообще не въеду.
 
Последнее редактирование модератором:
Ребз, какую IDE под линагу юзаете? ))
Screenshot.jpg

Вот какие параметры в итемах. Использования грейда сосок не указано.
Код:
<item id="4700" name="Sword of Delusion" name_additional="Health" type="Weapon">
        <set name="icon" val="icon.weapon_sword_of_delusion_i01" />
        <set name="default_action" val="EQUIP" />
        <set name="weapon_type" val="SWORD" />
        <set name="bodypart" val="rhand" />
        <set name="damage_range" val="0;0;40;120" />
        <set name="immediate_effect" val="true" />
        <set name="crystal_count" val="177" />
        <set name="crystal_type" val="C" />
        <set name="material" val="MITHRIL" />
        <set name="weight" val="1400" />
        <set name="price" val="660860" />
        <set name="soulshots" val="3" />
        <set name="spiritshots" val="3" />
        <set name="enchant_enabled" val="1" />
        <set name="commissionItemType" val="ONE_HAND_SWORD" />
        <set name="isAppearanceable" val="true" />
        <set name="is_freightable" val="false" />
        <skills>
            <skill id="3013" level="1" /> <!-- Special Ability: Health -->
        </skills>
        <stats>
            <stat type="pAtk">139</stat>
            <stat type="mAtk">76</stat>
            <stat type="rCrit">8</stat>
            <stat type="pAtkSpd">379</stat>
            <stat type="randomDamage">10</stat>
            <stat type="pAtkRange">40</stat>
        </stats>
    </item>

Походу по любому где-то в ядре, а не дп.

Я хз даже. Уже и блокнотом рылся.
Screenshot.jpg
 
Последнее редактирование модератором:
Просто удали эту часть проверки из soulshots:
weaponInst.getItem().getCrystalTypePlus() == item.getItem().getCrystalTypePlus()

Удаление этого по идее позволит все соски на все оружие юзать:
weaponInst.getItem().getCrystalTypePlus() == item.getItem().getCrystalTypePlus()

А если только нг, то надо добавить условие:
boolean gradeCheck = item.isEtcItem() && (item.getEtcItem().getDefaultAction() == ActionType.SOULSHOT) && (weaponInst.getItem().getCrystalTypePlus() == item.getItem().getCrystalTypePlus() || item.getItem().getCrystalTypePlus() == 0);
В конце может быть 0 или "" или какой-то другой тип данных который эта функция возвращает для нг сосок.
 
Последнее редактирование модератором:
Просто удали эту часть проверки из soulshots:
weaponInst.getItem().getCrystalTypePlus() == item.getItem().getCrystalTypePlus()

Удаление этого по идее позволит все соски на все оружие юзать:
weaponInst.getItem().getCrystalTypePlus() == item.getItem().getCrystalTypePlus()

А если только нг, то надо добавить условие:
boolean gradeCheck = item.isEtcItem() && (item.getEtcItem().getDefaultAction() == ActionType.SOULSHOT) && (weaponInst.getItem().getCrystalTypePlus() == item.getItem().getCrystalTypePlus() || item.getItem().getCrystalTypePlus() == 0);
В конце может быть 0 или "" или какой-то другой тип данных который эта функция возвращает для нг сосок.
Спасибо, попробую.
upd.
Херня, начинают работать не правильно (вообще перестают работать, и тд)
Пробовал даже закоментить, эффект тот же:
Код:
/**
        boolean gradeCheck = item.isEtcItem() && (item.getEtcItem().getDefaultAction() == ActionType.SOULSHOT) && (weaponInst.getItem().getCrystalType() == item.getItem().getCrystalType());
    
        if (!gradeCheck)
        {
            if (!activeChar.getAutoSoulShot().contains(itemId))
            {
                activeChar.sendPacket(SystemMessageId.THE_SOULSHOT_YOU_ARE_ATTEMPTING_TO_USE_DOES_NOT_MATCH_THE_GRADE_OF_YOUR_EQUIPPED_WEAPON);
            }
            return false;
        }
        */

Мб где-то еще могут быть?
Flylink можешь мне свой SoulShots скинуть? Гляну как у тебя. Мб просто переделать придется.
Либо что за сурсы юзаешь.
 
Последнее редактирование:
Попробуй руками по соске кликать. если будет работать - значит нужно ещё внести корректировки в вызов autosoulshot/autoshot внутри player/playable. Скорее всего проблема в том что все соски на автоюзе пытаются использоваться одновременно.
 
Тип кристаллов в шмотке попробуй сменить, вроде бы, по ним привязка к греду идет.
 
Тип кристаллов в шмотке попробуй сменить, вроде бы, по ним привязка к греду идет.
Попробую.
upd.
Работают, только если на них нажимать. (привет с1 :D)
Попробуй руками по соске кликать. если будет работать - значит нужно ещё внести корректировки в вызов autosoulshot/autoshot внутри player/playable. Скорее всего проблема в том что все соски на автоюзе пытаются использоваться одновременно.
Да хз, соски убираются с панели автоюза вообще, а если тыкать по нг соскам, то да, юзаются, и то только после одевания нг пухи.

Ладно, пока на сосках завис, займусь другим. Как с заточками быть, необходимо по сути тоже самое, точить свитками любого грейда?
 
Последнее редактирование модератором:
С заточкой сложнее, там много изменений надо вносить, для защиты от дюпов/багов в коде может быть куча проверок. Вообще нужны 3 файла: enchantscroll или enchantable, requestenchant и ещё один пакетный класс(напомню название, что то похожее на request enchant item), который отвечает за пакет выбора вещи, когда его в окно енчанта помещают
 
С заточкой сложнее, там много изменений надо вносить, для защиты от дюпов/багов в коде может быть куча проверок. Вообще нужны 3 файла: enchantscroll или enchantable, requestenchant и ещё один пакетный класс(напомню название, что то похожее на request enchant item), который отвечает за пакет выбора вещи, когда его в окно енчанта помещают
Покопался, и та же история, ничего связанного с грейдом не нашел. Только зависимости, проверки, и тд.

з.ы. а я то дурак думал всё чуток проще будет. :D
 
там идёт статическая привязка по ID так что просто в soulshots.java отключить не получится, всё привязано к grade+кристаллам, туда и копай, по типу
D grade = D crystall (ID)
а к этому потом привязаны соски
 
Последнее редактирование:
там идёт статическая привязка по ID так что просто в soulshots.java отключить не получится, всё привязано к grade+кристаллам, туда и копай, по типу
D grade = D crystall
Я так понял, что всё что связанно с кристаллами придётся отрубать?
Сам грейд оружия хоть не пропадет (я имею ввиду иконки D, C, B и тд), а то с таким же успехом можно просто нг пухи создавать?
 
Последнее редактирование:
Иконки в клиенте в датниках (зависит от crystal_type или чет такое)
Изменение типа кристалов в сборке может потянуть за собой отключение штрафа на оружие (допустим носить А шмот на 20 уровне) и прочее.
Я бы всё равно копал в сторону именно сосок
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу