Skip to content

Commit 76905b7

Browse files
committed
dust drop compat
1 parent 8fb55ee commit 76905b7

18 files changed

+231
-63
lines changed

build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,12 @@ dependencies {
107107
implementation(fg.deobf("maven.modrinth:nethers-delight:${nethersdelight_version}"))
108108
implementation(fg.deobf("maven.modrinth:shield-expansion:${shieldexpansion_version}"))
109109
implementation(fg.deobf("maven.modrinth:create:${create_version}"))
110+
implementation(fg.deobf("maven.modrinth:supplementaries:${supplementaries_version}"))
110111

111112
// For dev testing
112113
runtimeOnly(fg.deobf("maven.modrinth:scannable:${scannable_version}"))
113114
runtimeOnly(fg.deobf("maven.modrinth:architectury-api:${architectury_version}"))
115+
runtimeOnly(fg.deobf("maven.modrinth:moonlight:${moonlight_lib_version}"))
114116

115117
/// Utilities for the development environment
116118
//runtimeOnly fg.deobf("curse.maven:jade-324717:${jade_version}")

gradle.properties

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Project
2-
version=3.0.2
2+
version=3.2.0
33
group=galena
44
mod_name=Oreganized
55
mod_author=Xaidee as part of Team Galena
@@ -31,4 +31,5 @@ shieldexpansion_version=8mpKmudC
3131
create_version=ZZW2y7nG
3232
supplementaries_version=eMF95dNK
3333
scannable_version=2FlwUOgm
34-
architectury_version=tBWqtdBO
34+
architectury_version=tBWqtdBO
35+
moonlight_lib_version=sfzdPwZX

src/generated/resources/assets/oreganized/lang/en_us.json

+1-4
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,7 @@
138138
"item.oreganized.electrum_shield": "Electrum Shield",
139139
"item.oreganized.electrum_shovel": "Electrum Shovel",
140140
"item.oreganized.electrum_sword": "Electrum Sword",
141-
<<<<<<< Updated upstream
142-
=======
143141
"item.oreganized.flint_and_pewter": "Flint and Pewter",
144-
>>>>>>> Stashed changes
145142
"item.oreganized.lead_bolt": "Lead Bolt",
146143
"item.oreganized.lead_ingot": "Lead Ingot",
147144
"item.oreganized.lead_nugget": "Lead Nugget",
@@ -168,4 +165,4 @@
168165
"trim_material.oreganized.lead": "Lead material",
169166
"trim_material.oreganized.silver": "Silver material",
170167
"upgrade.oreganized.electrum_upgrade": "Electrum Upgrade"
171-
}
168+
}

