Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Плагин [SEC/FIX] DupeFixer v3.2 - фикс дюпов, багов, X-Ray [>=1.9]

Готово! Я не пожалел несколько часов своего времени и накатил обновление. Оптимизировал код, поубирал баги, добавил новый фикс. Смотрите историю версий.

Вот думаю надо ли добавлять чистку предметов с нестандартным уровнем зачарования или это лишнее?
 
В Крае, если это измерение. На краю, если это краешек чего-то (прим.: край стола).
Выделил три отличительных признака
В Энде — если это измерение. В крае — если это Пермский край или Красноярский ;)

Вот думаю надо ли добавлять чистку предметов с нестандартным уровнем зачарования или это лишнее?

Мне кажется вполне вписывается в концепцию плагина, только должно быть полностью настраиваемо и отключаемо.
 
Готово! Я не пожалел несколько часов своего времени и накатил обновление. Оптимизировал код, поубирал баги, добавил новый фикс. Смотрите историю версий.

Вот думаю надо ли добавлять чистку предметов с нестандартным уровнем зачарования или это лишнее?
Вот держи, а то опять наговнокодишь :D.

Java:
@EventHandler
  public void onItemDrop(PlayerDropItemEvent e) {
      Item it = e.getItemDrop();
      removeEnt(it.getItemStack());
  }

  @EventHandler
  public void onPlayerInteract(PlayerInteractEvent e) {
    if (e.getItem() != null) {
        ItemStack it = e.getItem();
        boolean b = removeEnt(it);
        e.setCancelled(b);
    }
  }

  @EventHandler
  public void InventoryClick(InventoryClickEvent e) {
    if (e.getCurrentItem() != null) {
        ItemStack it = e.getCurrentItem();
        removeEnt(it);
    }
  }

  @EventHandler
  public void onPickupItem(PlayerPickupItemEvent e) {
      Item it = e.getItem();
      removeEnt(it.getItemStack());
  }

  @EventHandler
  public void onEntityDamage(EntityDamageEvent e) {
      Entity ent = e.getEntity();
      if ((ent instanceof Player)) {
          Player p = (Player)ent;
          for(ItemStack it : p.getInventory().getArmorContents()) {
              removeEnt(it);
          }
      }
  }

  boolean removeEnt(ItemStack it) {
      boolean b = false;
        for(Entry<Enchantment, Integer> ench : it.getEnchantments().entrySet()) {
            Enchantment E = (Enchantment) ench.getKey();
            if(ench.getValue() > E.getMaxLevel()) {
              ItemMeta m = it.getItemMeta();
              m.removeEnchant(E);
              it.setItemMeta(m);
              b=true;
            }
        }
    return b;
  }

Вот держи, а то опять наговнокодишь :D.

Java:
@EventHandler
  public void onItemDrop(PlayerDropItemEvent e) {
      Item it = e.getItemDrop();
      removeEnt(it.getItemStack());
  }

  @EventHandler
  public void onPlayerInteract(PlayerInteractEvent e) {
    if (e.getItem() != null) {
        ItemStack it = e.getItem();
        boolean b = removeEnt(it);
        e.setCancelled(b);
    }
  }

  @EventHandler
  public void InventoryClick(InventoryClickEvent e) {
    if (e.getCurrentItem() != null) {
        ItemStack it = e.getCurrentItem();
        removeEnt(it);
    }
  }

  @EventHandler
  public void onPickupItem(PlayerPickupItemEvent e) {
      Item it = e.getItem();
      removeEnt(it.getItemStack());
  }

  @EventHandler
  public void onEntityDamage(EntityDamageEvent e) {
      Entity ent = e.getEntity();
      if ((ent instanceof Player)) {
          Player p = (Player)ent;
          for(ItemStack it : p.getInventory().getArmorContents()) {
              removeEnt(it);
          }
      }
  }

  boolean removeEnt(ItemStack it) {
      boolean b = false;
        for(Entry<Enchantment, Integer> ench : it.getEnchantments().entrySet()) {
            Enchantment E = (Enchantment) ench.getKey();
            if(ench.getValue() > E.getMaxLevel()) {
              ItemMeta m = it.getItemMeta();
              m.removeEnchant(E);
              it.setItemMeta(m);
              b=true;
            }
        }
    return b;
  }
