Search in sources :

Example 21 with MovecraftLocation

use of net.countercraft.movecraft.MovecraftLocation in project Movecraft by APDevTeam.

the class StatusSign method onSignTranslate.

@EventHandler
public final void onSignTranslate(SignTranslateEvent event) {
    Craft craft = event.getCraft();
    if (!ChatColor.stripColor(event.getLine(0)).equalsIgnoreCase("Status:")) {
        return;
    }
    int fuel = 0;
    int totalBlocks = 0;
    Counter<Material> foundBlocks = new Counter<>();
    var v = craft.getType().getObjectProperty(CraftType.FUEL_TYPES);
    if (!(v instanceof Map<?, ?>))
        throw new IllegalStateException("FUEL_TYPES must be of type Map");
    var fuelTypes = (Map<?, ?>) v;
    for (var e : fuelTypes.entrySet()) {
        if (!(e.getKey() instanceof Material))
            throw new IllegalStateException("Keys in FUEL_TYPES must be of type Material");
        if (!(e.getValue() instanceof Double))
            throw new IllegalStateException("Values in FUEL_TYPES must be of type Double");
    }
    for (MovecraftLocation ml : craft.getHitBox()) {
        Material material = craft.getWorld().getBlockAt(ml.getX(), ml.getY(), ml.getZ()).getType();
        foundBlocks.add(material);
        if (Tags.FURNACES.contains(material)) {
            InventoryHolder inventoryHolder = (InventoryHolder) craft.getWorld().getBlockAt(ml.getX(), ml.getY(), ml.getZ()).getState();
            for (ItemStack iStack : inventoryHolder.getInventory()) {
                if (iStack == null || !fuelTypes.containsKey(iStack.getType()))
                    continue;
                fuel += iStack.getAmount() * (double) fuelTypes.get(iStack.getType());
            }
        }
        if (!material.isAir() && material != Material.FIRE) {
            totalBlocks++;
        }
    }
    int signLine = 1;
    int signColumn = 0;
    /*  TODO: Implement new system for flyblocks on status signs
        for(EnumSet<Material> alFlyBlockID : craft.getType().getFlyBlocks().keySet()) {
            Material flyBlockID= alFlyBlockID.get(0);
            double minimum=craft.getType().getFlyBlocks().get(alFlyBlockID).get(0);
            if(foundBlocks.get(flyBlockID) != 0 && minimum>0) { // if it has a minimum, it should be considered for sinking consideration
                int amount=foundBlocks.get((flyBlockID));
                double percentPresent= (amount*100D/totalBlocks);
                String signText="";
                if(percentPresent>minimum*1.04) {
                    signText+= ChatColor.GREEN;
                } else if(percentPresent>minimum*1.02) {
                    signText+=ChatColor.YELLOW;
                } else {
                    signText+=ChatColor.RED;
                }
                if(flyBlockID == Material.REDSTONE_BLOCK) {
                    signText+="R";
                } else if(flyBlockID == Material.IRON_BLOCK) {
                    signText+="I";
                } else {
                    signText+= flyBlockID.toString().charAt(0);
                }

                signText+=" ";
                signText+=  (int) percentPresent;
                signText+="/";
                signText+= (int) minimum;
                signText+="  ";
                if(signColumn==0) {
                    event.setLine(signLine,signText);
                    signColumn++;
                } else if(signLine<3) {
                    String existingLine = event.getLine(signLine);
                    existingLine += signText;
                    event.setLine(signLine, existingLine);
                    signLine++;
                    signColumn=0;
                }
            }
        }
        if (signLine < 3 && signColumn == 1){
            signLine++;
        }
        */
    String fuelText = "";
    int cruiseSkipBlocks = (int) craft.getType().getPerWorldProperty(CraftType.PER_WORLD_CRUISE_SKIP_BLOCKS, craft.getWorld());
    cruiseSkipBlocks++;
    double fuelBurnRate = (double) craft.getType().getPerWorldProperty(CraftType.PER_WORLD_FUEL_BURN_RATE, craft.getWorld());
    int fuelRange = (int) Math.round((fuel * (1 + cruiseSkipBlocks)) / fuelBurnRate);
    if (fuelRange > 1000) {
        fuelText += ChatColor.GREEN;
    } else if (fuelRange > 100) {
        fuelText += ChatColor.YELLOW;
    } else {
        fuelText += ChatColor.RED;
    }
    fuelText += "Fuel range:";
    fuelText += fuelRange;
    event.setLine(signLine, fuelText);
}
Also used : Craft(net.countercraft.movecraft.craft.Craft) Material(org.bukkit.Material) Counter(net.countercraft.movecraft.util.Counter) MovecraftLocation(net.countercraft.movecraft.MovecraftLocation) ItemStack(org.bukkit.inventory.ItemStack) Map(java.util.Map) InventoryHolder(org.bukkit.inventory.InventoryHolder) EventHandler(org.bukkit.event.EventHandler)

Example 22 with MovecraftLocation

