Бонус крафта от умения Мастер Создания

MollyBloom

Пляшущий с бубном
Участник
Сообщения
28
Розыгрыши
0
Репутация
17
Реакции
14
Баллы
235
Хроники
  1. Fafurion
Исходники
Присутствуют
Сборка
Mobius
Ткните носом пож куда лезть искать?
При выученном умении Мастер Создания у крафтера при крафте не отображается бонус от этого умения
2022-07-10_19-58-13.png
 
Вот пакет -> RecipeItemMakeInfo
Хранится тута - java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java
При каких-то условиях (если что-то там равно 2), можно в конце выслать еще fcfc
Если что-то будет интересное - поделитесь :)
А так, я сначало подумал что это как с Изобилками.
 
Ткните носом пож куда лезть искать?
При выученном умении Мастер Создания у крафтера при крафте не отображается бонус от этого умения
Посмотреть вложение 44444
у вас не корректная структура сервер пакетов для отображения данного параметра помойму 2ух
 
RecipeShopItemInfo и RecipeShopSellList есть пропуски и не правильная структура
 
Вот пакет -> RecipeItemMakeInfo
Хранится тута - java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java
При каких-то условиях (если что-то там равно 2), можно в конце выслать еще fcfc
Если что-то будет интересное - поделитесь :)
А так, я сначало подумал что это как с Изобилками.
ОБЪЯСНЕНИЕ:
На приложеном Вами скриншоте мы все увидели недоработку, о которой Вы сообщили в посте как
кните носом пож куда лезть искать?
При выученном умении Мастер Создания у крафтера при крафте не отображается бонус от этого умения
Как Я и ChaosPaladin ответили, в пакете, который отправляет сервер клиенту при запросе на отображение окна, указаного Вами выше, параметры, такие как "не отображается бонус от этого умения", не прописаны в пакете. Вам мной было предложено перейти по пути java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java и лицезреть структуру пакета, который предстоит доработать для того, Вы получили результат.
Для получения результата, мной было предложено в конце пакета дописать
можно в конце выслать еще fcfc
но к сожалению с условием
При каких-то условиях (если что-то там равно 2)
Как ответил ChaosPaladin - это условие
Можно предположить, что если данные параметры появляются у Вас в окне, на которое Вы ссылаетесь в первом посте, это условие выполняется и так же, как заметил ChaosPaladin
А fcfc это доп шанс и крит шанс
FC - это дополнительный шанс, а FC - это шанс крита.
Из этого следует, что
Расскажите какие?
в файлике, который называется "пакет" java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java в конце структуры записи для отправки в клиент
Код:
@Override
    public boolean write(PacketWriter packet)
    {
        final RecipeHolder recipe = RecipeData.getInstance().getRecipe(_id);
        if (recipe != null)
        {
            OutgoingPackets.RECIPE_ITEM_MAKE_INFO.writeId(packet);
            packet.writeD(_id);
            packet.writeD(recipe.isDwarvenRecipe() ? 0 : 1); // 0 = Dwarven - 1 = Common
            packet.writeD((int) _player.getCurrentMp());
            packet.writeD(_player.getMaxMp());
            packet.writeD(_success == null ? -1 : (_success ? 1 : 0)); // item creation none/success/failed
            packet.writeC(_offeringMaximumAdena > 0 ? 1 : 0); // Show offering window.
            packet.writeQ(_offeringMaximumAdena); // Adena worth of items for maximum offering.
            return true;
        }
        PacketLogger.info("Character: " + _player + ": Requested unexisting recipe with id = " + _id);
        return false;
    }
