Что делает этот скрипт:
- Берет цену продажи в магазин готовой продукции и сравнивает её суммарной стоимостью всех ингредиентов.
- Если цена продажи в магазин больше, чем суммарные затраты, то при загрузке указывается название мультиселла и Id продукта, где есть уязвимость, а так же пишется информация о суммарной стоимости продукции и ингредиентов.
Такой скрипт критически необходим людям, которые ставят свой серверна шарных исходниках, для проверки своего сервера на наличие уязвимостей в мультиселлах.
В свое время очень помогло мне, когда работал на лавео, сразу с десяток уязвимостей обнаружилось
В GameServer.java после последнего ***.getInstance() добавляем:
При необходимости можно закомментировать.
https://yadi.sk/d/vfQmyq06Z2J7Y
- Берет цену продажи в магазин готовой продукции и сравнивает её суммарной стоимостью всех ингредиентов.
- Если цена продажи в магазин больше, чем суммарные затраты, то при загрузке указывается название мультиселла и Id продукта, где есть уязвимость, а так же пишется информация о суммарной стоимости продукции и ингредиентов.
Такой скрипт критически необходим людям, которые ставят свой серверна шарных исходниках, для проверки своего сервера на наличие уязвимостей в мультиселлах.
В свое время очень помогло мне, когда работал на лавео, сразу с десяток уязвимостей обнаружилось
Код:
package l2p.gameserver.taskmanager.tasks;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import l2p.commons.threading.RunnableImpl;
import l2p.gameserver.data.xml.holder.ItemHolder;
import l2p.gameserver.data.xml.holder.MultiSellHolder;
import l2p.gameserver.data.xml.holder.MultiSellHolder.MultiSellListContainer;
import l2p.gameserver.model.base.MultiSellEntry;
import l2p.gameserver.model.base.MultiSellIngredient;
import l2p.gameserver.templates.item.ItemTemplate;
/**
* @author WoWan-SM
* ICQ 181-70-70
* Skype WoWan.SM
*
* Класс для проверки итемов на корректную цену продажи в магазины
* Проверяет цену и количество products в мультиселлах и цену, количество ingridients
*/
public class InspectionItem extends RunnableImpl{
static long _productPrice = 0;
static long _ingredientPrice = 0;
static boolean _isQuestItem = false;
static boolean _isIgnoreItem = false;
//Список игнорируемых итемов
/*
4356, //Laveon
4357, //Little Laveon
9600, //Первая Страница (Hidden First Page)
9601, //Вторая Страница (Hidden Second Page)
9602, //Часть Контракта Демона (Demon Contract Fragment)
4310, //Чек Ясона Хейна (Iason Heine's Bill)
3472 Blood Medusa
3473 Blood Werewolf
3474 Blood Basilisk
3475 Blood Drevanul
3476 Blood Succubus
3477 Blood Dragon
3478 Beleths Blood
3479 Manaks Blood Werewolf
3480 Nia's Blood Medusa
3481 Gold Dragon
3482 Gold Wyvern
3483 Gold Knight
3484 Gold Giant
3485 Gold Drake
3486 Gold Wyrm
3487 Beleths Gold
3488 Manaks Gold Giant
3489 Nia's Gold Wywern
3490 Silver Unicorn
3491 Silver Fairy
3492 Silver Dryad
3493 Silver Dragon
3494 Silver Golem
3495 Silver Undine
3496 Beleths Silver
3497 Manaks Silver Dryad
3498 Nia's Silver Fairy
5575 Древняя Адена (Ancient Adena)
5961 Серебряный Василиск Кайла (Kail's Silver Basilisk)
5962 Золотой Голем Кайла (Kail's Gold Golem)
5963 Кровавый Дракон Кайла (Kail's Blood Dragon)
6016 Руда Инферниума (Infernium Ore)
6021 Плазма Дракона (Dracoplasm)
6023 Лунная Пыль (Moon Dust)
6024 Некроплазма (Necroplasm)
6025 Плазма Демона (Demonplasm)
6027 Драконья Эссенция (Draconic Essence)
6028 Пламенная Эссенция (Fire Essence)
6029 Лунный Камень (Lunargent)
6030 Полуночное Масло (Midnight Oil)
6031 Демоническая Эссенция (Demonic Essence)
6032 Масло Преисподней (Abyss Oil)
6033 Масло Огня Ада (Hellfire Oil)
6034 Масло Кошмара (Nightmare Oil)
7562 Алмаз Иных Миров (Dimensional Diamond)
9451 Эссенция Династии (Dynastic Essence)
10413 Эссенция Династии II (Dynastic Essence II)
14052 Усиливающий Камень Венеры (Noble Enhancement Stone)
14861 Проклятое Украшение (Cursed Burial Items)
14873 Шкура Макронианина (Mucrokian Hide)
14836 Библиография Гигантов, 1-й том (Knowledge of the Giants Anthology, Chapter 1)
14837 Библиография Гигантов, 2-й том (Knowledge of the Giants Anthology, Chapter 2)
14838 Библиография Гигантов, 3-й том (Knowledge of the Giants Anthology, Chapter 3)
14839 Библиография Гигантов, 4-й том (Knowledge of the Giants Anthology, Chapter 4)
14840 Библиография Гигантов, 5-й том (Knowledge of the Giants Anthology, Chapter 5)
13796 Ядро Освобожденной Души (Freed Soul)
13841 Амулет Дракона (Dragonkin Charm)
*/
final static int[] ignore_item = {-300,-200,7562,6016,6021,6023,6024,6025,6027,6028,6029,6030,6031,6032,6033,6034,5575,5961,5962,5963,13796,13841,14836,14837,14838,14839,14840,9451,10413,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,4356,4357,9600,9601,9602,4310,3488,3492,3497,14861,14873,3840};
private static final Logger _log = LoggerFactory.getLogger(InspectionItem.class);
@Override
public void runImpl() throws Exception {
Arrays.sort(ignore_item);
int _multisellID = 0;
MultiSellListContainer list;
for (final int i : MultiSellHolder.entries.keys()) {
_multisellID = i;
list = MultiSellHolder.entries.get(_multisellID);
_productPrice = 0;
_ingredientPrice = 0;
_isQuestItem = false;
_isIgnoreItem = false;
for (final MultiSellEntry j: list.getEntries())
{
for (final MultiSellIngredient _ingredient: j.getIngredients())
{
if (_ingredient.getItemId() <= 0)
break;
final ItemTemplate item = ItemHolder.getInstance().getTemplate(_ingredient.getItemId());
if (item == null)
break;
if (Arrays.binarySearch(ignore_item, _ingredient.getItemId()) >= 0)
{
_isIgnoreItem = true;
break;
}
if(item.isQuest())
{
_isQuestItem = true;
break;
}
_ingredientPrice += (item.getReferencePrice() * _ingredient.getItemCount());
}
for (final MultiSellIngredient _production: j.getProduction())
{
if (!_isQuestItem || !_isIgnoreItem)
{
final ItemTemplate item = ItemHolder.getInstance().getTemplate(_production.getItemId());
if (item == null)
break;
_productPrice += (item.getReferencePrice() * _production.getItemCount());
}
}
if ((_productPrice > _ingredientPrice) && !_isQuestItem && !_isIgnoreItem)
{
_log.warn("The total price of product " + j.getEntryId() + " bigger then ingredient price. Check multisell ID:" + _multisellID);
_log.warn("Product price: " + _productPrice + " ingredient price: " + _ingredientPrice);
}
}
}
}
}
В GameServer.java после последнего ***.getInstance() добавляем:
Код:
ThreadPoolManager.getInstance().schedule(new InspectionItem(), 30000L);
https://yadi.sk/d/vfQmyq06Z2J7Y