use of net.countercraft.movecraft.MovecraftLocation in project Movecraft by APDevTeam.

the class SubcraftRotateSign method onSignClick.

@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onSignClick(@NotNull PlayerInteractEvent event) {
    MovecraftRotation rotation;
    if (event.getAction() == Action.RIGHT_CLICK_BLOCK)
        rotation = MovecraftRotation.CLOCKWISE;
    else if (event.getAction() == Action.LEFT_CLICK_BLOCK)
        rotation = MovecraftRotation.ANTICLOCKWISE;
    else
        return;
    BlockState state = event.getClickedBlock().getState();
    if (!(state instanceof Sign))
        return;
    Sign sign = (Sign) state;
    if (!ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase(HEADER))
        return;
    Location loc = event.getClickedBlock().getLocation();
    MovecraftLocation startPoint = new MovecraftLocation(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
    if (rotating.contains(startPoint)) {
        event.getPlayer().sendMessage(I18nSupport.getInternationalisedString("Rotation - Already Rotating"));
        event.setCancelled(true);
        return;
    }
    // rotate subcraft
    String craftTypeStr = ChatColor.stripColor(sign.getLine(1));
    CraftType craftType = CraftManager.getInstance().getCraftTypeFromString(craftTypeStr);
    if (craftType == null)
        return;
    if (ChatColor.stripColor(sign.getLine(2)).equals("") && ChatColor.stripColor(sign.getLine(3)).equals("")) {
        sign.setLine(2, "_\\ /_");
        sign.setLine(3, "/ \\");
        sign.update(false, false);
    }
    if (!event.getPlayer().hasPermission("movecraft." + craftTypeStr + ".pilot") || !event.getPlayer().hasPermission("movecraft." + craftTypeStr + ".rotate")) {
        event.getPlayer().sendMessage(I18nSupport.getInternationalisedString("Insufficient Permissions"));
        return;
    }
    Craft playerCraft = CraftManager.getInstance().getCraftByPlayer(event.getPlayer());
    if (playerCraft != null) {
        if (!playerCraft.isNotProcessing()) {
            event.getPlayer().sendMessage(I18nSupport.getInternationalisedString("Detection - Parent Craft is busy"));
            return;
        }
        // prevent the parent craft from moving or updating until the subcraft is done
        playerCraft.setProcessing(true);
        new BukkitRunnable() {

            @Override
            public void run() {
                playerCraft.setProcessing(false);
            }
        }.runTaskLater(Movecraft.getInstance(), (10));
    }
    rotating.add(startPoint);
    Player player = event.getPlayer();
    World world = event.getClickedBlock().getWorld();
    CraftManager.getInstance().detect(startPoint, craftType, (type, w, p, parents) -> {
        if (parents.size() > 1)
            return new Pair<>(Result.failWithMessage(I18nSupport.getInternationalisedString("Detection - Failed - Already commanding a craft")), null);
        if (parents.size() < 1)
            return new Pair<>(Result.succeed(), new SubcraftRotateCraft(type, w, p));
        Craft parent = parents.iterator().next();
        return new Pair<>(Result.succeed(), new SubCraftImpl(type, w, parent));
    }, world, player, Movecraft.getAdventure().player(player), craft -> () -> {
        Bukkit.getServer().getPluginManager().callEvent(new CraftPilotEvent(craft, CraftPilotEvent.Reason.SUB_CRAFT));
        if (craft instanceof SubCraft) {
            // Subtract craft from the parent
            Craft parent = ((SubCraft) craft).getParent();
            var newHitbox = parent.getHitBox().difference(craft.getHitBox());
            ;
            parent.setHitBox(newHitbox);
        }
        new BukkitRunnable() {

            @Override
            public void run() {
                craft.rotate(rotation, startPoint, true);
                if (craft instanceof SubCraft) {
                    Craft parent = ((SubCraft) craft).getParent();
                    var newHitbox = parent.getHitBox().union(craft.getHitBox());
                    parent.setHitBox(newHitbox);
                }
                CraftManager.getInstance().release(craft, CraftReleaseEvent.Reason.SUB_CRAFT, false);
            }
        }.runTaskLater(Movecraft.getInstance(), 3);
    });
    event.setCancelled(true);
    new BukkitRunnable() {

        @Override
        public void run() {
            rotating.remove(startPoint);
        }
    }.runTaskLater(Movecraft.getInstance(), 4);
}
Also used : Player(org.bukkit.entity.Player) SubcraftRotateCraft(net.countercraft.movecraft.craft.SubcraftRotateCraft) Craft(net.countercraft.movecraft.craft.Craft) SubCraft(net.countercraft.movecraft.craft.SubCraft) BukkitRunnable(org.bukkit.scheduler.BukkitRunnable) World(org.bukkit.World) SubcraftRotateCraft(net.countercraft.movecraft.craft.SubcraftRotateCraft) CraftPilotEvent(net.countercraft.movecraft.events.CraftPilotEvent) MovecraftRotation(net.countercraft.movecraft.MovecraftRotation) BlockState(org.bukkit.block.BlockState) Sign(org.bukkit.block.Sign) SubCraftImpl(net.countercraft.movecraft.craft.SubCraftImpl) SubCraft(net.countercraft.movecraft.craft.SubCraft) MovecraftLocation(net.countercraft.movecraft.MovecraftLocation) CraftType(net.countercraft.movecraft.craft.type.CraftType) Location(org.bukkit.Location) MovecraftLocation(net.countercraft.movecraft.MovecraftLocation) Pair(net.countercraft.movecraft.util.Pair) EventHandler(org.bukkit.event.EventHandler)

Example 23 with MovecraftLocation

use of net.countercraft.movecraft.MovecraftLocation in project Movecraft by APDevTeam.

the class DescendSign method onCraftDetect.

@EventHandler
public void onCraftDetect(CraftDetectEvent event) {
    World world = event.getCraft().getWorld();
    for (MovecraftLocation location : event.getCraft().getHitBox()) {
        var block = location.toBukkit(world).getBlock();
        if (!Tag.SIGNS.isTagged(block.getType())) {
            continue;
        }
        BlockState state = block.getState();
        if (state instanceof Sign) {
            Sign sign = (Sign) state;
            if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("Descend: ON")) {
                sign.setLine(0, "Descend: OFF");
                sign.update();
            }
        }
    }
}
Also used : BlockState(org.bukkit.block.BlockState) Sign(org.bukkit.block.Sign) World(org.bukkit.World) MovecraftLocation(net.countercraft.movecraft.MovecraftLocation) EventHandler(org.bukkit.event.EventHandler)

