Вопрос Фикс цены в наковальне

Версия Minecraft
1.16.X

Artur001

Пользователь
Сообщения
9
Хай!

Недавно написал плагин на улучшение зелий в наковальне, однако столкнулся с проблемой...
Суть заключается в том, что в моем плагине есть возможность улучшать сразу несколько зелий, и цена вместе с этим растет.
Однако, если улучшаешь слишком много, то в наковальне показывается "Слишком дорого", и это не только с моим плагином,
а вообще в целом в майнкрафте.

Так, вот, знаю что на холиворлде-лайт эта проблема зафикшена, у них напрямую отображается цена прямо в наковальне, а не
через какие то сообщения игроку и т.д...


Может кто нибудь знает, как сделать также? Может, нужно использовать ProtocolLib?
 
Привет!

Если правильно понимаю твой вопрос, то тебе достаточно просто искусственно установить стоимость починки. Подобное уже обсуждалось на форуме. Вот тут можешь посмотреть решение:
 
Привет!

Если правильно понимаю твой вопрос, то тебе достаточно просто искусственно установить стоимость починки. Подобное уже обсуждалось на форуме. Вот тут можешь посмотреть решение:
Привет!
Это не совсем что мне нужно, однако я уже нашёл решение но незнаю как его применить. Если интересно,
 
Привет!
Это не совсем что мне нужно, однако я уже нашёл решение но незнаю как его применить. Если интересно,
Ты хочешь просто отправить этот пакет?
 
Верно, это полностью исправит "Слишком дорого" в наковальне без всяких дополнительных сообщений игроку и так далее.
Не понимаю немного, как это должно помочь, но отправка твоего пакета при помощи ProtocolLib делается так:


Java:
public void sendPacket(Player player) {
    PacketContainer packet = new PacketContainer(PacketType.Play.Server.ABILITIES);
    
    
    byte flags = (byte) 0x08;
    
    packet.getBytes().write(0, flags);
    packet.getFloat().write(0, 0.05f);
    packet.getFloat().write(1, 0.1f);
    
    try {
        ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet);
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}

Вроде ничего не напутал...
 
Не понимаю немного, как это должно помочь, но отправка твоего пакета при помощи ProtocolLib делается так:


Java:
public void sendPacket(Player player) {
    PacketContainer packet = new PacketContainer(PacketType.Play.Server.ABILITIES);
   
   
    byte flags = (byte) 0x08;
   
    packet.getBytes().write(0, flags);
    packet.getFloat().write(0, 0.05f);
    packet.getFloat().write(1, 0.1f);
   
    try {
        ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet);
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}

Вроде ничего не напутал...
Омг! Очень оперативно, большое спасибо. Проверю чуть позже, сейчас чутка занят :)

Насчёт поможет или нет, я спрашивал напрямую у разраба холиворлд-лайта(там где эта проблема зафикшена), и он ответил то что нужно устанавливать именно этот флаг.
Также, ты мог заметить, что если ты находишься в режиме креатива, то в наковальне "Слишком дорого" для тебя пропадает, однако в выживании оно есть(в дефолтном Майнкрафте, без фиксов).

Возник ещё один маленький вопросик, отправку пакетов устанавливать при заходе игрока на сервер, или же в другом случае?
 
Омг! Очень оперативно, большое спасибо. Проверю чуть позже, сейчас чутка занят :)

Насчёт поможет или нет, я спрашивал напрямую у разраба холиворлд-лайта(там где эта проблема зафикшена), и он ответил то что нужно устанавливать именно этот флаг.
Также, ты мог заметить, что если ты находишься в режиме креатива, то в наковальне "Слишком дорого" для тебя пропадает, однако в выживании оно есть(в дефолтном Майнкрафте, без фиксов).

Возник ещё один маленький вопросик, отправку пакетов устанавливать при заходе игрока на сервер, или же в другом случае?
Чтобы не было "сюрпризов", лучше выдавать непосредственно после того, как предмет положили в наковальню, а после того, как зачарование применилось, отсылать пакет "наоборот", чтобы забрать его действие. Ибо, скорее всего, если его не забрать, то у игрока пропадёт лимит на наковальню в целом. С этим то справишься?)


offtop Я не уверен, что это решение лучшее, но вроде как, лучше лишний раз подумать о том, какие абилки игроку нужны, а какие нет
 
Последнее редактирование:
Чтобы не было "сюрпризов", лучше выдавать непосредственно после того, как предмет положили в наковальню, а после того, как зачарование применилось, отсылать пакета "наоборот", чтобы забрать его действие. С этим то справишься?)
Прикол в том, что мне нужно Не только на зачарования. Как я говорил, я написал плагин на улучшение зелий (зелье 2 уровня в 1 слот, и такое же во 2, после чего в 3 за плату в уровнях появляется улучшенное зелье 3 уровня).

