private final int _type;Попробуй еще глянуть в сторону AutoSoulShot-ов. Если на стороне сервера никаких проверок нет, значит захардкожено в клиенте видимо :/
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 и что в процессе происходит. Но мне кажется, что все же в клиенте зарыто.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 и что в процессе происходит. Но мне кажется, что все же в клиенте зарыто.
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 заряжены и все.
т.е. соски как предметы не использовать вобще, а просто считать что всегда активированы бесконечные соски.
Да я уже понял что копать в сторону крисов, спасибо за помощь всем.)Ты все ещё маешься с этими сосками ))
Там делов то ничего, сделать всю работу программиста:
- посмотри все цепочки вариантов взаимодействия с сосками в soulshots.java, autoshot в player.java, requestautosoulshot.java . Удали сравнения crystaltype. Аналогично для спиритшотов.
- посмотри все методы которые присваивают значение crystaltype, которые возвращаются в getCrystalType и getCrystalTypePlus(в ItemInstance.java). Откуда берутся значения и как присваиваются хоть прямо до парсера предметов.
- поищи все места где используются getCrystalType и getCrystalTypePlus и могут ли они как то быть связаны с сосками
- возьми itemId какой то соски и поищи это значение во всех скриптах и классах, вдруг где то есть тайный хардкод
Если что то не понятно, что где то возвращается, нужно искать что в это поле присваивается и как оно влияет - а не пытаться искать другое место. Только так это работает.
После всех этих манипуляция определи, может соска уже юзается на сервере(уничтожается предмет, добавляется урон), но нет эффекта в клиенте. В этом случае найди пакет Attack в serverpackets, там есть указание ssgrade - возможно понадобится подменять ид соски на нужную по Грейду, чтобы визуальный эффект сработал
Для тебя в клиенте поправить изи - возьми всю weapogrp и замени crystal_type на 0.Да я уже понял что копать в сторону крисов, спасибо за помощь всем.)
Пока просто времени нет проверять это всё.
ЛС с НГ работает нормально (разве что на стороне сервера разрешить аугментацию НГ оружия).зачем столько геммороя? грейд нам нужен только для вставки лс, заточки и выбора сосок, провернуть с нонграде просто не получиться нет параметров для лс и заточки, берём любой грейд и регуляркой ставим его для всех итемов за 5 сек поменяешь во всех прндметах, далее в клиенте регуляркой в конце строки датника меняем на нужный грейд и всё, сделай всё одного грейда, скилы штрафа указали зайди и просто поменяй значения в xml, или выпили их в сурсах
не пишите ерунды, если не знаете как всё устроено то лучше сначала изучитьЯ конечно не претендую на абсолютное мнение, но такие подмены грейдов всего для всего выглядят как какие-то жуткие костыли и нормальным решением не могут являться, потому что:
- нужно будет тестировать все что связано с грейдами, а тестировать понадобится все, связанное с грейдами
- есть некая вероятность, что вы можете создать какой-то критичный баг, который просто так не найдете
- в случае чего нужно будет проворачивать все эти действия в обратном порядке, чтобы вернуть как было
Нормальным решением будет найти только те необходимые участки, где нужно отключить проверку и сделать конфиги для: а) сосок б) заточек
интересный конечно комментарий)не пишите ерунды, если не знаете как всё устроено то лучше сначала изучить
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?