Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
5dcfa63
implements sneak pose and dismount logic
zyxkad Jul 28, 2025
a2c5f28
fix dismount to
zyxkad Jul 28, 2025
e7e1564
fix collision with ships
zyxkad Jul 28, 2025
381ccf9
make player has no firction
zyxkad Jul 28, 2025
3e6743e
fix Y firction
zyxkad Jul 28, 2025
bb9046c
fix crouching pose when flying
zyxkad Jul 28, 2025
6547c22
allow to step in free rotation
zyxkad Jul 28, 2025
224290a
trying rotate camera
zyxkad Jul 29, 2025
5095725
finally made mouse rotation works
zyxkad Jul 29, 2025
81990c3
fix player tag
zyxkad Jul 29, 2025
04fbedc
sync rotation between client & server
zyxkad Jul 29, 2025
5557f5b
fix local oritantion again
zyxkad Jul 29, 2025
dc9b5a9
fix RemotePlayer orientation
zyxkad Jul 30, 2025
bea0b59
fix render when player is not free rotating
zyxkad Jul 30, 2025
f078240
Merge branch 'main' of https://github.com/jcm236/Starlance into playe…
zyxkad Jul 30, 2025
3ef3811
add headPitch
zyxkad Jul 31, 2025
e3fc1d4
fix misc
zyxkad Jul 31, 2025
cffc513
Merge branch 'main' of https://github.com/jcm236/Starlance into playe…
zyxkad Aug 1, 2025
418e742
implement multi part player entity pushing
zyxkad Aug 6, 2025
4de33c9
Merge branch 'main' of https://github.com/jcm236/Starlance into playe…
zyxkad Aug 6, 2025
4df35cb
fix collision
zyxkad Aug 6, 2025
be05882
add player roll
zyxkad Aug 6, 2025
964b7c8
trying to make magnet boot align with the ship
zyxkad Aug 7, 2025
6eb6e6b
Merge branch 'main' of https://github.com/jcm236/Starlance into playe…
zyxkad Sep 20, 2025
a97d93f
complete head rotation
zyxkad Sep 20, 2025
cf5aa64
Merge branch 'magnet-patch' into player_rotation
zyxkad Sep 20, 2025
e05b3fe
trying collision
zyxkad Sep 21, 2025
a928f0e
partially fixed horizontal collision
zyxkad Sep 22, 2025
0c99da2
proper collision
zyxkad Sep 22, 2025
4db1778
toggeable magnet boots
zyxkad Sep 22, 2025
2fe45f2
allow magnet boots works with curios
zyxkad Sep 22, 2025
7ce7298
sprint to rotate body back to view vector
zyxkad Sep 22, 2025
16fba30
fix jump
zyxkad Sep 22, 2025
44c5d8d
implement maybeBackOffFromEdge
zyxkad Sep 23, 2025
c9f3471
make magnet boots working at edge
zyxkad Sep 23, 2025
ba10fac
implement fall damage
zyxkad Sep 24, 2025
b759e48
entity drag on ship has some issue
zyxkad Sep 25, 2025
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
19 changes: 13 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,13 @@ repositories {
includeModule("org.squiddev", "Cobalt")
}
}
maven {
name = "Illusive Soulworks maven"
url = "https://maven.theillusivec4.top/"
content {
includeGroup("top.theillusivec4.curios")
}
}
}

dependencies {
Expand All @@ -199,22 +206,22 @@ dependencies {
//runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:generators")
//runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:additions")

implementation fg.deobf("curse.maven:jade-324717:${jade_id}")
implementation fg.deobf("curse.maven:jade-324717:5876199")

implementation "org.joml:joml:1.10.5"
implementation "com.fasterxml.jackson.core:jackson-annotations:2.13.3"
implementation "thedarkcolour:kotlinforforge:4.10.0"
implementation fg.deobf("cc.tweaked:cc-tweaked-${minecraft_version}-forge:${cc_version}")
implementation fg.deobf("maven.modrinth:cosmic-horizons-cosmos:${cosmos_version}")
compileOnly fg.deobf("com.jozufozu.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}")
implementation fg.deobf("com.simibubi.create:create-${create_minecraft_version}:${create_version}:all")
compileOnly fg.deobf("com.jozufozu.flywheel:flywheel-forge-${minecraft_version}:${flywheel_version}")
implementation fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all")

//compileOnly fg.deobf("curse.maven:female-gender-forge-481655:4603538")
compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}:api")

//RUNTIME
runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}-forge:${jei_version}")
// runtimeOnly fg.deobf("maven.modrinth:create-clockwork:1.20.1-0.1.16")
// runtimeOnly fg.deobf("maven.modrinth:architectury-api:9.2.14+forge")
// runtimeOnly fg.deobf("maven.modrinth:create-clockwork:1.20.1-0.1.16")
// runtimeOnly fg.deobf("maven.modrinth:architectury-api:9.2.14+forge")
runtimeOnly fg.deobf("maven.modrinth:jade-addons-forge:5.3.1+forge")
//runtimeOnly fg.deobf("curse.maven:rubidium-574856:4494903")
//runtimeOnly fg.deobf("curse.maven:ctm-267602:3933537")
Expand Down
13 changes: 5 additions & 8 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,14 @@ vs2_mc_version=120
#vs_core_version=1.1.0+cf7b0d3c5b
vs2_version=2.3.0-beta.5+bcda04a482
vs_core_version=1.1.0+b19b27c4a4
jade_id=5876199

