Skip to content

Commit e45710c

Browse files
authored
Merge pull request #24 from lonelyicer/1.21.1-NeoForge
chore: toilet plug improvement & add toilet linker
2 parents 7e590fc + 8982bfa commit e45710c

File tree

23 files changed

+405
-49
lines changed

23 files changed

+405
-49
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"parent": "minecraft:item/generated",
3+
"textures": {
4+
"layer0": "poopsky:item/toilet_linker"
5+
}
6+
}

src/main/java/com/altnoir/poopsky/block/AbstractToiletBlock.java

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@
77
import com.altnoir.poopsky.sound.PSSoundEvents;
88
import net.minecraft.core.BlockPos;
99
import net.minecraft.core.Direction;
10+
import net.minecraft.core.registries.Registries;
11+
import net.minecraft.resources.ResourceKey;
12+
import net.minecraft.resources.ResourceLocation;
1013
import net.minecraft.server.level.ServerLevel;
14+
import net.minecraft.server.level.ServerPlayer;
15+
import net.minecraft.sounds.SoundEvent;
16+
import net.minecraft.sounds.SoundEvents;
1117
import net.minecraft.sounds.SoundSource;
1218
import net.minecraft.util.RandomSource;
1319
import net.minecraft.world.entity.Entity;
@@ -19,6 +25,7 @@
1925
import net.minecraft.world.item.context.BlockPlaceContext;
2026
import net.minecraft.world.level.BlockGetter;
2127
import net.minecraft.world.level.Level;
28+
import net.minecraft.world.level.LevelAccessor;
2229
import net.minecraft.world.level.block.*;
2330
import net.minecraft.world.level.block.entity.BlockEntity;
2431
import net.minecraft.world.level.block.state.BlockState;
@@ -39,6 +46,17 @@ public AbstractToiletBlock(Properties properties) {
3946
this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.NORTH));
4047
}
4148

49+
@Override
50+
public void onRemove(BlockState oldState, Level level, BlockPos pos, BlockState newState, boolean isMoving) {
51+
if (!oldState.is(newState.getBlock())) {
52+
BlockEntity be = level.getBlockEntity(pos);
53+
if (be instanceof ToiletBlockEntity toilet) {
54+
toilet.clearLinkedBlock();
55+
}
56+
}
57+
super.onRemove(oldState, level, pos, newState, isMoving);
58+
}
59+
4260
@Override
4361
public void fallOn(Level level, BlockState blockState, BlockPos pos, Entity entity, float fallDistance) {
4462
if (!level.isClientSide) {
@@ -53,6 +71,12 @@ public void fallOn(Level level, BlockState blockState, BlockPos pos, Entity enti
5371
falling.getBlockState().is(Blocks.DAMAGED_ANVIL)) {
5472
poopAnvil(level, entity);
5573
}
74+
75+
if (fallDistance >= 1.0f && entity instanceof ServerPlayer player && isPlayerCentered(pos, player)) {
76+
var be = (ToiletBlockEntity)level.getBlockEntity(pos);
77+
if (be == null) return;
78+
teleportPlayer(player, be, fallDistance);
79+
}
5680
}
5781
}
5882