P.s Креативщики еще умеют изменять имя и лоре предмета, вписывать там свою рекламу. Но тут уже нужен индивидуальный фильтр под сервер.
Есть еще вариант отменять такие пакеты от клиента через протоколлиб. Тогда фикс будет универсальным от чарки, лоре и имени предмета.
 
Дюп с нулевым количеством актуален, но не так как раньше. Вот что получается: из сломанного сундука 1 предмет на земле, второй кладем в раздатчик - он выплевывает 1 раз. Итого у нас 2 предмета. Можно дюпать дорогие предметы, хоть и рискованно. На какой из 1.7 работает как надо не знаю, предположительно 1.7.2 (плагин на ней не тестировался).

Дюп с вагонеткой / ослом в ад актуален.

Дюп растений актуален на 1.7 и первых 1.8, не знаю точно до какой версии.

Дюп рельс убрали только в одной из 1.8 (лень искать коммит).

Визуальные дюпы быстрыми кликами актуальны для 1.7-1.8, но есть одна вариация, которая пока не фиксится. Позволяет визуально дюпнуть броню, защищает ли она реально - не знаю. На 1.6 и ниже говорят что реально, вполне возможно что на 1.7 тоже. Можно зафиксить только черезпопно, поэтому пока не делаю. Еще кто-то в помощи говорил что на 1.7 быстрыми кликами можно реально размножить вещи, например через наковальню.

Дюп с воронками в множественных вариантах актуален, зафиксить не могу - нет ивентов. И вряд ли они вообще помогут, похоже что очень хреново их реализовали. Игрок построил механизм, который создает алмазы в бешеном количестве.
@Shevchik может ты зафиксишь в тик оптимизере? Суть в том чтобы прогнать предметы по куче воронок, в конце их магическим образом становится больше. К сожалению, видео потерялось.

Дюп с выбрасыванием, выходом и поднятием, как выяснилось, работает не только в одиночке. Попробую что-нибудь придумать.

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

Еще есть популярные дюпы с помощью багов WorldGuard и ChestShop, ими пока что нет желания заниматся.

Вот так, а кто-то тут пердел что плагин не нужен :lol::lol::lol:

Мне кажется вполне вписывается в концепцию плагина, только должно быть полностью настраиваемо и отключаемо.
Добавлю как только еще что-нибудь интересное допишу. У меня код уже есть, просто я его не добавлял конкретно в этот плагин.
 
Дюп с нулевым количеством актуален, но не так как раньше. Вот что получается: из сломанного сундука 1 предмет на земле, второй кладем в раздатчик - он выплевывает 1 раз. Итого у нас 2 предмета. Можно дюпать дорогие предметы, хоть и рискованно. На какой из 1.7 работает как надо не знаю, предположительно 1.7.2 (плагин на ней не тестировался).

Дюп с вагонеткой / ослом в ад актуален.

Дюп растений актуален на 1.7 и первых 1.8, не знаю точно до какой версии.

Дюп рельс убрали только в одной из 1.8 (лень искать коммит).

Визуальные дюпы быстрыми кликами актуальны для 1.7-1.8, но есть одна вариация, которая пока не фиксится. Позволяет визуально дюпнуть броню, защищает ли она реально - не знаю. На 1.6 и ниже говорят что реально, вполне возможно что на 1.7 тоже. Можно зафиксить только черезпопно, поэтому пока не делаю. Еще кто-то в помощи говорил что на 1.7 быстрыми кликами можно реально размножить вещи, например через наковальню.

