mirror of
https://github.com/TheClashFruit/CreatePissAndShit.git
synced 2024-09-19 17:36:47 +00:00
feat: sitting on toilets
This commit is contained in:
parent
07ca259c44
commit
5b6de456b8
|
@ -5,12 +5,14 @@ import me.shedaniel.autoconfig.AutoConfig;
|
||||||
import me.shedaniel.autoconfig.ConfigHolder;
|
import me.shedaniel.autoconfig.ConfigHolder;
|
||||||
import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer;
|
import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer;
|
||||||
import me.theclashfruit.pissnshit.config.MainConfig;
|
import me.theclashfruit.pissnshit.config.MainConfig;
|
||||||
|
import me.theclashfruit.pissnshit.criteria.ToiletUseTrigger;
|
||||||
import me.theclashfruit.pissnshit.network.PissingPacket;
|
import me.theclashfruit.pissnshit.network.PissingPacket;
|
||||||
import me.theclashfruit.pissnshit.registry.*;
|
import me.theclashfruit.pissnshit.registry.*;
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory;
|
import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory;
|
||||||
import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry;
|
import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry;
|
||||||
import net.fabricmc.fabric.api.loot.v2.LootTableEvents;
|
import net.fabricmc.fabric.api.loot.v2.LootTableEvents;
|
||||||
|
import net.minecraft.advancement.criterion.Criteria;
|
||||||
import net.minecraft.loot.LootPool;
|
import net.minecraft.loot.LootPool;
|
||||||
import net.minecraft.loot.condition.RandomChanceLootCondition;
|
import net.minecraft.loot.condition.RandomChanceLootCondition;
|
||||||
import net.minecraft.loot.entry.ItemEntry;
|
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 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 MainConfig CONFIG;
|
||||||
public static ConfigHolder<MainConfig> CONFIG_HOLDER;
|
public static ConfigHolder<MainConfig> CONFIG_HOLDER;
|
||||||
|
|
||||||
|
@ -37,6 +41,7 @@ public class PissAndShit implements ModInitializer {
|
||||||
Fluids.init();
|
Fluids.init();
|
||||||
Items.init();
|
Items.init();
|
||||||
Blocks.init();
|
Blocks.init();
|
||||||
|
Entities.init();
|
||||||
|
|
||||||
StatusEffects.init();
|
StatusEffects.init();
|
||||||
Potions.init();
|
Potions.init();
|
||||||
|
|
|
@ -8,18 +8,24 @@ import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.HorizontalFacingBlock;
|
import net.minecraft.block.HorizontalFacingBlock;
|
||||||
import net.minecraft.block.ShapeContext;
|
import net.minecraft.block.ShapeContext;
|
||||||
import net.minecraft.block.entity.BlockEntityType;
|
import net.minecraft.block.entity.BlockEntityType;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.item.ItemPlacementContext;
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
import net.minecraft.item.ItemUsageContext;
|
import net.minecraft.item.ItemUsageContext;
|
||||||
import net.minecraft.state.StateManager;
|
import net.minecraft.state.StateManager;
|
||||||
import net.minecraft.state.property.Properties;
|
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.function.BooleanBiFunction;
|
||||||
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
import net.minecraft.util.shape.VoxelShapes;
|
import net.minecraft.util.shape.VoxelShapes;
|
||||||
import net.minecraft.world.BlockView;
|
import net.minecraft.world.BlockView;
|
||||||
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.WorldView;
|
import net.minecraft.world.WorldView;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
|
|
||||||
|
import static me.theclashfruit.pissnshit.PissAndShit.TOILET_USED;
|
||||||
import static net.minecraft.state.property.Properties.HORIZONTAL_FACING;
|
import static net.minecraft.state.property.Properties.HORIZONTAL_FACING;
|
||||||
|
|
||||||
public class MechanicalToiletBlock extends HorizontalFacingBlock implements IBE<MechanicalToiletBlockEntity>, IWrenchable {
|
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;
|
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) {
|
public static VoxelShape rotateShape(Direction from, Direction to, VoxelShape shape) {
|
||||||
VoxelShape[] buffer = new VoxelShape[]{ shape, VoxelShapes.empty() };
|
VoxelShape[] buffer = new VoxelShape[]{ shape, VoxelShapes.empty() };
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,11 @@
|
||||||
package me.theclashfruit.pissnshit.client;
|
package me.theclashfruit.pissnshit.client;
|
||||||
|
|
||||||
import me.theclashfruit.pissnshit.client.gui.hud.PissAndShitHudOverlay;
|
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.PissSyncPacket;
|
||||||
import me.theclashfruit.pissnshit.network.PissingPacket;
|
import me.theclashfruit.pissnshit.network.PissingPacket;
|
||||||
import me.theclashfruit.pissnshit.network.ShitSyncPacket;
|
import me.theclashfruit.pissnshit.network.ShitSyncPacket;
|
||||||
|
import me.theclashfruit.pissnshit.registry.Entities;
|
||||||
import me.theclashfruit.pissnshit.registry.Fluids;
|
import me.theclashfruit.pissnshit.registry.Fluids;
|
||||||
import me.theclashfruit.pissnshit.client.gui.screen.DisclaimerScreen;
|
import me.theclashfruit.pissnshit.client.gui.screen.DisclaimerScreen;
|
||||||
import net.fabricmc.api.ClientModInitializer;
|
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.keybinding.v1.KeyBindingHelper;
|
||||||
import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry;
|
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.render.fluid.v1.SimpleFluidRenderHandler;
|
||||||
|
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
|
||||||
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
|
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.option.KeyBinding;
|
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);
|
BlockRenderLayerMap.INSTANCE.putFluids(RenderLayer.getTranslucent(), Fluids.STILL_PISS, Fluids.FLOWING_PISS);
|
||||||
|
|
||||||
|
EntityRendererRegistry.register(Entities.MECHANICAL_TOILET_SEAT_ENTITY, MechanicalToiletSeatEntityRenderer::new);
|
||||||
|
|
||||||
MinecraftClient client = MinecraftClient.getInstance();
|
MinecraftClient client = MinecraftClient.getInstance();
|
||||||
PissAndShitHudOverlay hudOverlay = new PissAndShitHudOverlay(client);
|
PissAndShitHudOverlay hudOverlay = new PissAndShitHudOverlay(client);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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));
|
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() {}
|
public static void init() {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {}
|
||||||
|
}
|
|
@ -42,7 +42,6 @@
|
||||||
|
|
||||||
"advancements.pissnshit.mechanical_marvel.title": "Mechanical Marvel",
|
"advancements.pissnshit.mechanical_marvel.title": "Mechanical Marvel",
|
||||||
"advancements.pissnshit.mechanical_marvel.description": "Craft a mechanical toilet.",
|
"advancements.pissnshit.mechanical_marvel.description": "Craft a mechanical toilet.",
|
||||||
|
|
||||||
"advancements.pissnshit.flushed.title": "Flush(ed)",
|
"advancements.pissnshit.flushed.title": "Flush(ed)",
|
||||||
"advancements.pissnshit.flushed.description": "Use your newly operational mechanical toilet.",
|
"advancements.pissnshit.flushed.description": "Use your newly operational mechanical toilet.",
|
||||||
|
|
||||||
|
|
|
@ -17,10 +17,7 @@
|
||||||
"parent": "minecraft:pissnshit/mechanical_marvel",
|
"parent": "minecraft:pissnshit/mechanical_marvel",
|
||||||
"criteria": {
|
"criteria": {
|
||||||
"mechanical_toilet": {
|
"mechanical_toilet": {
|
||||||
"conditions": {
|
"trigger": "pissnshit:toilet_used"
|
||||||
"recipe_id": "pissnshit:mechanical_toilet"
|
|
||||||
},
|
|
||||||
"trigger": "minecraft:recipe_crafted"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"requirements": [
|
"requirements": [
|
||||||
|
|
Loading…
Reference in a new issue