требуется дописать fcfc. То-есть чтобы получить следующую структуру:
Код:
@Override
    public boolean write(PacketWriter packet)
    {
        final RecipeHolder recipe = RecipeData.getInstance().getRecipe(_id);
        if (recipe != null)
        {
            OutgoingPackets.RECIPE_ITEM_MAKE_INFO.writeId(packet);
            packet.writeD(_id);
            packet.writeD(recipe.isDwarvenRecipe() ? 0 : 1); // 0 = Dwarven - 1 = Common
            packet.writeD((int) _player.getCurrentMp());
            packet.writeD(_player.getMaxMp());
            packet.writeD(_success == null ? -1 : (_success ? 1 : 0)); // item creation none/success/failed
            packet.writeC(_offeringMaximumAdena > 0 ? 1 : 0); // Show offering window.
            packet.writeQ(_offeringMaximumAdena); // Adena worth of items for maximum offering.
            packet.writeF(0);
            packet.writeC(0);
            packet.writeF(0);
            packet.writeC(0);
            return true;
        }
        PacketLogger.info("Character: " + _player + ": Requested unexisting recipe with id = " + _id);
        return false;
    }
Далее при помощи простых действий (на постижение которых у меня ушли годы) - сохраняем файлик с новой структурой - запускаем сервер в режиме отладки и при открытии меню, которое Вы показали в первом посте, смотреть отслеживение параметров и изменять их в самом коде пакета (путем изменения ноликов на единички и путем hotswap обновлять класс, которые запрашивает сервер. Или перезагружать сервер при каждом изменении параметра.
ОТВЕТ НА ГЛАВНЫЙ ВОПРОС.
У МОБИУСА ТАКОГО НЕТУ.
 

    MollyBloom

    Баллов: 1
    Спасибо за помощь
ОБЪЯСНЕНИЕ:
На приложеном Вами скриншоте мы все увидели недоработку, о которой Вы сообщили в посте как

Как Я и ChaosPaladin ответили, в пакете, который отправляет сервер клиенту при запросе на отображение окна, указаного Вами выше, параметры, такие как "не отображается бонус от этого умения", не прописаны в пакете. Вам мной было предложено перейти по пути java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java и лицезреть структуру пакета, который предстоит доработать для того, Вы получили результат.
Для получения результата, мной было предложено в конце пакета дописать

но к сожалению с условием

Как ответил ChaosPaladin - это условие

Можно предположить, что если данные параметры появляются у Вас в окне, на которое Вы ссылаетесь в первом посте, это условие выполняется и так же, как заметил ChaosPaladin

FC - это дополнительный шанс, а FC - это шанс крита.
Из этого следует, что

в файлике, который называется "пакет" java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java в конце структуры записи для отправки в клиент
Код:
@Override
    public boolean write(PacketWriter packet)
    {
        final RecipeHolder recipe = RecipeData.getInstance().getRecipe(_id);
        if (recipe != null)
        {
            OutgoingPackets.RECIPE_ITEM_MAKE_INFO.writeId(packet);
            packet.writeD(_id);
            packet.writeD(recipe.isDwarvenRecipe() ? 0 : 1); // 0 = Dwarven - 1 = Common
            packet.writeD((int) _player.getCurrentMp());
            packet.writeD(_player.getMaxMp());
            packet.writeD(_success == null ? -1 : (_success ? 1 : 0)); // item creation none/success/failed
            packet.writeC(_offeringMaximumAdena > 0 ? 1 : 0); // Show offering window.
            packet.writeQ(_offeringMaximumAdena); // Adena worth of items for maximum offering.
            return true;
        }
        PacketLogger.info("Character: " + _player + ": Requested unexisting recipe with id = " + _id);
        return false;
    }
требуется дописать fcfc. То-есть чтобы получить следующую структуру:
Код:
@Override
    public boolean write(PacketWriter packet)
    {
        final RecipeHolder recipe = RecipeData.getInstance().getRecipe(_id);
        if (recipe != null)
        {
            OutgoingPackets.RECIPE_ITEM_MAKE_INFO.writeId(packet);
            packet.writeD(_id);
            packet.writeD(recipe.isDwarvenRecipe() ? 0 : 1); // 0 = Dwarven - 1 = Common
            packet.writeD((int) _player.getCurrentMp());
            packet.writeD(_player.getMaxMp());
            packet.writeD(_success == null ? -1 : (_success ? 1 : 0)); // item creation none/success/failed
            packet.writeC(_offeringMaximumAdena > 0 ? 1 : 0); // Show offering window.
            packet.writeQ(_offeringMaximumAdena); // Adena worth of items for maximum offering.
            packet.writeF(0);
            packet.writeC(0);
            packet.writeF(0);
            packet.writeC(0);
            return true;
        }
        PacketLogger.info("Character: " + _player + ": Requested unexisting recipe with id = " + _id);
        return false;
    }
Далее при помощи простых действий (на постижение которых у меня ушли годы) - сохраняем файлик с новой структурой - запускаем сервер в режиме отладки и при открытии меню, которое Вы показали в первом посте, смотреть отслеживение параметров и изменять их в самом коде пакета (путем изменения ноликов на единички и путем hotswap обновлять класс, которые запрашивает сервер. Или перезагружать сервер при каждом изменении параметра.
ОТВЕТ НА ГЛАВНЫЙ ВОПРОС.
У МОБИУСА ТАКОГО НЕТУ.
частично ток согласен, структура немного другая но протоколы разные поэтому не буду критиковать
 
Java:
    @Override
    protected final void writeImpl()
    {
        writeC(0xDD);
        writeD(_recipe.getId());
        writeD(!_recipe.isDwarven());
        writeD(_curMp);
        writeD(_maxMp);
        writeD(_status); //итог крафта: 0xFFFFFFFF - нет статуса, 1 - удача, 0 - провал
        writeC(_recipe.getOffering() > 0);
        writeQ(_recipe.getOffering());
        writeF(_chanceAdd);
        writeC(_chanceCrit > 0);
        writeF(_chanceCrit);
    }
З.Ы. это рабочая структура для 286 протокола, но не думаю что ранее, с момента добавления этих полей, или позже были изменения в этом.
 
Ткните носом пож куда лезть искать?
При выученном умении Мастер Создания у крафтера при крафте не отображается бонус от этого умения
Посмотреть вложение 44444
кстати вру.
Чуть-чуть посмотрев (вот эти ваши нолики писал) нашел парочку статов
Stat.CRAFTING_CRITICAL и Stat.CRAFT_RATE

Ткните носом пож куда лезть искать?
При выученном умении Мастер Создания у крафтера при крафте не отображается бонус от этого умения
Посмотреть вложение 44444
Можете вот даже проверить...
Diff:
Index: java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java b/java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java
--- a/java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java   
+++ b/java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java    (date 1657757785005)
@@ -20,6 +20,7 @@
 import org.l2jmobius.gameserver.data.xml.RecipeData;
 import org.l2jmobius.gameserver.model.actor.Player;
 import org.l2jmobius.gameserver.model.holders.RecipeHolder;
+import org.l2jmobius.gameserver.model.stats.Stat;
 import org.l2jmobius.gameserver.network.OutgoingPackets;
 import org.l2jmobius.gameserver.network.PacketLogger;
 
@@ -65,6 +66,8 @@
     @Override
     public boolean write(PacketWriter packet)
     {
+        double craft_rate = _player.getStat().getValue(Stat.CRAFT_RATE, 0);
+        double craft_critical = _player.getStat().getValue(Stat.CRAFTING_CRITICAL, 0);
         final RecipeHolder recipe = RecipeData.getInstance().getRecipe(_id);
         if (recipe != null)
         {
@@ -76,6 +79,10 @@
             packet.writeD(_success == null ? -1 : (_success ? 1 : 0)); // item creation none/success/failed
             packet.writeC(_offeringMaximumAdena > 0 ? 1 : 0); // Show offering window.
             packet.writeQ(_offeringMaximumAdena); // Adena worth of items for maximum offering.
+            packet.writeF(Math.max(craft_rate, 100.0));
+            packet.writeC(craft_rate > 0 ? 1 : 0);
+            packet.writeF(Math.max(craft_critical, 100.0));
+            packet.writeC(craft_critical > 0 ? 1 : 0);
             return true;
         }
         PacketLogger.info("Character: " + _player + ": Requested unexisting recipe with id = " + _id);
Index: java/org/l2jmobius/gameserver/network/serverpackets/RecipeShopItemInfo.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/java/org/l2jmobius/gameserver/network/serverpackets/RecipeShopItemInfo.java b/java/org/l2jmobius/gameserver/network/serverpackets/RecipeShopItemInfo.java
--- a/java/org/l2jmobius/gameserver/network/serverpackets/RecipeShopItemInfo.java   
+++ b/java/org/l2jmobius/gameserver/network/serverpackets/RecipeShopItemInfo.java    (date 1657757934486)
@@ -18,6 +18,7 @@
 
 import org.l2jmobius.commons.network.PacketWriter;
 import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.stats.Stat;
 import org.l2jmobius.gameserver.network.OutgoingPackets;
 
 public class RecipeShopItemInfo implements IClientOutgoingPacket
@@ -49,6 +50,8 @@
     @Override
     public boolean write(PacketWriter packet)
     {
+        double craft_rate = _manufacturer.getStat().getValue(Stat.CRAFT_RATE, 0);
+        double craft_critical = _manufacturer.getStat().getValue(Stat.CRAFTING_CRITICAL, 0);
         OutgoingPackets.RECIPE_SHOP_ITEM_INFO.writeId(packet);
         packet.writeD(_manufacturer.getObjectId());
         packet.writeD(_recipeId);
@@ -58,6 +61,10 @@
         packet.writeQ(_manufacturePrice);
         packet.writeC(_offeringMaximumAdena > 0 ? 1 : 0); // Trigger offering window if 1
         packet.writeQ(_offeringMaximumAdena);
+        packet.writeF(Math.max(craft_rate, 100.0));
+        packet.writeC(craft_rate > 0 ? 1 : 0);
+        packet.writeF(Math.max(craft_critical, 100.0));
+        packet.writeC(craft_critical > 0 ? 1 : 0);
         return true;
     }
 }
Index: java/org/l2jmobius/gameserver/network/serverpackets/RecipeShopSellList.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/java/org/l2jmobius/gameserver/network/serverpackets/RecipeShopSellList.java b/java/org/l2jmobius/gameserver/network/serverpackets/RecipeShopSellList.java
--- a/java/org/l2jmobius/gameserver/network/serverpackets/RecipeShopSellList.java   
+++ b/java/org/l2jmobius/gameserver/network/serverpackets/RecipeShopSellList.java    (date 1657758086935)
@@ -20,6 +20,7 @@
 
 import org.l2jmobius.commons.network.PacketWriter;
 import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.stats.Stat;
 import org.l2jmobius.gameserver.network.OutgoingPackets;
 
 public class RecipeShopSellList implements IClientOutgoingPacket
@@ -36,6 +37,8 @@
     @Override
     public boolean write(PacketWriter packet)
     {
+        double craft_rate = _manufacturer.getStat().getValue(Stat.CRAFT_RATE, 0);
+        double craft_critical = _manufacturer.getStat().getValue(Stat.CRAFTING_CRITICAL, 0);
         OutgoingPackets.RECIPE_SHOP_SELL_LIST.writeId(packet);
         packet.writeD(_manufacturer.getObjectId());
         packet.writeD((int) _manufacturer.getCurrentMp()); // Creator's MP
@@ -53,6 +56,9 @@
                 packet.writeD(item.getKey());
                 packet.writeD(0); // CanCreate?
                 packet.writeQ(item.getValue());
+                packet.writeF(Math.max(craft_rate, 100.0));
+                packet.writeC(craft_rate > 0 ? 1 : 0);
+                packet.writeF(Math.max(craft_critical, 100.0));
             }
         }
         return true;
 
ОБЪЯСНЕНИЕ:
На приложеном Вами скриншоте мы все увидели недоработку, о которой Вы сообщили в посте как

Как Я и ChaosPaladin ответили, в пакете, который отправляет сервер клиенту при запросе на отображение окна, указаного Вами выше, параметры, такие как "не отображается бонус от этого умения", не прописаны в пакете. Вам мной было предложено перейти по пути java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java и лицезреть структуру пакета, который предстоит доработать для того, Вы получили результат.
Для получения результата, мной было предложено в конце пакета дописать

но к сожалению с условием

Как ответил ChaosPaladin - это условие

Можно предположить, что если данные параметры появляются у Вас в окне, на которое Вы ссылаетесь в первом посте, это условие выполняется и так же, как заметил ChaosPaladin

FC - это дополнительный шанс, а FC - это шанс крита.
Из этого следует, что

в файлике, который называется "пакет" java/org/l2jmobius/gameserver/network/serverpackets/RecipeItemMakeInfo.java в конце структуры записи для отправки в клиент
Код:
@Override
    public boolean write(PacketWriter packet)
    {
        final RecipeHolder recipe = RecipeData.getInstance().getRecipe(_id);
        if (recipe != null)
        {
            OutgoingPackets.RECIPE_ITEM_MAKE_INFO.writeId(packet);
            packet.writeD(_id);
            packet.writeD(recipe.isDwarvenRecipe() ? 0 : 1); // 0 = Dwarven - 1 = Common
            packet.writeD((int) _player.getCurrentMp());
            packet.writeD(_player.getMaxMp());
            packet.writeD(_success == null ? -1 : (_success ? 1 : 0)); // item creation none/success/failed
            packet.writeC(_offeringMaximumAdena > 0 ? 1 : 0); // Show offering window.
            packet.writeQ(_offeringMaximumAdena); // Adena worth of items for maximum offering.
            return true;
        }
        PacketLogger.info("Character: " + _player + ": Requested unexisting recipe with id = " + _id);
        return false;
    }
требуется дописать fcfc. То-есть чтобы получить следующую структуру:
Код:
@Override
    public boolean write(PacketWriter packet)
    {
        final RecipeHolder recipe = RecipeData.getInstance().getRecipe(_id);
        if (recipe != null)
        {
            OutgoingPackets.RECIPE_ITEM_MAKE_INFO.writeId(packet);
            packet.writeD(_id);
            packet.writeD(recipe.isDwarvenRecipe() ? 0 : 1); // 0 = Dwarven - 1 = Common
            packet.writeD((int) _player.getCurrentMp());
            packet.writeD(_player.getMaxMp());
            packet.writeD(_success == null ? -1 : (_success ? 1 : 0)); // item creation none/success/failed
            packet.writeC(_offeringMaximumAdena > 0 ? 1 : 0); // Show offering window.
            packet.writeQ(_offeringMaximumAdena); // Adena worth of items for maximum offering.
            packet.writeF(0);
            packet.writeC(0);
            packet.writeF(0);
            packet.writeC(0);
            return true;
        }
        PacketLogger.info("Character: " + _player + ": Requested unexisting recipe with id = " + _id);
        return false;
    }
Далее при помощи простых действий (на постижение которых у меня ушли годы) - сохраняем файлик с новой структурой - запускаем сервер в режиме отладки и при открытии меню, которое Вы показали в первом посте, смотреть отслеживение параметров и изменять их в самом коде пакета (путем изменения ноликов на единички и путем hotswap обновлять класс, которые запрашивает сервер. Или перезагружать сервер при каждом изменении параметра.
ОТВЕТ НА ГЛАВНЫЙ ВОПРОС.
У МОБИУСА ТАКОГО НЕТУ.
Спасибо за подробное описание. Буду пробовать.

З.Ы. При создании темы не нашёл хроники, и указал подходящие по протоколу 166, fafurion. У меня secret of empire classic, надеюсь разница будет не колоссальной

кстати вру.
Чуть-чуть посмотрев (вот эти ваши нолики писал) нашел парочку статов
Stat.CRAFTING_CRITICAL и Stat.CRAFT_RATE
Кстати критикал крафт(он же дабл крафт) тоже почему то не в рабочем состоянии. Нет ээфекта для него. Но пока хочу разобраться с обычным крафтом, котлрый просто добавляет шанс к успешному крафту. Указывая в коде скила 100%, то есть он работает хорошо, но не указывает в окне количество бонусных % за скилл
 
Назад
Сверху Снизу