Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
200ca6b
Add fluid registry
blockninja124 Jun 29, 2025
7e3aa32
cleanup fluids
zyxkad Jun 29, 2025
68aaefe
add flowing fluids
zyxkad Jun 29, 2025
63ee2f5
add fluids to tag
zyxkad Jun 29, 2025
6b5493a
add h2o2
zyxkad Jun 29, 2025
8146f8a
Merge branch 'main' of https://github.com/jcm236/Starlance into new_f…
zyxkad Jun 29, 2025
14d58cc
add liquid translations
zyxkad Jun 29, 2025
7b151a6
init pipe
zyxkad Jun 30, 2025
d7753bd
init PipeNetwork
zyxkad Jun 30, 2025
37986cf
add node LevelChunkSection encoding
zyxkad Jun 30, 2025
5016840
add CustomNodeRegistry
zyxkad Jul 1, 2025
30c2c3c
implement NodeGetter
zyxkad Jul 1, 2025
054eae1
setNodesUnsaved
zyxkad Jul 1, 2025
ef4ac93
serialize pipe nodes to saves
zyxkad Jul 1, 2025
76d0e1d
add PipeLevelRenderer
zyxkad Jul 2, 2025
60ed490
make render works
zyxkad Jul 2, 2025
fa1a087
add node sync packet
zyxkad Jul 3, 2025
226bb05
placeable nodes
zyxkad Jul 3, 2025
8143c19
fix node rendering
zyxkad Jul 3, 2025
4715c6e
fix node encoding
zyxkad Jul 3, 2025
f272bb5
fix the render truely
zyxkad Jul 3, 2025
7050384
complete node place hint and add node removal action
zyxkad Jul 3, 2025
a307276
node must placed on positions that supportable
zyxkad Jul 4, 2025
42c4512
drop node when supporting block is gone
zyxkad Jul 4, 2025
0446920
make pipe node render on ships
zyxkad Jul 4, 2025
2c72e50
add nodes translation
zyxkad Jul 5, 2025
77da2d0
fix node will not break when chunk/section being set directly
zyxkad Jul 5, 2025
9c99b89
update RenderUtil
zyxkad Jul 5, 2025
628f832
refactor a few nodes
zyxkad Jul 5, 2025
14e6d1c
fix javadoc
zyxkad Jul 5, 2025
1fd4ac2
add node capability
zyxkad Jul 9, 2025
72ba9c2
start ticking pipes
zyxkad Jul 11, 2025
e7d781d
add node connect logic
zyxkad Jul 13, 2025
1e57c01
optimize switch statement with Axis.choose
zyxkad Jul 15, 2025
0118b99
Merge branch 'main' into pipes
zyxkad Jul 15, 2025
8acc7ed
fix some styles
zyxkad Jul 15, 2025
773ca35
node now can transfer fluids relatively frequently
zyxkad Jul 15, 2025
3ee5271
Merge branch 'main' into pipes
zyxkad Jul 22, 2025
6620c4a
Merge branch 'main' into pipes
zyxkad Aug 16, 2025
488443d
fix vector3i
zyxkad Aug 16, 2025
4a742b1
partialy fixed node render
zyxkad Aug 17, 2025
093134d
render corner pipe
zyxkad Aug 17, 2025
2724ee6
fix nodes connection
zyxkad Aug 18, 2025
9b9c37b
support energy distrubtion
zyxkad Aug 18, 2025
4c2b748
fix item model
zyxkad Aug 18, 2025
fd0bf52
rename vsch$ to starlance$
zyxkad Aug 18, 2025
065c352
Merge pull request #61 from jcm236/pipes
zyxkad Jan 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 5 additions & 7 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -181,20 +181,18 @@ repositories {
dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
// cri
//annotationProcessor(implementation("com.github.LlamaLad7:MixinExtras:0.1.1"))

compileOnly annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")
implementation(jarJar("io.github.llamalad7:mixinextras-forge:0.4.1")) {
jarJar.ranged(it, "[0.4.1,)")
}

implementation ("org.valkyrienskies.core:api:${vs_core_version}")
implementation ("org.valkyrienskies.core:impl:${vs_core_version}")
implementation ("org.valkyrienskies.core:api-game:${vs_core_version}")
implementation ("org.valkyrienskies.core:util:${vs_core_version}")
implementation fg.deobf("org.valkyrienskies:valkyrienskies-120-forge:${vs2_version}")

compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1"))
implementation(jarJar("io.github.llamalad7:mixinextras-forge:0.4.1")) {
jarJar.ranged(it, "[0.4.1,)")
}

//implementation fg.deobf("mekanism:Mekanism:${mekanism_version}")
//runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:generators")
//runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:additions")
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/net/jcm/vsch/VSCHCapabilities.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package net.jcm.vsch;

import net.jcm.vsch.api.pipe.capability.INodePortProvider;

import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.capabilities.CapabilityToken;

public final class VSCHCapabilities {
private VSCHCapabilities() {}

public static final Capability<INodePortProvider> PORT_PROVIDER = CapabilityManager.get(new CapabilityToken<>(){});
}
65 changes: 53 additions & 12 deletions src/main/java/net/jcm/vsch/VSCHEvents.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package net.jcm.vsch;

import net.jcm.vsch.api.pipe.NodePos;
import net.jcm.vsch.api.pipe.PipeNode;
import net.jcm.vsch.event.AtmosphericCollision;
import net.jcm.vsch.event.GravityInducer;
import net.jcm.vsch.event.PlanetCollision;
import net.jcm.vsch.pipe.level.NodeLevel;
import net.jcm.vsch.util.EmptyChunkAccess;
import net.jcm.vsch.util.Pair;
import net.lointain.cosmos.network.CosmosModVariables;

import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.Level;
Expand All @@ -19,41 +24,55 @@
import org.valkyrienskies.core.api.ships.LoadedServerShip;
import org.valkyrienskies.mod.common.VSGameUtilsKt;

import java.util.function.Predicate;

@Mod.EventBusSubscriber
public class VSCHEvents {

@SubscribeEvent(priority = EventPriority.HIGH)
public static void onServerTick(TickEvent.ServerTickEvent event) {
if (event.phase != TickEvent.Phase.END) {
public static void onServerTick(final TickEvent.ServerTickEvent event) {
if (event.phase != TickEvent.Phase.START) {
return;
}
for (final LoadedServerShip ship : VSGameUtilsKt.getShipObjectWorld(event.getServer()).getLoadedShips()) {
GravityInducer.getOrCreate(ship);
}
for (ServerLevel level : event.getServer().getAllLevels()) {
if (level.getPlayers(player -> true, 1).isEmpty()) {
// skip if the no player is in the world
// TODO: maybe we'll have automated ships in the future and this need to be removed?
continue;
}

@SubscribeEvent(priority = EventPriority.HIGH)
public static void onLevelTick(final TickEvent.LevelTickEvent event) {
if (!(event.level instanceof ServerLevel serverLevel)) {
return;
}
switch (event.phase) {
case START -> {
NodeLevel.get(serverLevel).getNetwork().onTick();
}
case END -> {
if (serverLevel.getPlayers(player -> true, 1).isEmpty()) {
// skip if the no player is in the world
// TODO: maybe we'll have automated ships in the future and this need to be removed?
return;
}
AtmosphericCollision.atmosphericCollisionTick(serverLevel);
PlanetCollision.planetCollisionTick(serverLevel);
}
AtmosphericCollision.atmosphericCollisionTick(level);
PlanetCollision.planetCollisionTick(level);
}
}

@SubscribeEvent
public static void onServerStart(ServerStartedEvent event) {
public static void onServerStart(final ServerStartedEvent event) {
GravityInducer.gravityDataTag = CosmosModVariables.WorldVariables.get(event.getServer().overworld()).gravity_data;
}

// For next vs update
// @SubscribeEvent
// public static void shipLoad(VSEvents.ShipLoadEvent event) {
//// Gravity.setAll(event.getServer().overworld());
// Gravity.setAll(event.getServer().overworld());
// }

@SubscribeEvent
public static void onBlockPlace(BlockEvent.EntityPlaceEvent event) {
public static void onBlockPlace(final BlockEvent.EntityPlaceEvent event) {
if (!(event.getLevel() instanceof Level level)) {
return;
}
Expand All @@ -62,4 +81,26 @@ public static void onBlockPlace(BlockEvent.EntityPlaceEvent event) {
event.setCanceled(true);
}
}

@SubscribeEvent
public static void onBlockUpdate(final BlockEvent.NeighborNotifyEvent event) {
if (!(event.getLevel() instanceof Level level)) {
return;
}
onBlockChange(level, event.getPos());
}

/**
* Do not use BlockEvent.NeighborNotifyEvent here, since it won't trigger for shape update.
*/
public static void onBlockChange(final Level level, final BlockPos blockPos) {
if (level.isClientSide) {
return;
}
final NodeLevel nodeLevel = NodeLevel.get(level);
nodeLevel.streamNodesOn(blockPos)
.filter(Predicate.not(PipeNode::canAnchor))
.map(PipeNode::getPos)
.forEach(nodeLevel::breakNode);
}
}
8 changes: 8 additions & 0 deletions src/main/java/net/jcm/vsch/VSCHMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
import net.jcm.vsch.config.VSCHConfig;
import net.jcm.vsch.entity.VSCHEntities;
import net.jcm.vsch.event.GravityInducer;
import net.jcm.vsch.fluid.VSCHFluidTypes;
import net.jcm.vsch.fluid.VSCHFluids;
import net.jcm.vsch.items.VSCHItems;
import net.jcm.vsch.network.VSCHNetwork;
import net.jcm.vsch.util.assemble.MoveUtil;

import net.minecraftforge.client.event.EntityRenderersEvent;
Expand All @@ -26,6 +29,7 @@
@Mod(VSCHMod.MODID)
public class VSCHMod {
public static final String MODID = "vsch";
public static final String VERSION = ModLoadingContext.get().getActiveContainer().getModInfo().getVersion().toString();

public VSCHMod() {
IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus();
Expand All @@ -37,6 +41,10 @@ public VSCHMod() {
VSCHTab.register(modBus);
VSCHEntities.register(modBus);
VSCHTags.register();
VSCHFluidTypes.register(modBus);
VSCHFluids.register(modBus);
VSCHNetwork.register();

MoveUtil.registerDefaultMovers();

// Register commands (I took this code from another one of my mods, can't be bothered to make it consistent with the rest of this)
Expand Down
29 changes: 12 additions & 17 deletions src/main/java/net/jcm/vsch/VSCHTab.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,18 @@
import net.minecraftforge.registries.RegistryObject;

public class VSCHTab {
public static final DeferredRegister<CreativeModeTab> REGISTRY = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, VSCHMod.MODID);

public static final RegistryObject<CreativeModeTab> TAB = REGISTRY.register("starlance",
() -> CreativeModeTab.builder().title(Component.translatable("vsch.itemtab")).icon(() -> new ItemStack(VSCHBlocks.THRUSTER_BLOCK.get())).displayItems((parameters, tabData) -> {

tabData.accept(VSCHBlocks.THRUSTER_BLOCK.get());
tabData.accept(VSCHBlocks.AIR_THRUSTER_BLOCK.get());
tabData.accept(VSCHBlocks.POWERFUL_THRUSTER_BLOCK.get());
tabData.accept(VSCHBlocks.DRAG_INDUCER_BLOCK.get());
tabData.accept(VSCHBlocks.GYRO_BLOCK.get());
tabData.accept(VSCHBlocks.ROCKET_ASSEMBLER_BLOCK.get());

tabData.accept(VSCHItems.MAGNET_BOOT.get());

tabData.accept(VSCHItems.WRENCH.get());

}).build());
private static final DeferredRegister<CreativeModeTab> REGISTRY = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, VSCHMod.MODID);

public static final RegistryObject<CreativeModeTab> TAB = REGISTRY.register(
VSCHMod.MODID,
() -> CreativeModeTab.builder()
.title(Component.translatable("vsch.itemtab"))
.icon(() -> new ItemStack(VSCHBlocks.THRUSTER_BLOCK.get()))
.displayItems((parameters, tabData) -> {
VSCHItems.registerTab(tabData::accept);
})
.build()
);

public static void register(IEventBus eventBus) {
REGISTRY.register(eventBus);
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/net/jcm/vsch/accessor/IChunkMapAccessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.jcm.vsch.accessor;

import net.minecraft.server.level.ChunkHolder;

public interface IChunkMapAccessor {
Iterable<ChunkHolder> starlance$getChunks();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.jcm.vsch.accessor;

import net.jcm.vsch.network.s2c.PipeNodeSyncChunkS2C;

public interface IClientboundLevelChunkWithLightPacketAccessor {
PipeNodeSyncChunkS2C starlance$getPipeNodeSyncChunkS2C();
}
2 changes: 1 addition & 1 deletion src/main/java/net/jcm/vsch/accessor/IGuiAccessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
import net.minecraft.network.chat.Component;

public interface IGuiAccessor {
void vsch$setOverlayMessageIfNotExist(Component component, int duration);
void starlance$setOverlayMessageIfNotExist(Component component, int duration);
}
7 changes: 7 additions & 0 deletions src/main/java/net/jcm/vsch/accessor/ILevelAccessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.jcm.vsch.accessor;

import net.jcm.vsch.pipe.level.NodeLevel;

public interface ILevelAccessor {
NodeLevel starlance$getNodeLevel();
}
30 changes: 30 additions & 0 deletions src/main/java/net/jcm/vsch/accessor/INodeLevelChunkSection.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package net.jcm.vsch.accessor;

import net.jcm.vsch.api.pipe.PipeNode;
import net.jcm.vsch.pipe.level.NodeLevel;

import net.minecraft.core.SectionPos;
import net.minecraft.network.FriendlyByteBuf;

public interface INodeLevelChunkSection {
/**
* Do NOT modify the returned array.
*/
PipeNode[][] starlance$getAllNodes();

PipeNode starlance$getNode(int x, int y, int z, int index);

/**
* Do NOT modify the returned array.
*/
PipeNode[] starlance$getNodes(int x, int y, int z);

PipeNode starlance$setNode(int x, int y, int z, int index, PipeNode node);

boolean starlance$hasAnyNode();

void starlance$writeNodes(FriendlyByteBuf buf);

void starlance$readNodes(NodeLevel level, SectionPos sectionPos, FriendlyByteBuf buf);
}

14 changes: 14 additions & 0 deletions src/main/java/net/jcm/vsch/api/pipe/AbstractCustomNode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package net.jcm.vsch.api.pipe;

import net.jcm.vsch.pipe.level.NodeLevel;

import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.DyeColor;

public abstract class AbstractCustomNode<T extends AbstractCustomNode<T>> extends PipeNode<T> {
protected AbstractCustomNode(final NodeLevel level, final NodePos pos) {
super(level, pos, Type.CUSTOM);
}

public abstract ResourceLocation getId();
}
47 changes: 47 additions & 0 deletions src/main/java/net/jcm/vsch/api/pipe/CustomNodeRegistry.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package net.jcm.vsch.api.pipe;

import net.jcm.vsch.VSCHMod;
import net.jcm.vsch.pipe.level.NodeLevel;

import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.RegistryBuilder;
import net.minecraftforge.registries.RegistryObject;

import java.util.function.Supplier;

public final class CustomNodeRegistry {
private CustomNodeRegistry() {}

public static final ResourceKey<Registry<PipeNodeProvider<? extends AbstractCustomNode>>> ID = ResourceKey.createRegistryKey(new ResourceLocation(VSCHMod.MODID, "custom_node"));
private static final DeferredRegister<PipeNodeProvider<? extends AbstractCustomNode>> REGISTRY = DeferredRegister.create(ID, VSCHMod.MODID);
private static Supplier<IForgeRegistry<PipeNodeProvider<? extends AbstractCustomNode>>> REGISTERED_REGISTRY = null;

public static IForgeRegistry<PipeNodeProvider<? extends AbstractCustomNode>> getRegistry() {
return REGISTERED_REGISTRY.get();
}

public static AbstractCustomNode createNode(final ResourceLocation id, final NodeLevel level, final NodePos pos) {
final IForgeRegistry<PipeNodeProvider<? extends AbstractCustomNode>> registry = REGISTERED_REGISTRY.get();
if (registry == null) {
throw new IllegalStateException("Trying to use registry before it get registered");
}
final PipeNodeProvider<? extends AbstractCustomNode> provider = registry.getValue(id);
if (provider == null) {
return null;
}
return provider.createNode(level, pos);
}

/**
* module private
*/
public static void register(final IEventBus bus) {
REGISTERED_REGISTRY = REGISTRY.makeRegistry(RegistryBuilder::new);
REGISTRY.register(bus);
}
}
24 changes: 24 additions & 0 deletions src/main/java/net/jcm/vsch/api/pipe/FlowDirection.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package net.jcm.vsch.api.pipe;

public enum FlowDirection {
NONE(false, false),
BOTH(true, true),
IN(true, false),
OUT(false, true);

private final boolean in;
private final boolean out;

private FlowDirection(final boolean in, final boolean out) {
this.in = in;
this.out = out;
}

public boolean canFlowIn() {
return this.in;
}

public boolean canFlowOut() {
return this.out;
}
}
Loading
Loading