Честно говоря, не уверен что справлюсь, однако очень сильно постараюсь, учитывая то, что я начал писать плагины совсем недавно.

К слову, забрать предмет из наковальни когда показывает "Слишком дорого" можно, однако без показывания требуемого уровня опыта. По сути говоря, наугад.
 
Последнее редактирование:
Чтобы не было "сюрпризов", лучше выдавать непосредственно после того, как предмет положили в наковальню, а после того, как зачарование применилось, отсылать пакет "наоборот", чтобы забрать его действие. Ибо, скорее всего, если его не забрать, то у игрока пропадёт лимит на наковальню в целом. С этим то справишься?)


offtop Я не уверен, что это решение лучшее, но вроде как, лучше лишний раз подумать о том, какие абилки игроку нужны, а какие нет
Вобщем, мне попросту выдало ошибку:
Код:
[16:41:32 ERROR]: Could not pass event InventoryClickEvent to XTAnvilPriceFix v1.0
com.comphenix.protocol.reflect.FieldAccessException: Field index 0 is out of bounds for length 0
        at com.comphenix.protocol.reflect.FieldAccessException.fromFormat(FieldAccessException.java:49) ~[?:?]
        at com.comphenix.protocol.reflect.StructureModifier.write(StructureModifier.java:318) ~[?:?]
        at com.example.xtanvilpricefix.XTAnvilPriceFix.sendPacketReverse(XTAnvilPriceFix.java:63) ~[?:?]
        at com.example.xtanvilpricefix.XTAnvilPriceFix.onInventoryClick(XTAnvilPriceFix.java:38) ~[?:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor1284.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69) ~[patched_1.16.5.jar:git-Paper-794]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.16.5.jar:git-Paper-794]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.16.5.jar:git-Paper-794]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:624) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:2715) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.PacketPlayInWindowClick.a(SourceFile:32) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.PacketPlayInWindowClick.a(SourceFile:10) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.PlayerConnectionUtils.lambda$ensureMainThread$1(PlayerConnectionUtils.java:35) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:1271) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:1264) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:1225) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1139) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:291) ~[patched_1.16.5.jar:git-Paper-794]
        at java.lang.Thread.run(Thread.java:831) [?:?]
 
Вобщем, мне попросту выдало ошибку:
Код:
[16:41:32 ERROR]: Could not pass event InventoryClickEvent to XTAnvilPriceFix v1.0
com.comphenix.protocol.reflect.FieldAccessException: Field index 0 is out of bounds for length 0
        at com.comphenix.protocol.reflect.FieldAccessException.fromFormat(FieldAccessException.java:49) ~[?:?]
        at com.comphenix.protocol.reflect.StructureModifier.write(StructureModifier.java:318) ~[?:?]
        at com.example.xtanvilpricefix.XTAnvilPriceFix.sendPacketReverse(XTAnvilPriceFix.java:63) ~[?:?]
        at com.example.xtanvilpricefix.XTAnvilPriceFix.onInventoryClick(XTAnvilPriceFix.java:38) ~[?:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor1284.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69) ~[patched_1.16.5.jar:git-Paper-794]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.16.5.jar:git-Paper-794]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.16.5.jar:git-Paper-794]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:624) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:2715) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.PacketPlayInWindowClick.a(SourceFile:32) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.PacketPlayInWindowClick.a(SourceFile:10) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.PlayerConnectionUtils.lambda$ensureMainThread$1(PlayerConnectionUtils.java:35) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:1271) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:1264) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:1225) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1139) ~[patched_1.16.5.jar:git-Paper-794]
        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:291) ~[patched_1.16.5.jar:git-Paper-794]
        at java.lang.Thread.run(Thread.java:831) [?:?]
Скорее всего я где-то ошибся, проверь данные, которые передаются. Я не дома пока
 
Однако, если улучшаешь слишком много, то в наковальне показывается "Слишком дорого", и это не только с моим плагином,
а вообще в целом в майнкрафте.
Так это не баг, так и должно быть
Чтобы предметы не чинили снова и снова

Ремонтировать (модифицировать) предметы нельзя, если стоимость починки превысит 50 уровней
Можешь банально сбросить тег, который отвечает за цену починки
 
Так это не баг, так и должно быть
Чтобы предметы не чинили снова и снова

Ремонтировать (модифицировать) предметы нельзя, если стоимость починки превысит 50 уровней
Можешь банально сбросить тег, который отвечает за цену починки
Я знаю что так и должно быть, однако мне нужно это обойти.

Когда показывает "Слишком дорого" предмет все еще можно забрать с наковальни, однако по сути наугад с ценой ремонта.
 
Назад
Сверху Снизу