Дюп с воронками в множественных вариантах актуален, зафиксить не могу - нет ивентов. И вряд ли они вообще помогут, похоже что очень хреново их реализовали. Игрок построил механизм, который создает алмазы в бешеном количестве.
@Shevchik может ты зафиксишь в тик оптимизере? Суть в том чтобы прогнать предметы по куче воронок, в конце их магическим образом становится больше. К сожалению, видео потерялось.

Дюп с выбрасыванием, выходом и поднятием, как выяснилось, работает не только в одиночке. Попробую что-нибудь придумать.

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

Еще есть популярные дюпы с помощью багов WorldGuard и ChestShop, ими пока что нет желания заниматся.

Вот так, а кто-то тут пердел что плагин не нужен :lol::lol::lol:


Добавлю как только еще что-нибудь интересное допишу. У меня код уже есть, просто я его не добавлял конкретно в этот плагин.
Почти всё описанное на 1.8.8 не пашет, зафиксили. С воронками такой дюп ловил опять же только на версии где есть Hopper Tick Scheduling, там косяк на косяке, но его убрали, и есть он только в PaperSpigot.
 
Почти всё описанное на 1.8.8 не пашет, зафиксили.
Ну оно не у всех ведь, потому выкладываю.
С воронками такой дюп ловил опять же только на версии где есть Hopper Tick Scheduling, там косяк на косяке, но его убрали
а в какой версии убрали?

Уже запилил фикс дюпа брони, сейчас еще два фикса добавлю и выложу новую версию.
Ну и денек сегодня, с 4-5 часов утра сижу над кодом. Вот что добвил в 1.4:
  • удалялка нестандартно зачаренных предметов (не палит новые атрибуты отсюда)
  • удалялка нестандартных зелий
  • фикс дюпа быстрым поднятием вещи и выходом из игры (сам дюп не тестировал)
Дюп брони только визуальный, когда урон получаешь как будто ее нету. Зафиксить не смог и не хочу. Тестировал на 1.7.9 и на последней версии 1.8.8

Остальные потенциально рабочие дюпы пока не тестировал. Все, отдых.
 
Ну оно не у всех ведь, потому выкладываю.

а в какой версии убрали?

Уже запилил фикс дюпа брони, сейчас еще два фикса добавлю и выложу новую версию.
Ну и денек сегодня, с 4-5 часов утра сижу над кодом. Вот что добвил в 1.4:
  • удалялка нестандартно зачаренных предметов (не палит новые атрибуты отсюда)
  • удалялка нестандартных зелий
  • фикс дюпа быстрым поднятием вещи и выходом из игры (сам дюп не тестировал)
Дюп брони только визуальный, когда урон получаешь как будто ее нету. Зафиксить не смог и не хочу. Тестировал на 1.7.9 и на последней версии 1.8.8

Остальные потенциально рабочие дюпы пока не тестировал. Все, отдых.
Кастомные атрибуты я не смог заюзать на спайготе, удаляются сами. Так что не критично.
 
На 1.8.7 работают, сделал себе меч на 1000лвл урон. А вот на 1.7.9 нифига.
Надо попробовать, а то я сколько не мучил модификаторы, все удалялось. Хотел ради интереса их вывести.
Теперь я хоть знаю как оно выводится :).
Код:
{id:"minecraft:wooden_sword",Damage:0s,Count:1b,tag:{AttributeModifiers:[0:{Name:"generic.maxHealth",Amount:20,Operation:0,UUIDLeast:306581,UUIDMost:22120,AttributeName:"generic.maxHealth"}],RepairCost:1,ench:[0:{id:35s,lvl:3s}]}}

Вот тебе костыль для определения AttributeModifiers.

Java:
    boolean getAttributeModifiers(ItemStack it) {
          NBTTagCompound itemTag = new NBTTagCompound();
          CraftItemStack craft = CraftItemStack.asCraftCopy(it);
          CraftItemStack.asNMSCopy(craft).save(itemTag);
          if(itemTag.get("tag")!=null) {
              if(((NBTTagCompound) itemTag.get("tag")).hasKey("AttributeModifiers")) {
                  return true;
              }
          }
          return false;
    }
 