@@ -93,7 +117,7 @@ protected void onPoop(Level level, Player player) {
93117
new ItemStack(PSItems.POOP.get())
94118
);
95119
poop.setDefaultPickUpDelay();
96-
float pitch = level.random.nextFloat() + 0.5F;
120+
var pitch = level.random.nextFloat() + 0.5F;
97121
level.playSound(null, player.getX(), player.getY() + 0.1, player.getZ(), PSSoundEvents.FART.get(), SoundSource.PLAYERS, 1.0F, pitch);
98122
((ServerLevel) level).sendParticles(
99123
PSParticles.POOP_PARTICLE.get(),
@@ -109,6 +133,21 @@ protected void onPoop(Level level, Player player) {
109133
level.addFreshEntity(poop);
110134
}
111135

136+
public void teleportPlayer(ServerPlayer player, ToiletBlockEntity blockEntity, float fallDistance) {
137+
var server = player.server;
138+
if (blockEntity.getLinkedDim() == null) return;
139+
var targetWorld = server.getLevel(ResourceKey.create(Registries.DIMENSION, ResourceLocation.parse(blockEntity.getLinkedDim())));
140+
if (targetWorld == null) return;
141+
142+
var targetPos = blockEntity.getLinkedPos();
143+
player.teleportTo(targetWorld, targetPos.getX() + 0.5, targetPos.getY() + 1, targetPos.getZ() + 0.5, player.getYRot(), player.getXRot());
144+
var pitch = targetWorld.random.nextFloat() + 0.5F;
145+
targetWorld.playSound(null, player.getX(), player.getY() + 0.1, player.getZ(), SoundEvents.PLAYER_TELEPORT, SoundSource.PLAYERS, 1.0F, pitch);
146+
var bounce = Math.sqrt(2 * 0.08 * fallDistance) * 0.85;
147+
player.setDeltaMovement(player.getDeltaMovement().x, bounce, player.getDeltaMovement().z);
148+
player.hurtMarked = true;
149+
}
150+
112151
@Override
113152
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
114153
builder.add(FACING);

src/main/java/com/altnoir/poopsky/block/entity/ToiletBlockEntity.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,21 @@
33
import com.altnoir.poopsky.block.PSBlockEntities;
44
import net.minecraft.core.BlockPos;
55
import net.minecraft.core.HolderLookup;
6+
import net.minecraft.core.registries.Registries;
67
import net.minecraft.nbt.CompoundTag;
78
import net.minecraft.network.protocol.Packet;
89
import net.minecraft.network.protocol.game.ClientGamePacketListener;
910
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
11+
import net.minecraft.resources.ResourceKey;
12+
import net.minecraft.resources.ResourceLocation;
1013
import net.minecraft.server.level.ServerLevel;
14+
import net.minecraft.server.level.ServerPlayer;
15+
import net.minecraft.server.level.TicketType;
16+
import net.minecraft.world.entity.player.Player;
17+
import net.minecraft.world.level.ChunkPos;
1118
import net.minecraft.world.level.block.entity.BlockEntity;
1219
import net.minecraft.world.level.block.state.BlockState;
20+
import net.minecraft.world.level.chunk.status.ChunkStatus;
1321

1422
import javax.annotation.Nullable;
1523

@@ -29,6 +37,29 @@ public BlockPos getLinkedPos() {
2937
return linkedPos;
3038
}
3139

40+
public void clearLinkedBlock() {
41+
if (level == null || level.isClientSide()) return;
42+
if (linkedPos == null || linkedDim == null) return;
43+
44+
var server = ((ServerLevel) level).getServer();
45+
var targetWorld = server.getLevel(ResourceKey.create(Registries.DIMENSION, ResourceLocation.parse(this.getLinkedDim())));
46+
if (targetWorld == null) return;
47+
48+
var chunkPos = new ChunkPos(this.getLinkedPos());
49+
50+
level.getChunkSource().getChunk(chunkPos.x, chunkPos.z, ChunkStatus.FULL, true);
51+
52+
var be = (ToiletBlockEntity)targetWorld.getBlockEntity(linkedPos);
53+
if (be == null) return;
54+
be.setLinkedPos(BlockPos.ZERO, "");
55+
}
56+
57+
public void setLinkedPos(BlockPos pos, String dim) {
58+
this.linkedPos = pos;
59+
this.linkedDim = dim;
60+
this.setChanged();
61+
}
62+
3263
public void setLinkedPos(BlockPos pos, ServerLevel serverLevel) {
3364
this.linkedPos = pos;
3465
this.linkedDim = serverLevel.dimension().location().toString();

src/main/java/com/altnoir/poopsky/component/PSComponents.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
public class PSComponents {
1111
public static final DeferredRegister.DataComponents REGISTRAR = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, PoopSky.MOD_ID);
1212

13+
public static final DeferredHolder<DataComponentType<?>, DataComponentType<ToiletComponent>> TOILET_COMPONENT = REGISTRAR.registerComponentType(
14+
"toilet_component",
15+
builder -> builder
16+
.persistent(ToiletComponent.BASIC_CODEC)
17+
.networkSynchronized(ToiletComponent.STREAM_CODEC)
18+
);
19+
1320
public static void register(IEventBus eventBus) {
1421
REGISTRAR.register(eventBus);
1522
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.altnoir.poopsky.component;
2+
3+
import com.altnoir.poopsky.block.ToiletBlocks;
4+
import com.mojang.serialization.Codec;
5+
import com.mojang.serialization.codecs.RecordCodecBuilder;
6+
import io.netty.buffer.ByteBuf;
7+
import net.minecraft.network.codec.ByteBufCodecs;
8+
import net.minecraft.network.codec.StreamCodec;
9+
10+
public record ToiletComponent(String level1,
11+
String level2,
12+
int x1,
13+
int y1,
14+
int z1,
15+
int x2,
16+
int y2,
17+
int z2) {
18+
public static final Codec<ToiletComponent> BASIC_CODEC = RecordCodecBuilder.create(instance ->
19+
instance.group(
20+
Codec.STRING.fieldOf("level1").forGetter(ToiletComponent::level1),
21+
Codec.STRING.fieldOf("level2").forGetter(ToiletComponent::level2),
22+
Codec.INT.fieldOf("x1").forGetter(ToiletComponent::x1),
23+
Codec.INT.fieldOf("y1").forGetter(ToiletComponent::y1),
24+
Codec.INT.fieldOf("z1").forGetter(ToiletComponent::z1),
25+
Codec.INT.fieldOf("x2").forGetter(ToiletComponent::x2),
26+
Codec.INT.fieldOf("y2").forGetter(ToiletComponent::y2),
27+
Codec.INT.fieldOf("z2").forGetter(ToiletComponent::z2)
28+
).apply(instance, ToiletComponent::new)
29+
);
30+
31+
public static final StreamCodec<ByteBuf, ToiletComponent> STREAM_CODEC = new StreamCodec<>() {
32+
@Override
33+
public ToiletComponent decode(ByteBuf buf) {
34+
String level1 = ByteBufCodecs.STRING_UTF8.decode(buf);
35+
String level2 = ByteBufCodecs.STRING_UTF8.decode(buf);
36+
int x1 = buf.readInt();
37+
int y1 = buf.readInt();
38+
int z1 = buf.readInt();
39+
int x2 = buf.readInt();
40+
int y2 = buf.readInt();
41+
int z2 = buf.readInt();
42+
return new ToiletComponent(level1, level2, x1, y1, z1, x2, y2, z2);
43+
}
44+
45+
@Override
46+
public void encode(ByteBuf buf, ToiletComponent value) {
47+
ByteBufCodecs.STRING_UTF8.encode(buf, value.level1());
48+
ByteBufCodecs.STRING_UTF8.encode(buf, value.level2());
49+
buf.writeInt(value.x1());
50+
buf.writeInt(value.y1());
51+
buf.writeInt(value.z1());
52+
buf.writeInt(value.x2());
53+
buf.writeInt(value.y2());
54+
buf.writeInt(value.z2());
55+
}
56+
};
57+
58+
public static final ToiletComponent EMPTY = new ToiletComponent("", "", 0, 0, 0, 0, 0, 0);
59+
}

src/main/java/com/altnoir/poopsky/datagen/PSItemModelProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ protected void registerModels() {
1616
basicItem(PSItems.POOP.get());
1717
basicItem(PSItems.POOP_BALL.get());
1818
basicItem(PSItems.POOP_DUMPLINGS.get());
19-
basicItem(PSItems.Toilet_Plug.get());
19+
basicItem(PSItems.TOILET_PLUG.get());
2020
basicItem(PSItems.SPALL.get());
2121
basicItem(PSItems.LAWRENCE_MUSIC_DISC.get());
22+
basicItem(PSItems.TOILET_LINKER.get());
2223
}
2324
}

src/main/java/com/altnoir/poopsky/entity/p/ToiletPlugEntity.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.joml.Vector3f;
3535

3636
import javax.annotation.Nullable;
37-
import java.util.List;
3837

3938
public class ToiletPlugEntity extends VehicleEntity implements Leashable {
4039
private LeashData leashData;
@@ -356,7 +355,7 @@ public ItemStack getPickResult() {
356355

357356
@Override
358357
protected Item getDropItem() {
359-
return PSItems.Toilet_Plug.get();
358+
return PSItems.TOILET_PLUG.get();
360359
}
361360

362361
@Override
@@ -379,8 +378,8 @@ public boolean hurt(DamageSource source, float amount) {
379378
if (source.getEntity() instanceof Player player && player.isCrouching()) {
380379
this.kill();
381380
if (!player.getAbilities().instabuild) {
382-
if (!player.getInventory().add(new ItemStack(PSItems.Toilet_Plug.get()))) {
383-
this.spawnAtLocation(PSItems.Toilet_Plug.get());
381+
if (!player.getInventory().add(new ItemStack(PSItems.TOILET_PLUG.get()))) {
382+
this.spawnAtLocation(PSItems.TOILET_PLUG.get());
384383
}
385384
}
386385
return true;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.altnoir.poopsky.item;
2+
3+
import com.altnoir.poopsky.component.PSComponents;
4+
import com.mojang.blaze3d.platform.InputConstants;
5+
import net.minecraft.ChatFormatting;
6+
import net.minecraft.client.Minecraft;
7+
import net.minecraft.network.chat.Component;
8+
import net.minecraft.world.item.Item;
9+
import net.minecraft.world.item.ItemStack;
10+
import net.minecraft.world.item.TooltipFlag;
11+
12+
import java.util.List;
13+
14+
public class PSBaseItem extends Item {
15+
public PSBaseItem(Properties properties) {
16+
super(properties);
17+
}
18+
19+
public boolean isShiftDown(){
20+
return InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), InputConstants.KEY_LSHIFT)
21+
|| InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), InputConstants.KEY_RSHIFT);
22+
}
23+
24+
@Override
25+
public void appendHoverText(ItemStack stack, TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
26+
if (!isShiftDown())
27+
tooltipComponents.add(Component.translatable("tooltip.poopsky.item.info_0"));
28+
else {
29+
appendTooltip(stack, context, tooltipComponents, tooltipFlag);
30+
}
31+
}
32+
33+
public void appendTooltip(ItemStack stack, TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
34+
35+
}
36+
}

src/main/java/com/altnoir/poopsky/item/PSItems.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.altnoir.poopsky.PoopSky;
44
import com.altnoir.poopsky.component.PFoods;
5+
import com.altnoir.poopsky.component.PSComponents;
6+
import com.altnoir.poopsky.component.ToiletComponent;
57
import com.altnoir.poopsky.sound.PSSoundEvents;
68
import net.minecraft.world.item.Item;
79
import net.minecraft.world.item.Rarity;
@@ -14,15 +16,19 @@ public class PSItems {
1416
public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(PoopSky.MOD_ID);
1517

1618
public static final DeferredItem<Item> POOP = ITEMS.register("poop", () ->
17-
new Poop(new Item.Properties().food(PFoods.POOP).stacksTo(88)));
19+
new PoopItem(new Item.Properties().food(PFoods.POOP).stacksTo(88)));
1820
public static final DeferredItem<Item> POOP_BALL = ITEMS.register("poop_ball", () ->
19-
new PoopBall(new Item.Properties().stacksTo(88)));
21+
new PoopBallItem(new Item.Properties().stacksTo(88)));
2022
public static final DeferredItem<Item> POOP_DUMPLINGS = ITEMS.register("poop_dumplings", () ->
2123
new Item(new Item.Properties().food(PFoods.POOP_DUMPLINGS).stacksTo(88)));
22-
public static final DeferredItem<Item> Toilet_Plug = ITEMS.register("toilet_plug", () ->
23-
new Item(new Item.Properties().stacksTo(1)));
24+
public static final DeferredItem<Item> TOILET_PLUG = ITEMS.register("toilet_plug", () ->
25+
new ToiletPlugItem(new Item.Properties().stacksTo(1)));
2426
public static final DeferredItem<Item> SPALL = ITEMS.register("spall", () ->
2527
new Item(new Item.Properties()));
28+
public static final DeferredItem<Item> TOILET_LINKER = ITEMS.register("toilet_linker", () ->
29+
new ToiletLinkerItem(new Item.Properties()
30+
.component(PSComponents.TOILET_COMPONENT, ToiletComponent.EMPTY)
31+
.stacksTo(1)));
2632

2733
public static final DeferredItem<Item> LAWRENCE_MUSIC_DISC = ITEMS.register("music_disc_lawrence", () ->
2834
new Item(new Item.Properties().jukeboxPlayable(PSSoundEvents.LAWRENCE_KEY).rarity(Rarity.RARE).stacksTo(1)));

src/main/java/com/altnoir/poopsky/item/Plug.java

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)