mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-19 19:25:48 +00:00
Merge branch 'master' into feature/auto-crafters
This commit is contained in:
commit
659f329349
@ -32,6 +32,8 @@
|
||||
|
||||
#### Changes
|
||||
* Deprecated Automatic Crafting Chamber
|
||||
* (API) Improvements to the BlockBreakHandler
|
||||
* (API) Deprecated SlimefunBlockHandler
|
||||
|
||||
#### Fixes
|
||||
* Fixed #2794
|
||||
@ -44,6 +46,7 @@
|
||||
* Fixed exceptions with inventories not being printed using the logger of the addon that caused it
|
||||
* Fixed #2818
|
||||
* Fixed #1161
|
||||
* Fixed a duplication glitch with the Woodcutter Android
|
||||
|
||||
## Release Candidate 20 (30 Jan 2021)
|
||||
|
||||
@ -61,6 +64,8 @@
|
||||
|
||||
#### Fixes
|
||||
* Fixed elevator floor order
|
||||
* Fixed "block-explosions" (e.g. beds in Nether) not properly respecting explosion-resistant blocks
|
||||
* Fixed #2560
|
||||
* Fixed #2449
|
||||
* Fixed #2511
|
||||
* Fixed #2636
|
||||
@ -90,6 +95,7 @@
|
||||
#### Changes
|
||||
* Performance optimizations for Cargo networks
|
||||
* Removed an old version of bStats
|
||||
* General performance improvements
|
||||
* CraftBukkit is officially no longer supported, Slimefun will now be disabled on old builds of CraftBukkit
|
||||
* Removed the deprecated ItemManipulationAPI for BlockMenus
|
||||
* Removed the "Written Book" variant of the Slimefun Guide
|
||||
|
2
pom.xml
2
pom.xml
@ -335,7 +335,7 @@
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<version>3.7.7</version>
|
||||
<version>3.8.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
|
@ -333,6 +333,7 @@ public final class SlimefunRegistry {
|
||||
return globalItemHandlers;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Nonnull
|
||||
public Map<String, SlimefunBlockHandler> getBlockHandlers() {
|
||||
return blockHandlers;
|
||||
|
@ -2,18 +2,103 @@ package io.github.thebusybiscuit.slimefun4.core.handlers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.api.events.AndroidMineEvent;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.MinerAndroid;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface BlockBreakHandler extends ItemHandler {
|
||||
/**
|
||||
* The {@link BlockBreakHandler} is called when a {@link Block} is broken
|
||||
* which holds a {@link SlimefunItem}.
|
||||
* The {@link BlockBreakHandler} provides three methods for this, one for block breaking
|
||||
* caused by a {@link Player}, one for a {@link MinerAndroid} and one method for a {@link Block}
|
||||
* being destroyed by an explosion.
|
||||
*
|
||||
* @author TheBusyBiscuit
|
||||
*
|
||||
* @see BlockPlaceHandler
|
||||
*
|
||||
*/
|
||||
public abstract class BlockBreakHandler implements ItemHandler {
|
||||
|
||||
boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List<ItemStack> drops);
|
||||
/**
|
||||
* Whether a {@link MinerAndroid} is allowed to break this block.
|
||||
*/
|
||||
private final boolean allowAndroids;
|
||||
|
||||
/**
|
||||
* Whether an explosion is allowed to destroy this block.
|
||||
*/
|
||||
private final boolean allowExplosions;
|
||||
|
||||
/**
|
||||
* This constructs a new {@link BlockBreakHandler}.
|
||||
*
|
||||
* @param allowAndroids
|
||||
* Whether a {@link MinerAndroid} is allowed to break blocks of this type
|
||||
* @param allowExplosions
|
||||
* Whether blocks of this type are allowed to be broken by explosions
|
||||
*/
|
||||
public BlockBreakHandler(boolean allowAndroids, boolean allowExplosions) {
|
||||
this.allowAndroids = allowAndroids;
|
||||
this.allowExplosions = allowExplosions;
|
||||
}
|
||||
|
||||
@ParametersAreNonnullByDefault
|
||||
public abstract void onPlayerBreak(BlockBreakEvent e, ItemStack item, List<ItemStack> drops);
|
||||
|
||||
@ParametersAreNonnullByDefault
|
||||
public void onExplode(Block b, List<ItemStack> drops) {
|
||||
// This can be overridden, if necessary
|
||||
}
|
||||
|
||||
@ParametersAreNonnullByDefault
|
||||
public void onAndroidBreak(AndroidMineEvent e) {
|
||||
// This can be overridden, if necessary
|
||||
}
|
||||
|
||||
/**
|
||||
* This returns whether an explosion is able to break the given {@link Block}.
|
||||
*
|
||||
* @param b
|
||||
* The {@link Block}
|
||||
* @return Whether explosions can destroy this {@link Block}
|
||||
*/
|
||||
public boolean isExplosionAllowed(@Nonnull Block b) {
|
||||
/*
|
||||
* By default our flag is returned, but you can override it
|
||||
* to be handled on a per-Block basis.
|
||||
*/
|
||||
return allowExplosions;
|
||||
}
|
||||
|
||||
/**
|
||||
* This returns whether a {@link MinerAndroid} is allowed to break
|
||||
* the given {@link Block}.
|
||||
*
|
||||
* @param b
|
||||
* The {@link Block}
|
||||
*
|
||||
* @return Whether androids can break the given {@link Block}
|
||||
*/
|
||||
public boolean isAndroidAllowed(@Nonnull Block b) {
|
||||
/*
|
||||
* By default our flag is returned, but you can override it
|
||||
* to be handled on a per-Block basis.
|
||||
*/
|
||||
return allowAndroids;
|
||||
}
|
||||
|
||||
@Override
|
||||
default Class<? extends ItemHandler> getIdentifier() {
|
||||
public final Class<? extends ItemHandler> getIdentifier() {
|
||||
return BlockBreakHandler.class;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
package io.github.thebusybiscuit.slimefun4.core.handlers;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
@ -31,7 +33,7 @@ public abstract class BlockPlaceHandler implements ItemHandler {
|
||||
* @param e
|
||||
* The corresponding {@link BlockPlaceEvent}
|
||||
*/
|
||||
public abstract void onPlayerPlace(BlockPlaceEvent e);
|
||||
public abstract void onPlayerPlace(@Nonnull BlockPlaceEvent e);
|
||||
|
||||
/**
|
||||
* This method is called whenever a {@link BlockPlacer} places this {@link Block}.
|
||||
@ -42,7 +44,7 @@ public abstract class BlockPlaceHandler implements ItemHandler {
|
||||
* @param e
|
||||
* The corresponding {@link BlockPlacerPlaceEvent}
|
||||
*/
|
||||
public void onBlockPlacerPlace(BlockPlacerPlaceEvent e) {
|
||||
public void onBlockPlacerPlace(@Nonnull BlockPlacerPlaceEvent e) {
|
||||
// This can be overridden, if necessary
|
||||
}
|
||||
|
||||
@ -56,7 +58,7 @@ public abstract class BlockPlaceHandler implements ItemHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<? extends ItemHandler> getIdentifier() {
|
||||
public final Class<? extends ItemHandler> getIdentifier() {
|
||||
return BlockPlaceHandler.class;
|
||||
}
|
||||
}
|
||||
|
@ -240,11 +240,11 @@ final class CargoUtils {
|
||||
int maxSlot = range[1];
|
||||
|
||||
for (int slot = minSlot; slot < maxSlot; slot++) {
|
||||
ItemStack is = contents[slot];
|
||||
ItemStack item = contents[slot];
|
||||
|
||||
if (matchesFilter(network, node, is)) {
|
||||
if (matchesFilter(network, node, item)) {
|
||||
inv.setItem(slot, null);
|
||||
return new ItemStackAndInteger(is, slot);
|
||||
return new ItemStackAndInteger(item, slot);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -114,6 +114,7 @@ public class Translators {
|
||||
addTranslator("milvantiou", SupportedLanguage.DUTCH, true);
|
||||
addTranslator("Sven313D", SupportedLanguage.DUTCH, true);
|
||||
addTranslator("TypischTeun", SupportedLanguage.DUTCH, true);
|
||||
addTranslator("peppower", SupportedLanguage.DUTCH, true);
|
||||
|
||||
// Translators - Danish
|
||||
addTranslator("Mini-kun", SupportedLanguage.DANISH, true);
|
||||
|
@ -79,6 +79,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.listeners.GrapplingHook
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.listeners.HopperListener;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ItemDropListener;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ItemPickupListener;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.listeners.MiningAndroidListener;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.listeners.MultiBlockListener;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.listeners.NetworkListener;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.listeners.PlayerProfileListener;
|
||||
@ -637,6 +638,7 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
|
||||
new GrindstoneListener(this);
|
||||
new CartographyTableListener(this);
|
||||
new ButcherAndroidListener(this);
|
||||
new MiningAndroidListener(this);
|
||||
new NetworkListener(this, networkManager);
|
||||
new HopperListener(this);
|
||||
new TalismanListener(this);
|
||||
|
@ -0,0 +1,59 @@
|
||||
package io.github.thebusybiscuit.slimefun4.implementation.handlers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.api.events.AndroidMineEvent;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.MinerAndroid;
|
||||
|
||||
/**
|
||||
* This simple implementation of {@link BlockBreakHandler} will execute the same code
|
||||
* for when the {@link Block} is broken by a {@link Player}, by a {@link MinerAndroid} or an explosion.
|
||||
* By default, both androids and explosions are allowed.
|
||||
*
|
||||
* @author TheBusyBiscuit
|
||||
*
|
||||
* @see BlockBreakHandler
|
||||
*
|
||||
*/
|
||||
public abstract class SimpleBlockBreakHandler extends BlockBreakHandler {
|
||||
|
||||
/**
|
||||
* This constructs a new {@link SimpleBlockBreakHandler}.
|
||||
*/
|
||||
public SimpleBlockBreakHandler() {
|
||||
super(true, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called when a {@link Block} of this type is broken by a {@link Player},
|
||||
* by a {@link MinerAndroid} or through an explosion.
|
||||
*
|
||||
* @param b
|
||||
* The broken {@link Block}
|
||||
*/
|
||||
public abstract void onBlockBreak(@Nonnull Block b);
|
||||
|
||||
@Override
|
||||
public void onPlayerBreak(BlockBreakEvent e, ItemStack item, List<ItemStack> drops) {
|
||||
onBlockBreak(e.getBlock());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAndroidBreak(AndroidMineEvent e) {
|
||||
onBlockBreak(e.getBlock());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExplode(Block b, List<ItemStack> drops) {
|
||||
onBlockBreak(b);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
/**
|
||||
* This package holds simple implementations of {@link me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler}.
|
||||
* These are just handlers that can be re-used frequently.
|
||||
*/
|
||||
package io.github.thebusybiscuit.slimefun4.implementation.handlers;
|
@ -21,15 +21,16 @@ import org.bukkit.util.Vector;
|
||||
import io.github.thebusybiscuit.cscorelib2.chat.ChatColors;
|
||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockDispenseHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.handlers.SimpleBlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.listeners.AncientAltarListener;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.tasks.AncientAltarTask;
|
||||
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||
|
||||
/**
|
||||
@ -53,21 +54,28 @@ public class AncientPedestal extends SimpleSlimefunItem<BlockDispenseHandler> {
|
||||
public AncientPedestal(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
|
||||
super(category, item, recipeType, recipe, recipeOutput);
|
||||
|
||||
SlimefunItem.registerBlockHandler(getId(), (p, b, tool, reason) -> {
|
||||
Optional<Item> entity = getPlacedItem(b);
|
||||
addItemHandler(onBreak());
|
||||
}
|
||||
|
||||
if (entity.isPresent()) {
|
||||
Item stack = entity.get();
|
||||
@Nonnull
|
||||
private BlockBreakHandler onBreak() {
|
||||
return new SimpleBlockBreakHandler() {
|
||||
|
||||
if (stack.isValid()) {
|
||||
stack.removeMetadata("no_pickup", SlimefunPlugin.instance());
|
||||
b.getWorld().dropItem(b.getLocation(), getOriginalItemStack(stack));
|
||||
stack.remove();
|
||||
@Override
|
||||
public void onBlockBreak(@Nonnull Block b) {
|
||||
Optional<Item> entity = getPlacedItem(b);
|
||||
|
||||
if (entity.isPresent()) {
|
||||
Item stack = entity.get();
|
||||
|
||||
if (stack.isValid()) {
|
||||
stack.removeMetadata("no_pickup", SlimefunPlugin.instance());
|
||||
b.getWorld().dropItem(b.getLocation(), getOriginalItemStack(stack));
|
||||
stack.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -56,7 +56,6 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineFuel;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.InventoryBlock;
|
||||
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
||||
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
|
||||
@ -151,7 +150,8 @@ public class ProgrammableAndroid extends SlimefunItem implements InventoryBlock,
|
||||
addItemHandler(onPlace());
|
||||
}
|
||||
|
||||
private ItemHandler onPlace() {
|
||||
@Nonnull
|
||||
private BlockPlaceHandler onPlace() {
|
||||
return new BlockPlaceHandler(false) {
|
||||
|
||||
@Override
|
||||
|
@ -159,6 +159,7 @@ public class WoodcutterAndroid extends ProgrammableAndroid {
|
||||
} else {
|
||||
// Simply drop the sapling if the soil does not fit
|
||||
block.getWorld().dropItemNaturally(block.getLocation(), new ItemStack(saplingType));
|
||||
block.setType(Material.AIR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,8 @@
|
||||
package io.github.thebusybiscuit.slimefun4.implementation.items.blocks;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
@ -16,6 +19,7 @@ import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.handlers.SimpleBlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.utils.ChatUtils;
|
||||
import io.github.thebusybiscuit.slimefun4.utils.NumberUtils;
|
||||
import io.github.thebusybiscuit.slimefun4.utils.holograms.SimpleHologram;
|
||||
@ -30,12 +34,14 @@ public class HologramProjector extends SlimefunItem implements HologramOwner {
|
||||
|
||||
private static final String OFFSET_PARAMETER = "offset";
|
||||
|
||||
@ParametersAreNonnullByDefault
|
||||
public HologramProjector(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
|
||||
super(category, item, recipeType, recipe, recipeOutput);
|
||||
|
||||
addItemHandler(onPlace(), onRightClick(), onBreak());
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private BlockPlaceHandler onPlace() {
|
||||
return new BlockPlaceHandler(false) {
|
||||
|
||||
@ -52,13 +58,18 @@ public class HologramProjector extends SlimefunItem implements HologramOwner {
|
||||
};
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private BlockBreakHandler onBreak() {
|
||||
return (e, item, fortune, drops) -> {
|
||||
remove(e.getBlock());
|
||||
return true;
|
||||
return new SimpleBlockBreakHandler() {
|
||||
|
||||
@Override
|
||||
public void onBlockBreak(@Nonnull Block b) {
|
||||
remove(b);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public BlockUseHandler onRightClick() {
|
||||
return e -> {
|
||||
e.cancel();
|
||||
@ -72,7 +83,7 @@ public class HologramProjector extends SlimefunItem implements HologramOwner {
|
||||
};
|
||||
}
|
||||
|
||||
private static void openEditor(Player p, Block projector) {
|
||||
private static void openEditor(@Nonnull Player p, @Nonnull Block projector) {
|
||||
ChestMenu menu = new ChestMenu(SlimefunPlugin.getLocalization().getMessage(p, "machines.HOLOGRAM_PROJECTOR.inventory-title"));
|
||||
|
||||
menu.addItem(0, new CustomItem(Material.NAME_TAG, "&7Text &e(Click to edit)", "", "&r" + ChatColors.color(BlockStorage.getLocationInfo(projector.getLocation(), "text"))));
|
||||
@ -105,7 +116,7 @@ public class HologramProjector extends SlimefunItem implements HologramOwner {
|
||||
menu.open(p);
|
||||
}
|
||||
|
||||
private static ArmorStand getArmorStand(Block projector, boolean createIfNoneExists) {
|
||||
private static ArmorStand getArmorStand(@Nonnull Block projector, boolean createIfNoneExists) {
|
||||
String nametag = BlockStorage.getLocationInfo(projector.getLocation(), "text");
|
||||
double offset = Double.parseDouble(BlockStorage.getLocationInfo(projector.getLocation(), OFFSET_PARAMETER));
|
||||
Location l = new Location(projector.getWorld(), projector.getX() + 0.5, projector.getY() + offset, projector.getZ() + 0.5);
|
||||
@ -129,7 +140,7 @@ public class HologramProjector extends SlimefunItem implements HologramOwner {
|
||||
return hologram;
|
||||
}
|
||||
|
||||
private static void remove(Block b) {
|
||||
private static void remove(@Nonnull Block b) {
|
||||
ArmorStand hologram = getArmorStand(b, false);
|
||||
|
||||
if (hologram != null) {
|
||||
|
@ -11,7 +11,9 @@ import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.networks.cargo.CargoNet;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.handlers.SimpleBlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||
@ -39,15 +41,22 @@ abstract class AbstractFilterNode extends AbstractCargoNode {
|
||||
public AbstractFilterNode(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, @Nullable ItemStack recipeOutput) {
|
||||
super(category, item, recipeType, recipe, recipeOutput);
|
||||
|
||||
registerBlockHandler(getId(), (p, b, stack, reason) -> {
|
||||
BlockMenu inv = BlockStorage.getInventory(b);
|
||||
addItemHandler(onBreak());
|
||||
}
|
||||
|
||||
if (inv != null) {
|
||||
inv.dropItems(b.getLocation(), SLOTS);
|
||||
@Nonnull
|
||||
private BlockBreakHandler onBreak() {
|
||||
return new SimpleBlockBreakHandler() {
|
||||
|
||||
@Override
|
||||
public void onBlockBreak(@Nonnull Block b) {
|
||||
BlockMenu inv = BlockStorage.getInventory(b);
|
||||
|
||||
if (inv != null) {
|
||||
inv.dropItems(b.getLocation(), SLOTS);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
@ -2,6 +2,7 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.cargo;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
@ -11,8 +12,10 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
|
||||
import io.github.thebusybiscuit.slimefun4.core.attributes.HologramOwner;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.networks.cargo.CargoNet;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.handlers.SimpleBlockBreakHandler;
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||
@ -27,10 +30,18 @@ public class CargoManager extends SlimefunItem implements HologramOwner {
|
||||
public CargoManager(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||
super(category, item, recipeType, recipe);
|
||||
|
||||
registerBlockHandler(getId(), (p, b, tool, reason) -> {
|
||||
removeHologram(b);
|
||||
return true;
|
||||
});
|
||||
addItemHandler(onBreak());
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private BlockBreakHandler onBreak() {
|
||||
return new SimpleBlockBreakHandler() {
|
||||
|
||||
@Override
|
||||
public void onBlockBreak(@Nonnull Block b) {
|
||||
removeHologram(b);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -12,9 +12,11 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
||||
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.networks.cargo.CargoNet;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.handlers.SimpleBlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.reactors.Reactor;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.items.misc.CoolantCell;
|
||||
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
|
||||
@ -50,6 +52,8 @@ public class ReactorAccessPort extends SlimefunItem {
|
||||
public ReactorAccessPort(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||
super(category, item, recipeType, recipe);
|
||||
|
||||
addItemHandler(onBreak());
|
||||
|
||||
new BlockMenuPreset(getId(), "&2Reactor Access Port") {
|
||||
|
||||
@Override
|
||||
@ -108,18 +112,23 @@ public class ReactorAccessPort extends SlimefunItem {
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
registerBlockHandler(getId(), (p, b, tool, reason) -> {
|
||||
BlockMenu inv = BlockStorage.getInventory(b);
|
||||
@Nonnull
|
||||
private BlockBreakHandler onBreak() {
|
||||
return new SimpleBlockBreakHandler() {
|
||||
|
||||
if (inv != null) {
|
||||
inv.dropItems(b.getLocation(), getFuelSlots());
|
||||
inv.dropItems(b.getLocation(), getCoolantSlots());
|
||||
inv.dropItems(b.getLocation(), getOutputSlots());
|
||||
@Override
|
||||
public void onBlockBreak(@Nonnull Block b) {
|
||||
BlockMenu inv = BlockStorage.getInventory(b);
|
||||
|
||||
if (inv != null) {
|
||||
inv.dropItems(b.getLocation(), getFuelSlots());
|
||||
inv.dropItems(b.getLocation(), getCoolantSlots());
|
||||
inv.dropItems(b.getLocation(), getOutputSlots());
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
private void constructMenu(@Nonnull BlockMenuPreset preset) {
|
||||
|
@ -9,8 +9,10 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
||||
import io.github.thebusybiscuit.slimefun4.core.attributes.HologramOwner;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNet;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.handlers.SimpleBlockBreakHandler;
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||
@ -34,10 +36,18 @@ public class EnergyRegulator extends SlimefunItem implements HologramOwner {
|
||||
public EnergyRegulator(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||
super(category, item, recipeType, recipe);
|
||||
|
||||
SlimefunItem.registerBlockHandler(getId(), (p, b, stack, reason) -> {
|
||||
removeHologram(b);
|
||||
return true;
|
||||
});
|
||||
addItemHandler(onBreak());
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private BlockBreakHandler onBreak() {
|
||||
return new SimpleBlockBreakHandler() {
|
||||
|
||||
@Override
|
||||
public void onBlockBreak(@Nonnull Block b) {
|
||||
removeHologram(b);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
@ -23,9 +23,11 @@ import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
||||
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
|
||||
import io.github.thebusybiscuit.slimefun4.api.events.AsyncReactorProcessCompleteEvent;
|
||||
import io.github.thebusybiscuit.slimefun4.api.events.ReactorExplodeEvent;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.attributes.HologramOwner;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.handlers.SimpleBlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.items.cargo.ReactorAccessPort;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.AbstractEnergyProvider;
|
||||
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
|
||||
@ -106,24 +108,31 @@ public abstract class Reactor extends AbstractEnergyProvider implements Hologram
|
||||
}
|
||||
};
|
||||
|
||||
registerBlockHandler(getId(), (p, b, tool, reason) -> {
|
||||
BlockMenu inv = BlockStorage.getInventory(b);
|
||||
|
||||
if (inv != null) {
|
||||
inv.dropItems(b.getLocation(), getFuelSlots());
|
||||
inv.dropItems(b.getLocation(), getCoolantSlots());
|
||||
inv.dropItems(b.getLocation(), getOutputSlots());
|
||||
}
|
||||
|
||||
progress.remove(b.getLocation());
|
||||
processing.remove(b.getLocation());
|
||||
removeHologram(b);
|
||||
return true;
|
||||
});
|
||||
|
||||
addItemHandler(onBreak());
|
||||
registerDefaultFuelTypes();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private BlockBreakHandler onBreak() {
|
||||
return new SimpleBlockBreakHandler() {
|
||||
|
||||
@Override
|
||||
public void onBlockBreak(@Nonnull Block b) {
|
||||
BlockMenu inv = BlockStorage.getInventory(b);
|
||||
|
||||
if (inv != null) {
|
||||
inv.dropItems(b.getLocation(), getFuelSlots());
|
||||
inv.dropItems(b.getLocation(), getCoolantSlots());
|
||||
inv.dropItems(b.getLocation(), getOutputSlots());
|
||||
}
|
||||
|
||||
progress.remove(b.getLocation());
|
||||
processing.remove(b.getLocation());
|
||||
removeHologram(b);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
protected void updateInventory(@Nonnull BlockMenu menu, @Nonnull Block b) {
|
||||
ReactorMode mode = getReactorMode(b.getLocation());
|
||||
|
||||
|
@ -4,6 +4,9 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.OptionalInt;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
@ -16,8 +19,10 @@ import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
||||
import io.github.thebusybiscuit.slimefun4.api.geo.GEOResource;
|
||||
import io.github.thebusybiscuit.slimefun4.core.attributes.HologramOwner;
|
||||
import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.handlers.SimpleBlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.AdvancedMenuClickHandler;
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction;
|
||||
@ -37,25 +42,15 @@ public class GEOMiner extends AContainer implements RecipeDisplayItem, HologramO
|
||||
private static final int[] OUTPUT_SLOTS = { 29, 30, 31, 32, 33, 38, 39, 40, 41, 42 };
|
||||
private static final int PROCESSING_TIME = 14;
|
||||
|
||||
@ParametersAreNonnullByDefault
|
||||
public GEOMiner(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||
super(category, item, recipeType, recipe);
|
||||
|
||||
addItemHandler(onPlace());
|
||||
registerBlockHandler(getId(), (p, b, stack, reason) -> {
|
||||
removeHologram(b);
|
||||
|
||||
BlockMenu inv = BlockStorage.getInventory(b);
|
||||
|
||||
if (inv != null) {
|
||||
inv.dropItems(b.getLocation(), getOutputSlots());
|
||||
}
|
||||
|
||||
progress.remove(b);
|
||||
processing.remove(b);
|
||||
return true;
|
||||
});
|
||||
addItemHandler(onBreak());
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private BlockPlaceHandler onPlace() {
|
||||
return new BlockPlaceHandler(false) {
|
||||
|
||||
@ -66,6 +61,26 @@ public class GEOMiner extends AContainer implements RecipeDisplayItem, HologramO
|
||||
};
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private BlockBreakHandler onBreak() {
|
||||
return new SimpleBlockBreakHandler() {
|
||||
|
||||
@Override
|
||||
public void onBlockBreak(@Nonnull Block b) {
|
||||
removeHologram(b);
|
||||
|
||||
BlockMenu inv = BlockStorage.getInventory(b);
|
||||
|
||||
if (inv != null) {
|
||||
inv.dropItems(b.getLocation(), getOutputSlots());
|
||||
}
|
||||
|
||||
progress.remove(b);
|
||||
processing.remove(b);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMachineIdentifier() {
|
||||
return "GEO_MINER";
|
||||
|
@ -1,12 +1,19 @@
|
||||
package io.github.thebusybiscuit.slimefun4.implementation.items.gps;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNetComponentType;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||
@ -23,16 +30,12 @@ public abstract class GPSTransmitter extends SimpleSlimefunItem<BlockTicker> imp
|
||||
|
||||
private final int capacity;
|
||||
|
||||
@ParametersAreNonnullByDefault
|
||||
public GPSTransmitter(Category category, int tier, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||
super(category, item, recipeType, recipe);
|
||||
this.capacity = 4 << (2 * tier);
|
||||
|
||||
addItemHandler(onPlace());
|
||||
registerBlockHandler(getId(), (p, b, stack, reason) -> {
|
||||
UUID owner = UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner"));
|
||||
SlimefunPlugin.getGPSNetwork().updateTransmitter(b.getLocation(), owner, false);
|
||||
return true;
|
||||
});
|
||||
addItemHandler(onPlace(), onBreak());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -40,6 +43,7 @@ public abstract class GPSTransmitter extends SimpleSlimefunItem<BlockTicker> imp
|
||||
return capacity;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private BlockPlaceHandler onPlace() {
|
||||
return new BlockPlaceHandler(false) {
|
||||
|
||||
@ -50,6 +54,19 @@ public abstract class GPSTransmitter extends SimpleSlimefunItem<BlockTicker> imp
|
||||
};
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private BlockBreakHandler onBreak() {
|
||||
return new BlockBreakHandler(false, false) {
|
||||
|
||||
@Override
|
||||
public void onPlayerBreak(BlockBreakEvent e, ItemStack item, List<ItemStack> drops) {
|
||||
Location l = e.getBlock().getLocation();
|
||||
UUID owner = UUID.fromString(BlockStorage.getLocationInfo(l, "owner"));
|
||||
SlimefunPlugin.getGPSNetwork().updateTransmitter(l, owner, false);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public abstract int getMultiplier(int y);
|
||||
|
||||
public abstract int getEnergyConsumption();
|
||||
|
@ -56,14 +56,9 @@ public class BlockListener implements Listener {
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
||||
public void onBlockPlaceExisting(BlockPlaceEvent e) {
|
||||
/*
|
||||
* This prevents Players from placing a block where another block already exists.
|
||||
* While this can cause ghost blocks it also prevents them from replacing grass
|
||||
* or saplings etc...
|
||||
*/
|
||||
Block block = e.getBlock();
|
||||
|
||||
// Fixes #2636
|
||||
// Fixes #2636 - This will solve the "ghost blocks" issue
|
||||
if (e.getBlockReplacedState().getType().isAir()) {
|
||||
SlimefunItem sfItem = BlockStorage.check(block);
|
||||
|
||||
@ -77,6 +72,7 @@ public class BlockListener implements Listener {
|
||||
BlockStorage.clearBlockInfo(block);
|
||||
}
|
||||
} else if (BlockStorage.hasBlockInfo(e.getBlock())) {
|
||||
// If there is no air (e.g. grass) then don't let the block be placed
|
||||
e.setCancelled(true);
|
||||
}
|
||||
}
|
||||
@ -117,18 +113,18 @@ public class BlockListener implements Listener {
|
||||
return;
|
||||
}
|
||||
|
||||
checkForSensitiveBlockAbove(e.getPlayer(), e.getBlock());
|
||||
|
||||
ItemStack item = e.getPlayer().getInventory().getItemInMainHand();
|
||||
checkForSensitiveBlockAbove(e, item);
|
||||
|
||||
int fortune = getBonusDropsWithFortune(item, e.getBlock());
|
||||
List<ItemStack> drops = new ArrayList<>();
|
||||
|
||||
if (!item.getType().isAir()) {
|
||||
if (!e.isCancelled() && !item.getType().isAir()) {
|
||||
callToolHandler(e, item, fortune, drops);
|
||||
}
|
||||
|
||||
if (!e.isCancelled()) {
|
||||
callBlockHandler(e, item, fortune, drops);
|
||||
callBlockHandler(e, item, drops);
|
||||
}
|
||||
|
||||
dropItems(e, drops);
|
||||
@ -148,7 +144,7 @@ public class BlockListener implements Listener {
|
||||
}
|
||||
|
||||
@ParametersAreNonnullByDefault
|
||||
private void callBlockHandler(BlockBreakEvent e, ItemStack item, int fortune, List<ItemStack> drops) {
|
||||
private void callBlockHandler(BlockBreakEvent e, ItemStack item, List<ItemStack> drops) {
|
||||
SlimefunItem sfItem = BlockStorage.check(e.getBlock());
|
||||
|
||||
if (sfItem == null && SlimefunPlugin.getBlockDataService().isTileEntity(e.getBlock().getType())) {
|
||||
@ -172,7 +168,7 @@ public class BlockListener implements Listener {
|
||||
sfItem.error("Something went wrong while triggering a BlockHandler", x);
|
||||
}
|
||||
} else {
|
||||
sfItem.callItemHandler(BlockBreakHandler.class, handler -> handler.onBlockBreak(e, item, fortune, drops));
|
||||
sfItem.callItemHandler(BlockBreakHandler.class, handler -> handler.onPlayerBreak(e, item, drops));
|
||||
}
|
||||
|
||||
drops.addAll(sfItem.getDrops());
|
||||
@ -182,13 +178,15 @@ public class BlockListener implements Listener {
|
||||
|
||||
@ParametersAreNonnullByDefault
|
||||
private void dropItems(BlockBreakEvent e, List<ItemStack> drops) {
|
||||
if (!drops.isEmpty()) {
|
||||
e.getBlock().setType(Material.AIR);
|
||||
|
||||
if (!drops.isEmpty() && !e.isCancelled()) {
|
||||
// Notify plugins like CoreProtect
|
||||
SlimefunPlugin.getProtectionManager().logAction(e.getPlayer(), e.getBlock(), ProtectableAction.BREAK_BLOCK);
|
||||
|
||||
// Fixes #2560
|
||||
if (e.isDropItems()) {
|
||||
// Disable normal block drops
|
||||
e.setDropItems(false);
|
||||
|
||||
for (ItemStack drop : drops) {
|
||||
if (drop != null && drop.getType() != Material.AIR) {
|
||||
e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation(), drop);
|
||||
@ -209,8 +207,8 @@ public class BlockListener implements Listener {
|
||||
* The {@link Block} that was broken
|
||||
*/
|
||||
@ParametersAreNonnullByDefault
|
||||
private void checkForSensitiveBlockAbove(Player p, Block b) {
|
||||
Block blockAbove = b.getRelative(BlockFace.UP);
|
||||
private void checkForSensitiveBlockAbove(BlockBreakEvent e, ItemStack item) {
|
||||
Block blockAbove = e.getBlock().getRelative(BlockFace.UP);
|
||||
|
||||
if (SlimefunTag.SENSITIVE_MATERIALS.isTagged(blockAbove.getType())) {
|
||||
SlimefunItem sfItem = BlockStorage.check(blockAbove);
|
||||
@ -219,13 +217,29 @@ public class BlockListener implements Listener {
|
||||
SlimefunBlockHandler blockHandler = SlimefunPlugin.getRegistry().getBlockHandlers().get(sfItem.getId());
|
||||
|
||||
if (blockHandler != null) {
|
||||
if (blockHandler.onBreak(p, blockAbove, sfItem, UnregisterReason.PLAYER_BREAK)) {
|
||||
if (blockHandler.onBreak(e.getPlayer(), blockAbove, sfItem, UnregisterReason.PLAYER_BREAK)) {
|
||||
blockAbove.getWorld().dropItemNaturally(blockAbove.getLocation(), BlockStorage.retrieve(blockAbove));
|
||||
blockAbove.setType(Material.AIR);
|
||||
}
|
||||
} else {
|
||||
blockAbove.getWorld().dropItemNaturally(blockAbove.getLocation(), BlockStorage.retrieve(blockAbove));
|
||||
/*
|
||||
* We create a dummy here to pass onto the BlockBreakHandler.
|
||||
* This will set the correct block context.
|
||||
*/
|
||||
BlockBreakEvent dummyEvent = new BlockBreakEvent(blockAbove, e.getPlayer());
|
||||
List<ItemStack> drops = new ArrayList<>();
|
||||
drops.addAll(sfItem.getDrops(e.getPlayer()));
|
||||
|
||||
sfItem.callItemHandler(BlockBreakHandler.class, handler -> handler.onPlayerBreak(dummyEvent, item, drops));
|
||||
blockAbove.setType(Material.AIR);
|
||||
|
||||
if (!dummyEvent.isCancelled() && dummyEvent.isDropItems()) {
|
||||
for (ItemStack drop : drops) {
|
||||
if (drop != null && drop.getType() != Material.AIR) {
|
||||
blockAbove.getWorld().dropItemNaturally(blockAbove.getLocation(), drop);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
@ -9,15 +11,29 @@ import org.bukkit.block.Block;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockExplodeEvent;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.core.attributes.WitherProof;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||
|
||||
/**
|
||||
* The {@link ExplosionsListener} is a {@link Listener} which listens to any explosion events.
|
||||
* Any {@link WitherProof} block is excluded from these explosions and this {@link Listener} also
|
||||
* calls the explosive part of the {@link BlockBreakHandler}.
|
||||
*
|
||||
* @author TheBusyBiscuit
|
||||
*
|
||||
* @see BlockBreakHandler
|
||||
* @see WitherProof
|
||||
*
|
||||
*/
|
||||
public class ExplosionsListener implements Listener {
|
||||
|
||||
public ExplosionsListener(@Nonnull SlimefunPlugin plugin) {
|
||||
@ -26,12 +42,19 @@ public class ExplosionsListener implements Listener {
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onEntityExplode(EntityExplodeEvent e) {
|
||||
Iterator<Block> blocks = e.blockList().iterator();
|
||||
removeResistantBlocks(e.blockList().iterator());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onBlockExplode(BlockExplodeEvent e) {
|
||||
removeResistantBlocks(e.blockList().iterator());
|
||||
}
|
||||
|
||||
private void removeResistantBlocks(@Nonnull Iterator<Block> blocks) {
|
||||
while (blocks.hasNext()) {
|
||||
Block block = blocks.next();
|
||||
|
||||
SlimefunItem item = BlockStorage.check(block);
|
||||
|
||||
if (item != null) {
|
||||
blocks.remove();
|
||||
|
||||
@ -41,6 +64,24 @@ public class ExplosionsListener implements Listener {
|
||||
|
||||
if (blockHandler != null) {
|
||||
success = blockHandler.onBreak(null, block, item, UnregisterReason.EXPLODE);
|
||||
} else {
|
||||
item.callItemHandler(BlockBreakHandler.class, handler -> {
|
||||
if (handler.isExplosionAllowed(block)) {
|
||||
BlockStorage.clearBlockInfo(block);
|
||||
block.setType(Material.AIR);
|
||||
|
||||
List<ItemStack> drops = new ArrayList<>();
|
||||
handler.onExplode(block, drops);
|
||||
|
||||
for (ItemStack drop : drops) {
|
||||
if (drop != null && !drop.getType().isAir()) {
|
||||
block.getWorld().dropItemNaturally(block.getLocation(), drop);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (success) {
|
||||
|
@ -0,0 +1,32 @@
|
||||
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.api.events.AndroidMineEvent;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||
|
||||
public class MiningAndroidListener implements Listener {
|
||||
|
||||
public MiningAndroidListener(@Nonnull SlimefunPlugin plugin) {
|
||||
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onAndroidMine(AndroidMineEvent e) {
|
||||
SlimefunItem item = BlockStorage.check(e.getBlock());
|
||||
|
||||
item.callItemHandler(BlockBreakHandler.class, handler -> {
|
||||
if (handler.isAndroidAllowed(e.getBlock())) {
|
||||
handler.onAndroidBreak(e);
|
||||
} else {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -4,6 +4,7 @@ import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||
|
||||
@ -16,8 +17,10 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||
*
|
||||
* @author TheBusyBiscuit
|
||||
*
|
||||
* @deprecated Please use the {@link BlockBreakHandler} instead.
|
||||
*
|
||||
*/
|
||||
@Deprecated
|
||||
@FunctionalInterface
|
||||
public interface SlimefunBlockHandler {
|
||||
|
||||
|
@ -40,6 +40,7 @@ import io.github.thebusybiscuit.slimefun4.core.attributes.Placeable;
|
||||
import io.github.thebusybiscuit.slimefun4.core.attributes.Radioactive;
|
||||
import io.github.thebusybiscuit.slimefun4.core.attributes.Rechargeable;
|
||||
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.researching.Research;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.items.VanillaItem;
|
||||
@ -1189,6 +1190,17 @@ public class SlimefunItem implements Placeable {
|
||||
return SlimefunPlugin.getRegistry().getPublicItemHandlers().computeIfAbsent(identifier, c -> new HashSet<>());
|
||||
}
|
||||
|
||||
/**
|
||||
* This has been deprecated.
|
||||
*
|
||||
* @deprecated Please use {@link #addItemHandler(ItemHandler...)} and {@link BlockBreakHandler} instead
|
||||
*
|
||||
* @param id
|
||||
* The id
|
||||
* @param handler
|
||||
* The handler
|
||||
*/
|
||||
@Deprecated
|
||||
public static void registerBlockHandler(String id, SlimefunBlockHandler handler) {
|
||||
SlimefunPlugin.getRegistry().getBlockHandlers().put(id, handler);
|
||||
}
|
||||
|
@ -10,9 +10,12 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
||||
*
|
||||
* @author TheBusyBiscuit
|
||||
*
|
||||
* @deprecated This enum is no longer needed
|
||||
*
|
||||
* @see SlimefunBlockHandler
|
||||
*
|
||||
*/
|
||||
@Deprecated
|
||||
public enum UnregisterReason {
|
||||
|
||||
/**
|
||||
|
@ -19,6 +19,7 @@ import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow;
|
||||
* @deprecated This interface is not designed to be used by addons.
|
||||
*
|
||||
*/
|
||||
@Deprecated
|
||||
public interface InventoryBlock {
|
||||
|
||||
/**
|
||||
|
@ -2,6 +2,8 @@ package me.mrCookieSlime.Slimefun.Objects.handlers;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.api.exceptions.IncompatibleItemHandlerException;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BowShootHandler;
|
||||
@ -51,7 +53,8 @@ public interface ItemHandler {
|
||||
* @return An {@link Optional} describing the result, it will contain an {@link IncompatibleItemHandlerException}
|
||||
* should there be an issue
|
||||
*/
|
||||
default Optional<IncompatibleItemHandlerException> validate(SlimefunItem item) {
|
||||
@Nonnull
|
||||
default Optional<IncompatibleItemHandlerException> validate(@Nonnull SlimefunItem item) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@ -61,5 +64,6 @@ public interface ItemHandler {
|
||||
*
|
||||
* @return The {@link Class} identifier for this {@link ItemHandler}
|
||||
*/
|
||||
@Nonnull
|
||||
Class<? extends ItemHandler> getIdentifier();
|
||||
}
|
||||
|
@ -417,19 +417,14 @@ public class BlockStorage {
|
||||
* @return the SlimefunItem's ItemStack corresponding to the block if it has one, otherwise null
|
||||
*/
|
||||
@Nullable
|
||||
public static ItemStack retrieve(Block block) {
|
||||
if (!hasBlockInfo(block)) {
|
||||
public static ItemStack retrieve(@Nonnull Block block) {
|
||||
SlimefunItem item = check(block);
|
||||
|
||||
if (item == null) {
|
||||
return null;
|
||||
} else {
|
||||
String id = getLocationInfo(block.getLocation(), "id");
|
||||
SlimefunItem item = SlimefunItem.getByID(id);
|
||||
clearBlockInfo(block);
|
||||
|
||||
if (item == null) {
|
||||
return null;
|
||||
} else {
|
||||
return item.getItem();
|
||||
}
|
||||
return item.getItem();
|
||||
}
|
||||
}
|
||||
|
||||
@ -705,6 +700,11 @@ public class BlockStorage {
|
||||
return id == null ? null : SlimefunItem.getByID(id);
|
||||
}
|
||||
|
||||
public static boolean check(Block block, String slimefunItem) {
|
||||
String id = checkID(block);
|
||||
return id != null && id.equals(slimefunItem);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static String checkID(@Nonnull Block b) {
|
||||
// Only access the BlockState when on the main thread
|
||||
@ -719,16 +719,8 @@ public class BlockStorage {
|
||||
return checkID(b.getLocation());
|
||||
}
|
||||
|
||||
public static boolean check(Block block, String slimefunItem) {
|
||||
String id = checkID(block);
|
||||
return id != null && id.equals(slimefunItem);
|
||||
}
|
||||
|
||||
public static String checkID(Location l) {
|
||||
if (!hasBlockInfo(l)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static String checkID(@Nonnull Location l) {
|
||||
return getLocationInfo(l, "id");
|
||||
}
|
||||
|
||||
@ -741,7 +733,7 @@ public class BlockStorage {
|
||||
return id != null && id.equals(slimefunItem);
|
||||
}
|
||||
|
||||
public static boolean isWorldLoaded(World world) {
|
||||
public static boolean isWorldLoaded(@Nonnull World world) {
|
||||
return SlimefunPlugin.getRegistry().getWorlds().containsKey(world.getName());
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
slimefun:
|
||||
weapons: Wapens
|
||||
tools: Gereedschappen
|
||||
items: Voorwerpen
|
||||
items: Handige Voorwerpen
|
||||
food: Eten
|
||||
basic_machines: Standaard machines
|
||||
electricity: Energie en Elektriciteit
|
||||
@ -13,7 +13,7 @@ slimefun:
|
||||
misc: Diverse Voorwerpen
|
||||
technical_gadgets: Technische Gadgets
|
||||
resources: Grondstoffen
|
||||
cargo: Cargobehering
|
||||
cargo: Opslagbehering
|
||||
tech_misc: Technische Componenten
|
||||
magical_armor: Magische Bescherming
|
||||
talismans: Amuletten (Niveau I)
|
||||
|
@ -14,7 +14,7 @@ slimefun:
|
||||
technical_gadgets: Những Đồ Dùng Kỹ Thuật
|
||||
resources: Những Tài Nguyên
|
||||
cargo: Quản Lý Hàng Hoá
|
||||
tech_misc: Những Thành Phần Kỷ Thuật
|
||||
tech_misc: Những Thành Phần Kỹ Thuật
|
||||
magical_armor: Giáp Ma Thuật
|
||||
talismans: Bùa Hộ Mệnh ( Loại I )
|
||||
ender_talismans: Bùa Hộ Mệnh ( Loại II )
|
||||
@ -23,4 +23,4 @@ slimefun:
|
||||
easter: Lệ Phục Sinh (Tháng Tư)
|
||||
birthday: Sinh Nhật TheBusyBiscuit (26 Tháng 10)
|
||||
halloween: Halloween (31 tháng 10)
|
||||
androids: Programmable Androids
|
||||
androids: Android lập trình
|
||||
|
@ -4,7 +4,7 @@ commands:
|
||||
cheat: Позволява Ви да чийтвате Предмети
|
||||
give: Позволява Ви да давате на някого Slimefun Предмети
|
||||
guide: Дава ви Slimefun Ръководство
|
||||
teleporter: Вижте пътни точки от други играчи
|
||||
teleporter: Вижте пътни точки на други играчи
|
||||
versions: Лист с всички инсталирани Добавки
|
||||
search: Претърсва вашето Ръководство за даден термин / предмет
|
||||
open_guide: Отваря Ви Slimefun Ръководството без да използвате книгата
|
||||
@ -48,10 +48,10 @@ guide:
|
||||
selected-language: 'Избран в момента:'
|
||||
change: Натисни, за да избереш нов език
|
||||
description:
|
||||
- "&7Сега имаш опцията да промениш"
|
||||
- "&7езика, на който е Slimefun"
|
||||
- "&7той ще се промени само за теб. Предметите"
|
||||
- "&7не могат да бъдат преведени за момента."
|
||||
'0': "&7Сега имаш опцията да промениш"
|
||||
'1': "&7езика, на който е Slimefun"
|
||||
'2': "&7той ще се промени само за теб. Предметите"
|
||||
'3': "&7не могат да бъдат преведени за момента."
|
||||
title:
|
||||
main: Slimefun Ръководство
|
||||
settings: Настройки & Информация
|
||||
@ -73,10 +73,10 @@ guide:
|
||||
profile-link: Натиснете, за да видите техния профил в GitHub
|
||||
open: Натисни, за да видиш нашите контрибутори
|
||||
description:
|
||||
- "&7Slimefun е проект с отворен код"
|
||||
- "&7и е поддържан от голямо общество от хора."
|
||||
- "&7Над &e%contributors% &7хора са работили върху"
|
||||
- "&7Slimefun през всички тези години."
|
||||
'0': "&7Slimefun е проект с отворен код"
|
||||
'1': "&7и е поддържан от голямо общество от хора."
|
||||
'2': "&7Над &e%contributors% &7хора са работили върху"
|
||||
'3': "&7Slimefun през всички тези години."
|
||||
pages:
|
||||
previous: Предишна страница
|
||||
next: Следваща страница
|
||||
@ -96,9 +96,9 @@ guide:
|
||||
settings: Върнете се обратно в Панела с Настройки(Settings Panel)
|
||||
locked: ЗАКЛЮЧЕНО
|
||||
locked-category:
|
||||
- За да отключите тази категория
|
||||
- ще трябва да отключите всички предмети от
|
||||
- следните категории
|
||||
'0': За да отключите тази категория
|
||||
'1': ще трябва да отключите всички предмети от
|
||||
'2': следните категории
|
||||
work-in-progress: Тази функция не е завършена все още!
|
||||
messages:
|
||||
not-researched: "&4Нямате достатъчно познания, за да разберете това"
|
||||
@ -154,22 +154,22 @@ messages:
|
||||
link-prompt: "&eНатиснете тук:"
|
||||
diet-cookie: "&eЗапочнахте да се чувствате доста лекичък..."
|
||||
fortune-cookie:
|
||||
- "&7Помогнете ми, аз съм затворен в Фабрика за Късметлийски Бисквитки!"
|
||||
- "&7Утре Вие ще умрете... от Creeper"
|
||||
- "&7В някакъв момент от живота Ви нещо лошо ще се случи!!!"
|
||||
- "&7Следващата седмица ще забележите, че това не е реалния свят, а всъщност Вие
|
||||
сте в компютърна игра"
|
||||
- "&7Тази бисквитка ще стане вкусна в следващите няколко секунди"
|
||||
- '&7Последната дума, която ще чуете ще бъде "УНИЩОЖЕТЕ!!!"'
|
||||
- "&7Каквото и да правите никога, ама никога не прегръщайте Creeper... Аз опитах.
|
||||
Доста добре е, но не си заслужава."
|
||||
- "&742. Отговорът е 42."
|
||||
- "&7Walshy веднъж на ден ще пази неприятностите далече."
|
||||
- "&7Никога не копайте право надолу!"
|
||||
- "&7Туй е само плътна рана!"
|
||||
- "&7Винаги гледайте от към хубавата страна на живота!"
|
||||
- "&7Това беше Бисквитка, а не Курабийка"
|
||||
- "&7Неоновите табели светят!"
|
||||
'0': "&7Помогнете ми, аз съм затворен в Фабрика за Късметлийски Бисквитки!"
|
||||
'1': "&7Утре Вие ще умрете... от Creeper"
|
||||
'2': "&7В някакъв момент от живота Ви нещо лошо ще се случи!!!"
|
||||
'3': "&7Следващата седмица ще забележите, че това не е реалния свят, а всъщност
|
||||
Вие сте в компютърна игра"
|
||||
'4': "&7Тази бисквитка ще стане вкусна в следващите няколко секунди"
|
||||
'5': '&7Последната дума, която ще чуете ще бъде "УНИЩОЖЕТЕ!!!"'
|
||||
'6': "&7Каквото и да правите никога, ама никога не прегръщайте Creeper... Аз опитах.
|
||||
Доста добре е, но не си заслужава."
|
||||
'7': "&742. Отговорът е 42."
|
||||
'8': "&7Walshy веднъж на ден ще пази неприятностите далече."
|
||||
'9': "&7Никога не копайте право надолу!"
|
||||
'10': "&7Туй е само плътна рана!"
|
||||
'11': "&7Винаги гледайте от към хубавата страна на живота!"
|
||||
'12': "&7Това беше Бисквитка, а не Курабийка"
|
||||
'13': "&7Неоновите табели светят!"
|
||||
piglin-barter: "&4Не може да разменяте предмети с Пиглините използвайки предмети
|
||||
от Slimefun"
|
||||
enchantment-rune:
|
||||
@ -269,9 +269,9 @@ gps:
|
||||
max: "&4Достигнахте максималната бройка локации"
|
||||
duplicate: "&4Вие вече сте създал локация на име: &f%waypoint%"
|
||||
insufficient-complexity:
|
||||
- "&4Недостатъчна Сложност на GPS Мрежата: &c%complexity%"
|
||||
- "&4a) Все още нямате направена GPS Мрежа"
|
||||
- "&4b) Вашата GPS Мрежа не е достатъчно сложна"
|
||||
'0': "&4Недостатъчна Сложност на GPS Мрежата: &c%complexity%"
|
||||
'1': "&4a) Все още нямате направена GPS Мрежа"
|
||||
'2': "&4b) Вашата GPS Мрежа не е достатъчно сложна"
|
||||
geo:
|
||||
scan-required: "&4GEO-Scan изискан! &cПърво сканирайте този чънк използвайки GEO-Scanner!"
|
||||
inventory:
|
||||
@ -310,11 +310,10 @@ android:
|
||||
INTERFACE_ITEMS: "&9Изпратни съдаржанието на Инвентара към лицевия Интерфейс"
|
||||
INTERFACE_FUEL: "&cИзвадете Гориво от лицевия Интерфейс"
|
||||
enter-name:
|
||||
-
|
||||
- "&eМоля въведете име за скрипта си"
|
||||
'1': "&eМоля въведете име за скрипта си"
|
||||
uploaded:
|
||||
- "&bКачване..."
|
||||
- "&aУспешно качихме твоя скрипт!"
|
||||
'0': "&bКачване..."
|
||||
'1': "&aУспешно качихме твоя скрипт!"
|
||||
rating:
|
||||
own: "&4Не може да оцените собствения си скрипт!"
|
||||
already: "&4Вие вече сте оставили рейтинг за този скрипт!"
|
||||
|
@ -1,34 +1,38 @@
|
||||
---
|
||||
commands:
|
||||
help: Zobrazí tuto nápovědu
|
||||
cheat: Umožňuje nacheatovat věci
|
||||
give: Dejte někomu nějaké Slimefun věci
|
||||
guide: Dá vám Slimefun příručku
|
||||
timings: Lag-Info vašeho serveru
|
||||
teleporter: "Zobrazí \nznačky \nostatních hráčů"
|
||||
versions: Seznam všech nainstalovaných doplňků
|
||||
search: Vyhledá ve vaší příručce daný příkaz
|
||||
cheat: Umožní našvindlovat si věci
|
||||
give: Dá hráči vybrané Slimefun předměty
|
||||
guide: Dá Slimefun příručku
|
||||
teleporter: Zobrazí záchytné body ostatních hráčů
|
||||
versions: Zobrazí všechny nainstalované doplňky
|
||||
search: Vyhledá v příručce daný předmět
|
||||
open_guide: Otevře Slimefun příručku bez použití knihy
|
||||
stats: Ukáže statistiky hráče
|
||||
research:
|
||||
description: Odemkne/Resetuje výzkum daného hráče
|
||||
description: Odemkne či resetuje výzkum daného hráče
|
||||
reset: "&cResetoval jsi výzkum hráče %player%"
|
||||
reset-target: "&cTvoje znalost byla resetována "
|
||||
backpack:
|
||||
description: Načíst kopii existujícího batohu
|
||||
invalid-id: "&4Id nesmí být záporné!"
|
||||
player-never-joined: "&4Hráče s tímto jménem nelze nalézt!"
|
||||
backpack-does-not-exist: "&4Určený batoh neexistuje!"
|
||||
backpack-does-not-exist: "&4Zadaný batoh neexistuje!"
|
||||
restored-backpack-given: "&aTvůj batoh byl obnoven a navrácen do tvého inventáře!"
|
||||
charge:
|
||||
description: Nabije předmět, který držíš
|
||||
charge-success: Předmět byl nabit!
|
||||
not-rechargeable: Tento předmět nelze nabít!
|
||||
timings: Lag-Info vašeho serveru
|
||||
guide:
|
||||
search:
|
||||
message: "&bCo bys chtěl vyhledat?"
|
||||
name: "&7Hledat..."
|
||||
tooltip: "&bKliknutím vyhledejte položku"
|
||||
tooltip: "&bKlikni pro vyhledání předmětu"
|
||||
inventory: 'Hledání: %item%'
|
||||
lore:
|
||||
- "&bCo bys chtěl vyhledat?"
|
||||
- "&7Napiš do chatu co chceš vyhledat"
|
||||
'1': "&7Napiš do chatu co chceš vyhledat"
|
||||
'0': "&bCo bys chtěl vyhledat?"
|
||||
cheat:
|
||||
no-multiblocks: "&4Nemůžeš podvádět v multiblocích, musíš je postavit!"
|
||||
languages:
|
||||
@ -41,157 +45,169 @@ guide:
|
||||
selected-language: 'Aktuálně vybráno:'
|
||||
change: Klikni pro výběr nového jazyka
|
||||
description:
|
||||
- "&7Nyní máš možnost to změnit"
|
||||
- "&7jazyk, ve kterém bude Slimefun"
|
||||
- "&7bude ti představeno. Předměty"
|
||||
- "&7nelze prozatím přeložit."
|
||||
'0': "&7Nyní máš možnost změnit"
|
||||
'1': "&7jazyk, ve kterém ti bude"
|
||||
'2': "&7Slimefun prezentován. Předměty"
|
||||
'3': "&7nelze prozatím přeložit."
|
||||
title:
|
||||
main: Slimefun příručka
|
||||
settings: Nastavení a informace
|
||||
languages: Zvol tvůj preferovaný jazyk
|
||||
languages: Zvol svůj preferovaný jazyk
|
||||
credits: Slimefun4 pomocníci
|
||||
wiki: Slimefun4 Wiki
|
||||
addons: Addony pro Slimefun4
|
||||
addons: Doplňky pro Slimefun4
|
||||
bugs: Nahlášení chyb
|
||||
source: Zdrojový kód
|
||||
versions: Nainstalovaná verze
|
||||
credits:
|
||||
commit: Commit
|
||||
commits: Commits
|
||||
roles:
|
||||
developer: "&6Vývojář"
|
||||
wiki: "&3Wiki správce"
|
||||
resourcepack: "&cTvůrce Resourcepacku"
|
||||
translator: "&9Překladač"
|
||||
profile-link: Klikni pro navštívení jejich profilu na GitHubu
|
||||
open: Klikni pro zobrazení našich spoluúčastníků
|
||||
resourcepack: "&cTvůrce modifikačního balíčku"
|
||||
translator: "&9Překladatel"
|
||||
profile-link: Klikni pro navštívení jeho profilu na GitHubu
|
||||
open: Klikni pro zobrazení našich pomocníků
|
||||
description:
|
||||
- "&7Slimefun je open-source projekt"
|
||||
- "&7a udržován velkou komunitou lidí."
|
||||
- "&Přes&e%contributors% &7lidí na tom pracovalo"
|
||||
- "&7Slimefun za všechny ty roky."
|
||||
'0': "&7Slimefun je open-source projekt"
|
||||
'1': "&7udržován velkou komunitou lidí."
|
||||
'2': "&7Na Slimefunu za všechny ty roky pracovalo"
|
||||
'3': "&7přes &e%contributors% &7lidí."
|
||||
pages:
|
||||
previous: Předchozí strana
|
||||
next: Následující strana
|
||||
tooltips:
|
||||
open-category: Klikni pro otevření
|
||||
versions-notice: To jsou velmi důležité při hlášení chyb!
|
||||
wiki: Zobrazit tento předmět na oficiální SlimeFun Wiki
|
||||
wiki: Zobrazit tento předmět na oficiální Slimefun Wiki
|
||||
recipes:
|
||||
machine: Recepty vytvářené tímto strojem
|
||||
miner: Materiály, které můžeš získat tímto těžebním robotem
|
||||
generator: Dostupné typy paliv
|
||||
gold-pan: Materiály, které můžeš získat
|
||||
climbing-pick: Povrchy, na které můžeš lézt
|
||||
back:
|
||||
title: Zpět
|
||||
guide: Zpět do Slimefun Guide
|
||||
settings: Zpět do Settings Panel
|
||||
guide: Zpět do Slimefun příručky
|
||||
settings: Zpět do panelu nastavení
|
||||
locked: ZAMČENO
|
||||
locked-category:
|
||||
- Chcete-li odemknout tuto kategorii, budete
|
||||
- 'je třeba odemknout všechny položky z '
|
||||
- následující kategorie
|
||||
'0': Chceš-li odemknout tuto kategorii,
|
||||
'1': je potřeba odemknout všechny předměty
|
||||
'2': z předchozích kategorií
|
||||
work-in-progress: Tato funkce ještě není zcela dokončena!
|
||||
messages:
|
||||
not-researched: "&4Ještě jsi nepostoupil tak daleko, abys pochopil tuhle věc"
|
||||
not-enough-xp: "&4Nemáš dostatek XP levelů na to, abys vyzkoumal tuhle věc"
|
||||
unlocked: '&bMáš vyzkoumáno &7"%research%"'
|
||||
not-enough-xp: "&4Nemáš dostatek XP úrovní na to, abys vyzkoumal tuhle věc"
|
||||
unlocked: "&bMáš vyzkoumáno &7„%research%”"
|
||||
only-players: "&4Tenhle příkaz je jenom pro hráče"
|
||||
unknown-player: "&4Neznámý hráč: &c%player%"
|
||||
no-permission: "&4Na tohle nemáš dostatečné povolení"
|
||||
no-permission: "&4Na tohle nemáš dostatečné oprávnění"
|
||||
usage: "&4Použití: &c%usage%"
|
||||
not-online: "&4%player% &czrovna není připojen!"
|
||||
invalid-item: "&4%item% &cnení platný item!"
|
||||
invalid-amount: "&4%amount% &cnení platné číslo : musí být větší než 0!"
|
||||
given-item: '&bDostal jsi &a%amount% &7"%item%&7"'
|
||||
give-item: '&bDal jsi %player% &a%amount% &7"%item%&7"'
|
||||
invalid-research: "&4%research% &cnení platný výzkum!"
|
||||
given-item: "&bDostal jsi &a%amount% &7„%item%&7”"
|
||||
give-item: "&bDal jsi %player% &a%amount% &7„%item%&7”"
|
||||
give-research: '&bUdělil jsi %player% výzkum &7"%research%&7"'
|
||||
hungry: "&cJsi moc hladový na to, abys to zvládl!"
|
||||
disabled-in-world: "&4&lTahle věc není v tomhle světě povolená"
|
||||
disabled-item: |-
|
||||
&4&lTahle věc není povolená!
|
||||
Jak jsi ji vůbec dostal?
|
||||
no-tome-yourself: "&cNemůžeš použít svůj &4Tome of Knowledge &c..."
|
||||
no-tome-yourself: "&cNemůžeš použít svůj &4Tome of Knowledge&c..."
|
||||
multimeter: "&bEnergie: &3%stored% &b/ &3%capacity%"
|
||||
talisman:
|
||||
anvil: "&a&oTvůj talisman zachránil tvůj nástroj od rozbití"
|
||||
miner: "&a&oTvůj talisman zdvojnásobil tvoje dropy"
|
||||
hunter: "&a&oTvůj talisman zdvojnásobil tvoje dropy"
|
||||
miner: "&a&oTvůj talisman zdvojnásobil tvou kořist"
|
||||
hunter: "&a&oTvůj talisman zdvojnásobil tvou kořist"
|
||||
lava: "&a&oTvůj talisman tě zachránil před uhořením"
|
||||
water: "&a&oTvůj talisman tě zachránil před utopením"
|
||||
angel: "&a&oTvůj talisman tě zachránil před poškození pádem"
|
||||
fire: "&a&oTvůj talisman tě zachránil před uhořením"
|
||||
magician: "&a&oTvůj talisman ti dal přídavné enchanty"
|
||||
magician: "&a&oTvůj talisman ti dal dodatečná očarování"
|
||||
traveller: "&a&oTvůj talisman ti dal rychlost"
|
||||
warrior: "&a&oTvůj talisman ti dal efekt síly na nějakou tu chvíli"
|
||||
knight: "&a&oTvůj talisman ti dal 5 vteřin regenerace"
|
||||
warrior: "&a&oTvůj talisman ti dal na určitou chvilku efekt síly"
|
||||
knight: "&a&oTvůj talisman ti dal 5 sekund regenerace"
|
||||
whirlwind: "&a&oTvůj talisman odrazil projektil"
|
||||
wizard: "&a&oTvůj talisman ti dal větší level Štěstí, ale možná snížil level jiných
|
||||
enchantů"
|
||||
wizard: "&a&oTvůj talisman ti dal větší úroveň štěstí, ale možná snížil úroveň
|
||||
jiných očarování"
|
||||
caveman: "&a&oTvůj talisman ti dal spěch"
|
||||
wise: "& a&aTvůj talisman zdvojnásobil zisk tvých zkušeností"
|
||||
soulbound-rune:
|
||||
fail: "&cKe své duši můžeš přidat jen jeden předmět."
|
||||
success: "&aÚspěšně jsi přidal tento item ke své duši. Pokud zemřeš, item ti zůstane."
|
||||
fail: "&cSvou duši můžeš spoutat jen s jedním předmětem."
|
||||
success: "&aÚspěšně jsi spoutal tento předmět se svou duši. Pokud zemřeš, předmět
|
||||
ti zůstane."
|
||||
research:
|
||||
start: "&7Antičtí duchové šeptají magické slova do tvého ucha..."
|
||||
start: "&7Antičtí duchové šeptají magická slova do tvého ucha..."
|
||||
progress: "&7Začal jsi přemýšlet nad &b%research% &e(%progress%)"
|
||||
fire-extinguish: "&7Uhasil ses"
|
||||
cannot-place: "&cZde nemůžeš položit blok!"
|
||||
no-pvp: "&cZde nemůžeš bojovat s hráči!"
|
||||
radiation: "&4Byl jsi vystaven smrtelné radiaci! &cVyhoď radioaktivní předmět nebo
|
||||
si obleč Hazmat oblek."
|
||||
opening-guide: "&bOtevírání příručky, může to pár sekund trvat..."
|
||||
opening-backpack: "&bOtevírání batohu, může to pár sekund trvat..."
|
||||
no-iron-golem-heal: "&cTo není Iron Ingot! S tímto nemůžeš léčit Iron Golemy!"
|
||||
si obleč hazmat oblek."
|
||||
opening-guide: "&bOtevírá se příručka, může to pár sekund trvat..."
|
||||
opening-backpack: "&bOtevírá se batoh, může to pár sekund trvat..."
|
||||
no-iron-golem-heal: "&cTohle není železný ingot, a proto s ním nemůžeš léčit železné
|
||||
golemy!"
|
||||
link-prompt: "&eKlikni zde:"
|
||||
diet-cookie: "&eZačínáš se cítit velice lehký..."
|
||||
diet-cookie: "&eZačínáš se cítit velice lehce..."
|
||||
fortune-cookie:
|
||||
- "&7POMOOC!! Jsem uvězněn v továrně na sušenky štěstí!"
|
||||
- "&7Zítra zemřeš... s láskou od pana Creepera"
|
||||
- "&7V nějaké části tvého života se stane něco špatného!!!"
|
||||
- "&7Příští týden si uvědomíš, že toto není reálný život, ale jsi v počítačové hře."
|
||||
- "&7Sušenka ti bude za pár vteřin velice chutnat"
|
||||
- '&7Poslední slovo, které uslyšíš bude "VYHUBIT!!!"'
|
||||
- "&7Ať se stane cokoliv, nepokoušej se mazlit Creepera... Zkusil jsem to. Je to
|
||||
dobrý pocit, ale nestojí to za to."
|
||||
- "&742. Odpověď je 42."
|
||||
- "&7Walshy udrží den problémy pryč."
|
||||
- "&7Nikdy nekopej pod sebe!"
|
||||
- "&7To je jen rána masa!"
|
||||
- "&7Vždy se podívejte na světlou stránku života!"
|
||||
- "&7Tohle byl vlastně Biscuit a ne Cookie"
|
||||
- "&7Neonové cedule jsou LIT!"
|
||||
piglin-barter: "&4Nemůžete měnit s pigliny Slimefun předměty"
|
||||
'0': "&7POMOOC!! Jsem uvězněn v továrně na sušenky štěstí!"
|
||||
'1': "&7Zítra zemřeš... s láskou od pana creepera"
|
||||
'2': "&7V nějaké části tvého života se stane něco špatného!!!"
|
||||
'3': "&7Příští týden si uvědomíš, že toto není reálný život, ale že jsi v počítačové
|
||||
hře"
|
||||
'4': "&7Sušenka ti bude za pár sekund velice chutnat"
|
||||
'5': "&7Poslední slovo, které uslyšíš bude „VYHUBIT!!!”"
|
||||
'6': "&7Ať se stane cokoliv, nepokoušej se mazlit creepera... Zkusil jsem to.
|
||||
Je to dobrý pocit, ale nestojí to za to."
|
||||
'7': "&742. Odpověď je 42."
|
||||
'8': "&7Walshy udrží den problémy pryč."
|
||||
'9': "&7Nikdy nekopej pod sebe!"
|
||||
'10': "&7To je jen rána masa!"
|
||||
'11': "&7Vždy se podívej na světlou stránku života!"
|
||||
'12': "&7Tohle byl vlastně Biscuit, a ne Cookie"
|
||||
'13': "&7Neonové cedule jsou LIT!"
|
||||
piglin-barter: "&4S pigliny nemůžeš vyměňovat Slimefun předměty"
|
||||
enchantment-rune:
|
||||
fail: "&cNemůžeš enchantovat tento předmět"
|
||||
no-enchantment: "&cPro tento předmět nelze najít žádný vhodný enchant."
|
||||
success: "&aÚspěšně jsi na tento předmět daů náhodný enchant."
|
||||
fail: "&cNemůžeš očarovat tento předmět."
|
||||
no-enchantment: "&cPro tento předmět nelze najít žádné vhodné očarování."
|
||||
success: "&aÚspěšně jsi na tento předmět dal náhodné vhodné očarování."
|
||||
tape-measure:
|
||||
no-anchor: "&cMusíš nastavit kotvu než začneš měřit! "
|
||||
no-anchor: "&cPřed začátkem měření musíš nastavit kotvu! "
|
||||
wrong-world: "&cTvoje kotva je pravděpodobně v jiném světa!"
|
||||
distance: "&7Měření zahájeno. &eVzdálenost: %distance%"
|
||||
anchor-set: "&aÚspěšně nastavena kotva:&e %anchor%"
|
||||
multi-tool:
|
||||
mode-change: "&b%device% mód změněn na: &9%mode%"
|
||||
not-shears: "&cMulti Tool nemůže být použit jako nůžky!"
|
||||
climbing-pick:
|
||||
dual-wielding: "&4Musíš držet Climbing Picks v obou rukou pro jeho použití!"
|
||||
wrong-material: "&cNa tento povrch nemůžeš vylézt. Zkontroluj Slimefun Guide,
|
||||
kde najdeš další informace!"
|
||||
invalid-item: "&4%item% &cnení platný předmět!"
|
||||
invalid-amount: "&4%amount% &cnení platné číslo. Musí být větší než 0!"
|
||||
invalid-research: "&4%research% &cnení platný výzkum!"
|
||||
bee-suit-slow-fall: "&eTvé Bee Wings ti pomohou bezpečně a pomalu se vrátit na zem"
|
||||
mode-change: "&b%device% mód změněn na: &9%mode%"
|
||||
machines:
|
||||
pattern-not-found: "&eOmlouvám se, ale nerozpoznal jsem tento recept. Dej do dispenseru
|
||||
pattern-not-found: "&eBohužel se nepodařilo rozpoznat tento recept. Dej do dávkovače
|
||||
předměty tak, aby odpovídaly receptu."
|
||||
unknown-material: "&eOmlouvám se, ale nepoznal jsem předmět v dispenseru. Dej tam
|
||||
něco, co znám."
|
||||
wrong-item: "&eOmlouvám se, ale nerozpoznal jsem předmět, se kterým jsi na mě kliknul.
|
||||
unknown-material: "&eBohužel se nepodařilo rozpoznat tento předmět v dávkovači.
|
||||
Dej tam něco správného."
|
||||
wrong-item: "&eBohužel se nepodařilo rozpoznat předmět, se kterým jsi na mě kliknul.
|
||||
Zkontroluj recept a koukni se, jaké předměty můžeš použít."
|
||||
full-inventory: "&eOmlouvám se, můj inventář je plný."
|
||||
in-use: "&cInventář tohoto bloku je právě otevřen jiným hráčem"
|
||||
full-inventory: "&eBohužel, můj inventář je plný."
|
||||
in-use: "&cInventář tohoto bloku je právě otevřen jiným hráčem."
|
||||
ignition-chamber-no-flint: "&cIgnition Chamberu chybí křesadlo."
|
||||
ANCIENT_ALTAR:
|
||||
not-enough-pedestals: "&4Altáři chybí podstavce &c(%pedestals% / 8)"
|
||||
not-enough-pedestals: "&4Altar nemá dostatek Pedestal &c(%pedestals% / 8)"
|
||||
unknown-catalyst: "&4Neznámý katalyst. &cPoužij správný recept!"
|
||||
unknown-recipe: "&4Neznámý recept! &cPoužij správný recept!"
|
||||
ANCIENT_PEDESTAL:
|
||||
obstructed: "&4Podstavce jsou zablokované! &cOdstraň cokoliv nad podstavcema!"
|
||||
obstructed: "&4Pedestal je zablokován! &cOdstraň cokoliv nad ním!"
|
||||
HOLOGRAM_PROJECTOR:
|
||||
enter-text: "&7Napiš do chatu zprávu, kterou chceš, aby Hologram ukazoval. &r(Barvy
|
||||
enter-text: "&7Napiš do chatu zprávu, kterou chceš, aby hologram ukazoval. &r(Barvy
|
||||
jsou podporovány!)"
|
||||
inventory-title: Editor hologramu
|
||||
ELEVATOR:
|
||||
@ -199,62 +215,63 @@ machines:
|
||||
pick-a-floor: "&3- Vyber si patro -"
|
||||
current-floor: "&eAktuální patro:"
|
||||
click-to-teleport: "&eKliknutím &7se teleportuješ na toto patro:"
|
||||
enter-name: "&7Prosím, zadejte název podlaží do chatu. &r(Barvy jsou podporovány!)"
|
||||
named: "&2Podlaží úspěšně pojmenováno na: &r%floor%"
|
||||
enter-name: "&7Zadej název podlaží do chatu. &r(Barvy jsou podporovány!)"
|
||||
named: "&2Podlaží úspěšně pojmenováno: &r%floor%"
|
||||
TELEPORTER:
|
||||
teleporting: "&3Teleportuji..."
|
||||
teleported: "&3Teleportace dokončena!"
|
||||
cancelled: "&4Teleportace zrušena!"
|
||||
invulnerability: "&b&lZískal jsi 30 sekund nezranitelnosti!"
|
||||
gui:
|
||||
title: Vaše waypointy
|
||||
tooltip: Klikněte pro teleportaci
|
||||
title: Tvé záchytné body
|
||||
tooltip: Klikni pro teleportaci
|
||||
time: Předpokládaný čas
|
||||
CARGO_NODES:
|
||||
must-be-placed: "&4Musí být umístěn na truhlu nebo stroj!"
|
||||
GPS_CONTROL_PANEL:
|
||||
title: GPS - Kontrolní panel
|
||||
transmitters: Přehled vysílačů
|
||||
waypoints: Přehled waypointů
|
||||
waypoints: Přehled záchytných bodů
|
||||
INDUSTRIAL_MINER:
|
||||
no-fuel: "&cTvému průmyslovému horníku došlo palivo! Vložte palivo do bedny nad."
|
||||
no-fuel: "&cTvému průmyslovému horníku došlo palivo! Vlož palivo do bedny nad."
|
||||
piston-facing: "&cTvůj průmyslový horník potřebuje píst směřující nahoru!"
|
||||
piston-space: "&cDva písty potřebují prázdný blok nad nimi!"
|
||||
destroyed: "&cZdá se, váš průmysloví horník byl rozbit."
|
||||
destroyed: "&cZdá se, že tvůj průmyslový horník byl zničen."
|
||||
already-running: "&cTento průmyslový horník již běží!"
|
||||
full-chest: "&cBedna vašeho průmyslového horníka je plná!"
|
||||
no-permission: "&4Zdá se, nemáte oprávnění používat průmyslového horníka zde!"
|
||||
finished: "&eVáš průmysloví horník dokončil práci! Získal %ores% hornin!"
|
||||
no-permission: "&4Zdá se, že zde nemáš oprávnění používat průmyslového horníka!"
|
||||
finished: "&eTvůj průmysloví horník dokončil práci! Získal %ores% rud!"
|
||||
anvil:
|
||||
not-working: "&4Předměty ze Slimefunu nelze použít v kovadlině!"
|
||||
mcmmo-salvaging: "&4Nemůžeš zachránit Slimefun předměty!"
|
||||
backpack:
|
||||
already-open: "&cOmlouváme se, tento batoh je otevřený již někde jinde!"
|
||||
no-stack: "&cNemůžeš stackovat batohy"
|
||||
already-open: "&cBohužel, tento batoh je již otevřený někde jinde!"
|
||||
no-stack: "&cNemůžeš shromažďovat batohy"
|
||||
workbench:
|
||||
not-enhanced: "&4Nemůžeš použít itemy ze Slimefunu v normální výrobě"
|
||||
not-enhanced: "&4Nemůžeš použít předměty ze Slimefunu v normální pracovním stole"
|
||||
gps:
|
||||
deathpoint: "&4Bod úmrtí &7%date%"
|
||||
waypoint:
|
||||
new: "&eProsím, zadejte název waypointu do chatu. &7(Barvy jsou podporovány!)"
|
||||
added: "&aÚspěšně přidán nový waypoint"
|
||||
max: "&4Dosáhl jsi maxima waypointů"
|
||||
duplicate: "&4Již jsi vytvořil waypoint pojmenovaný: &f%waypoint%"
|
||||
new: "&eZadej název záchytného bodu do chatu. &7(Barvy jsou podporovány!)"
|
||||
added: "&aÚspěšně přidán nový záchytný bod"
|
||||
max: "&4Dosáhl jsi maxima záchytných bodů"
|
||||
duplicate: "&4Již jsi vytvořil záchytný bod pojmenovaný: &f%waypoint%"
|
||||
insufficient-complexity:
|
||||
- "&4Nedostatečná komplexita GPS Networku: &c%complexity%"
|
||||
- "&4a) Nemáš nastavený GPS Network"
|
||||
- "&4b) TvůjGPS Network není dostatečně komplexní"
|
||||
'0': "&4Nedostatečná komplexita GPS Networku: &c%complexity%"
|
||||
'1': "&4a) Nemáš nastavený GPS Network"
|
||||
'2': "&4b) Tvůj GPS Network není dostatečně komplexní"
|
||||
geo:
|
||||
scan-required: "&4GEO-Scan je požadován! &cProzkoumejte tento chunk pomocí GEO-Scanneru!"
|
||||
scan-required: "&4GEO-Scan je požadován! &cProzkoumej tento chunk pomocí GEO-Scanneru!"
|
||||
inventory:
|
||||
no-access: "&4Nemáš přístup k tomuto bloku"
|
||||
android:
|
||||
started: "&7Tvůj Android právě začal používat jemu přidělený script"
|
||||
stopped: "&7Tvůj Android pozastavil jemu přidělený script"
|
||||
started: "&7Tvůj Android právě začal používat jemu přidělený skript"
|
||||
stopped: "&7Tvůj Android pozastavil jemu přidělený skript"
|
||||
scripts:
|
||||
already-uploaded: "&4Tento script byl již nahrán."
|
||||
already-uploaded: "&4Tento skript již byl nahrán."
|
||||
instructions:
|
||||
START: "&2Začít Script"
|
||||
REPEAT: "&9Opakovat Script"
|
||||
START: "&2Začít skript"
|
||||
REPEAT: "&9Opakovat skript"
|
||||
WAIT: "&ePočkej 0.5s"
|
||||
GO_FORWARD: "&7Posuň se vpřed"
|
||||
GO_UP: "&7Posuň se nahoru"
|
||||
@ -267,10 +284,10 @@ android:
|
||||
MOVE_AND_DIG_UP: "&bPosuň se a zároveň kopej nahoru"
|
||||
MOVE_AND_DIG_FORWARD: "&bPosuň se a zároveň kopej dopředu"
|
||||
MOVE_AND_DIG_DOWN: "&bPosuň se a zároveň kopej dolů"
|
||||
ATTACK_MOBS_ANIMALS: "&4Útoč na &cnepřátelské moby a zvířata"
|
||||
ATTACK_MOBS: "&4Útoč na &cnepřátelské moby"
|
||||
ATTACK_MOBS_ANIMALS: "&4Útoč na &cnepřátelská stvoření a zvířata"
|
||||
ATTACK_MOBS: "&4Útoč na &cnepřátelská stvoření"
|
||||
ATTACK_ANIMALS: "&4Útoč na &czvířata"
|
||||
ATTACK_ANIMALS_ADULT: "&4Útoč na &czvířata&7[Dospělá]"
|
||||
ATTACK_ANIMALS_ADULT: "&4Útoč na &czvířata &7[Dospělá]"
|
||||
CHOP_TREE: "&cPokácej a zasaď"
|
||||
CATCH_FISH: "&bRybař"
|
||||
FARM_FORWARD: "&bSkliď a zasaď"
|
||||
@ -280,15 +297,15 @@ android:
|
||||
INTERFACE_ITEMS: "&9Přesuň obsah inventáře do rozhraní na přední straně"
|
||||
INTERFACE_FUEL: "&cVyndej palivo z rozhraní přední strany"
|
||||
enter-name:
|
||||
-
|
||||
- "&eProsíme, zadejte název vašeho scriptu"
|
||||
'1': "&eZadej název tvého skriptu"
|
||||
uploaded:
|
||||
- "&bNahrávání..."
|
||||
- "&aTvůj script byl úspěšně nahrán!"
|
||||
'0': "&bNahrávání..."
|
||||
'1': "&aTvůj skript byl úspěšně nahrán!"
|
||||
rating:
|
||||
own: "&4Nemůžeš hodnotit vlastní script!"
|
||||
already: "&4K tomuto scriptu jsi již zanechal hlasování!"
|
||||
own: "&4Nemůžeš hodnotit vlastní skript!"
|
||||
already: "&4K tomuto skriptu jsi již zanechal hlasování!"
|
||||
editor: Editor skriptu
|
||||
too-long: "&cSkript je příliš dlouhý na úpravu!"
|
||||
languages:
|
||||
default: Výchozí-serverový
|
||||
en: Angličtina
|
||||
@ -298,7 +315,7 @@ languages:
|
||||
es: Španělština
|
||||
pl: Polština
|
||||
sv: Švédština
|
||||
nl: Holandština
|
||||
nl: Nizozemština
|
||||
cs: Čeština
|
||||
hu: Maďarština
|
||||
lv: Lotyština
|
||||
@ -310,8 +327,6 @@ languages:
|
||||
zh-CN: Čínština (Čína)
|
||||
el: Řečtina
|
||||
he: Hebrejština
|
||||
pt: Portugalština (Portugalsko)
|
||||
pt-BR: Portugalština (Brazílie)
|
||||
ar: Arabština
|
||||
af: Afrikánština
|
||||
da: Dánština
|
||||
@ -323,6 +338,8 @@ languages:
|
||||
fa: Perština
|
||||
th: Thajština
|
||||
ro: Rumunština
|
||||
pt: Portugalština (Portugalsko)
|
||||
pt-BR: Portugalština (Brazílie)
|
||||
bg: Bulharština
|
||||
ko: Korejština
|
||||
tr: Turečtina
|
||||
@ -330,9 +347,16 @@ languages:
|
||||
mk: Makedonština
|
||||
sr: Srbština
|
||||
be: Běloruština
|
||||
tl: 'Tagalština '
|
||||
brewing_stand:
|
||||
not-working: "&4Nemůžeš používat Slimefun předměty ve varném stojanu!"
|
||||
villagers:
|
||||
no-trading: "&4Nemůžeš měnit Slimefun předměty s vesničany!"
|
||||
no-trading: "&4Nemůžeš vyměňovat Slimefun předměty s vesničany!"
|
||||
cartography_table:
|
||||
not-working: "&4Nemůžeš použít Slimefun předměty v kartografickém stole!"
|
||||
cauldron:
|
||||
no-discoloring: "&4Nemůžeš odebrat barvu ze Slimefun brnění"
|
||||
placeholderapi:
|
||||
profile-loading: Načítání...
|
||||
miner:
|
||||
no-ores: "&eOmlouvám se, nemohu najít rudy v okolí!"
|
||||
|
@ -4,7 +4,6 @@ commands:
|
||||
cheat: Geeft je toestemming om gratis spullen in het spel te brengen
|
||||
give: Geef iemand een aantal Slimefun spullen
|
||||
guide: Geef jezelf een Slimefun Handboek
|
||||
timings: Laat informatie over de server's prestaties zien
|
||||
teleporter: Bekijk de opgeslagen locaties van andere spelers
|
||||
versions: Laat een lijst met alle geïnstalleerde uitbreidingen zien
|
||||
search: Doorzoek de Slimefun handleiding voor een bepaald trefwoord
|
||||
@ -15,6 +14,18 @@ commands:
|
||||
description: Ontgrendel of herstart Slimefun kennissen van een speler
|
||||
reset: "&cJe hebt %player%'s Slimefun kennis herstart"
|
||||
reset-target: "&cJe Slimefun kennis is herstart"
|
||||
backpack:
|
||||
description: Krijg een kopie van een al bestaande rugzak
|
||||
invalid-id: "&4Het id moet een positieve nummer zijn!"
|
||||
player-never-joined: "&4Er is geen speler met die naam gevonden!"
|
||||
backpack-does-not-exist: "& 4De opgegeven rugzak bestaat niet!"
|
||||
restored-backpack-given: "&aJouw rugzak is hersteld en is toegevoegd aan jouw
|
||||
inventaris."
|
||||
charge:
|
||||
description: Laad het item wat je vasthoud op
|
||||
charge-success: Item is opgeladen!
|
||||
not-rechargeable: Dit item kan niet opgeladen worden!
|
||||
timings: Laat informatie over de server's prestaties zien
|
||||
guide:
|
||||
search:
|
||||
message: "&bOp welk woord zou je willen zoeken?"
|
||||
@ -22,8 +33,8 @@ guide:
|
||||
tooltip: "&bKlik om naar een item te zoeken"
|
||||
inventory: 'Zoeken naar: %item%'
|
||||
lore:
|
||||
- "&bOp welk woord zou je willen zoeken?"
|
||||
- "&7Type je zoekterm in het gespreksvenster"
|
||||
'1': "&7Type je zoekterm in het gespreksvenster"
|
||||
'0': "&bOp welk woord zou je willen zoeken?"
|
||||
cheat:
|
||||
no-multiblocks: "&4Je kan geen Slimefun machines in het spel brengen, je moet
|
||||
ze bouwen zoals aangegeven."
|
||||
@ -34,7 +45,13 @@ guide:
|
||||
lore: Klik om een eigen vertaling toe the voegen
|
||||
select: Klik om deze taal te selecteren
|
||||
select-default: Klik om de standaard taal te selecteren
|
||||
selected-language: 'Momenteel geselecteerd:'
|
||||
selected-language: " Op dit moment geselecteerd:"
|
||||
change: Klik om een nieuwe taal te kiezen
|
||||
description:
|
||||
'0': "&7Je hebt nu de mogelijkheid om de taal"
|
||||
'1': "&7van Slimefun te veranderen"
|
||||
'2': "&7aan jou wordt vertoond. Items"
|
||||
'3': "&7kunnen momenteel niet vertaald worden."
|
||||
title:
|
||||
main: Slimefun Handboek
|
||||
settings: Instellingen & Informatie
|
||||
@ -44,6 +61,7 @@ guide:
|
||||
addons: Uitbreidingen voor Slimefun4
|
||||
bugs: Fouten rapporteren
|
||||
source: Source Code
|
||||
versions: Geïnstalleerde versies
|
||||
credits:
|
||||
commit: Bijdrage
|
||||
commits: Bijdragen
|
||||
@ -53,6 +71,12 @@ guide:
|
||||
resourcepack: "&cGrafische bundel Ontwikkelaar"
|
||||
translator: "&9Vertaler"
|
||||
profile-link: Klik om hun profielen op Github te bezoeken
|
||||
open: Klik om onze bijdragers te zien
|
||||
description:
|
||||
'0': "&7Slimefun is een open-source project"
|
||||
'1': "&7en wordt in stand gehouden door een grote gemeenschap van mensen."
|
||||
'2': "&7Meer dan &e%contributors% &7mensen hebben hieraan"
|
||||
'3': "&7al deze jaren gewerkt."
|
||||
pages:
|
||||
previous: Vorige bladzijde
|
||||
next: Volgende bladzijde
|
||||
@ -65,15 +89,17 @@ guide:
|
||||
miner: Grondstoffen die je met deze Miner kunt verkrijgen
|
||||
generator: Beschikbare soorten brandstof
|
||||
gold-pan: Grondstoffen die je kunt verkrijgen
|
||||
climbing-pick: Oppervlakken die je kunt beklimmen
|
||||
back:
|
||||
title: Terug
|
||||
guide: Ga terug naar de Slimefun Handleiding
|
||||
settings: Ga terug naar Instellingen
|
||||
locked: VERGRENDELD
|
||||
locked-category:
|
||||
- Om deze categorie te ontgrendelen zul je
|
||||
- alle items moeten ontgrendelen van de
|
||||
- volgende categorieën
|
||||
'0': Om deze categorie te ontgrendelen zul je
|
||||
'1': alle items moeten ontgrendelen van de
|
||||
'2': volgende categorieën
|
||||
work-in-progress: Dit is nog niet helemaal klaar!
|
||||
messages:
|
||||
not-researched: "&4Je hebt niet genoeg Slimefun kennis om dit te begrijpen"
|
||||
not-enough-xp: "&4Je hebt niet genoeg XP om dit te ontgrendelen"
|
||||
@ -83,12 +109,8 @@ messages:
|
||||
no-permission: "&4Je hebt geen toestemming om deze actie uit te voeren"
|
||||
usage: "&4Gebruik, zoals: &c%usage%"
|
||||
not-online: "&4%player% &cis niet online!"
|
||||
invalid-item: "&4%item% &cis geen geldig voorwerp!"
|
||||
invalid-amount: "&4%amount% &cis geen geldige hoeveelheid: het moet meer zijn
|
||||
dan 0!"
|
||||
given-item: '&bJe hebt &a%amount% keer &7"%item%&7" ontvangen'
|
||||
give-item: '&bJe hebt %player% &a%amount% keer &7"%item%&7" gegeven'
|
||||
invalid-research: "&4%research% &cis geen geldig Slimefun onderzoek"
|
||||
give-research: '&bJe hebt %player% de kennis over &7"%research%&7" gegeven'
|
||||
hungry: "&cJe hebt teveel honger om zoiets te doen!"
|
||||
disabled-in-world: "&4&lDit voorwerp is uitgeschakeld in deze wereld"
|
||||
@ -110,6 +132,8 @@ messages:
|
||||
whirlwind: "&a&oJe Talisman heeft het projectiel weerkaatst"
|
||||
wizard: "&a&oJe Talisman heeft je een hoger level van geluk gegeven, maar heeft
|
||||
misschien ook de levels van andere betoveringen verlaagd"
|
||||
caveman: "&a&oJe talisman gaf je haast"
|
||||
wise: "&a&oJe Talisman heeft je verkregen experience punten verdubbeld"
|
||||
soulbound-rune:
|
||||
fail: "&cJe kan maar één voorwerp met je ziel verbinden op elk moment"
|
||||
success: "&aJe hebt dit voorwerp succesvol met je ziel verbonden! Het blijft bij
|
||||
@ -129,19 +153,46 @@ messages:
|
||||
link-prompt: "&eKlik mij:"
|
||||
diet-cookie: "&eJe begint je zo ligt als een veertje te voelen..."
|
||||
fortune-cookie:
|
||||
- "&7Hellup mij, ik zit vast in een gelukskoekjes-fabriek!"
|
||||
- "&7Je overlijdt morgen... door een creeper..."
|
||||
- "&7Ooit gaat er iets ergs gebeuren in je leven!!! Muhahaha"
|
||||
- "&7Volgende week zal je eindelijk doorhebben dat dit niet de echte wereld is,
|
||||
maar een simulatie"
|
||||
- "&7Dit koekje gaat over een paar seconden heerlijk smaken"
|
||||
- '&7De laatste woorden die je ooit zal horen zijn "Voor mij is deze wereld alleen
|
||||
maar vals!"'
|
||||
- "&7What je ook wilt worden, knuffels nooit een creeper... Ik heb het geprobeerd,
|
||||
maar het is het echt niet waard"
|
||||
- "&742. Het antwoord op alles is 42"
|
||||
- "&7A Walshy, één dag houdt alle problemen weg"
|
||||
- "&7Graaf nooit recht naar beneden!"
|
||||
'0': "&7Hellup mij, ik zit vast in een gelukskoekjes-fabriek!"
|
||||
'1': "&7Je overlijdt morgen... door een creeper..."
|
||||
'2': "&7Ooit gaat er iets ergs gebeuren in je leven!!! Muhahaha"
|
||||
'3': "&7Volgende week zal je eindelijk doorhebben dat dit niet de echte wereld
|
||||
is, maar een simulatie"
|
||||
'4': "&7Dit koekje gaat over een paar seconden heerlijk smaken"
|
||||
'5': '&7De laatste woorden die je ooit zal horen zijn "Voor mij is deze wereld
|
||||
alleen maar vals!"'
|
||||
'6': "&7What je ook wilt worden, knuffels nooit een creeper... Ik heb het geprobeerd,
|
||||
maar het is het echt niet waard"
|
||||
'7': "&742. Het antwoord op alles is 42"
|
||||
'8': "&7A Walshy, één dag houdt alle problemen weg"
|
||||
'9': "&7Graaf nooit recht naar beneden!"
|
||||
'10': "&7Het is slechts een vleeswonde!"
|
||||
'11': "&7Kijk altijd naar de blije kant van je leven!"
|
||||
'12': "&7Deze was eigenlijk een biscuitje en geen koekje"
|
||||
'13': "&7Neon borden zijn LIT!"
|
||||
piglin-barter: "&4Je kunt geen Slimefun spullen met piglins ruilen"
|
||||
enchantment-rune:
|
||||
fail: "&cJe kunt dit item niet betoveren."
|
||||
no-enchantment: "&cKon geen mogelijke betoveringen vinden voor dit item."
|
||||
success: "&aJe hebt succesvol een random betovering toegevoegd op dit item."
|
||||
tape-measure:
|
||||
no-anchor: "&cJe hebt nog een anker nodig voordat je kunt meten!"
|
||||
wrong-world: "&cJe anker lijkt in een andere wereld te zitten!"
|
||||
distance: "&7Afstand gemeten. &eAfstand: %distance%"
|
||||
anchor-set: "&aHet is gelukt om het anker in te stellen:&e %anchor%"
|
||||
multi-tool:
|
||||
mode-change: "&b%device% mode veranderd naar: &9%mode%"
|
||||
not-shears: "&cEen Mutli Tool kan niet gebruikt worden als een schaar!"
|
||||
climbing-pick:
|
||||
dual-wielding: "&4Je moet een klim-pickaxe in bijde handen hebben om hem te gebruiken!"
|
||||
wrong-material: "&cJe kunt dit oppervlak niet beklimmen. Check je Slimefun Guide
|
||||
voor meer info!"
|
||||
invalid-item: "&4%item% &cis geen geldig voorwerp!"
|
||||
invalid-amount: "&4%amount% &cis geen geldige hoeveelheid: het moet meer zijn dan
|
||||
0!"
|
||||
invalid-research: "&4%research% &cis geen geldig Slimefun onderzoek"
|
||||
bee-suit-slow-fall: "&eJe Bee Wings zullen je helpen om weer veilig op de grond
|
||||
te komen"
|
||||
mode-change: "&b%device% mode is veranderd naar: &9%mode%"
|
||||
machines:
|
||||
pattern-not-found: "&eSorry, ik heb het recept niet herkend. Plaats astublieft de
|
||||
@ -187,8 +238,20 @@ machines:
|
||||
title: GPS - Configuratiescherm
|
||||
transmitters: Transmitter-overzicht
|
||||
waypoints: Waypoint-overzicht
|
||||
INDUSTRIAL_MINER:
|
||||
no-fuel: "& cUw Industrial Miner heeft geen brandstof meer! Doe de brandstof in
|
||||
de kist erboven."
|
||||
piston-facing: "&cJe Industrial Miner moet de duwmachines naar boven hebben!"
|
||||
piston-space: "&cDe twee duwmachines moeten een leeg blok boven hem hebben!"
|
||||
destroyed: "&cJouw Industrial Miner lijkt vernietigt te zijn!"
|
||||
already-running: "&cDeze Industrial Miner draait al!"
|
||||
full-chest: "&cDe kist van je Industrial Miner is vol!"
|
||||
no-permission: "&4Het lijkt er op dat je geen permissie hebt om een Industrial
|
||||
Miner hier te laten werken!"
|
||||
finished: "&eJe Industrial Miner is klaar! Het heeft in totaal %ores% grondstof(fen)! "
|
||||
anvil:
|
||||
not-working: "&4Je kan geen Slimefun voorwerpen gebruiken in een aambeeld!"
|
||||
mcmmo-salvaging: "&4Je kunt geen Slimefun items afbreken!"
|
||||
backpack:
|
||||
already-open: "&cSorry, deze rugzak is al ergens anders geopend!"
|
||||
no-stack: "&cJe kan geen rugzakken stapelen"
|
||||
@ -201,10 +264,11 @@ gps:
|
||||
&r(Kleurcodes zijn ondersteund)"
|
||||
added: "&aEen nieuw locatiepunt is succesvol toegevoegd"
|
||||
max: "&4Je hebt het maximum aantal locatiepunten bereikt"
|
||||
duplicate: "&4Je hebt al een waypoint genaamd: &f%waypoint%"
|
||||
insufficient-complexity:
|
||||
- "&4Er is te weinig GPS netwerk complexiteit: &c%complexity%"
|
||||
- "&4a) Je hebt nog geen GPS netwerk opgezet"
|
||||
- "&4b) Je GPS netwerk is niet complex genoeg"
|
||||
'0': "&4Er is te weinig GPS netwerk complexiteit: &c%complexity%"
|
||||
'1': "&4a) Je hebt nog geen GPS netwerk opgezet"
|
||||
'2': "&4b) Je GPS netwerk is niet complex genoeg"
|
||||
geo:
|
||||
scan-required: "&4Een GEO-Scan is nodig! &cScan deze chunk eerst met behulp van
|
||||
een GEO-Scanner!"
|
||||
@ -243,15 +307,15 @@ android:
|
||||
INTERFACE_ITEMS: "&9Geef inventaris aan de geconfronteerde interface"
|
||||
INTERFACE_FUEL: "&cOntvang brandstof van de geconfronteerde interface"
|
||||
enter-name:
|
||||
-
|
||||
- "&eType astublieft de gewenste naam in voor het script"
|
||||
'1': "&eType astublieft de gewenste naam in voor het script"
|
||||
uploaded:
|
||||
- "&bBezig met uploaden..."
|
||||
- "&aHet script is succesvol geupload!"
|
||||
'0': "&bBezig met uploaden..."
|
||||
'1': "&aHet script is succesvol geupload!"
|
||||
rating:
|
||||
own: "&4Je kan je eigen script geen waardering geven!"
|
||||
already: "&4Je hebt aan een waardering achtergelaten voor dit script!"
|
||||
editor: Scripteditor
|
||||
too-long: "&cDe code is te lang om te kunnen editen!"
|
||||
languages:
|
||||
default: Server-Standaard
|
||||
en: Engels
|
||||
@ -284,10 +348,25 @@ languages:
|
||||
fa: Perzisch
|
||||
th: Thais
|
||||
ro: Roemeens
|
||||
pt: Portugees (Portugal)
|
||||
pt: Portugees (Portugal)
|
||||
pt-BR: Portugees (Brazilië)
|
||||
bg: Bulgaars
|
||||
ko: Koreaans
|
||||
tr: Turks
|
||||
hr: Kroatisch
|
||||
mk: Macedonisch
|
||||
sr: Servisch
|
||||
be: Wit-Russisch/Russisch
|
||||
tl: Tagalog
|
||||
brewing_stand:
|
||||
not-working: "&4Je kunt geen Slimefun spullen in een brouwstandaard doen!"
|
||||
villagers:
|
||||
no-trading: "&4Je kunt geen Slimefun spullen met villagers ruilen!"
|
||||
cartography_table:
|
||||
not-working: "&4Je kunt Slimefun items niet in een cartografie tafel gebruiken!"
|
||||
cauldron:
|
||||
no-discoloring: "&4Je kunt de kleur van Slimefun Bescherming niet er af halen"
|
||||
placeholderapi:
|
||||
profile-loading: Aan het laden...
|
||||
miner:
|
||||
no-ores: "&eSorry, ik kon geen ertsen vinden dichtbij!"
|
||||
|
Loading…
Reference in New Issue
Block a user