Skip to content
Merged
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
## What is Pylon?
Pylon is an upcoming Minecraft Java plugin that will hugely expand vanilla gameplay with new content, including electric machines, huge multiblocks, a fully-fledged fluid system, a complex smelting system, extensive automation options and much, an (actually good) research system, and much more. It is intended to supersede Slimefun.
Pylon is an upcoming Minecraft Java plugin that will hugely expand vanilla gameplay with new content, including electric machines, huge multiblocks, a fully-fledged fluid system, a complex smelting system, extensive automation options and much, an (actually good) research system, and much more. It is intended to supersede Slimefun

Pylon uses an addon system, meaning anyone can add content to Pylon by writing an addon for it! It also comes with a number of really useful features, such as:
- First-class translation support, meaning each player can select their own language.
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/io/github/pylonmc/pylon/base/BaseBlocks.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,19 @@
import io.github.pylonmc.pylon.base.content.building.ExplosiveTarget;
import io.github.pylonmc.pylon.base.content.building.Immobilizer;
import io.github.pylonmc.pylon.base.content.building.Pedestal;
import io.github.pylonmc.pylon.base.content.components.EnrichedSoulSoil;
import io.github.pylonmc.pylon.base.content.machines.cargo.CargoExtractor;
import io.github.pylonmc.pylon.base.content.machines.cargo.CargoInserter;
import io.github.pylonmc.pylon.base.content.machines.diesel.DieselBrickMolder;
import io.github.pylonmc.pylon.base.content.machines.diesel.DieselGrindstone;
import io.github.pylonmc.pylon.base.content.components.EnrichedSoulSoil;
import io.github.pylonmc.pylon.base.content.machines.diesel.DieselPipeBender;
import io.github.pylonmc.pylon.base.content.machines.cargo.CargoBuffer;
import io.github.pylonmc.pylon.base.content.machines.diesel.DieselPress;
import io.github.pylonmc.pylon.base.content.machines.diesel.DieselTableSaw;
import io.github.pylonmc.pylon.base.content.machines.fluid.*;
import io.github.pylonmc.pylon.base.content.machines.hydraulics.*;
import io.github.pylonmc.pylon.base.content.machines.hydraulics.CoalFiredPurificationTower;
import io.github.pylonmc.pylon.base.content.machines.hydraulics.SolarPurificationTower;
import io.github.pylonmc.pylon.base.content.machines.simple.*;
import io.github.pylonmc.pylon.base.content.machines.smelting.*;
import io.github.pylonmc.pylon.base.content.resources.RefractoryMix;
Expand Down
17 changes: 8 additions & 9 deletions src/main/java/io/github/pylonmc/pylon/base/BaseItems.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,9 @@
import io.github.pylonmc.pylon.base.content.machines.diesel.DieselTableSaw;
import io.github.pylonmc.pylon.base.content.machines.fluid.*;
import io.github.pylonmc.pylon.base.content.machines.hydraulics.*;
import io.github.pylonmc.pylon.base.content.machines.simple.CoreDrill;
import io.github.pylonmc.pylon.base.content.machines.simple.ImprovedManualCoreDrill;
import io.github.pylonmc.pylon.base.content.machines.simple.Press;
import io.github.pylonmc.pylon.base.content.machines.simple.VacuumHopper;
import io.github.pylonmc.pylon.base.content.machines.hydraulics.CoalFiredPurificationTower;
import io.github.pylonmc.pylon.base.content.machines.hydraulics.SolarPurificationTower;
import io.github.pylonmc.pylon.base.content.machines.simple.*;
import io.github.pylonmc.pylon.base.content.machines.smelting.PitKiln;
import io.github.pylonmc.pylon.base.content.resources.IronBloom;
import io.github.pylonmc.pylon.base.content.science.Loupe;
Expand Down Expand Up @@ -763,7 +762,7 @@ private BaseItems() {
public static final ItemStack MIXING_POT = ItemStackBuilder.pylon(Material.CAULDRON, BaseKeys.MIXING_POT)
.build();
static {
PylonItem.register(PylonItem.class, MIXING_POT, BaseKeys.MIXING_POT);
PylonItem.register(MixingPot.MixingPotItem.class, MIXING_POT, BaseKeys.MIXING_POT);
BasePages.SIMPLE_MACHINES.addItem(MIXING_POT);
}

Expand Down Expand Up @@ -1192,23 +1191,23 @@ private BaseItems() {
.set(DataComponentTypes.ITEM_MODEL, Material.WHITE_CONCRETE.getKey())
.build();
static {
PylonItem.register(PylonItem.class, FLUID_VALVE, BaseKeys.FLUID_VALVE);
PylonItem.register(FluidValve.Item.class, FLUID_VALVE, BaseKeys.FLUID_VALVE);
BasePages.FLUID_MACHINES.addItem(FLUID_VALVE);
}

public static final ItemStack FLUID_FILTER = ItemStackBuilder.pylon(Material.STRUCTURE_VOID, BaseKeys.FLUID_FILTER)
.set(DataComponentTypes.ITEM_MODEL, Material.WHITE_CONCRETE.getKey())
.build();
static {
PylonItem.register(PylonItem.class, FLUID_FILTER, BaseKeys.FLUID_FILTER);
PylonItem.register(FluidFilter.Item.class, FLUID_FILTER, BaseKeys.FLUID_FILTER);
BasePages.FLUID_MACHINES.addItem(FLUID_FILTER);
}

public static final ItemStack FLUID_METER = ItemStackBuilder.pylon(Material.STRUCTURE_VOID, BaseKeys.FLUID_METER)
.set(DataComponentTypes.ITEM_MODEL, Material.WHITE_CONCRETE.getKey())
.build();
static {
PylonItem.register(PylonItem.class, FLUID_METER, BaseKeys.FLUID_METER);
PylonItem.register(FluidFilter.Item.class, FLUID_METER, BaseKeys.FLUID_METER);
BasePages.FLUID_MACHINES.addItem(FLUID_METER);
}

Expand Down Expand Up @@ -1318,7 +1317,7 @@ private BaseItems() {
public static final ItemStack FLUID_STRAINER = ItemStackBuilder.pylon(Material.COPPER_GRATE, BaseKeys.FLUID_STRAINER)
.build();
static {
PylonItem.register(PylonItem.class, FLUID_STRAINER, BaseKeys.FLUID_STRAINER);
PylonItem.register(FluidStrainer.Item.class, FLUID_STRAINER, BaseKeys.FLUID_STRAINER);
BasePages.FLUID_MACHINES.addItem(FLUID_STRAINER);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,15 @@
import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey;

public class Immobilizer extends PylonBlock implements PylonPiston, PylonBreakHandler {
public static HashMap<BlockPosition, Set<Player>> frozenPlayers = new HashMap<>();
private final NamespacedKey cooldownKey = baseKey("immobilizer_cooldown_millis");
private final double radius = getSettings().getOrThrow("radius", ConfigAdapter.DOUBLE);
private final int duration = getSettings().getOrThrow("duration", ConfigAdapter.INT);
private final long cooldownMillis = getSettings().getOrThrow("cooldown", ConfigAdapter.INT) * 50L;
private final int particleCount = getSettings().getOrThrow("particle.count", ConfigAdapter.INT);
private final double particleRadius = getSettings().getOrThrow("particle.radius", ConfigAdapter.DOUBLE);
private final int particlePeriod = getSettings().getOrThrow("particle.period", ConfigAdapter.INT);

public static class Item extends PylonItem {
private final double radius = getSettings().getOrThrow("radius", ConfigAdapter.DOUBLE);
private final int duration = getSettings().getOrThrow("duration", ConfigAdapter.INT);
Expand All @@ -53,15 +62,6 @@ public Item(@NotNull ItemStack stack) {
}
}

public static HashMap<BlockPosition, Set<Player>> frozenPlayers = new HashMap<>();
private final NamespacedKey cooldownKey = baseKey("immobilizer_cooldown_millis");
private final double radius = getSettings().getOrThrow("radius", ConfigAdapter.DOUBLE);
private final int duration = getSettings().getOrThrow("duration", ConfigAdapter.INT);
private final long cooldownMillis = getSettings().getOrThrow("cooldown", ConfigAdapter.INT) * 50L;
private final int particleCount = getSettings().getOrThrow("particle.count", ConfigAdapter.INT);
private final double particleRadius = getSettings().getOrThrow("particle.radius", ConfigAdapter.DOUBLE);
private final int particlePeriod = getSettings().getOrThrow("particle.period", ConfigAdapter.INT);

public Immobilizer(Block block, BlockCreateContext context) {
super(block);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import io.github.pylonmc.pylon.core.datatypes.PylonSerializers;
import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder;
import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.NamespacedKey;
import org.bukkit.block.Block;
Expand All @@ -30,7 +31,7 @@ public class Pedestal extends PylonBlock implements PylonEntityHolderBlock, Pylo
private static final NamespacedKey ROTATION_KEY = baseKey("rotation");
private static final NamespacedKey LOCKED_KEY = baseKey("locked");
private double rotation;
@Setter
@Getter @Setter
private boolean locked;

@SuppressWarnings("unused")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,15 @@ public ReactivatedWitherSkull(@NotNull ItemStack stack) {
@Override
public void onUsedToRightClick(@NotNull PlayerInteractEvent event) {
Player player = event.getPlayer();
if ((event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) || player.isSneaking()) return;

if (player.getGameMode() != GameMode.CREATIVE) getStack().damage(1, player);
if ((event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK)
|| player.isSneaking()
) {
return;
}

if (player.getGameMode() != GameMode.CREATIVE) {
getStack().damage(1, player);
}

player.setCooldown(getStack(), cooldownTicks);
Location skullPos = player.getLocation().clone().add(0, playerHeight, 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ public EnrichedSoulSoil(@NotNull Block block, @NotNull PersistentDataContainer p
super(block, pdc);
}

public void tick(double deltaSeconds) {
@Override
public void tick() {
if (getBlock().getRelative(BlockFace.UP).getType() == Material.FIRE) {
new ParticleBuilder(Particle.LAVA)
.location(getBlock().getLocation().toCenterLocation())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,52 +13,37 @@
import io.github.pylonmc.pylon.core.item.PylonItem;
import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder;
import io.github.pylonmc.pylon.core.logistics.LogisticSlotType;
import io.github.pylonmc.pylon.core.datatypes.PylonSerializers;
import io.github.pylonmc.pylon.core.logistics.VirtualInventoryLogisticSlot;
import io.github.pylonmc.pylon.core.util.PylonUtils;
import io.github.pylonmc.pylon.core.util.gui.GuiItems;
import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataContainer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.invui.gui.Gui;
import xyz.xenondevs.invui.inventory.VirtualInventory;

import java.util.List;

import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey;


public class CargoBuffer extends PylonBlock
implements PylonDirectionalBlock, PylonGuiBlock, PylonCargoBlock, PylonEntityHolderBlock {

private static final NamespacedKey FACE_KEY = baseKey("face");

private final BlockFace facing;
private final VirtualInventory inventory = new VirtualInventory(1);

public final int transferRate = getSettings().getOrThrow("transfer-rate", ConfigAdapter.INT);

public final ItemStack mainStack = ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE)
.addCustomModelDataString(getKey() + ":main")
.build();
public final ItemStack side1Stack = ItemStackBuilder.of(Material.BARREL)
.addCustomModelDataString(getKey() + ":side1")
.build();
public final ItemStack side2Stack = ItemStackBuilder.of(Material.BARREL)
.addCustomModelDataString(getKey() + ":side2")
.build();
public final ItemStack inputStack = ItemStackBuilder.of(Material.LIME_TERRACOTTA)
.addCustomModelDataString(getKey() + ":input")
.build();
public final ItemStack outputStack = ItemStackBuilder.of(Material.RED_TERRACOTTA)
.addCustomModelDataString(getKey() + ":output")
.build();
public final ItemStackBuilder mainStack = ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE)
.addCustomModelDataString(getKey() + ":main");
public final ItemStackBuilder side1Stack = ItemStackBuilder.of(Material.BARREL)
.addCustomModelDataString(getKey() + ":side1");
public final ItemStackBuilder side2Stack = ItemStackBuilder.of(Material.BARREL)
.addCustomModelDataString(getKey() + ":side2");
public final ItemStackBuilder inputStack = ItemStackBuilder.of(Material.LIME_TERRACOTTA)
.addCustomModelDataString(getKey() + ":input");
public final ItemStackBuilder outputStack = ItemStackBuilder.of(Material.RED_TERRACOTTA)
.addCustomModelDataString(getKey() + ":output");

public static class Item extends PylonItem {

Expand All @@ -83,20 +68,16 @@ public Item(@NotNull ItemStack stack) {
public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) {
super(block, context);

if (!(context instanceof BlockCreateContext.PlayerPlace playerPlaceContext)) {
throw new IllegalArgumentException("Cargo buffers can only be placed by player");
}

facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true);
setFacing(context.getFacing());

addCargoLogisticGroup(facing, "input");
addCargoLogisticGroup(facing.getOppositeFace(), "output");
addCargoLogisticGroup(getFacing(), "input");
addCargoLogisticGroup(getFacing().getOppositeFace(), "output");
setCargoTransferRate(transferRate);

addEntity("main", new ItemDisplayBuilder()
.itemStack(mainStack)
.transformation(new TransformBuilder()
.lookAlong(facing)
.lookAlong(getFacing())
.scale(0.65)
)
.build(block.getLocation().toCenterLocation())
Expand All @@ -105,7 +86,7 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) {
addEntity("side1", new ItemDisplayBuilder()
.itemStack(side1Stack)
.transformation(new TransformBuilder()
.lookAlong(facing)
.lookAlong(getFacing())
.rotate(Math.PI / 2, Math.PI / 2, 0)
.scale(0.5, 0.5, 0.7)
)
Expand All @@ -115,7 +96,7 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) {
addEntity("side2", new ItemDisplayBuilder()
.itemStack(side2Stack)
.transformation(new TransformBuilder()
.lookAlong(facing)
.lookAlong(getFacing())
.rotate(Math.PI / 2, Math.PI / 2, 0)
.scale(0.7, 0.5, 0.5)
)
Expand All @@ -125,7 +106,7 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) {
addEntity("input", new ItemDisplayBuilder()
.itemStack(inputStack)
.transformation(new TransformBuilder()
.lookAlong(facing)
.lookAlong(getFacing())
.translate(0, 0, 0.15)
.scale(0.4, 0.4, 0.4)
)
Expand All @@ -135,7 +116,7 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) {
addEntity("output", new ItemDisplayBuilder()
.itemStack(outputStack)
.transformation(new TransformBuilder()
.lookAlong(facing)
.lookAlong(getFacing())
.translate(0, 0, -0.15)
.scale(0.4, 0.4, 0.4)
)
Expand All @@ -146,13 +127,6 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) {
@SuppressWarnings("unused")
public CargoBuffer(@NotNull Block block, @NotNull PersistentDataContainer pdc) {
super(block, pdc);

facing = pdc.get(FACE_KEY, PylonSerializers.BLOCK_FACE);
}

@Override
public void write(@NotNull PersistentDataContainer pdc) {
pdc.set(FACE_KEY, PylonSerializers.BLOCK_FACE, facing);
}

@Override
Expand All @@ -164,11 +138,6 @@ public void write(@NotNull PersistentDataContainer pdc) {
.build();
}

@Override
public @Nullable BlockFace getFacing() {
return facing;
}

@Override
public void postInitialise() {
createLogisticGroup("input", LogisticSlotType.INPUT, new VirtualInventoryLogisticSlot(inventory, 0));
Expand Down
Loading