Fixes.java:65 - Сравнение String с Enum.

Уже лучше. Но можно ещё лучше.
http://puu.sh/klk7u/0969cf28aa.zip
Навигация по Fixes.java: //Adds, //Fixes, //Edit .
ты меня опередил с реализацией locToString :D
а насчет остального, может потом покопаюсь с сокращенными вариантами, мне пока так привычнее
Java:
    boolean getAttributeModifiers(ItemStack it) {
          NBTTagCompound itemTag = new NBTTagCompound();
          CraftItemStack craft = CraftItemStack.asCraftCopy(it);
          CraftItemStack.asNMSCopy(craft).save(itemTag);
          if(itemTag.get("tag")!=null) {
              if(((NBTTagCompound) itemTag.get("tag")).hasKey("AttributeModifiers")) {
                  return true;
              }
          }
          return false;
    }
лучше скажи откуда классы импортить и чтобы это все не крашилось на 1.7
 
ты меня опередил с реализацией locToString :D
а насчет остального, может потом покопаюсь с сокращенными вариантами, мне пока так привычнее

лучше скажи откуда классы импортить и чтобы это все не крашилось на 1.7
С чего оно крашить должно то? Вроде все проверки воткнул. И да в идеале тут нужна рефлексия под быдлопакеты, не дружу с ней.
 
С чего оно крашить должно то? Вроде все проверки воткнул. И да в идеале тут нужна рефлексия под быдлопакеты, не дружу с ней.
Так пути то к классам разные. Для 1.8:
Код:
import net.minecraft.server.v1_8_R3.NBTTagCompound;
Либу брал от шевчика, которая у него в тик оптимизере приложена.
 
ну и фиг с ним тогда, если у кого раздачи пусть пилят свое решение, под конкретную версию можно же без магии
 
ну и фиг с ним тогда, если у кого раздачи пусть пилят свое решение, под конкретную версию можно же без магии
В принципе можно обойтись и без рефлексий, создав для отдельной версии отдельный класс, как это сделано тут
Но если хочется поизвращаться с рефлексиями, то:
Java:
boolean getAttributeModifiers(ItemStack it) {
    String version = "v1_7_R4"; // Тут надо находить версию, мне лень
   
    try {
        Class nbtCompoundClass = Class.forName("net.minecraft.server." + version + ".NBTTagCompound");
        Class craftItemStackClass = Class.forName("org.bukkit.craftbukkit." + version + ".CraftItemStack");
        Class nmsItemStackClass = Class.forName("net.minecraft.server." + version + ".inventory.ItemStack");

        Object itemTag = nbtCompoundClass.getConstructor().newInstance();
        Object craft = craftItemStackClass.getMethod("asCraftCopy", ItemStack.class).invoke(null, it);
        Object nms = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, craft);
        nmsItemStackClass.getMethod("save", nbtCompoundClass).invoke(nms, itemTag);
       
        Method getMethod = nbtCompoundClass.getMethod("get", String.class);
        if (getMethod.invoke(itemTag, "tag") != null) {
            if ((boolean) nbtCompoundClass.getMethod("hasKey", String.class).invoke(getMethod.invoke(itemTag, "tag"), "AttributeModifiers")) {
                return true;
            }
        }
    } catch (ReflectiveOperationException e) {
        e.printStackTrace();
    }

    return false;
}

Честно? Я бы юзал первый способ. Хотя мне было бы интересно запустить этот код, чтобы проверить работает-ли он.
 
Последнее редактирование:
лучше бы написали что то глобальное,которое лечит само понятие дюп.
 
лучше бы написали что то глобальное,которое лечит само понятие дюп.
Это моджангу сказать надо. TickOptimizer от шевчика должен более нормально фиксить разные штуки, но я не знаю какие именно.
 

Поделиться этой страницей

Назад
Верх