Туториал Пишем простой плагин для bukkit (v1.2.5+)

Продолжать выкладывать туториалы по написанию плагинов?

  • Да

    Голосов: 157 95,7%
  • Нет

    Голосов: 7 4,3%

  • Всего проголосовало
    164
Как кикнуть определённого игрока?
 
Не, не робит, тем более надо указать ник игрока. Я на версии 1.2.5
Java:
Player[] p = plugin.getServer().getOnlinePlayers();
        if(p.length!=0)
            for(int i=0; i<p.length; i++)
                if(p.getName().equals("Нужный ник"))
                    p.kickPlayer("Причина");
 
Java:
for (Player p : plugin.getServer().getOnlinePlayers()) {
  if (p.getName().equalsIgnoreCase("nick"))
    p.kickPlayer("reason");
}
так наверно короче будет
 
2012-09-28 13:57:24 [SEVERE] null
org.bukkit.command.CommandException: Unhandled exception executing command 'pid' in plugin pidPl v1.0
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:42)
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:166)
at forge.bukkit.ForgeCommandMap.dispatch(ForgeCommandMap.java:55)
at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:664)
at net.minecraft.server.NetServerHandler.handleCommand(NetServerHandler.java:862)
at net.minecraft.server.NetServerHandler.chat(NetServerHandler.java:818)
at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:800)
at net.minecraft.server.Packet3Chat.handle(Packet3Chat.java:34)
at net.minecraft.server.NetworkManager.b(NetworkManager.java:262)
at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:119)
at net.minecraft.server.NetworkListenThread.a(NetworkListenThread.java:97)
at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:651)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:525)
at net.minecraft.server.ThreadServerApplication.run(SourceFile:492)
Caused by: java.lang.NullPointerException
at evilsworld.psih.PidPl.onCommand(PidPl.java:48)
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:40)
... 13 more
Выдаёт. В обоих случаях
 
Java:
for (Player p : plugin.getServer().getOnlinePlayers()) {
  if (p.getName().equalsIgnoreCase("nick"))
    p.kickPlayer("reason");
}
так наверно короче будет
Но так пояснения будут требовать пояснений, скорее всего. Мой пример более базовый.
2012-09-28 13:57:24 [SEVERE] null
org.bukkit.command.CommandException: Unhandled exception executing command 'pid' in plugin pidPl v1.0
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:42)
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:166)
at forge.bukkit.ForgeCommandMap.dispatch(ForgeCommandMap.java:55)
at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:664)
at net.minecraft.server.NetServerHandler.handleCommand(NetServerHandler.java:862)
at net.minecraft.server.NetServerHandler.chat(NetServerHandler.java:818)
at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:800)
at net.minecraft.server.Packet3Chat.handle(Packet3Chat.java:34)
at net.minecraft.server.NetworkManager.b(NetworkManager.java:262)
at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:119)
at net.minecraft.server.NetworkListenThread.a(NetworkListenThread.java:97)
at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:651)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:525)
at net.minecraft.server.ThreadServerApplication.run(SourceFile:492)
Caused by: java.lang.NullPointerException
at evilsworld.psih.PidPl.onCommand(PidPl.java:48)
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:40)
... 13 more
Выдаёт. В обоих случаях
У тебя ошибка в файлах PidPl.java, 48 строка и PluginCommand.java, 40 строка.
 
plugin Это что? Ошибка на этой же строке.
у меня это в начале кода public Plugin plugin;

И я написал [0] после p , а то ошибку Eclipse выдаёт.
Player[] p = plugin.getServer().getOnlinePlayers();

if(p.length!=0)

for(int i=0; i<p.length; i++)

if(p[0].getName().equals(args[0]))

p[0].kickPlayer("Причина");

Нашёл код добавляющий рецепт крафта. Как в рецепт добавить вещи из модов?
Вот код:
ShapedRecipe recipe1 = new ShapedRecipe(new ItemStack(Material.MONSTER_EGGS, 1));
recipe1.shape(new String[] { "CAC", "ARA", "CAC" });
recipe1.setIngredient('A', Material.);
Вот непойму как заместо Material вписать id или предмет из мода
 