Example 24 with MovecraftLocation

use of net.countercraft.movecraft.MovecraftLocation in project Movecraft by APDevTeam.

the class BlockListener method onRedstoneEvent.

// process certain redstone on cruising crafts
@EventHandler(priority = EventPriority.HIGHEST)
public void onRedstoneEvent(BlockRedstoneEvent event) {
    Block block = event.getBlock();
    CraftManager.getInstance().getCraftsInWorld(block.getWorld());
    for (Craft tcraft : CraftManager.getInstance().getCraftsInWorld(block.getWorld())) {
        MovecraftLocation mloc = new MovecraftLocation(block.getX(), block.getY(), block.getZ());
        if (MathUtils.locIsNearCraftFast(tcraft, mloc) && tcraft.getCruising() && (block.getType() == Material.STICKY_PISTON || block.getType() == Material.PISTON || block.getType() == Material.DISPENSER && !tcraft.isNotProcessing())) {
            // don't allow piston movement on cruising crafts
            event.setNewCurrent(event.getOldCurrent());
            return;
        }
    }
}
Also used : Craft(net.countercraft.movecraft.craft.Craft) Block(org.bukkit.block.Block) MovecraftLocation(net.countercraft.movecraft.MovecraftLocation) EventHandler(org.bukkit.event.EventHandler)

Example 25 with MovecraftLocation

use of net.countercraft.movecraft.MovecraftLocation in project Movecraft by APDevTeam.

the class BlockListener method onIceForm.

@EventHandler
public void onIceForm(BlockFormEvent e) {
    if (e.isCancelled() || !Settings.DisableIceForm)
        return;
    if (e.getBlock().getType() != Material.WATER)
        return;
    MovecraftLocation loc = MathUtils.bukkit2MovecraftLoc(e.getBlock().getLocation());
    Craft craft = MathUtils.fastNearestCraftToLoc(CraftManager.getInstance().getCrafts(), e.getBlock().getLocation());
    if (craft != null && craft.getHitBox().contains((loc)))
        e.setCancelled(true);
}
Also used : Craft(net.countercraft.movecraft.craft.Craft) MovecraftLocation(net.countercraft.movecraft.MovecraftLocation) EventHandler(org.bukkit.event.EventHandler)

Aggregations

MovecraftLocation (net.countercraft.movecraft.MovecraftLocation)60 Craft (net.countercraft.movecraft.craft.Craft)18 EventHandler (org.bukkit.event.EventHandler)18 Material (org.bukkit.Material)17 World (org.bukkit.World)15 Sign (org.bukkit.block.Sign)14 BlockState (org.bukkit.block.BlockState)13 Block (org.bukkit.block.Block)12 ArrayList (java.util.ArrayList)11 Location (org.bukkit.Location)11 Map (java.util.Map)10 HashMap (java.util.HashMap)9 SetHitBox (net.countercraft.movecraft.util.hitboxes.SetHitBox)9 HashSet (java.util.HashSet)8 SinkingCraft (net.countercraft.movecraft.craft.SinkingCraft)8 NotNull (org.jetbrains.annotations.NotNull)8 MovecraftRotation (net.countercraft.movecraft.MovecraftRotation)6 HitBox (net.countercraft.movecraft.util.hitboxes.HitBox)6 SolidHitBox (net.countercraft.movecraft.util.hitboxes.SolidHitBox)6 LinkedList (java.util.LinkedList)5