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

Помогите Прочность блоков. Zombie Destruct Blocks

baksovic111

Активный участник
Пользователь
Баллы
88
Имя в Minecraft
Baksovic
Товарищи.
Решил сделать плагин с помощью которого зомби смогут ломать блоки.
Получаю Entity в определенном радиусе от игрока и с помощью цикла проверяю блоки вокруг Entity если блок не воздух то уничтожаем блок.(Левенький код но сейчас не об этом)
Так вот.
Хочу каким то образом реализовать прочность блоков которые будут уничтожаться.
Кто подскажет каким образом это сделать?
На данный момент блок я уничтожаю таким образом
.getBlock().breakNaturally();
Собственно он ломается моментально.
 
Товарищи.
Решил сделать плагин с помощью которого зомби смогут ломать блоки.
Получаю Entity в определенном радиусе от игрока и с помощью цикла проверяю блоки вокруг Entity если блок не воздух то уничтожаем блок.(Левенький код но сейчас не об этом)
Так вот.
Хочу каким то образом реализовать прочность блоков которые будут уничтожаться.
Кто подскажет каким образом это сделать?
На данный момент блок я уничтожаю таким образом
.getBlock().breakNaturally();
Собственно он ломается моментально.
А зомби ломает только один блок или их несколько ?
 
Если и найти, это только взять из режима HardCore, и Hard, помоему только в них зомби ломают двери и что-то ещё.
Там обычный джава код, он никак не связан с Bukkit'ом и плагинописанием.
 
В BloodMoon вроде такое делали, можно подсмотреть.
 
Знаю этот плагин кстати так и сделал)
Нашел код но он достаточно сложный и запутанный но кое что я все же взял и буду тестировать)
 
Нашёл, что-то, может это?


Java:
public BloodMoonEntityZombie(BloodMoon plugin, EntityMonster nmsEntity, CraftLivingEntity bukkitEntity, BloodMoonEntityType type){
        super(plugin, nmsEntity, bukkitEntity, type);
    }
   
    @Override
    public void onTick(){
        String worldName = nmsEntity.world.worldData.getName();
        String entityName = bukkitEntity.getType().name().toUpperCase();
        PluginConfig worldConfig = plugin.getConfig(worldName);

        if (nmsEntity.getGoalTarget() instanceof EntityHuman && plugin.isActive(worldName) && plugin.isFeatureEnabled(worldName, Feature.BREAK_BLOCKS) && worldConfig.getStringList(Config.FEATURE_BREAK_BLOCKS_MOBS).contains(entityName) && nmsEntity.world.getTime() % 20 == 0 && nmsEntity.world.worldData.getName().equals(nmsEntity.getGoalTarget().world.worldData.getName())) {
            Block[] blocks = new Block[2];
           
            blocks[0] = this.getBreakableTargetBlock();
            blocks[1] = blocks[0].getRelative(BlockFace.UP);
           
            for (Block block : blocks){
                this.attemptBreakBlock(worldConfig, block);
            }
        }
    }
   
}
 
Да - это. Но это не все)
там еще код был.
Я все в том плагине перерыл))
Код не брал но взял для себя идею и переделал свой плагин.
Изначально я брал блоки вокруг Entity добавляя к лоцации во все стороны +1
Теперь я сильно переделал плагин)
Кому интересно, вот код - Поделюсь))

http://pastebin.com/wKCkzcfA
 
Последнее редактирование:
Да - это. Но это не все)
там еще код был.
Я все в том плагине перерыл))
Код не брал но взял для себя идею и переделал свой плагин.
Изначально я брал блоки вокруг Entity добавляя к лоцации во все стороны +1
Теперь я сильно переделал плагин)
Кому интересно, вот код - Поделюсь))

public class ZDBlocks extends JavaPlugin implements Listener{
List<Block> BlocksList = new ArrayList<Block>();
HashMap<Material, Integer> BlockDurabilityList = new HashMap<Material, Integer>();

public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
BlockDurabilityList.put(Material.DIRT, 200);
BlockDurabilityList.put(Material.GRASS, 200);
BlockDurabilityList.put(Material.GLASS, 120);
BlockDurabilityList.put(Material.WOOD, 50);
BlockDurabilityList.put(Material.LOG, 30);
BlockDurabilityList.put(Material.WOODEN_DOOR, 20);
BlockDurabilityList.put(Material.IRON_DOOR, 10);
BlockDurabilityList.put(Material.OBSIDIAN, 10);
new BukkitRunnable() {

@Override
public void run() {
Collection<? extends Player> PlayerList = getServer().getOnlinePlayers();
Collection<Entity> EntityList;
for (Player player : PlayerList){
if (player.getGameMode() == GameMode.CREATIVE)
return;
EntityList = player.getNearbyEntities(16.0D, 16.0D, 16.0D);
for (Entity entity : EntityList){

if (entity.isDead())
return;

if (entity.getType() == EntityType.ZOMBIE && ((LivingEntity) entity).getTargetBlock((Set<Material>) null, 2).getType() != Material.AIR)
BlocksList.add(((LivingEntity) entity).getTargetBlock((Set<Material>) null, 2));
}
}
}}.runTaskTimer(this, 0, 20);

new BukkitRunnable() {
@Override
public void run(){
for (Block block : BlocksList)
BreakBlock(block);
BlocksList.removeAll(BlocksList);
}}.runTaskTimer(this, 0, (long) (Math.random() * 30) + 15);
}

protected void BreakBlock(Block block){

Location loc = block.getLocation();
Material material = block.getType();
int RandomValue = 1000;
int BlockDurability = 20;

List<Material> BlockList = new ArrayList<Material>();
BlockList.add(Material.AIR);
BlockList.add(Material.BEDROCK);

if (BlockDurabilityList.containsKey(material))
BlockDurability = BlockDurabilityList.get(material);

if (BlockList.contains(material))
return;

if (Math.random() * RandomValue <= BlockDurability){
loc.getWorld().playEffect(loc, Effect.ZOMBIE_DESTROY_DOOR, 0);
block.breakNaturally();
}
else
loc.getWorld().playSound(loc, Sound.ZOMBIE_WOOD, 1.0F, 1.0F);
}
}
А без If, не как, чтобы сократить.
А так если, код довольно логичный.
 
А без If, не как, чтобы сократить.
А так если, код довольно логичный.
Я код сократил в максимум.
Может у кого по больше опыта тот знает что и где исправить)
Тему закрывать не буду может кто еще выразит какие мысли, идеи)
 
Я код сократил в максимум.
Может у кого по больше опыта тот знает что и где исправить)
Тему закрывать не буду может кто еще выразит какие мысли, идеи)
Скиньте пожалуйста те API, которые вы используете.
 

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

Назад
Верх