cc_version=1.114.2
create_minecraft_version = 1.20.1
flywheel_minecraft_version = 1.20.1
create_version = 0.5.1.j-55
flywheel_version = 0.6.11-13
registrate_version = MC1.20-1.3.3

create_version=0.5.1.j-55
curios_version=5.14.1+1.20.1
flywheel_version=0.6.11-13
jei_version=15.2.0.27
lodestone_version=1.4.1.435
jei_version = 15.2.0.27
registrate_version=MC1.20-1.3.3

curse_api_token=
curse_project_id=1130106
Expand Down
18 changes: 9 additions & 9 deletions src/main/java/net/jcm/vsch/VSCHMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import net.jcm.vsch.entity.VSCHEntities;
import net.jcm.vsch.event.GravityInducer;
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 @@ -27,20 +28,24 @@
@Mod(VSCHMod.MODID)
public class VSCHMod {
public static final String MODID = "vsch";
@SuppressWarnings("removal")
public static final String VERSION = ModLoadingContext.get().getActiveContainer().getModInfo().getVersion().toString();

public VSCHMod() {
@SuppressWarnings("removal")
final FMLJavaModLoadingContext context = FMLJavaModLoadingContext.get();
final IEventBus modBus = context.getModEventBus();

VSCHItems.register(modBus);
VSCHBlocks.register(modBus);
MoveUtil.registerDefaultMovers();
VSCHBlockEntities.register(modBus);
VSCHBlocks.register(modBus);
VSCHClientConfig.register(context);
VSCHConfig.register(context);
VSCHTab.register(modBus);
VSCHEntities.register(modBus);
VSCHItems.register(modBus);
VSCHNetwork.register();
VSCHTab.register(modBus);
VSCHTags.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)
MinecraftForge.EVENT_BUS.register(ModCommands.class);
Expand All @@ -65,8 +70,3 @@ public void registerRenderers(EntityRenderersEvent.RegisterRenderers event) {
// event.registerEntityRenderer(VSCHEntities.MAGNET_ENTITY.get(), NoopRenderer::new);
}
}





1 change: 1 addition & 0 deletions src/main/java/net/jcm/vsch/VSCHTags.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ private Fluids() {}
public static final TagKey<Fluid> HYDROGEN = tag("liquid_hydrogen");
public static final TagKey<Fluid> OXYGEN = tag("liquid_oxygen");

@SuppressWarnings("removal")
private static TagKey<Fluid> tag(String name) {
return TagKey.create(Registries.FLUID, new ResourceLocation(VSCHMod.MODID, name));
}
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/net/jcm/vsch/accessor/EntityAccessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package net.jcm.vsch.accessor;

import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;

