Skip to content

Commit

Permalink
Further develop Level Run
Browse files Browse the repository at this point in the history
  • Loading branch information
Clomclem committed Dec 27, 2023
1 parent 31d0ddf commit befd225
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 25 deletions.
16 changes: 10 additions & 6 deletions src/main/java/org/vfast/backrooms/BackroomsMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.event.player.AttackEntityCallback;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.entity.LivingEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.ActionResult;
import org.vfast.backrooms.block.BackroomsBlocks;
Expand Down Expand Up @@ -92,16 +93,19 @@ public void registerEvents() {
player.setSpawnPoint(BackroomsDimensions.LEVEL_ZERO.key,// TODO Make this the same as origin dimension
player.getBlockPos(), // TODO make spawnpoint position randomized
0.0f, true, false);
if (destination == BackroomsDimensions.LEVEL_RUN.getWorld(player.getServer())) {
StatusEffectInstance speed = new StatusEffectInstance(StatusEffects.SPEED, StatusEffectInstance.INFINITE, 0, false, false, false);
player.addStatusEffect(speed);
}
} else if (BackroomsDimensions.isLevel(origin)){
ServerWorld overworld = player.getServer().getOverworld();
player.setSpawnPoint(overworld.getRegistryKey(), overworld.getSpawnPos(), overworld.getSpawnAngle(), true, false);
player.removeStatusEffect(StatusEffects.MINING_FATIGUE);
if (origin == BackroomsDimensions.LEVEL_RUN.getWorld(player.getServer())) {
player.removeStatusEffect(StatusEffects.SPEED);
}
});
ServerEntityWorldChangeEvents.AFTER_ENTITY_CHANGE_WORLD.register((originalEntity, newEntity, origin, destination) -> {
if (newEntity instanceof LivingEntity entity) {
if (destination == BackroomsDimensions.LEVEL_RUN.getWorld(entity.getServer())) {
StatusEffectInstance speed = new StatusEffectInstance(StatusEffects.SPEED, StatusEffectInstance.INFINITE, 0, false, false, false);
entity.addStatusEffect(speed);
} else if (origin == BackroomsDimensions.LEVEL_RUN.getWorld(entity.getServer())) {
entity.removeStatusEffect(StatusEffects.SPEED);
}
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,14 @@ public void onEntityCollision(BlockState state, World fromWorld, BlockPos pos, E
ServerWorld overworld = server.getOverworld();
ServerWorld level = BackroomsDimensions.getLevel(((BackroomsPortalBlockEntity)fromWorld.getBlockEntity(pos)).getLevel()).getWorld(server);
if (fromWorld != level) {
LimlibTravelling.travelTo(entity, level, new TeleportTarget(
Vec3d.of(new Vec3i(rand.nextBetween(entity.getBlockX()-200, entity.getBlockX()+200), 2, rand.nextBetween(entity.getBlockZ()-200, entity.getBlockZ()+200))),
Vec3d.ZERO, 0.0f, 0.0f),
BackroomsSounds.CAMERA_CLICK, 5.0f, 1.0f);
if (level == BackroomsDimensions.LEVEL_RUN.getWorld(server)) {
BackroomsDimensions.moveToLevelRun(entity);
} else {
LimlibTravelling.travelTo(entity, level, new TeleportTarget(
Vec3d.of(new Vec3i(rand.nextBetween(entity.getBlockX() - 200, entity.getBlockX() + 200), 2, rand.nextBetween(entity.getBlockZ() - 200, entity.getBlockZ() + 200))),
Vec3d.ZERO, 0.0f, 0.0f),
BackroomsSounds.CAMERA_CLICK, 5.0f, 1.0f);
}
} else {
LimlibTravelling.travelTo(entity, overworld, new TeleportTarget(
overworld.getSpawnPos().toCenterPos(),
Expand Down
33 changes: 28 additions & 5 deletions src/main/java/org/vfast/backrooms/mixin/EntityMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@
import net.minecraft.entity.Entity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.command.CommandOutput;
import net.minecraft.util.Nameable;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.TeleportTarget;
import net.minecraft.world.World;
import net.minecraft.world.entity.EntityLike;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
Expand All @@ -24,6 +28,16 @@

@Mixin(Entity.class)
public abstract class EntityMixin implements Nameable, EntityLike, CommandOutput, IEntityDataAccessor {
@Shadow public abstract World getWorld();

@Shadow public abstract boolean isInsideWall();

@Shadow @Nullable public abstract MinecraftServer getServer();

@Shadow public abstract int getBlockX();

@Shadow public abstract int getBlockZ();

@Unique
private NbtCompound persistentData;
@Unique
Expand Down Expand Up @@ -53,14 +67,23 @@ protected void readCustomData(NbtCompound nbt, CallbackInfo ci) {

@Inject(method = "tick", at = @At("TAIL"))
private void onTick(CallbackInfo ci) {
if (!((Entity) (Object) this).getWorld().isClient()) {
Random rand = ((Entity) (Object) this).getWorld().getRandom();
if (((Entity) (Object) this).isInsideWall() && rand.nextBetween(1, 50) == 50) {
LimlibTravelling.travelTo(((Entity) (Object) this), BackroomsDimensions.LEVEL_ZERO.getWorld(((Entity) (Object) this).getServer()), new TeleportTarget(
Vec3d.of(new Vec3i(rand.nextBetween(((Entity) (Object) this).getBlockX() - 200, ((Entity) (Object) this).getBlockX() + 200), 2, rand.nextBetween(((Entity) (Object) this).getBlockZ() - 200, ((Entity) (Object) this).getBlockZ() + 200))),
World world = getWorld();
if (!world.isClient()) {
MinecraftServer server = getServer();
Random rand = world.getRandom();
if (isInsideWall() && rand.nextBetween(1, 50) == 50) {
LimlibTravelling.travelTo(((Entity) (Object) this), BackroomsDimensions.LEVEL_ZERO.getWorld(server), new TeleportTarget(
Vec3d.of(new Vec3i(rand.nextBetween(getBlockX() - 200, getBlockX() + 200), 2, rand.nextBetween(getBlockZ() - 200, getBlockZ() + 200))),
Vec3d.ZERO, 0.0f, 0.0f),
BackroomsSounds.CAMERA_CLICK, 5.0f, 1.0f);
}

if (world == BackroomsDimensions.LEVEL_RUN.getWorld(server) && getBlockZ() >= 805) {
LimlibTravelling.travelTo(((Entity) (Object) this), server.getOverworld(), new TeleportTarget(
Vec3d.of(server.getOverworld().getSpawnPos()),
Vec3d.ZERO, 0.0f, 0.0f),
null, 0.0f, 0.0f);
}
}
}
}
10 changes: 10 additions & 0 deletions src/main/java/org/vfast/backrooms/world/BackroomsDimensions.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

import com.google.common.base.Function;
import com.google.common.base.Supplier;
import net.ludocrypt.limlib.api.LimlibTravelling;
import net.minecraft.entity.Entity;
import net.minecraft.registry.*;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.TeleportTarget;
import org.jetbrains.annotations.Nullable;
import org.vfast.backrooms.BackroomsMod;
import org.vfast.backrooms.world.biome.BackroomsBiomes;
Expand Down Expand Up @@ -82,6 +85,13 @@ public class BackroomsDimensions implements LimlibRegistrar {
.get())
)));

public static void moveToLevelRun(Entity entity) {
ServerWorld levelRun = LEVEL_RUN.getWorld(entity.getServer());
LimlibTravelling.travelTo(entity, levelRun, new TeleportTarget(new Vec3d(160 * levelRun.getRandom().nextBetween(-100000, 100000) + 7.5, 1, 17),
Vec3d.ZERO, 0.0f, 0.0f),
null, 0.0f, 0.0f);
}

public static boolean isInBackrooms(Entity entity) {
return isLevel((ServerWorld) entity.getWorld());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import net.minecraft.server.world.ServerLightingProvider;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.structure.StructureTemplateManager;
import net.minecraft.util.BlockMirror;
import net.minecraft.util.BlockRotation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
Expand Down Expand Up @@ -74,22 +75,34 @@ public CompletableFuture<Chunk> populateNoise(ChunkRegion chunkRegion, ChunkStat
Random random = RngUtils.getFromPos(chunkRegion, chunk);
BlockPos start = chunk.getPos().getStartPos();
ChunkPos pos = chunk.getPos();
final int maxChunkLength = 20;
final int maxChunkLength = 50;
if (MathHelper.isMultipleOf(pos.x, 10) && pos.z >= 0 && pos.z <= maxChunkLength) {
if (pos.z == 0) {
generateNbt(chunkRegion, start.add(0, 0, 13), nbtGroup.nbtId("main", "start"), Manipulation.of(BlockRotation.CLOCKWISE_180));
generateNbt(chunkRegion, start.add(4, 0, 13), nbtGroup.nbtId("main", "start"), Manipulation.of(BlockRotation.CLOCKWISE_180));
} else if (pos.z == maxChunkLength) {
generateNbt(chunkRegion, start, nbtGroup.nbtId("main", "exit"), Manipulation.of(BlockRotation.CLOCKWISE_180));
generateNbt(chunkRegion, start.add(4, 0, 0), nbtGroup.nbtId("main", "exit"), Manipulation.of(BlockRotation.CLOCKWISE_180));
} else {
generateNbt(chunkRegion, start, nbtGroup.nbtId("main", "big_hallway"), Manipulation.of(BlockRotation.CLOCKWISE_180));
if (random.nextBetween(1, 3) == 3) {
generateNbt(chunkRegion, start.add(7, 0, 1), nbtGroup.nbtId("main", "small_hallway"), Manipulation.of(BlockRotation.CLOCKWISE_180));
BlockMirror mirror = random.nextBoolean() ? BlockMirror.FRONT_BACK : BlockMirror.NONE;
generateNbt(chunkRegion, start.add(4, 0, 0), nbtGroup.nbtId("main", "big_hallway"), Manipulation.of(BlockRotation.CLOCKWISE_180, mirror));
if (mirror == BlockMirror.NONE) {
if (random.nextBetween(1, 3) == 3) {
generateNbt(chunkRegion, start.add(11, 0, 1), nbtGroup.nbtId("main", "small_hallway"), Manipulation.of(BlockRotation.CLOCKWISE_180));
} else {
generateNbt(chunkRegion, start.add(11, 0, 1), nbtGroup.nbtId("main", "closet"));
generateNbt(chunkRegion, start.add(11, 0, 10), nbtGroup.nbtId("main", "closet"));
}
generateNbt(chunkRegion, start.add(0, 0, 10), nbtGroup.nbtId("main", "closet"), Manipulation.of(BlockRotation.CLOCKWISE_180));
generateNbt(chunkRegion, start.add(0, 0, 2), nbtGroup.nbtId("main", "closet"), Manipulation.of(BlockRotation.CLOCKWISE_180));
} else {
generateNbt(chunkRegion, start.add(7, 0, 1), nbtGroup.nbtId("main", "closet"), Manipulation.of(BlockRotation.NONE));
generateNbt(chunkRegion, start.add(7, 0, 10), nbtGroup.nbtId("main", "closet"), Manipulation.of(BlockRotation.NONE));
if (random.nextBetween(1, 3) == 3) {
generateNbt(chunkRegion, start.add(0, 0, 1), nbtGroup.nbtId("main", "small_hallway"));
} else {
generateNbt(chunkRegion, start.add(0, 0, 10), nbtGroup.nbtId("main", "closet"), Manipulation.of(BlockRotation.CLOCKWISE_180));
generateNbt(chunkRegion, start.add(0, 0, 1), nbtGroup.nbtId("main", "closet"), Manipulation.of(BlockRotation.CLOCKWISE_180));
}
generateNbt(chunkRegion, start.add(11, 0, 2), nbtGroup.nbtId("main", "closet"));
generateNbt(chunkRegion, start.add(11, 0, 10), nbtGroup.nbtId("main", "closet"));
}
generateNbt(chunkRegion, start.add(-4, 0, 10), nbtGroup.nbtId("main", "closet"), Manipulation.of(BlockRotation.CLOCKWISE_180));
generateNbt(chunkRegion, start.add(-4, 0, 2), nbtGroup.nbtId("main", "closet"), Manipulation.of(BlockRotation.CLOCKWISE_180));
}
}
return CompletableFuture.completedFuture(chunk);
Expand Down

0 comments on commit befd225

Please sign in to comment.