1
0
Fork 0
mirror of https://github.com/TheClashFruit/CreatePissAndShit.git synced 2024-09-19 09:26:46 +00:00

feat: sitting on toilets

This commit is contained in:
TheClashFruit 2024-08-27 22:11:15 +02:00
parent 07ca259c44
commit 5b6de456b8
Signed by: TheClashFruit
GPG key ID: 09BB24C34C2F3204
10 changed files with 169 additions and 27 deletions

View file

@ -5,12 +5,14 @@ import me.shedaniel.autoconfig.AutoConfig;
import me.shedaniel.autoconfig.ConfigHolder;
import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer;
import me.theclashfruit.pissnshit.config.MainConfig;
import me.theclashfruit.pissnshit.criteria.ToiletUseTrigger;
import me.theclashfruit.pissnshit.network.PissingPacket;
import me.theclashfruit.pissnshit.registry.*;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory;
import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry;
import net.fabricmc.fabric.api.loot.v2.LootTableEvents;
import net.minecraft.advancement.criterion.Criteria;
import net.minecraft.loot.LootPool;
import net.minecraft.loot.condition.RandomChanceLootCondition;
import net.minecraft.loot.entry.ItemEntry;
@ -27,6 +29,8 @@ public class PissAndShit implements ModInitializer {
public static final GameRules.Key<GameRules.BooleanRule> PISS_SOURCE_CONVERSION = GameRuleRegistry.register("pissSourceConversion", GameRules.Category.UPDATES, GameRuleFactory.createBooleanRule(false));
public static ToiletUseTrigger TOILET_USED = Criteria.register(new ToiletUseTrigger());
public static MainConfig CONFIG;
public static ConfigHolder<MainConfig> CONFIG_HOLDER;
@ -37,6 +41,7 @@ public class PissAndShit implements ModInitializer {
Fluids.init();
Items.init();
Blocks.init();
Entities.init();
StatusEffects.init();
Potions.init();

View file

@ -8,18 +8,24 @@ import net.minecraft.block.BlockState;
import net.minecraft.block.HorizontalFacingBlock;
import net.minecraft.block.ShapeContext;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.item.ItemUsageContext;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.Properties;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.function.BooleanBiFunction;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
import net.minecraft.world.WorldView;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import static me.theclashfruit.pissnshit.PissAndShit.TOILET_USED;
import static net.minecraft.state.property.Properties.HORIZONTAL_FACING;
public class MechanicalToiletBlock extends HorizontalFacingBlock implements IBE<MechanicalToiletBlockEntity>, IWrenchable {
@ -86,6 +92,26 @@ public class MechanicalToiletBlock extends HorizontalFacingBlock implements IBE<
return Blocks.MECHANICAL_TOILET_BLOCK_ENTITY;
}
@Override
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
if (!world.isClient) {
if (player.hasVehicle()) {
return ActionResult.PASS;
}
MechanicalToiletSeatEntity seatEntity = MechanicalToiletSeatEntity.create(world, pos);
world.spawnEntity(seatEntity);
player.startRiding(seatEntity);
TOILET_USED.trigger(player);
return ActionResult.SUCCESS;
}
return ActionResult.PASS;
}
public static VoxelShape rotateShape(Direction from, Direction to, VoxelShape shape) {
VoxelShape[] buffer = new VoxelShape[]{ shape, VoxelShapes.empty() };

View file

@ -0,0 +1,46 @@
package me.theclashfruit.pissnshit.blocks.toilet;
import me.theclashfruit.pissnshit.registry.Entities;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.network.packet.Packet;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class MechanicalToiletSeatEntity extends Entity {
public MechanicalToiletSeatEntity(EntityType<? extends MechanicalToiletSeatEntity> type, World world) {
super(type, world);
this.noClip = true; // Allows entity to ignore collisions
}
@Override
protected void initDataTracker() {}
@Override
protected void readCustomDataFromNbt(NbtCompound nbt) {}
@Override
protected void writeCustomDataToNbt(NbtCompound nbt) {}
@Override
public void tick() {
super.tick();
if (!getWorld().isClient) {
if (getFirstPassenger() == null || !(getFirstPassenger() instanceof PlayerEntity) || !(getWorld().getBlockState(getBlockPos()).getBlock() instanceof MechanicalToiletBlock)) {
discard();
}
}
}
public static MechanicalToiletSeatEntity create(World world, BlockPos pos) {
MechanicalToiletSeatEntity seatEntity = new MechanicalToiletSeatEntity(Entities.MECHANICAL_TOILET_SEAT_ENTITY, world);
seatEntity.updatePosition(pos.getX() + 0.45, pos.getY() + 0.45, pos.getZ() + 0.45);
return seatEntity;
}
}

View file

@ -1,9 +1,11 @@
package me.theclashfruit.pissnshit.client;
import me.theclashfruit.pissnshit.client.gui.hud.PissAndShitHudOverlay;
import me.theclashfruit.pissnshit.client.renderer.MechanicalToiletSeatEntityRenderer;
import me.theclashfruit.pissnshit.network.PissSyncPacket;
import me.theclashfruit.pissnshit.network.PissingPacket;
import me.theclashfruit.pissnshit.network.ShitSyncPacket;
import me.theclashfruit.pissnshit.registry.Entities;
import me.theclashfruit.pissnshit.registry.Fluids;
import me.theclashfruit.pissnshit.client.gui.screen.DisclaimerScreen;
import net.fabricmc.api.ClientModInitializer;
@ -13,6 +15,7 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry;
import net.fabricmc.fabric.api.client.render.fluid.v1.SimpleFluidRenderHandler;
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
@ -36,6 +39,8 @@ public class PissAndShitClient implements ClientModInitializer {
BlockRenderLayerMap.INSTANCE.putFluids(RenderLayer.getTranslucent(), Fluids.STILL_PISS, Fluids.FLOWING_PISS);
EntityRendererRegistry.register(Entities.MECHANICAL_TOILET_SEAT_ENTITY, MechanicalToiletSeatEntityRenderer::new);
MinecraftClient client = MinecraftClient.getInstance();
PissAndShitHudOverlay hudOverlay = new PissAndShitHudOverlay(client);

View file

@ -0,0 +1,17 @@
package me.theclashfruit.pissnshit.client.renderer;
import me.theclashfruit.pissnshit.blocks.toilet.MechanicalToiletSeatEntity;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.util.Identifier;
public class MechanicalToiletSeatEntityRenderer extends EntityRenderer<MechanicalToiletSeatEntity> {
public MechanicalToiletSeatEntityRenderer(EntityRendererFactory.Context context) {
super(context);
}
@Override
public Identifier getTexture(MechanicalToiletSeatEntity entity) {
return null;
}
}

View file

@ -0,0 +1,45 @@
package me.theclashfruit.pissnshit.criteria;
import com.google.gson.JsonObject;
import com.mojang.serialization.Codec;
import net.minecraft.advancement.criterion.AbstractCriterion;
import net.minecraft.advancement.criterion.AbstractCriterionConditions;
import net.minecraft.advancement.criterion.CriterionConditions;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.predicate.entity.AdvancementEntityPredicateDeserializer;
import net.minecraft.predicate.entity.AdvancementEntityPredicateSerializer;
import net.minecraft.predicate.entity.LootContextPredicate;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier;
import java.util.Optional;
import static me.theclashfruit.pissnshit.PissAndShit.MOD_ID;
public class ToiletUseTrigger extends AbstractCriterion<ToiletUseTrigger.Conditions> {
public static final Identifier ID = new Identifier(MOD_ID, "toilet_used");
@Override
protected Conditions conditionsFromJson(JsonObject obj, LootContextPredicate playerPredicate, AdvancementEntityPredicateDeserializer predicateDeserializer) {
return new Conditions();
}
@Override
public Identifier getId() {
return ID;
}
public void trigger(PlayerEntity player) {
trigger((ServerPlayerEntity) player, Conditions::requirementsMet);
}
public static class Conditions extends AbstractCriterionConditions {
public Conditions() {
super(ID, LootContextPredicate.EMPTY);
}
boolean requirementsMet() {
return true;
}
}
}

View file

@ -46,27 +46,5 @@ public class Blocks {
public static final BlockEntityType<MechanicalToiletBlockEntity> MECHANICAL_TOILET_BLOCK_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, new Identifier(MOD_ID, "mechanical_toilet_block_entity"), BlockEntityType.Builder.create(MechanicalToiletBlockEntity::new, MECHANICAL_TOILET).build(null));
/*
REGISTRATE
.block("encased_fan", MechanicalToiletBlock::new)
.initialProperties(SharedProperties::copperMetal)
.properties(p -> p.mapColor(MapColor.ORANGE))
.blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p)))
.transform(BlockStressDefaults.setImpact(8.0))
.item()
.transform(customItemModel())
.addLayer(() -> RenderLayer::getCutout)
.register();
*/
/*
public static final BlockEntityEntry<MechanicalToiletBlockEntity> MECHANICAL_TOILET_ENTITY = REGISTRATE
.blockEntity("encased_fan", MechanicalToiletBlockEntity::new)
.instance(() -> MechanicalToiletCogInstance::new)
.validBlocks(MECHANICAL_TOILET)
.renderer(() -> MechanicalToiletRenderer::new)
.register();
*/
public static void init() {}
}

View file

@ -0,0 +1,24 @@
package me.theclashfruit.pissnshit.registry;
import me.theclashfruit.pissnshit.blocks.toilet.MechanicalToiletSeatEntity;
import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder;
import net.minecraft.entity.EntityDimensions;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.SpawnGroup;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;
import static me.theclashfruit.pissnshit.PissAndShit.MOD_ID;
public class Entities {
public static final EntityType<MechanicalToiletSeatEntity> MECHANICAL_TOILET_SEAT_ENTITY = Registry.register(
Registries.ENTITY_TYPE,
new Identifier(MOD_ID, "mechanical_toilet_seat_entity"),
FabricEntityTypeBuilder.<MechanicalToiletSeatEntity>create(SpawnGroup.MISC, MechanicalToiletSeatEntity::new)
.dimensions(EntityDimensions.fixed(0.001f, 0.001f))
.build()
);
public static void init() {}
}

View file

@ -42,7 +42,6 @@
"advancements.pissnshit.mechanical_marvel.title": "Mechanical Marvel",
"advancements.pissnshit.mechanical_marvel.description": "Craft a mechanical toilet.",
"advancements.pissnshit.flushed.title": "Flush(ed)",
"advancements.pissnshit.flushed.description": "Use your newly operational mechanical toilet.",

View file

@ -17,10 +17,7 @@
"parent": "minecraft:pissnshit/mechanical_marvel",
"criteria": {
"mechanical_toilet": {
"conditions": {
"recipe_id": "pissnshit:mechanical_toilet"
},
"trigger": "minecraft:recipe_crafted"
"trigger": "pissnshit:toilet_used"
}
},
"requirements": [