public interface EntityAccessor {
Vec3 vsch$collide(Vec3 movement);
void vsch$checkInsideBlocks();
void vsch$onInsideBlock(BlockState block);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package net.jcm.vsch.accessor;

import org.joml.Quaternionf;

public interface EntityRotationPacketAccessor {
Quaternionf vsch$rotation();
float vsch$getHeadPitch();
void vsch$setHeadPitch(float pitch);
float vsch$getHeadYaw();
void vsch$setHeadYaw(float yaw);
}
77 changes: 77 additions & 0 deletions src/main/java/net/jcm/vsch/accessor/FreeRotatePlayerAccessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package net.jcm.vsch.accessor;

import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.EntityDimensions;
import net.minecraft.world.entity.Pose;
import net.minecraft.world.phys.Vec3;

import org.joml.Quaternionf;
import org.joml.Vector3d;
import org.joml.primitives.AABBd;
import org.valkyrienskies.core.api.ships.Ship;

import java.util.function.Consumer;

public interface FreeRotatePlayerAccessor extends LivingEntityAccessor {
EntityDimensions vsch$getVanillaDimensions(Pose pose);

boolean vsch$isFreeRotating();

Vec3 vsch$getHeadCenter();

Vec3 vsch$getFeetPosition();

void vsch$setFeetPosition(double x, double y, double z);

default Vec3 vsch$getDownVector() {
if (!this.vsch$isFreeRotating()) {
return new Vec3(0, -1, 0);
}
final Vector3d posY = this.vsch$getBodyRotation().transformUnitPositiveY(new Vector3d());
return new Vec3(-posY.x, -posY.y, -posY.z);
}

Quaternionf vsch$getBodyRotation();

void vsch$setBodyRotation(Quaternionf rotation);

Quaternionf vsch$getBodyRotationO();

void vsch$setBodyRotationO(Quaternionf rotation);

void vsch$setLerpBodyRotation(Quaternionf rotation);

Quaternionf vsch$getHeadRotation();

Quaternionf vsch$getHeadRotationO();

float vsch$getHeadPitch();

void vsch$setHeadPitch(float pitch);

float vsch$getHeadPitchO();

void vsch$setLerpHeadPitch(float pitch);

float vsch$getHeadYaw();

void vsch$setHeadYaw(float yaw);

float vsch$getHeadYawO();

void vsch$setLerpHeadYaw(float yaw);

boolean vsch$hasSupportingBlock();

default BlockPos vsch$findSupportingBlock() {
return this.vsch$findSupportingBlock((box) -> {});
}

BlockPos vsch$findSupportingBlock(Consumer<AABBd> boxModifier);

Ship vsch$getSupportingShip();

void vsch$setOldPosAndRot();

void vsch$stepLerp(int steps);
}
5 changes: 5 additions & 0 deletions src/main/java/net/jcm/vsch/accessor/LivingEntityAccessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package net.jcm.vsch.accessor;

public interface LivingEntityAccessor {
int vsch$getTickSinceLastJump();
}
65 changes: 65 additions & 0 deletions src/main/java/net/jcm/vsch/client/ClientEvents.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package net.jcm.vsch.client;

import net.jcm.vsch.accessor.FreeRotatePlayerAccessor;
import net.jcm.vsch.items.IToggleableItem;
import net.jcm.vsch.items.custom.MagnetBootItem;

import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.player.Inventory;
import net.minecraftforge.client.event.ViewportEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

import org.joml.Quaternionf;
import org.joml.Vector3f;

@Mod.EventBusSubscriber
public final class ClientEvents {
private static final Vector3f CAMERA_ROT_VEC = new Vector3f();

@SubscribeEvent
public static void onComputeCamera(final ViewportEvent.ComputeCameraAngles event) {
final Camera camera = event.getCamera();
if (!(camera.getEntity() instanceof final FreeRotatePlayerAccessor frp) || !frp.vsch$isFreeRotating()) {
return;
}
final Quaternionf rotation = camera.rotation();
rotation.getEulerAnglesYXZ(CAMERA_ROT_VEC);
event.setPitch(CAMERA_ROT_VEC.x * Mth.RAD_TO_DEG);
if (Math.abs(Math.abs(CAMERA_ROT_VEC.x) - Mth.HALF_PI) < 0.025f) {
// Lovely gimbal lock
event.setYaw((float) (-Math.toDegrees(Math.atan2(
-2 * (rotation.x * rotation.z - rotation.y * rotation.w),
1 - 2 * (rotation.y * rotation.y + rotation.z * rotation.z)
))));
event.setRoll(0);
} else {
event.setYaw(-CAMERA_ROT_VEC.y * Mth.RAD_TO_DEG);
event.setRoll(CAMERA_ROT_VEC.z * Mth.RAD_TO_DEG);
}
}

@SubscribeEvent
public static void onClientTick(final TickEvent.ClientTickEvent event) {
if (event.phase != TickEvent.Phase.END) {
return;
}
final LocalPlayer player = Minecraft.getInstance().player;
final Inventory inventory = player == null ? null : player.getInventory();
final int bootSlot = EquipmentSlot.FEET.getIndex(Inventory.INVENTORY_SIZE);
while (VSCHKeyBindings.TOGGLE_MAGNET_BOOT.consumeClick()) {
if (inventory == null) {
continue;
}
if (inventory.getItem(bootSlot).getItem() instanceof MagnetBootItem && IToggleableItem.toggleSlot(player, bootSlot)) {
continue;
}
IToggleableItem.toggleCuriosSlot(player, "boots", (stack) -> stack.getItem() instanceof MagnetBootItem);
}
}
}
56 changes: 56 additions & 0 deletions src/main/java/net/jcm/vsch/client/VSCHKeyBindings.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package net.jcm.vsch.client;

import net.jcm.vsch.VSCHMod;
import net.jcm.vsch.client.key.DoubleClickKeyMapping;

import com.mojang.blaze3d.platform.InputConstants;
import net.minecraft.client.KeyMapping;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
import net.minecraftforge.client.settings.KeyConflictContext;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import org.lwjgl.glfw.GLFW;

@Mod.EventBusSubscriber(modid = VSCHMod.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD)
public final class VSCHKeyBindings {
public static final KeyMapping ROLL_CLOCKWISE = new KeyMapping(
"key." + VSCHMod.MODID + ".roll_clockwise",
KeyConflictContext.IN_GAME,
InputConstants.Type.KEYSYM,
GLFW.GLFW_KEY_C,
"key.categories.movement"
);

public static final KeyMapping ROLL_COUNTER_CLOCKWISE = new KeyMapping(
"key." + VSCHMod.MODID + ".roll_counter_clockwise",
KeyConflictContext.IN_GAME,
InputConstants.Type.KEYSYM,
GLFW.GLFW_KEY_Z,
"key.categories.movement"
);

public static final DoubleClickKeyMapping UNLOCK_HEAD_ROTATION = new DoubleClickKeyMapping(
"key." + VSCHMod.MODID + ".unlock_head_rotation",
KeyConflictContext.IN_GAME,
InputConstants.Type.KEYSYM,
GLFW.GLFW_KEY_LEFT_ALT,
"key.categories.movement"
);

public static final KeyMapping TOGGLE_MAGNET_BOOT = new KeyMapping(
"key." + VSCHMod.MODID + ".toggle_magnet_boot",
KeyConflictContext.IN_GAME,
InputConstants.Type.KEYSYM,
GLFW.GLFW_KEY_X,
"key.categories." + VSCHMod.MODID
);

@SubscribeEvent
public static void register(final RegisterKeyMappingsEvent event) {
event.register(ROLL_COUNTER_CLOCKWISE);
event.register(ROLL_CLOCKWISE);
event.register(UNLOCK_HEAD_ROTATION);
event.register(TOGGLE_MAGNET_BOOT);
}
}
41 changes: 41 additions & 0 deletions src/main/java/net/jcm/vsch/client/key/DoubleClickKeyMapping.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package net.jcm.vsch.client.key;

import com.mojang.blaze3d.platform.InputConstants;
import net.minecraft.client.KeyMapping;
import net.minecraftforge.client.settings.KeyConflictContext;

public class DoubleClickKeyMapping extends KeyMapping {
private long lastDown = 0;
private long doubleClicked = 0;

public DoubleClickKeyMapping(final String name, final KeyConflictContext context, final InputConstants.Type type, final int defaultKey, final String category) {
super(name, context, type, defaultKey, category);
}

public boolean consumeDoubleClick() {
if (this.doubleClicked == 0) {
return false;
}
final boolean valid = this.doubleClicked + 500 >= System.currentTimeMillis();
this.doubleClicked = 0;
return valid;
}

@Override
public void setDown(final boolean value) {
super.setDown(value);
final long now = System.currentTimeMillis();
if (!value) {
if (this.lastDown != 0 && this.lastDown + 180 < now) {
this.lastDown = 0;
}
return;
}
if (this.lastDown + 300 < now) {
this.lastDown = now;
return;
}
this.lastDown = 0;
this.doubleClicked = now;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public class GyroRenderer implements BlockEntityRenderer<GyroBlockEntity> {
private static final ModelTextures CORE_MODEL;

static {
@SuppressWarnings("removal")
final ResourceLocation resource = new ResourceLocation(VSCHMod.MODID, "block/gyro");
CORE_MODEL = new ModelTextures(
TextureLocation.fromNonStandardSize(resource, 12, 44, 128),
Expand Down
Loading
Loading