SoulShots.java сюда копатьИнтересно, как можно убрать грейд для сосок/точек. Сделать по типу как у петов соски.
На пример, создать вообще левый предмет нг, и он будет точить от D до S грейда.
Аналогично с сосками, нг соски работают не зависимо от грейда.
Куда вообще копать, и возможно ли?
Это херня. Где находится зависимость по грейду то? От куда он ее берёт вообще?SoulShots.java сюда копать
Я уже где только не копался, не нашел подобного.Посмотреть вложение 23910
У меня тут грейды указаны и какие соски, к какому грейду относятся и какой скил при юзе используется, дублируем ид можно юзать хоть на каком оружие
/*
* 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()); } }
/*
* 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 под линагу юзаете? ))
<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>
Спасибо, попробую.Просто удали эту часть проверки из 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 или "" или какой-то другой тип данных который эта функция возвращает для нг сосок.
/**
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;
}
*/
Попробую.Тип кристаллов в шмотке попробуй сменить, вроде бы, по ним привязка к греду идет.
Да хз, соски убираются с панели автоюза вообще, а если тыкать по нг соскам, то да, юзаются, и то только после одевания нг пухи.Попробуй руками по соске кликать. если будет работать - значит нужно ещё внести корректировки в вызов autosoulshot/autoshot внутри player/playable. Скорее всего проблема в том что все соски на автоюзе пытаются использоваться одновременно.
Покопался, и та же история, ничего связанного с грейдом не нашел. Только зависимости, проверки, и тд.С заточкой сложнее, там много изменений надо вносить, для защиты от дюпов/багов в коде может быть куча проверок. Вообще нужны 3 файла: enchantscroll или enchantable, requestenchant и ещё один пакетный класс(напомню название, что то похожее на request enchant item), который отвечает за пакет выбора вещи, когда его в окно енчанта помещают
Я так понял, что всё что связанно с кристаллами придётся отрубать?там идёт статическая привязка по ID так что просто в soulshots.java отключить не получится, всё привязано к grade+кристаллам, туда и копай, по типу
D grade = D crystall
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?