1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Совет Популярный код для начинающих

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем Mik1313, 30 сен 2012.

?

Полезно?

  1. Да.

    52 голосов
    56,5%
  2. Нет.

    3 голосов
    3,3%
  3. Пойду поем.

    37 голосов
    40,2%
  1. Автор темы
    Mik1313

    Mik1313 Старожил Девелопер Пользователь

    Баллы:
    153
    И так, в голову пришла мысль о том, что бы собрать в одной теме разный код, полезный и не только.

    Список:

    1. Совсем недавно поднималась тема о замене итема дропа блока. Пока что не совсем проверена рациональность данного кода, но всё же.

    Вот код:
    Код:
    @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
    public void onBreak(BlockBreakEvent event) {
    Block block = event.getBlock();
    World world = block.getWorld();
    if(event.getBlock().getType().equals(Material.STONE)){ //если при разрушении блока, материал=STONE (камень), то
    Bukkit.getServer().broadcastMessage("New drop set!"); //вывод сообщения
    ItemStack drop = new ItemStack(Material.ICE, 1); //установка итема для дропа
    event.getBlock().setType(Material.AIR); //замена блока (который разрушали) воздухом
    world.dropItem(block.getLocation(), drop); //имитация дропа итема по координатам разрушеного блока
    }
    }
    Если что то не так, то отпишите.

    2. Опять же в одной теме недавно видел реализацию создания нового рецепта для крафта из оригинальных предметов. Возможно и из предметов модов.
    Вот код:
    Код:
    ShapedRecipe craft3 = new ShapedRecipe(new ItemStack(Material.getMaterial(262), 6)); //при крафте получим итем с ид=262 и в кол-во=6
    craft3.shape(new String[] { "CAC", "CBC", "CDC" }); //расположение элементов (сверху вниз)
    //установка ингридиентов
    craft3.setIngredient('A', Material.getMaterial(265)); //А = материал с ид=265
    craft3.setIngredient('B', Material.getMaterial(280)); //B материал с ид=280
    craft3.setIngredient('D', Material.getMaterial(339)); //D материал с ид=339
    getServer().addRecipe(craft3); //после установки рецепта, его добовление
    И ещё. Для того что бы использовать доп. индекс. (у цвет. досок - 5:2)
    Надо использовать:

    Код:
    craft3.setIngredient('D', Material.getMaterial(5), (byte)2) //таким образом для крафта будет нужно цветные доски с ид=5:2

    3. Как то мне требовалось узнать ник убийцы игрока при смерти.
    Вот код:
    Код:
    @EventHandler
    public void onDeath(PlayerDeathEvent e) {
    Player player = e.getEntity();
    Player killer = player.getKiller(); //получаем "киллера"
    String killername = killer.getName(); //получаем ник "киллера"
    }
    4. Так же требовалось программно выдать игроку предмет.
    Вот код:
    Код:
    PlayerInventory inv = p.getInventory();
    inv.addItem(new ItemStack(4, 64)); //выдаём предмет с ид=4 и в кол-во=64
    5. Взаимодействие с экономикой. Нужно кинуть в библиотеку плагин iConomy.
    Вот код:
    Код:
    Holdings h1 = new Account(player.getName()).getHoldings();
    double balance1 = h1.getBalance(); //получаем счёт игрока
    h1.setBalance(balance1 + 100); //добовляем к его деньгам 100
    player.sendMessage(ChatColor.GOLD + "Вы получили 100$"); //пишем в чат сообщение
    6. Код для использования Permissons. Намного проще чем код в туторе. DmitriyMX'a.
    Вот код:
    Код:
    if(player.hasPermission("some.pointless.permission")) { //если есть права - some.pointless.permission
    //что то выполняется
    }else{ //если же нет таких прав
    //что то выполняется
    }
    7. Кик игрока с причиной.
    Вот код.
    Код:
    Допустим у нас есть событие смерти игрока.
    
    @EventHandler
    public void onDeath(PlayerDeathEvent e) {
    Player player = e.getEntity();
    player.kickPlayer("This is a kick message!");
    }
    8. Установка параметров игрока. Не все знают...
    Вот код:
    Код:
    player.setExp(1000); //установка опыта
    player.setHealth(10); //установка хп
    player.setFoodLevel(10); //установка еды
    //тоже самое с get (?)
    9. Установка блока на территорию с учётом привата. Сам не пробовал.
    Спасибо fromgate за этот код:
    Код:
    public boolean PlaceBlock(Location loc, Player p, Material newType, byte newData, boolean phys){
    return PlaceBlock (loc.getBlock(),p,newType,newData, phys);
    }
    
    public boolean PlaceBlock(Block block, Player p, Material newType, byte newData, boolean phys){
    BlockState state = block.getState();
            block.setTypeIdAndData(newType.getId(), newData, phys);
    BlockPlaceEvent event = new BlockPlaceEvent(state.getBlock(), state, block, p.getItemInHand(), p, true);
    this.getServer().getPluginManager().callEvent(event);
    if (event.isCancelled()) state.update(true);
    return event.isCancelled();
    }
    
    //неплохо было бы добавить описание к строчкам кода...
    10. Хороший "повторитель". Повторяет действие через n-времени.
    За этот код опять спасибо fromgate:
    Код:
    int tid = 0; // где-то определили переменную, идентификатор задачи
    boolean tid_active=false; // если = true - задача выполняется
    
    // процедура рестарта задачи
    // время повтора и задержки первого выполнения задается в тиках.
    // 1 sec = 20;
    // 1 min = 1200
    // 1 hour = 72000
    // 24 hour = 1728000
    public void restartTick(Long repeat_time, Long delay_time){
    if (tid_active) Bukkit.getScheduler().cancelTask(tid);
            tid_active = true;
    tid = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){
    public void run (){
    // Повторяющиеся действия
    }
    }, delay_time, repeat_time);
    }
    11. Обработка получения урона. С помощью этого можно сделать следующее: допустим если падаем, но одеты в кожаные ботинки, то урон мы отменяем.
    Вот код:
    Код:
    @EventHandler
    public void onEntityDamage(EntityDamageEvent event) {
    if (event.getCause() == DamageCause.DROWNING) {
    //что то делаеться
    }
    }
    
    //DROWNING - это утопление (когда кислород=0)
    //что ещё может быть:
    // BLOCK_EXPLOSION
    // ENTITY_ATTACK
    // ENTITY_EXPLOSION
    // FALL
    // FIRE
    // FIRE_TICK
    // LAVA
    // LIGHTNING
    // SUFFOCATION
    // VOID
    // CONTACT
    // CUSTOM
    
    Так же, для получения ника игрока которому наноситься урон:
    Код:
    Entity entity = event.getEntity();
    Player player = (Player) entity;
    
    //и для отмены или установки урона
    event.setCancelled(true); //отмена
    event.setDamage(0); //0-урона
    12. Выдача денег через Essentials ECO (?). Кидаем Essentials.jar в библиотеку.
    Сам код:
    Код:
    try {
        double b1 = com.earth2me.essentials.api.Economy.getMoney(player.getName()); //получаем текущее кол-во денег
        com.earth2me.essentials.api.Economy.setMoney(player.getName(), b1 + 100); //плюсуем к нему 100
    } catch (UserDoesNotExistException e1) {
        e1.printStackTrace();
    } catch (NoLoanPermittedException e2) {
        e2.printStackTrace();
    }
    
    13. Работа с Vault. Кидаем Vault.jar в библиотеку.
    Сам код:
    Код:
    public static Economy economy = null;
    
    private boolean setupEconomy()
    {
    RegisteredServiceProvider<Economy> economyProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
    if (economyProvider != null) {
    economy = economyProvider.getProvider();
    }
    return (economy != null);
    }
    
    //ставим где надо:
    if (setupEconomy()==true) {
    economy.depositPlayer(ник, кол-во); //выдаём деньги
    }
    13. Проверка во что одет игрок. Шлем, Кираса, Поножи, Ботинки.
    Сам код:
    Код:
    if (player.getInventory().getHelmet() != null && player.getInventory().getHelmet().getType() == Material.getMaterial(298)) { //если игрок одет в материал с идом=298 (кожаный шлем) то
    //что-то
    }
     
    Последнее редактирование: 9 янв 2014
    cookie_Dice, Official_dizziel, Teozard и 32 другим нравится это.
  2. Valletta

    Valletta Старожил Пользователь

    Баллы:
    153
    Skype:
    kontakt-best
    Имя в Minecraft:
    Valletta
    Ставлю лайк, думаю, новичкам будет очень полезно. Для себя тоже извлек нечто новое. Спасибо :)
     
    Mik1313 нравится это.
  3. Valletta

    Valletta Старожил Пользователь

    Баллы:
    153
    Skype:
    kontakt-best
    Имя в Minecraft:
    Valletta
    Так для новичков же :)
     
  4. Dedok13x

    Dedok13x Активный участник

    Баллы:
    78
    Как сделать таймер, раз в сутки например? И опыт чтобы можно было менять
     
  5. Zeluboba

    Zeluboba Старожил Девелопер Пользователь

    Баллы:
    103
    Имя в Minecraft:
    Zeluboba
    да, новички, точно, простите)
    но усложнять зачем?) даже для новичков - ересь) кому нужно столько кастов?)
     
    HoShiMin и Сникерсни нравится это.
  6. Valletta

    Valletta Старожил Пользователь

    Баллы:
    153
    Skype:
    kontakt-best
    Имя в Minecraft:
    Valletta
    http://rubukkit.org/forums/help/ - милости просим сюда.
     
  7. ufes

    ufes Старожил Девелопер Пользователь

    Баллы:
    173
    Что такое касты?
    Код:
    @EventHandler
    public void onDeath(PlayerDeathEvent e) {
    String killername = e.getEntity().getKiller().getName(); //получаем ник "киллера"
    }
     
    Mik1313 нравится это.
  8. Valletta

    Valletta Старожил Пользователь

    Баллы:
    153
    Skype:
    kontakt-best
    Имя в Minecraft:
    Valletta
    Да пусть, ничего плохого из этого не будет. Работает? Работает!
    Иногда упростив код, стабильность работы пропадает.
     
  9. hubridos

    hubridos Старожил Пользователь

    Баллы:
    103
    Skype:
    hubridos
    Имя в Minecraft:
    Hubrid
    @Mik1313, получай + , многим людям помог наверное)
     
    slavik123123123 нравится это.
  10. mayor123

    mayor123 Старожил Девелопер Пользователь

    Баллы:
    173
    Код:
    Object packetObj = ...;
    Packet packet = (Packet) packetObj; // Это каст
    А то, что ты написал - присвоение экземпляру класса Player значения, которое возвращает функция getPlayer() из экземляра класса, который наследует класс PlayerEvent.
    А playerpoimeniplohoichelovek .equals("PlohoiChelovek") - условный оператор с функцией equals из класса Object (класс Object наследуют все классы Java), которая возвращает, равен ли один объект (экземпляр класса) другому.
    И да, думаю, что ты хотел написать так:
    Код:
    playerpoimeniplohoichelovek.getName().equals("PlohoiChelovek")
    P.S. То, что ты назвал кастами - методы.
     
    Mik1313 и ufes нравится это.
  11. mayor123

    mayor123 Старожил Девелопер Пользователь

    Баллы:
    173
    Твой метод тоже работает, но есть ещё варианты. Можно делать таймер например, через Sheluder, но я предпочитаю так:
    1. Создаем класс, делаем его наследником Thread.
    2. Создаем в этом классе публичный метод типа void run().
    3. Ну например, в onEnable создаем экземпляр нашего класса и вызываем метод start() класса.
     
    Mik1313 нравится это.
  12. ufes

    ufes Старожил Девелопер Пользователь

    Баллы:
    173
    fromgate, ты сможешь сказать кто прав, а кто нет? (заодно подчистить тред)
    И ещё призываю smilesdc & smile42ru
     
  13. smilesdc

    smilesdc Няша Модератор

    Баллы:
    153
    Имя в Minecraft:
    smilesdc
    Ну, как бы mayor123 прав.
    Вот тоже какие-то касты :D
    Код:
    public class CastSpeed {
     
        public static void main(String[] args) {
            long start = System.currentTimeMillis();
            Object o = new ArrayList<Object>();
            ArrayList<Object> al = new ArrayList<Object>();
            for(long i=0; i < 10000000000l; i++) {
                ArrayList<Object> a = (ArrayList<Object>) o;
                a.size();
            }
            System.out.println("Сast: "+(System.currentTimeMillis()-start));
            start = System.currentTimeMillis();
            for(long i=0; i < 10000000000l; i++) {
                ArrayList<Object> a = al;
                a.size();
            }
            System.out.println("Out Cast: "+(System.currentTimeMillis()-start));
        }
     
    }
     
    ufes нравится это.
  14. smilesdc

    smilesdc Няша Модератор

    Баллы:
    153
    Имя в Minecraft:
    smilesdc
    Вот пример самого элементарного каста в Bukkit:

    Код:
    Player player = (Player) sender;
     
    Black-UK-Lord и mayor123 нравится это.
  15. smilesdc

    smilesdc Няша Модератор

    Баллы:
    153
    Имя в Minecraft:
    smilesdc
    Еще, можно кастовать фаерболы :D
     
    fromgate, ufes и Mik1313 нравится это.
  16. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Самый рулез - это кастовать файерболлы. А вообще я в терминологии не силён: банально забыл, поскольку учился программировать очень давно и уже лет восемь как сменил специальность. Джава для меня это хобби.

    В любом случае тема полезна. Предлагаю, если с чем-то не согласны - писать конкретно с чем и давать свой вариант кода. Нет своего варианта кода - воздерживайтесь. Мне кажется справедливый вариант - выиграют все.

    Чуть позже выложу парочку своих процедур.
     
  17. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Уже где-то ранее приводил, но можно повториться и тут.
    Процедура установки блока с учетом того запривачена территория или нет. Метод хорош своей универсальностью - т.е. поддерживается любой плагин привата (который отменяет событие BlockPlaceEvent).

    Код:
        public boolean PlaceBlock(Location loc, Player p, Material newType, byte newData, boolean phys){
            return PlaceBlock (loc.getBlock(),p,newType,newData, phys);
        }
     
        public boolean PlaceBlock(Block block, Player p, Material newType, byte newData, boolean phys){
            BlockState state = block.getState();
            block.setTypeIdAndData(newType.getId(), newData, phys);
            BlockPlaceEvent event = new BlockPlaceEvent(state.getBlock(), state, block, p.getItemInHand(), p, true);
            this.getServer().getPluginManager().callEvent(event);
            if (event.isCancelled()) state.update(true);
            return event.isCancelled();
        }
    
     
    ПриветОтМиднайта нравится это.
  18. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Я для повторяющихся задач использую что-то вроде:

    Код:
    int tid = 0; // где-то определили переменную, идентификатор задачи
    boolean tid_active=false; // если = true - задача выполняется
     
    // процедура рестарта задачи
    // время повтора и задержки первого выполнения задается в тиках.
    // 1 sec = 20;
    // 1 min = 1200
    // 1 hour = 72000
    // 24 hour = 1728000
        public void restartTick(Long repeat_time, Long delay_time){
            if (tid_active) Bukkit.getScheduler().cancelTask(tid);
            tid_active = true;
            tid = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){
                public void run (){
                    // Повторяющиеся действия
                }
            }, delay_time, repeat_time);   
        }
    
    Это баккитовский шедуллер, выполняется в основном потоке сервера. Безопасен с точки зрения действий с блоками и т.п. Но подвисание такой задачи приведет к зависанию сервера.
     
    Dedok13x, BoJlk, mayor123 и 2 другим нравится это.
  19. DmitriyMX

    DmitriyMX Старожил Пользователь

    Баллы:
    153
    Skype:
    dmn550
    Просьба к оформлению первого топика:
    Сделать сначала содержание, а ниже уже "разжевывать".

    пример:

    --------------------------------------
    1. замене итема дропа блока
    2. создания нового рецепта для крафта из оригинальных предметов
    3. узнать ник убийцы игрока при смерти
    --------------------------------------

    1. Совсем недавно поднималась тема о замене итема дропа блока. Пока что не совсем проверена рациональность данного кода, но всё же.
    Вот код: /* тут код */

    2. Опять же в одной теме недавно видел реализацию создания нового рецепта для крафта из оригинальных предметов. Возможно и из предметов модов.
    Вот код: /* код */

    3. Как то мне требовалось узнать ник убийцы игрока при смерти.
    Вот код: /* код */
     
    Mik1313 нравится это.
  20. Kachalov

    Kachalov Старожил Пользователь

    Баллы:
    103
    Skype:
    alex-kachalov-01
    Имя в Minecraft:
    Kachalov
    А смерть мобов отлавливать с помощью EntityDeathEvent()?

    Есть ли ивент, на нахождение под солнцем?

    Как расширить интерфейс криперов?
     

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