07-18-2009, 09:19 PM
Автор не я, просто нашел в сети и решил выложить у нас. Вот слова автора (перевод):
Я нашел этот баг в старом L2J C5 сервере. Тогда я решил воспроизвести его на серверах Interlude которые были доступны с HopZone, и он работал на большинстве из них. В последних ревизиях L2jServer его исправили, но зато все так же работает в L2jFree.
Я описал по пунктам как определить, если ли он на вашем сервере.
Что бы закрыть возможность использовать баг, нужно применить патчи и скомпилировать java сервер.
[SOURCE="diff"]Index: java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (Revision 2746)
+++ java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (working copy)
private int _oldMaxHp; // stats watch
private int _oldMaxMp; // stats watch
+ private int _oldMaxCp; // stats watch[/SOURCE]
[SOURCE="diff"]Index: java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (Revision 2746)
+++ java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (working copy)
super.setLevel(value);
}
}
+ @Override
+ public final int getMaxCp()
+ {
+ int val = super.getMaxCp();
+ if (val != _oldMaxCp)
+ {
+ _oldMaxCp = val;
+ if (getActiveChar().getStatus().getCurrentCp() != val)
+ {
+ getActiveChar().getStatus().setCurrentCp(getActiveChar().getStatus().getCurrentCp());
+ }
+ }
+ return val;
+ }
@Override
public final int getMaxHp()[/SOURCE]
[SOURCE="diff"]Index: java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java (Revision 2746)
+++ java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java (working copy)
return _activeChar.getTemplate().baseAtkRange;
}
- public final int getMaxCp()
+ public int getMaxCp()
{
if (_activeChar == null)
{
return 1;
}
return (int) calcStat(Stats.MAX_CP, _activeChar.getTemplate().baseCpMax, null, null);
}[/SOURCE]
Автор исправления: Devon
Патчи вы можете вручную прописать у себя на сервере, тут не много кода, а можете и автоматически пропатчить, просто сохраните эти куски в файл patch.diff и накатите с помощью черепахи. (Если не знаете как это делать, напишите, я сделаю мини-гайд).
Я нашел этот баг в старом L2J C5 сервере. Тогда я решил воспроизвести его на серверах Interlude которые были доступны с HopZone, и он работал на большинстве из них. В последних ревизиях L2jServer его исправили, но зато все так же работает в L2jFree.
Я описал по пунктам как определить, если ли он на вашем сервере.
- Берем персонажем оружие, которое повышает CP. (Например: Infinity Wing)
- Ждем пока не восстановится до максимального значения ваш CP
- Снимаем оружие
- Если значение CP не сбросилось, значит баг работает
Что бы закрыть возможность использовать баг, нужно применить патчи и скомпилировать java сервер.
[SOURCE="diff"]Index: java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (Revision 2746)
+++ java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (working copy)
private int _oldMaxHp; // stats watch
private int _oldMaxMp; // stats watch
+ private int _oldMaxCp; // stats watch[/SOURCE]
[SOURCE="diff"]Index: java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (Revision 2746)
+++ java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (working copy)
super.setLevel(value);
}
}
+ @Override
+ public final int getMaxCp()
+ {
+ int val = super.getMaxCp();
+ if (val != _oldMaxCp)
+ {
+ _oldMaxCp = val;
+ if (getActiveChar().getStatus().getCurrentCp() != val)
+ {
+ getActiveChar().getStatus().setCurrentCp(getActiveChar().getStatus().getCurrentCp());
+ }
+ }
+ return val;
+ }
@Override
public final int getMaxHp()[/SOURCE]
[SOURCE="diff"]Index: java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java (Revision 2746)
+++ java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java (working copy)
return _activeChar.getTemplate().baseAtkRange;
}
- public final int getMaxCp()
+ public int getMaxCp()
{
if (_activeChar == null)
{
return 1;
}
return (int) calcStat(Stats.MAX_CP, _activeChar.getTemplate().baseCpMax, null, null);
}[/SOURCE]
Автор исправления: Devon
Патчи вы можете вручную прописать у себя на сервере, тут не много кода, а можете и автоматически пропатчить, просто сохраните эти куски в файл patch.diff и накатите с помощью черепахи. (Если не знаете как это делать, напишите, я сделаю мини-гайд).