src/main/java/galena/oreganized/Oreganized.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.teamabnormals.blueprint.core.util.DataUtil;
77
import com.teamabnormals.blueprint.core.util.registry.RegistryHelper;
88
import galena.oreganized.compat.create.CreateCompat;
9+
import galena.oreganized.content.block.LeadOreBlock;
910
import galena.oreganized.content.block.MoltenLeadCauldronBlock;
1011
import galena.oreganized.content.entity.LeadBoltEntity;
1112
import galena.oreganized.data.OAdvancements;
@@ -49,6 +50,7 @@
4950
import net.minecraft.resources.ResourceLocation;
5051
import net.minecraft.server.packs.PackType;
5152
import net.minecraft.server.packs.metadata.pack.PackMetadataSection;
53+
import net.minecraft.tags.FluidTags;
5254
import net.minecraft.world.entity.npc.VillagerProfession;
5355
import net.minecraft.world.entity.projectile.AbstractArrow;
5456
import net.minecraft.world.entity.projectile.Projectile;
@@ -68,7 +70,6 @@
6870
import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement;
6971
import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool;
7072
import net.minecraftforge.common.BasicItemListing;
71-
import net.minecraftforge.common.ForgeMod;
7273
import net.minecraftforge.common.MinecraftForge;
7374
import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider;
7475
import net.minecraftforge.common.data.ExistingFileHelper;
@@ -172,10 +173,19 @@ private void injectVillagerTrades(VillagerTradesEvent event) {
172173

173174
private void setup(FMLCommonSetupEvent event) {
174175
FluidInteractionRegistry.addInteraction(OFluids.MOLTEN_LEAD_TYPE.get(), new FluidInteractionRegistry.InteractionInformation(
175-
ForgeMod.WATER_TYPE.get(),
176+
(level, pos, relativePos, fluidState) -> level.getFluidState(relativePos).is(FluidTags.WATER) && fluidState.isSource(),
176177
fluidState -> OBlocks.LEAD_BLOCK.get().defaultBlockState()
177178
));
178179

180+
FluidInteractionRegistry.addInteraction(OFluids.MOLTEN_LEAD_TYPE.get(), new FluidInteractionRegistry.InteractionInformation(
181+
(level, blockPos, relativePos, fluidState) -> level.getFluidState(relativePos).is(FluidTags.LAVA) && fluidState.isSource(),
182+
(level, pos, relativePos, fluidState) -> {
183+
LeadOreBlock.spawnCloud(level, pos, 2F);
184+
level.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState());
185+
level.levelEvent(1501, pos, 0);
186+
}
187+
));
188+
179189
event.enqueueWork(() -> {
180190

181191
Map<Item, CauldronInteraction> EMPTY = CauldronInteraction.EMPTY;
@@ -380,6 +390,7 @@ public void buildCreativeModeTabContents(BuildCreativeModeTabContentsEvent event
380390
putAfter(entries, Items.TNT_MINECART, OItems.SHRAPNEL_BOMB_MINECART);
381391
putBefore(entries, Items.MUSIC_DISC_5, OItems.MUSIC_DISC_STRUCTURE);
382392
putAfter(entries, Items.SHEARS, OItems.SCRIBE);
393+
putAfter(entries, Items.FLINT_AND_STEEL, OItems.FLINT_AND_PEWTER);
383394
}
384395
if (tab == CreativeModeTabs.COMBAT) {
385396
putBefore(entries, Items.NETHERITE_SWORD, OItems.ELECTRUM_SWORD);

src/main/java/galena/oreganized/OreganizedConfig.java

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public static class Common {
1919
public final ConfigValue<Boolean> leadDustCloud;
2020
public final ConfigValue<Boolean> pillagerSpawnWithBolts;
2121
public final ConfigValue<Boolean> scribeSilkTouchStone;
22+
public final ConfigValue<Integer> moltenLeadDelay;
2223

2324
private Common(ForgeConfigSpec.Builder builder) {
2425
builder.comment("Common");
@@ -28,6 +29,7 @@ private Common(ForgeConfigSpec.Builder builder) {
2829
leadDustCloud = builder.comment("Should lead ore spawn dust clouds when broken without adjacent water?").define("leadDustCloud", true);
2930
pillagerSpawnWithBolts = builder.comment("Pillagers have a chance to spawn with a lead bolt in their offhand").define("pillagerSpawnWithBolts", true);
3031
scribeSilkTouchStone = builder.comment("The scribe is able to silk-touch pickaxe-related blocks").define("scribeSilkTouchStone", true);
32+
moltenLeadDelay = builder.comment("Time in ticks molten lead waits until flowing downwards").defineInRange("moltenLeadDelay", 20 * 10, 0, 20 * 100);
3133

3234
builder.pop();
3335
}

src/main/java/galena/oreganized/content/block/LeadOreBlock.java

+18-15
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import net.minecraft.world.effect.MobEffectInstance;
1414
import net.minecraft.world.effect.MobEffects;
1515
import net.minecraft.world.entity.AreaEffectCloud;
16+
import net.minecraft.world.entity.LivingEntity;
1617
import net.minecraft.world.entity.player.Player;
1718
import net.minecraft.world.item.ItemStack;
1819
import net.minecraft.world.item.enchantment.EnchantmentHelper;
@@ -21,38 +22,40 @@
2122
import net.minecraft.world.level.block.DropExperienceBlock;
2223
import net.minecraft.world.level.block.state.BlockState;
2324
import net.minecraft.world.level.material.FluidState;
25+
import net.minecraft.world.phys.AABB;
2426
import net.minecraft.world.phys.Vec3;
2527

28+
import java.util.stream.Stream;
29+
2630
public class LeadOreBlock extends DropExperienceBlock {
2731

2832
public LeadOreBlock(Properties properties) {
2933
super(properties);
3034
}
3135

36+
private static Stream<MobEffectInstance> getEffects(int durationMultiplier) {
37+
if (OreganizedConfig.COMMON.poisonInsteadOfStunning.get()) {
38+
return Stream.of(new MobEffectInstance(MobEffects.POISON, 150 * durationMultiplier));
39+
}
40+
41+
return Stream.of(
42+
new MobEffectInstance(OEffects.STUNNING.get(), 600 * durationMultiplier),
43+
new MobEffectInstance(MobEffects.POISON, 40)
44+
);
45+
}
46+
3247
@Override
3348
public void spawnAfterBreak(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean dropXp) {
3449
super.spawnAfterBreak(state, level, pos, stack, dropXp);
3550

3651
if (shouldSpawnCloud(state, level, pos, stack)) {
37-
var vec = Vec3.atCenterOf(pos);
38-
var cloud = new AreaEffectCloud(level, vec.x, vec.y, vec.z);
39-
40-
if (OreganizedConfig.COMMON.poisonInsteadOfStunning.get()) {
41-
cloud.addEffect(new MobEffectInstance(MobEffects.POISON, 20 * 15));
42-
} else {
43-
cloud.addEffect(new MobEffectInstance(OEffects.STUNNING.get(), 20 * 60));
44-
cloud.addEffect(new MobEffectInstance(MobEffects.POISON, 20 * 2));
45-
}
46-
47-
cloud.setParticle(OParticleTypes.LEAD_CLOUD.get());
48-
cloud.setDuration(60);
49-
50-
level.addFreshEntity(cloud);
52+
spawnCloud(level, pos, 2F);
5153
}
5254
}
5355

5456
@Override
55-
public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, FluidState fluid) {
57+
public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player,
58+
boolean willHarvest, FluidState fluid) {
5659
var stack = player.getItemInHand(player.getUsedItemHand());
5760
if (shouldSpawnCloud(state, level, pos, stack) && player instanceof ServerPlayer serverPlayer) {
5861
OCriteriaTriggers.IN_LEAD_CLOUD.trigger(serverPlayer);

src/main/java/galena/oreganized/content/block/MoltenLeadBlock.java

+80-29
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
11
package galena.oreganized.content.block;
22

3+
import galena.oreganized.OreganizedConfig;
34
import galena.oreganized.index.OBlocks;
5+
import galena.oreganized.index.OItems;
46
import galena.oreganized.index.OTags;
57
import net.minecraft.MethodsReturnNonnullByDefault;
68
import net.minecraft.core.BlockPos;
79
import net.minecraft.core.Direction;
8-
import net.minecraft.core.particles.ParticleTypes;
10+
import net.minecraft.server.level.ServerLevel;
911
import net.minecraft.sounds.SoundEvent;
1012
import net.minecraft.sounds.SoundEvents;
1113
import net.minecraft.sounds.SoundSource;
1214
import net.minecraft.tags.FluidTags;
15+
import net.minecraft.util.RandomSource;
1316
import net.minecraft.world.entity.Entity;
1417
import net.minecraft.world.entity.EquipmentSlot;
1518
import net.minecraft.world.entity.LivingEntity;
1619
import net.minecraft.world.entity.Mob;
1720
import net.minecraft.world.level.BlockGetter;
1821
import net.minecraft.world.level.Level;
22+
import net.minecraft.world.level.LevelAccessor;
1923
import net.minecraft.world.level.block.Block;
2024
import net.minecraft.world.level.block.LiquidBlock;
2125
import net.minecraft.world.level.block.state.BlockState;
2226
import net.minecraft.world.level.block.state.StateDefinition;
2327
import net.minecraft.world.level.block.state.properties.BooleanProperty;
2428
import net.minecraft.world.level.material.FlowingFluid;
29+
import net.minecraft.world.level.material.Fluid;
2530
import net.minecraft.world.level.pathfinder.BlockPathTypes;
2631
import net.minecraft.world.level.pathfinder.PathComputationType;
2732
import net.minecraft.world.phys.Vec3;
@@ -39,19 +44,13 @@
3944
@MethodsReturnNonnullByDefault
4045
public class MoltenLeadBlock extends LiquidBlock {
4146

42-
public static final BooleanProperty MOVING = BooleanProperty.create("moving");
43-
4447
public static final VoxelShape STABLE_SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 8.0D, 16.0D);
4548

49+
public static final BooleanProperty WAITING = BooleanProperty.create("waiting");
50+
4651
public MoltenLeadBlock(Supplier<? extends FlowingFluid> fluid, Properties properties) {
4752
super(fluid, properties.noCollission().strength(-1.0F, 3600000.0F).noLootTable().lightLevel((state) -> 8));
48-
this.registerDefaultState(this.stateDefinition.any().setValue(MOVING, false));
49-
}
50-
51-
@Override
52-
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
53-
super.createBlockStateDefinition(builder);
54-
builder.add(MOVING);
53+
registerDefaultState(defaultBlockState().setValue(WAITING, true));
5554
}
5655

5756
@Nullable
@@ -61,23 +60,29 @@ public BlockPathTypes getBlockPathType(BlockState state, BlockGetter world, Bloc
6160
}
6261

6362
@Override
64-
public void onPlace(BlockState pState, Level pLevel, BlockPos pPos, BlockState pOldState, boolean pIsMoving) {
65-
if (pIsMoving) {
66-
if (!pOldState.getFluidState().is(FluidTags.WATER)) {
67-
pLevel.setBlock(pPos, pState.setValue(MOVING, true), 3);
68-
} else {
69-
pLevel.levelEvent(1501, pPos, 0);
70-
pLevel.setBlock(pPos, OBlocks.LEAD_BLOCK.get().defaultBlockState(), 3);
71-
}
72-
} else {
73-
if (!pOldState.getFluidState().is(FluidTags.WATER)) {
74-
pLevel.setBlock(pPos, pState.setValue(MOVING, false), 3);
75-
} else {
76-
pLevel.levelEvent(1501, pPos, 0);
77-
pLevel.setBlock(pPos, OBlocks.LEAD_BLOCK.get().defaultBlockState(), 3);
63+
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
64+
super.createBlockStateDefinition(builder);
65+
builder.add(WAITING);
66+
}
67+
68+
@Override
69+
public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) {
70+
if (state.getFluidState().isSource()) {
71+
var oldFluid = oldState.getFluidState();
72+
if (oldFluid.is(FluidTags.WATER)) {
73+
level.levelEvent(1501, pos, 0);
74+
level.setBlock(pos, OBlocks.LEAD_BLOCK.get().defaultBlockState(), 3);
75+
} else if (oldFluid.is(FluidTags.LAVA)) {
76+
LeadOreBlock.spawnCloud(level, pos, 2F);
77+
level.setBlockAndUpdate(pos, oldState);
7878
}
7979
}
80-
super.onPlace(pState, pLevel, pPos, pOldState, pIsMoving);
80+
81+
if (state.getValue(WAITING)) {
82+
level.scheduleTick(pos, state.getBlock(), OreganizedConfig.COMMON.moltenLeadDelay.get());
83+
}
84+
85+
super.onPlace(state, level, pos, oldState, isMoving);
8186
}
8287

8388
@Override
@@ -88,13 +93,28 @@ public VoxelShape getCollisionShape(BlockState blockState, BlockGetter world, Bl
8893
return super.getCollisionShape(blockState, world, blockPos, ctx);
8994
}
9095

96+
@Override
97+
public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
98+
if (context.isHoldingItem(OItems.MOLTEN_LEAD_BUCKET.get()))
99+
return level.getBlockState(pos.above()).is(this) ? Shapes.block() : STABLE_SHAPE;
100+
101+
return Shapes.empty();
102+
}
103+
104+
@Override
105+
public boolean canBeReplaced(BlockState state, Fluid fluid) {
106+
if (getFluid() == fluid) return false;
107+
return super.canBeReplaced(state, fluid);
108+
}
109+
91110
@Override
92111
public void onRemove(BlockState state, Level level, BlockPos pos, BlockState replacedWith, boolean dropXp) {
93112
super.onRemove(state, level, pos, replacedWith, dropXp);
94113

95114
if (replacedWith.isAir() || !replacedWith.getFluidState().isEmpty()) return;
115+
if (replacedWith.is(OBlocks.LEAD_BLOCK.get())) return;
96116

97-
tryEscape(state, level, pos);
117+
if (state.getFluidState().isSource()) tryEscape(state, level, pos);
98118
}
99119

100120
private boolean tryEscape(BlockState state, Level level, BlockPos pos, Direction direction) {
@@ -121,7 +141,7 @@ private boolean tryEscape(BlockState state, Level level, BlockPos pos) {
121141
}
122142
}
123143

124-
return false;
144+
return tryEscape(state, level, pos, Direction.UP);
125145
}
126146

127147
@Override
@@ -138,9 +158,9 @@ public void entityInside(BlockState state, Level world, BlockPos pos, Entity ent
138158

139159
@Override
140160
public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
141-
if (!((double) fallDistance < 4.0D) && entity instanceof LivingEntity living) {
161+
if (fallDistance >= 4.0D && entity instanceof LivingEntity living) {
142162
LivingEntity.Fallsounds fallSound = living.getFallSounds();
143-
SoundEvent sound = (double) fallDistance < 7.0D ? fallSound.small() : fallSound.big();
163+
SoundEvent sound = fallDistance < 7.0D ? fallSound.small() : fallSound.big();
144164
entity.playSound(sound, 1.0F, 1.0F);
145165
}
146166
}
@@ -153,6 +173,37 @@ public static boolean isEntityLighterThanLead(Entity entity) {
153173
}
154174
}
155175

176+
public static boolean shouldWait(LevelAccessor level, BlockPos pos) {
177+
var belowPos = pos.below();
178+
var belowState = level.getBlockState(belowPos);
179+
return belowState.isFaceSturdy(level, belowPos, Direction.UP);
180+
}
181+
182+
@Override
183+
public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos neighborPos, boolean moving) {
184+
super.neighborChanged(state, level, pos, block, neighborPos, moving);
185+
186+
var waiting = state.getValue(WAITING);
187+
var shouldWait = shouldWait(level, pos);
188+
189+
if (waiting == shouldWait) return;
190+
191+
if (shouldWait) {
192+
level.setBlockAndUpdate(pos, state.setValue(WAITING, true));
193+
} else {
194+
level.scheduleTick(pos, state.getBlock(), OreganizedConfig.COMMON.moltenLeadDelay.get());
195+
}
196+
}
197+
198+
@Override
199+
public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
200+
super.tick(state, level, pos, random);
201+
202+
if (!shouldWait(level, pos)) {
203+
level.setBlockAndUpdate(pos, state.setValue(WAITING, false));
204+
}
205+
}
206+
156207
@Override
157208
public Optional<SoundEvent> getPickupSound() {
158209
return Optional.of(SoundEvents.BUCKET_FILL_LAVA);

0 commit comments

Comments
 (0)