Porting From Bukkit To NukkitX 2.0

ZenGer

New Member
I saw this on a Hypixel forum post and wondering if it's possible to port this from Bukkit to NukkitX 2.0? It's a recreation of the floating spinning blocks Hypixel has for the BedWars diamond and emerald generators.

Java:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.bukkit.Location;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;

import com.google.common.collect.Lists;

/**
 * <b>Idea from Hypixels Bedwars diamond and emerald generators</b>
 * @author Kristoffer
 */
public class FloatingItem {

    private static List<FloatingItem> items = new ArrayList<>();
    private Location location, sameLocation;
    private ArmorStand armorStand;
    private boolean floatLoop;
    private List<ArmorStand> texts = new ArrayList<>();

    /**
     * Constructs a new floating item and adds it to the items list
     *
     * @param plugin The plugin
     * @param location The location to spawn item at
     */
    public FloatingItem(Location location) {
        this.location = location;
        this.floatLoop = true;
        
        items.add(this);
    }

    /**
     * @note This needs to be ran on onEnable in order to update properly
     */
    public static void enable(JavaPlugin plugin) {
        new BukkitRunnable() {
            
            @Override
            public void run() {
                FloatingItem.getFloatingItems().stream().filter(i -> i.getArmorStand() != null).forEach(i -> i.update());
            }
        }.runTaskTimerAsynchronously(plugin, 0, 1);
    }

    /**
     * Spawns the floating item with the given text and item type
     *
     * @param title Then text of the floating item
     * @param itemStack The itemstack
     * @param big Whether the item should be big or not
     */
    public void spawn(ItemStack itemStack, boolean big, String... text) {
        armorStand = (ArmorStand) location.getWorld().spawnEntity(location, EntityType.ARMOR_STAND);
        armorStand.setGravity(false);
        armorStand.setHelmet(itemStack);
        armorStand.setVisible(false);
        armorStand.setSmall(big ? false : true);

        this.sameLocation = armorStand.getLocation();

        addText(this, text);
    }

    /**
     * Updates the floating item
     */
    public void update() {
        Location location = armorStand.getLocation();

        if (!this.floatLoop) {
            location.add(0, 0.01, 0);
            location.setYaw((location.getYaw() + 7.5F));

            armorStand.teleport(location);

            if (armorStand.getLocation().getY() > (0.25 + sameLocation.getY()))
                this.floatLoop = true;
        }
        else {
            location.subtract(0, 0.01, 0);
            location.setYaw((location.getYaw() - 7.5F));

            armorStand.teleport(location);

            if (armorStand.getLocation().getY() < (-0.25 + sameLocation.getY()))
                this.floatLoop = false;
        }
    }

    private void addText(FloatingItem floatingItem, String... text) {
        ArmorStand armorStand = null;
        List<String> lines = Arrays.asList(text);
        lines = Lists.reverse(lines);

        double y = 0.25D;

        for (int i = 0; i < lines.size(); i++) {
            armorStand = (ArmorStand) location.getWorld().spawnEntity(location.clone().add(0, y, 0), EntityType.ARMOR_STAND);
            armorStand.setGravity(false);
            armorStand.setCustomName(lines.get(i).replace('&', '§'));
            armorStand.setCustomNameVisible(true);
            armorStand.setVisible(false);
            y += 0.21D;
            
            texts.add(armorStand);
        }
    }

    /**
     * Deletes all text that the floating item has
     */
    public void deleteAllText() {
        texts.forEach(t -> t.remove());
    }

    /**
     * Deletes this floating item
     */
    public void delete() {
        deleteAllText();
        if (armorStand != null)
            armorStand.remove();
    }
    
    /**
     * Resets all floating items
     */
    public void reset() {
        getFloatingItems().remove(this);
    }

    /**
     * Deletes all floating items on the server
     */
    public static void deleteAll() {
        getFloatingItems().forEach(i -> i.delete());
        getFloatingItems().clear();
    }

    /**
     * Gets all registered floating items
     * @return All floating items
     */
    public static List<FloatingItem> getFloatingItems() {
        return items;
    }

    /**
     * Gets all text holders
     * @return All text holders
     */
    public List<ArmorStand> getTexts() {
        return texts;
    }

    /**
     * Gets the location of the floating item
     * @return The location
     */
    public Location getLocation() {
        return location;
    }

    /**
     * Gets the armorstand of the floating item
     * @return The armorstand
     */
    public ArmorStand getArmorStand() {
        return armorStand;
    }
}
 
Top