Вот самый базовый ;)
Bukkit.getPlayerExact("vasja").kickPlayer("Мне щас так нельзя!");
Подле этого примера нужно проставить try и catch, иначе в случае несуществующего игрока пойдёт материться консоль.
 
Спасибо вам

Хм, а за одно подскажите как добавить в крафт предмет с доп. индексом (напр. разноцветные доски)?
+1

Хм, а за одно подскажите как добавить в крафт предмет с доп. индексом (напр. разноцветные доски)?
Разобрался, надо в этой строке:
ShapedRecipe recipe1 = new ShapedRecipe(new ItemStack(mat , 1));
Сделать так:
ShapedRecipe recipe1 = new ShapedRecipe(new ItemStack(mat , 1,(byte) 1));
где "(byte) 1" доп.индекс
 
Как генерировать определённую руду, на определённой высоте?
 
Mik1313, мне кажется придётся ещё и событие отменить - иначе будет дропаться и старый блок тоже. Т.е. в приведенном примере помимо льда будет дропаться ещё и камень.

Вообще, я давно писал предложение буккитовцам добавить методы event.setDrop() и event.getDrop(). Их даже добавили, но перед каким RB откатили обратно и с тех пор (несмотря на то, что где-то проскакивали обещание их реализовать) их больше движений в этом направлении не было. Вот повторная просьба: https://bukkit.atlassian.net/browse/BUKKIT-1905
 
Mik1313, мне кажется придётся ещё и событие отменить - иначе будет дропаться и старый блок тоже. Т.е. в приведенном примере помимо льда будет дропаться ещё и камень.

Вообще, я давно писал предложение буккитовцам добавить методы event.setDrop() и event.getDrop(). Их даже добавили, но перед каким RB откатили обратно и с тех пор (несмотря на то, что где-то проскакивали обещание их реализовать) их больше движений в этом направлении не было. Вот повторная просьба: https://bukkit.atlassian.net/browse/BUKKIT-1905
При отмене события, блок не сломается..
 
И да, у меня был ещё один вариант, но я глубоко не уверен, что он заработает, так как наверное, предметы дропаются после вызова всех слушателей.
Java:
@EventHandler
public void onBreak(BlockBreakEvent event) {
    Block b = event.getBlock();
    Location bLoc = b.getLocation();
    List<ItemStack> drops = b.getDrops();
    for(ItemStack i : drops) {
        for(Item ei : b.getWorld().getEntitiesByClass<Item>()) {
            Location l = ei.getLocation();
            if(ei.getItemStack().equals(i) && l.getBlockX().equals(bLoc.getBlockX()) && l.getBlockY().equals(bLoc.getBlockY()) && l.getBlockZ().equals(bLoc.getBlockZ())) {
                ei.remove();
            }
        }
    }
}
 
Вот рабочий код:

Java:
@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)){
Bukkit.getServer().broadcastMessage("Custom drop set!");
ItemStack drop = new ItemStack(Material.ICE, 1);
event.getBlock().setType(Material.AIR);
world.dropItem(block.getLocation(), drop);                   
}
}

По другому решить данную задачу я не смог. :(
А так же вот.
Тут пара ошибок(я так думаю).
Java:
@EventHandler(priority = EventPriority.MONITOR)
ignoreCancelled = true - значит, что даже если событие было отменёно, камень все равно сломается и выпадет лёд.
EventPriority.LOWEST - значит, что событие обрабатываться будет в первую очередь, возможно даже до обработки плагинами защиты.
EventPriority.MONITOR - значит, что событие обрабатываться будет в последнюю очередь.
 
event.getBlock().setType(Material.AIR);
Вот тут ошибка, как я понял, выпадает Material.AIR а это невозможно, поэтому тебя кидает из игры
 
Назад
Верх