mirror of
https://github.com/TeamMidnightDust/Puddles.git
synced 2025-12-15 11:35:09 +01:00
Puddles 2.0.0: Now fully server-sided!
- Port to 1.21 - Utilize Polymer and ServerTranslationsAPI for fully server-side functionality (Doesn't even require resourcepacks) - Instead of breaking, puddles will now create a splash effect when mined - Puddles no longer slow down walking (Sprinting still gets interrupted; this is not fixable, closes #2) - Fixed #13 - Fixed #11
This commit is contained in:
100
build.gradle
100
build.gradle
@@ -1,16 +1,26 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'fabric-loom' version '1.3-SNAPSHOT'
|
id 'fabric-loom' version '1.7-SNAPSHOT'
|
||||||
id 'maven-publish'
|
id 'maven-publish'
|
||||||
|
id "me.shedaniel.unified-publishing" version "0.1.+"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_21
|
||||||
|
targetCompatibility = JavaVersion.VERSION_21
|
||||||
|
|
||||||
|
archivesBaseName = project.archives_base_name
|
||||||
version = project.mod_version
|
version = project.mod_version
|
||||||
group = project.maven_group
|
group = project.maven_group
|
||||||
|
|
||||||
base {
|
loom {
|
||||||
archivesName = project.archives_base_name
|
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
maven { url "https://api.modrinth.com/maven" }
|
maven { url "https://maven.terraformersmc.com/releases" }
|
||||||
|
maven { url "https://jitpack.io" }
|
||||||
|
maven {
|
||||||
|
url = "https://api.modrinth.com/maven"
|
||||||
|
}
|
||||||
|
maven { url 'https://maven.nucleoid.xyz' }
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -19,10 +29,15 @@ dependencies {
|
|||||||
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
|
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
|
||||||
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
|
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
|
||||||
|
|
||||||
|
// Fabric API. This is technically optional, but you probably want it anyway.
|
||||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||||
modImplementation "maven.modrinth:midnightlib:${midnightlib_version}"
|
|
||||||
include "maven.modrinth:midnightlib:${midnightlib_version}"
|
|
||||||
|
|
||||||
|
modImplementation "maven.modrinth:midnightlib:${midnightlib_version}"
|
||||||
|
|
||||||
|
modImplementation include("eu.pb4:polymer-core:${polymer_version}")
|
||||||
|
modImplementation include("eu.pb4:polymer-blocks:${polymer_version}")
|
||||||
|
modImplementation include("eu.pb4:polymer-virtual-entity:${polymer_version}")
|
||||||
|
modImplementation include("xyz.nucleoid:server-translations-api:${server_translation_version}")
|
||||||
}
|
}
|
||||||
|
|
||||||
processResources {
|
processResources {
|
||||||
@@ -34,7 +49,13 @@ processResources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(JavaCompile).configureEach {
|
tasks.withType(JavaCompile).configureEach {
|
||||||
it.options.release = 17
|
// ensure that the encoding is set to UTF-8, no matter what the system default is
|
||||||
|
// this fixes some edge cases with special characters not displaying correctly
|
||||||
|
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
|
||||||
|
// If Javadoc is generated, this must be specified in that task too.
|
||||||
|
it.options.encoding = "UTF-8"
|
||||||
|
|
||||||
|
it.options.release = 21
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
@@ -42,14 +63,11 @@ java {
|
|||||||
// if it is present.
|
// if it is present.
|
||||||
// If you remove this line, sources will not be generated.
|
// If you remove this line, sources will not be generated.
|
||||||
withSourcesJar()
|
withSourcesJar()
|
||||||
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_17
|
|
||||||
targetCompatibility = JavaVersion.VERSION_17
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
from("LICENSE") {
|
from("LICENSE") {
|
||||||
rename { "${it}_${project.base.archivesName.get()}"}
|
rename { "${it}_${project.archivesBaseName}"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +75,13 @@ jar {
|
|||||||
publishing {
|
publishing {
|
||||||
publications {
|
publications {
|
||||||
mavenJava(MavenPublication) {
|
mavenJava(MavenPublication) {
|
||||||
from components.java
|
// add all the jars that should be included when publishing to maven
|
||||||
|
artifact(remapJar) {
|
||||||
|
builtBy remapJar
|
||||||
|
}
|
||||||
|
artifact(sourcesJar) {
|
||||||
|
builtBy remapSourcesJar
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,4 +92,56 @@ publishing {
|
|||||||
// The repositories here will be used for publishing your artifact, not for
|
// The repositories here will be used for publishing your artifact, not for
|
||||||
// retrieving dependencies.
|
// retrieving dependencies.
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ext {
|
||||||
|
releaseChangelog = {
|
||||||
|
def changes = new StringBuilder()
|
||||||
|
changes << "## Puddles v$project.version for $project.minecraft_version\n[View the changelog](https://www.github.com/TeamMidnightDust/Puddles/commits/)"
|
||||||
|
def proc = "git log --max-count=1 --pretty=format:%s".execute()
|
||||||
|
proc.in.eachLine { line ->
|
||||||
|
def processedLine = line.toString()
|
||||||
|
if (!processedLine.contains("New translations") && !processedLine.contains("Merge") && !processedLine.contains("branch")) {
|
||||||
|
changes << "\n- ${processedLine.capitalize()}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
proc.waitFor()
|
||||||
|
return changes.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unifiedPublishing {
|
||||||
|
project {
|
||||||
|
displayName = "Puddles v$project.version - Fabric $project.minecraft_version"
|
||||||
|
releaseType = "$project.release_type"
|
||||||
|
changelog = releaseChangelog()
|
||||||
|
gameVersions = []
|
||||||
|
gameLoaders = ["fabric","quilt"]
|
||||||
|
mainPublication remapJar
|
||||||
|
relations {
|
||||||
|
depends {
|
||||||
|
curseforge = "midnightlib"
|
||||||
|
modrinth = "midnightlib"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN")
|
||||||
|
if (CURSEFORGE_TOKEN != null) {
|
||||||
|
curseforge {
|
||||||
|
token = CURSEFORGE_TOKEN
|
||||||
|
id = rootProject.curseforge_id
|
||||||
|
gameVersions.addAll "Java 21", project.minecraft_version, project.supported_versions
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN")
|
||||||
|
if (MODRINTH_TOKEN != null) {
|
||||||
|
modrinth {
|
||||||
|
token = MODRINTH_TOKEN
|
||||||
|
id = rootProject.modrinth_id
|
||||||
|
version = "$project.version"
|
||||||
|
gameVersions.addAll project.minecraft_version, project.supported_versions
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,16 +3,21 @@ org.gradle.jvmargs=-Xmx1G
|
|||||||
|
|
||||||
# Fabric Properties
|
# Fabric Properties
|
||||||
# check these on https://fabricmc.net/use
|
# check these on https://fabricmc.net/use
|
||||||
minecraft_version=1.20.1
|
minecraft_version=1.21
|
||||||
yarn_mappings=1.20.1+build.10
|
supported_versions=1.21.1
|
||||||
loader_version=0.14.21
|
yarn_mappings=1.21+build.9
|
||||||
|
loader_version=0.15.11
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version = 1.2.2
|
mod_version = 2.0.0
|
||||||
maven_group = eu.midnightdust
|
maven_group = eu.midnightdust
|
||||||
archives_base_name = puddles
|
archives_base_name = puddles
|
||||||
|
release_type=release
|
||||||
|
curseforge_id=463169
|
||||||
|
modrinth_id=535D1YoA
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
fabric_version=0.86.1+1.20.1
|
fabric_version=0.100.7+1.21
|
||||||
midnightlib_version=0.5.2
|
midnightlib_version=1.5.8-fabric
|
||||||
|
polymer_version=0.9.6+1.21
|
||||||
|
server_translation_version=2.3.1+1.21-pre2
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ pluginManagement {
|
|||||||
name = 'Fabric'
|
name = 'Fabric'
|
||||||
url = 'https://maven.fabricmc.net/'
|
url = 'https://maven.fabricmc.net/'
|
||||||
}
|
}
|
||||||
mavenCentral()
|
maven { url "https://maven.architectury.dev/" }
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,26 +2,47 @@ package eu.midnightdust.puddles;
|
|||||||
|
|
||||||
import eu.midnightdust.puddles.block.PuddleBlock;
|
import eu.midnightdust.puddles.block.PuddleBlock;
|
||||||
import eu.midnightdust.puddles.config.PuddlesConfig;
|
import eu.midnightdust.puddles.config.PuddlesConfig;
|
||||||
|
import eu.pb4.polymer.core.api.item.PolymerBlockItem;
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.entity.attribute.EntityAttributeInstance;
|
||||||
import net.minecraft.fluid.Fluids;
|
import net.minecraft.entity.attribute.EntityAttributeModifier;
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.entity.attribute.EntityAttributes;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
|
import net.minecraft.network.packet.s2c.play.ParticleS2CPacket;
|
||||||
|
import net.minecraft.particle.ParticleTypes;
|
||||||
import net.minecraft.registry.Registries;
|
import net.minecraft.registry.Registries;
|
||||||
import net.minecraft.registry.Registry;
|
import net.minecraft.registry.Registry;
|
||||||
|
import net.minecraft.sound.SoundCategory;
|
||||||
|
import net.minecraft.sound.SoundEvents;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
public class Puddles implements ModInitializer {
|
public class Puddles implements ModInitializer {
|
||||||
public static final String MOD_ID = "puddles";
|
public static final String MOD_ID = "puddles";
|
||||||
private static final String ITEM_NAME = "puddle";
|
public static final PuddleBlock Puddle = new PuddleBlock();
|
||||||
public static final Block Puddle = new PuddleBlock(Fluids.WATER, FabricBlockSettings.create());
|
private final static EntityAttributeModifier entityAttributeModifier = new EntityAttributeModifier(id("puddle_speed"), 100, EntityAttributeModifier.Operation.ADD_VALUE);
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitialize() {
|
public void onInitialize() {
|
||||||
PuddlesConfig.init(MOD_ID, PuddlesConfig.class);
|
PuddlesConfig.init(MOD_ID, PuddlesConfig.class);
|
||||||
Registry.register(Registries.BLOCK, new Identifier(MOD_ID, ITEM_NAME), Puddle);
|
Registry.register(Registries.BLOCK, id("puddle"), Puddle);
|
||||||
Registry.register(Registries.ITEM, new Identifier(MOD_ID, ITEM_NAME), new BlockItem(Puddle, new Item.Settings()));
|
Registry.register(Registries.ITEM, id("puddle"), new PolymerBlockItem(Puddle, new Item.Settings(), Items.POTION));
|
||||||
|
ServerTickEvents.END_WORLD_TICK.register(world -> world.getPlayers().forEach(player -> {
|
||||||
|
EntityAttributeInstance entityAttributeInstance = player.getAttributes().getCustomInstance(EntityAttributes.GENERIC_WATER_MOVEMENT_EFFICIENCY);
|
||||||
|
if (player.getBlockStateAtPos().getBlock() instanceof PuddleBlock) {
|
||||||
|
if (entityAttributeInstance != null) {
|
||||||
|
entityAttributeInstance.removeModifier(entityAttributeModifier);
|
||||||
|
entityAttributeInstance.addTemporaryModifier(entityAttributeModifier);
|
||||||
|
}
|
||||||
|
if (world.random.nextInt(30) == 0) player.playSoundToPlayer(SoundEvents.ENTITY_PLAYER_SWIM, SoundCategory.BLOCKS, 0.5f, 1.2f);
|
||||||
|
player.networkHandler.sendPacket(new ParticleS2CPacket(ParticleTypes.SPLASH, false, player.getBlockX() + 0.5f, player.getBlockY() + 0.1f, player.getBlockZ() + 0.5f, 0.5f, 0.1f, 0.5f, 1, 2));
|
||||||
|
} else if (player.isInFluid()) {
|
||||||
|
if (entityAttributeInstance != null) entityAttributeInstance.removeModifier(entityAttributeModifier);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
public static Identifier id(String path) {
|
||||||
|
return Identifier.of(MOD_ID, path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
package eu.midnightdust.puddles;
|
|
||||||
|
|
||||||
import net.fabricmc.api.ClientModInitializer;
|
|
||||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
|
|
||||||
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
|
|
||||||
import net.fabricmc.fabric.impl.client.rendering.ColorProviderRegistryImpl;
|
|
||||||
import net.minecraft.block.Blocks;
|
|
||||||
import net.minecraft.world.biome.Biome;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static eu.midnightdust.puddles.Puddles.*;
|
|
||||||
|
|
||||||
public class PuddlesClient implements ClientModInitializer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onInitializeClient() {
|
|
||||||
// Colored Puddle Items & Blocks
|
|
||||||
ClientTickEvents.END_CLIENT_TICK.register(client -> {
|
|
||||||
int waterColor;
|
|
||||||
if (client.world != null && client.player != null) {
|
|
||||||
Biome biome = client.world.getBiome(client.player.getBlockPos()).value();
|
|
||||||
waterColor = biome.getWaterColor();
|
|
||||||
} else waterColor = 4159204;
|
|
||||||
|
|
||||||
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> waterColor, Puddles.Puddle);
|
|
||||||
});
|
|
||||||
|
|
||||||
ColorProviderRegistry.BLOCK.register((state, view, pos, tintIndex) -> Objects.requireNonNull(ColorProviderRegistryImpl.BLOCK.get(Blocks.WATER)).getColor(state, view, pos, tintIndex), Puddle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +1,38 @@
|
|||||||
package eu.midnightdust.puddles.block;
|
package eu.midnightdust.puddles.block;
|
||||||
|
|
||||||
import eu.midnightdust.puddles.Puddles;
|
|
||||||
import eu.midnightdust.puddles.config.PuddlesConfig;
|
import eu.midnightdust.puddles.config.PuddlesConfig;
|
||||||
import net.fabricmc.api.EnvType;
|
import eu.pb4.polymer.core.api.block.PolymerBlock;
|
||||||
import net.fabricmc.api.Environment;
|
import eu.pb4.polymer.virtualentity.api.BlockWithElementHolder;
|
||||||
import net.minecraft.block.*;
|
import eu.pb4.polymer.virtualentity.api.ElementHolder;
|
||||||
|
import eu.pb4.polymer.virtualentity.api.elements.InteractionElement;
|
||||||
|
import eu.pb4.polymer.virtualentity.api.elements.VirtualElement;
|
||||||
|
import net.minecraft.block.AbstractBlock;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.block.FluidBlock;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.component.ComponentMap;
|
||||||
|
import net.minecraft.component.DataComponentTypes;
|
||||||
|
import net.minecraft.component.type.PotionContentsComponent;
|
||||||
import net.minecraft.entity.ai.pathing.NavigationType;
|
import net.minecraft.entity.ai.pathing.NavigationType;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.fluid.*;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.item.*;
|
import net.minecraft.item.Items;
|
||||||
import net.minecraft.loot.context.LootContext;
|
import net.minecraft.network.packet.s2c.play.ParticleS2CPacket;
|
||||||
import net.minecraft.potion.PotionUtil;
|
import net.minecraft.particle.ParticleTypes;
|
||||||
import net.minecraft.potion.Potions;
|
import net.minecraft.potion.Potions;
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.sound.SoundCategory;
|
import net.minecraft.sound.SoundCategory;
|
||||||
import net.minecraft.sound.SoundEvents;
|
import net.minecraft.sound.SoundEvents;
|
||||||
import net.minecraft.stat.Stats;
|
import net.minecraft.stat.Stats;
|
||||||
import net.minecraft.util.ActionResult;
|
|
||||||
import net.minecraft.util.Hand;
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.ItemActionResult;
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
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 net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.util.math.random.Random;
|
import net.minecraft.util.math.random.Random;
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
import net.minecraft.util.shape.VoxelShapes;
|
import net.minecraft.util.shape.VoxelShapes;
|
||||||
@@ -30,32 +41,22 @@ import net.minecraft.world.World;
|
|||||||
import net.minecraft.world.WorldAccess;
|
import net.minecraft.world.WorldAccess;
|
||||||
import net.minecraft.world.WorldView;
|
import net.minecraft.world.WorldView;
|
||||||
|
|
||||||
import java.util.Collections;
|
public class PuddleBlock extends Block implements PolymerBlock, BlockWithElementHolder {
|
||||||
import java.util.List;
|
public PuddleBlock() {
|
||||||
|
super(AbstractBlock.Settings.copy(Blocks.SHORT_GRASS));
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public class PuddleBlock extends Block {
|
|
||||||
|
|
||||||
protected final FlowableFluid fluid;
|
|
||||||
public static final VoxelShape COLLISION_SHAPE;
|
|
||||||
|
|
||||||
public PuddleBlock(FlowableFluid fluid, AbstractBlock.Settings settings) {
|
|
||||||
super(settings);
|
|
||||||
this.fluid = fluid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
public ItemActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
||||||
ItemStack itemStack = player.getStackInHand(hand);
|
ItemStack itemStack = player.getStackInHand(hand);
|
||||||
if (itemStack.isEmpty()) {
|
if (itemStack.isEmpty()) {
|
||||||
return ActionResult.PASS;
|
return ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION;
|
||||||
} else {
|
} else {
|
||||||
Item item = itemStack.getItem();
|
if (itemStack.getItem() == Items.GLASS_BOTTLE) {
|
||||||
ItemStack waterBottleStack;
|
|
||||||
if (item == Items.GLASS_BOTTLE) {
|
|
||||||
if (!world.isClient) {
|
if (!world.isClient) {
|
||||||
if (!player.isCreative()) {
|
if (!player.isCreative()) {
|
||||||
waterBottleStack = PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER);
|
ItemStack waterBottleStack = new ItemStack(Items.POTION);
|
||||||
player.incrementStat(Stats.USE_CAULDRON);
|
waterBottleStack.applyComponentsFrom(ComponentMap.builder().add(DataComponentTypes.POTION_CONTENTS, PotionContentsComponent.DEFAULT.with(Potions.WATER)).build());
|
||||||
itemStack.decrement(1);
|
itemStack.decrement(1);
|
||||||
if (itemStack.isEmpty()) {
|
if (itemStack.isEmpty()) {
|
||||||
player.setStackInHand(hand, waterBottleStack);
|
player.setStackInHand(hand, waterBottleStack);
|
||||||
@@ -69,19 +70,20 @@ public class PuddleBlock extends Block {
|
|||||||
world.playSound(null, pos, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
|
world.playSound(null, pos, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
|
||||||
world.setBlockState(pos, Blocks.AIR.getDefaultState());
|
world.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||||
}
|
}
|
||||||
return ActionResult.success(world.isClient);
|
return ItemActionResult.success(world.isClient);
|
||||||
}
|
}
|
||||||
else return ActionResult.FAIL;
|
else return ItemActionResult.FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasRandomTicks(BlockState state) {
|
public boolean hasRandomTicks(BlockState state) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
||||||
if (!world.isRaining() && random.nextInt(10000 / PuddlesConfig.evaporationChance) == 0) {
|
if (!world.isRaining() && random.nextInt(1000 / PuddlesConfig.evaporationChance) == 0) {
|
||||||
world.setBlockState(pos, Blocks.AIR.getDefaultState());
|
world.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,77 +94,67 @@ public class PuddleBlock extends Block {
|
|||||||
public VoxelShape getCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return VoxelShapes.empty();
|
return VoxelShapes.empty();
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
|
||||||
return COLLISION_SHAPE;
|
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) {
|
public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) {
|
||||||
return VoxelShapes.empty();
|
return VoxelShapes.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) {
|
@Override
|
||||||
|
public boolean canPathfindThrough(BlockState state, NavigationType type) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FluidState getFluidState(BlockState state) {
|
|
||||||
return fluid.getFlowing(1,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Environment(EnvType.CLIENT)
|
|
||||||
public boolean isSideInvisible(BlockState state, BlockState stateFrom, Direction direction) {
|
|
||||||
return stateFrom.getFluidState().getFluid().matchesType(this.fluid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BlockRenderType getRenderType(BlockState state) {
|
|
||||||
return BlockRenderType.INVISIBLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ItemStack> getDroppedStacks(BlockState state, LootContext.Builder builder) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) {
|
public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) {
|
||||||
if (world.getBlockState(pos) == Blocks.AIR.getDefaultState() || world.getBlockState(pos) == Puddles.Puddle.getDefaultState()) {
|
if (world.getBlockState(pos).getBlock() == Blocks.AIR) {
|
||||||
int i;
|
int i;
|
||||||
// Check if there are fluids on the sides or corners of the block above
|
// Check if there are puddles on the sides of the block above
|
||||||
for (i = 2; i < 6; ++i) {
|
for (i = 2; i < 6; ++i) {
|
||||||
BlockPos pos1 = pos.up();
|
BlockPos pos1 = pos.up();
|
||||||
BlockPos pos2 = pos1.offset(Direction.byId(i));
|
if (world.getBlockState(pos1.offset(Direction.byId(i))).getBlock() instanceof PuddleBlock) {
|
||||||
if (!world.getFluidState(pos1.offset(Direction.byId(i))).isEmpty()) {
|
// When sides of the block above have a puddle, don't place the puddle
|
||||||
// When sides of the block above have water don't place the puddle
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!world.getFluidState(pos2.offset(Direction.byId(i).rotateYClockwise())).isEmpty()) {
|
|
||||||
// When corners of the block above have water don't place the puddle
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Check if there are fluids on the sides or corners of the block below
|
// Check if there are puddles on the sides of the block below
|
||||||
for (i = 2; i < 6; ++i) {
|
for (i = 2; i < 6; ++i) {
|
||||||
BlockPos pos1 = pos.down();
|
BlockPos pos1 = pos.down();
|
||||||
BlockPos pos2 = pos1.offset(Direction.byId(i));
|
if (world.getBlockState(pos1.offset(Direction.byId(i))).getBlock() instanceof PuddleBlock) {
|
||||||
if (!world.getFluidState(pos1.offset(Direction.byId(i))).isEmpty()) {
|
// When sides of the block below have a puddle, don't place the puddle
|
||||||
// When sides of the block below have water don't place the puddle
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!world.getFluidState(pos2.offset(Direction.byId(i).rotateYClockwise())).isEmpty()) {
|
|
||||||
// When corners of the block below have water don't place the puddle
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return world.getBlockState(pos.down()).isSideSolidFullSquare(world, pos, Direction.UP);
|
|
||||||
}
|
}
|
||||||
// When there's already another block at the position don't place the puddle
|
return world.getBlockState(pos.down()).isSideSolidFullSquare(world, pos, Direction.UP);
|
||||||
else return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) {
|
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) {
|
||||||
return !state.canPlaceAt(world, pos) ? Blocks.AIR.getDefaultState() : super.getStateForNeighborUpdate(state, direction, newState, world, pos, posFrom);
|
return !state.canPlaceAt(world, pos) ? Blocks.AIR.getDefaultState() : super.getStateForNeighborUpdate(state, direction, newState, world, pos, posFrom);
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
@Override
|
||||||
COLLISION_SHAPE = net.minecraft.block.Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 0.5D, 16.0D);
|
public BlockState getPolymerBlockState(BlockState state) {
|
||||||
|
return Blocks.WATER.getDefaultState().with(FluidBlock.LEVEL, 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) {
|
||||||
|
ElementHolder holder = new ElementHolder();
|
||||||
|
var interactionElement = new InteractionElement(new VirtualElement.InteractionHandler() {
|
||||||
|
@Override
|
||||||
|
public void interact(ServerPlayerEntity player, Hand hand) {
|
||||||
|
world.getBlockState(pos).onUseWithItem(player.getStackInHand(hand), world, player, hand, new BlockHitResult(pos.toCenterPos(), Direction.UP, pos, false));
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void attack(ServerPlayerEntity player) {
|
||||||
|
player.playSoundToPlayer(SoundEvents.ENTITY_PLAYER_SPLASH, SoundCategory.BLOCKS, 0.8f, 1.3f);
|
||||||
|
player.networkHandler.sendPacket(new ParticleS2CPacket(ParticleTypes.SPLASH, false, pos.getX() + 0.5f, pos.getY() + 0.1f, pos.getZ() + 0.5f, 0.5f, 0.1f, 0.5f, 1, 2));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
interactionElement.setSize(1f, 0.06241f);
|
||||||
|
interactionElement.setOffset(new Vec3d(0d, -0.5d, 0d));
|
||||||
|
holder.addElement(interactionElement);
|
||||||
|
return holder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,8 @@ package eu.midnightdust.puddles.config;
|
|||||||
import eu.midnightdust.lib.config.MidnightConfig;
|
import eu.midnightdust.lib.config.MidnightConfig;
|
||||||
|
|
||||||
public class PuddlesConfig extends MidnightConfig {
|
public class PuddlesConfig extends MidnightConfig {
|
||||||
@Entry(max = 10000) // Enable or disable hats for contributors, friends and donors.
|
@Entry(isSlider = true, min = 0, max = 1000)
|
||||||
public static int puddleSpawnRate = 1;
|
public static int puddleSpawnRate = 10;
|
||||||
@Entry(max = 10000)
|
@Entry(isSlider = true, min = 0, max = 1000)
|
||||||
public static int snowStackChance = 1;
|
public static int evaporationChance = 100;
|
||||||
@Entry(max = 10000)
|
}
|
||||||
public static int evaporationChance = 5;
|
|
||||||
}
|
|
||||||
@@ -2,17 +2,17 @@ package eu.midnightdust.puddles.mixin;
|
|||||||
|
|
||||||
import eu.midnightdust.puddles.Puddles;
|
import eu.midnightdust.puddles.Puddles;
|
||||||
import eu.midnightdust.puddles.config.PuddlesConfig;
|
import eu.midnightdust.puddles.config.PuddlesConfig;
|
||||||
import net.minecraft.block.Blocks;
|
|
||||||
import net.minecraft.registry.DynamicRegistryManager;
|
import net.minecraft.registry.DynamicRegistryManager;
|
||||||
import net.minecraft.registry.RegistryKey;
|
import net.minecraft.registry.RegistryKey;
|
||||||
import net.minecraft.registry.entry.RegistryEntry;
|
import net.minecraft.registry.entry.RegistryEntry;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.state.property.Properties;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.ChunkPos;
|
import net.minecraft.util.math.ChunkPos;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
import net.minecraft.util.profiler.Profiler;
|
import net.minecraft.util.profiler.Profiler;
|
||||||
import net.minecraft.world.*;
|
import net.minecraft.world.Heightmap;
|
||||||
|
import net.minecraft.world.MutableWorldProperties;
|
||||||
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.chunk.WorldChunk;
|
import net.minecraft.world.chunk.WorldChunk;
|
||||||
import net.minecraft.world.dimension.DimensionType;
|
import net.minecraft.world.dimension.DimensionType;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -24,8 +24,6 @@ import java.util.function.Supplier;
|
|||||||
|
|
||||||
@Mixin(ServerWorld.class)
|
@Mixin(ServerWorld.class)
|
||||||
public abstract class MixinServerWorld extends World {
|
public abstract class MixinServerWorld extends World {
|
||||||
|
|
||||||
|
|
||||||
protected MixinServerWorld(MutableWorldProperties properties, RegistryKey<World> registryRef, DynamicRegistryManager registryManager, RegistryEntry<DimensionType> dimensionEntry, Supplier<Profiler> profiler, boolean isClient, boolean debugWorld, long biomeAccess, int maxChainedNeighborUpdates) {
|
protected MixinServerWorld(MutableWorldProperties properties, RegistryKey<World> registryRef, DynamicRegistryManager registryManager, RegistryEntry<DimensionType> dimensionEntry, Supplier<Profiler> profiler, boolean isClient, boolean debugWorld, long biomeAccess, int maxChainedNeighborUpdates) {
|
||||||
super(properties, registryRef, registryManager, dimensionEntry, profiler, isClient, debugWorld, biomeAccess, maxChainedNeighborUpdates);
|
super(properties, registryRef, registryManager, dimensionEntry, profiler, isClient, debugWorld, biomeAccess, maxChainedNeighborUpdates);
|
||||||
}
|
}
|
||||||
@@ -41,27 +39,14 @@ public abstract class MixinServerWorld extends World {
|
|||||||
|
|
||||||
if (PuddlesConfig.puddleSpawnRate != 0) {
|
if (PuddlesConfig.puddleSpawnRate != 0) {
|
||||||
profiler.push("puddles");
|
profiler.push("puddles");
|
||||||
if (bl && random.nextInt(10000 / PuddlesConfig.puddleSpawnRate) == 0) {
|
if (bl && random.nextInt(100000 / PuddlesConfig.puddleSpawnRate) == 0) {
|
||||||
pos = this.getTopPosition(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, getRandomPosInChunk(x, 0, z, 15));
|
pos = this.getTopPosition(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, getRandomPosInChunk(x, 0, z, 15));
|
||||||
if (this.hasRain(pos) && getBlockState(pos.down()).isSideSolidFullSquare(this, pos, Direction.UP) && Puddles.Puddle.canPlaceAt(null,this,pos)) {
|
if (this.hasRain(pos) && getBlockState(pos.down()).isSideSolidFullSquare(this, pos, Direction.UP) &&
|
||||||
|
Puddles.Puddle.canPlaceAt(null,this,pos)) {
|
||||||
setBlockState(pos, Puddles.Puddle.getDefaultState());
|
setBlockState(pos, Puddles.Puddle.getDefaultState());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
profiler.pop();
|
profiler.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PuddlesConfig.snowStackChance != 0) {
|
|
||||||
profiler.push("extra_snow");
|
|
||||||
if (bl && random.nextInt(10000 / PuddlesConfig.snowStackChance) == 0) {
|
|
||||||
pos = this.getTopPosition(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, getRandomPosInChunk(x, 0, z, 15));
|
|
||||||
if (this.getBlockState(pos).getBlock() == Blocks.SNOW && getBlockState(pos.down()).isSideSolidFullSquare(this, pos, Direction.UP)) {
|
|
||||||
int layer = getBlockState(pos).get(Properties.LAYERS);
|
|
||||||
if (layer < 5) {
|
|
||||||
setBlockState(pos, Blocks.SNOW.getDefaultState().with(Properties.LAYERS, layer + 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
profiler.pop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"variants": {
|
|
||||||
"": {
|
|
||||||
"model": "puddles:block/puddle"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
5
src/main/resources/assets/puddles/lang/de_de.json
Executable file
5
src/main/resources/assets/puddles/lang/de_de.json
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"puddles.midnightconfig.title": "Puddles Konfiguration",
|
||||||
|
"puddles.midnightconfig.puddleSpawnRate": "Pfützen-Häufigkeit",
|
||||||
|
"puddles.midnightconfig.evaporationChance": "Verdunstungswahrscheinlichkeit"
|
||||||
|
}
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
{
|
{
|
||||||
"block.puddles.puddle":"Puddle",
|
|
||||||
"puddles.midnightconfig.title": "Puddles Config",
|
"puddles.midnightconfig.title": "Puddles Config",
|
||||||
"puddles.midnightconfig.puddleSpawnRate": "Puddle Spawn Rate",
|
"puddles.midnightconfig.puddleSpawnRate": "Puddle Spawn Rate",
|
||||||
"puddles.midnightconfig.snowStackChance": "Snow Stack Chance",
|
|
||||||
"puddles.midnightconfig.evaporationChance": "Evaporation Chance"
|
"puddles.midnightconfig.evaporationChance": "Evaporation Chance"
|
||||||
}
|
}
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"credit": "made by Motschen",
|
|
||||||
"parent": "block/block",
|
|
||||||
"textures": {
|
|
||||||
"particle": "block/water_still"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"credit": "made by Motschen",
|
|
||||||
"parent": "block/block",
|
|
||||||
"textures": {
|
|
||||||
"0": "block/water_still",
|
|
||||||
"particle": "block/water_still"
|
|
||||||
},
|
|
||||||
"elements": [
|
|
||||||
{
|
|
||||||
"from": [0, 0, 0],
|
|
||||||
"to": [16, 1, 16],
|
|
||||||
"faces": {
|
|
||||||
"north": {"uv": [0, 0, 16, 1], "texture": "#0", "tintindex": 0},
|
|
||||||
"east": {"uv": [0, 0, 16, 1], "texture": "#0", "tintindex": 0},
|
|
||||||
"south": {"uv": [0, 0, 16, 1], "texture": "#0", "tintindex": 0},
|
|
||||||
"west": {"uv": [0, 0, 16, 1], "texture": "#0", "tintindex": 0},
|
|
||||||
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "tintindex": 0},
|
|
||||||
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "tintindex": 0}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
3
src/main/resources/data/puddles/lang/de_de.json
Executable file
3
src/main/resources/data/puddles/lang/de_de.json
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"block.puddles.puddle":"Pfütze"
|
||||||
|
}
|
||||||
3
src/main/resources/data/puddles/lang/en_us.json
Executable file
3
src/main/resources/data/puddles/lang/en_us.json
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"block.puddles.puddle":"Puddle"
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
"version": "${version}",
|
"version": "${version}",
|
||||||
|
|
||||||
"name": "Puddles",
|
"name": "Puddles",
|
||||||
"description": "Adds puddles. Compatible with your favorite shaderpacks & mods!",
|
"description": "Adds puddles. Now fully server-sided!",
|
||||||
"authors": [
|
"authors": [
|
||||||
"Motschen",
|
"Motschen",
|
||||||
"TeamMidnightDust",
|
"TeamMidnightDust",
|
||||||
@@ -23,9 +23,6 @@
|
|||||||
"entrypoints": {
|
"entrypoints": {
|
||||||
"main": [
|
"main": [
|
||||||
"eu.midnightdust.puddles.Puddles"
|
"eu.midnightdust.puddles.Puddles"
|
||||||
],
|
|
||||||
"client": [
|
|
||||||
"eu.midnightdust.puddles.PuddlesClient"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"required": true,
|
"required": true,
|
||||||
"package": "eu.midnightdust.puddles.mixin",
|
"package": "eu.midnightdust.puddles.mixin",
|
||||||
"compatibilityLevel": "JAVA_8",
|
"compatibilityLevel": "JAVA_21",
|
||||||
"mixins": [
|
"mixins": [
|
||||||
"MixinServerWorld"
|
"MixinServerWorld"
|
||||||
],
|
],
|
||||||
|
|||||||
Reference in New Issue
Block a user