diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml
index 8abd1c47c..242fa5fbd 100644
--- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml
+++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml
@@ -8,6 +8,6 @@
v0.15.0
- 20260109173049
+ 20260116142425
diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.md5 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.md5
index 5449094be..aaa751297 100644
--- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.md5
+++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.md5
@@ -1 +1 @@
-fff27e0d7ae0c68144403d5c1abee224
\ No newline at end of file
+fce3db3665c838dddd2ee7d5d8bae949
\ No newline at end of file
diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha1 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha1
index 483a68e0d..bfd2c978c 100644
--- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha1
+++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha1
@@ -1 +1 @@
-2ff003f7f3970778df4663f653addcbca05b2436
\ No newline at end of file
+dae01136496d17e71cfdce997fb3fde1bfbc487c
\ No newline at end of file
diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha256 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha256
index 2034c852d..fe403299f 100644
--- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha256
+++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha256
@@ -1 +1 @@
-6dee6aa09748cee00cf95e083e350e34c92158f025ef17a678bd901e8f2ba0d3
\ No newline at end of file
+b7736c92fd24fcb1ff254c17edb15a5b12c86be2809de48bb48ed617e206e8a6
\ No newline at end of file
diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha512 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha512
index eb8cef04e..910ff75c7 100644
--- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha512
+++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha512
@@ -1 +1 @@
-975a307243179d593332897ffca2e626c8b53ad638277a16d80c5b23e909c7f176371a1d2d78e4fa0b77e87336d402eb1a5444aa1dbb30a92f8c13b3f92bd306
\ No newline at end of file
+0d33f144f82836fa278fad18d6477d8ad65cda37a9aa26a4bc1ae355a1d9958832f8226383bfc981cc2c60e7a95974ab11a7de39814f5b920f7fa8a3143c6654
\ No newline at end of file
diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar
index 176fb7183..31c500193 100644
Binary files a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar and b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar differ
diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.md5 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.md5
index 5cc46ebab..fe2b2cde4 100644
--- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.md5
+++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.md5
@@ -1 +1 @@
-2279401ea52d170347e8b704e867cda1
\ No newline at end of file
+18805301af5d583f22c957da7549025f
\ No newline at end of file
diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha1 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha1
index 672479559..e385c94dd 100644
--- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha1
+++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha1
@@ -1 +1 @@
-86df9c3267c56a304d407617e43467a53009e093
\ No newline at end of file
+5bb28b3294425a3a695493583fbad0f9da23a1ba
\ No newline at end of file
diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha256 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha256
index ebb9ab419..31954fdad 100644
--- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha256
+++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha256
@@ -1 +1 @@
-0bb8a61e1f51c37211d2631c5f85f1cfe53cdea2fb53703b0988d0cf27967ccd
\ No newline at end of file
+9d84813198a7a80225c82966f9d290c457f97a25bcf9f327e74f02ba9ae4817b
\ No newline at end of file
diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha512 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha512
index d3c167820..c1ad22415 100644
--- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha512
+++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha512
@@ -1 +1 @@
-d344aa159574bd0b06e5d19710adfa7b4bc24cfbf68b4984f0450c53645dbf71df4d0ad05f401695abd6728a94b7411659847e7fd28e90c75244b916ee3bcd91
\ No newline at end of file
+fb009d0f3dc21ba051d94674f2d09984471f0edc3ef654becd4eb0e5c09a59591297d199cadc29433f2d74f2146765c6aab4743f2f4f0a5be2ff0605ace548c5
\ No newline at end of file
diff --git a/src/main/java/net/ltxprogrammer/changed/client/gui/InfuserScreen.java b/src/main/java/net/ltxprogrammer/changed/client/gui/InfuserScreen.java
index 7054a88d1..c5d00999d 100644
--- a/src/main/java/net/ltxprogrammer/changed/client/gui/InfuserScreen.java
+++ b/src/main/java/net/ltxprogrammer/changed/client/gui/InfuserScreen.java
@@ -22,6 +22,7 @@
import net.minecraft.util.Mth;
import net.minecraft.world.entity.player.Inventory;
import net.minecraftforge.network.PacketDistributor;
+import org.jetbrains.annotations.NotNull;
public class InfuserScreen extends AbstractContainerScreen implements RecipeUpdateListener {
public static class Switch extends AbstractButton {
@@ -57,22 +58,21 @@ public Switch(AbstractContainerScreen> container, ResourceLocation name,
}
public void renderWidget(GuiGraphics graphics, int p_93844_, int p_93845_, float p_93846_) {
+ super.renderWidget(graphics, p_93844_, p_93845_, p_93846_);
Minecraft minecraft = Minecraft.getInstance();
- RenderSystem.setShaderTexture(0, sheet);
- RenderSystem.enableDepthTest();
Font font = minecraft.font;
- graphics.setColor(1.0F, 1.0F, 1.0F, this.alpha);
+ graphics.setColor(1.0F, 1.0F, 1.0F, 1.0f);
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
+ RenderSystem.enableDepthTest();
RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
int switchX = this.isHoveredOrFocused() ? this.width : 0;
int switchY = this.disabled ? this.height * 2 : (this.toggle ? this.height : 0);
graphics.blit(sheet, this.getX(), this.getY(), switchX, switchY, this.width, this.height, this.width * 2, this.height * 3);
- super.renderWidget(graphics, p_93844_, p_93845_, p_93846_);
}
@Override
- protected void updateWidgetNarration(NarrationElementOutput p_259858_) {
+ protected void updateWidgetNarration(@NotNull NarrationElementOutput p_259858_) {
this.defaultButtonNarrationText(p_259858_);
}
@@ -98,15 +98,16 @@ protected void init() {
this.widthTooNarrow = this.width < 379;
this.recipeBookComponent.init(this.width, this.height, this.minecraft, this.widthTooNarrow, this.menu);
this.leftPos = this.recipeBookComponent.updateScreenPosition(this.width, this.imageWidth);
- this.addRenderableWidget(new ImageButton(this.leftPos + 16, this.height / 2 - 25, 20, 18, 0, 0, 19, RECIPE_BUTTON_LOCATION, (p_98484_) -> {
+ this.addRenderableWidget(new ImageButton(this.leftPos + 16, this.height / 2 - 30, 20, 18, 0, 0, 19, RECIPE_BUTTON_LOCATION, (p_98484_) -> {
this.recipeBookComponent.toggleVisibility();
this.leftPos = this.recipeBookComponent.updateScreenPosition(this.width, this.imageWidth);
- ((ImageButton)p_98484_).setPosition(this.leftPos + 16, this.height / 2 - 25);
+ p_98484_.setPosition(this.leftPos + 16, this.height / 2 - 30);
maleFemaleSwitch.setPosition(this.leftPos + 135, this.topPos + 61);
}));
this.addWidget(this.recipeBookComponent);
this.setInitialFocus(this.recipeBookComponent);
- this.titleLabelX = 29;
+ this.titleLabelX = 5;
+ this.titleLabelY = 5;
maleFemaleSwitch = new Switch(this, Changed.modResource("male_female_switch"), this.leftPos + 135, this.topPos + 61, 20, 10, Component.empty(), false,
GENDER_SWITCH_LOCATION);
@@ -116,12 +117,9 @@ protected void init() {
private static final ResourceLocation texture = Changed.modResource("textures/gui/infuser.png");
@Override
- public void render(GuiGraphics graphics, int p_98480_, int p_98481_, float p_98482_) {
+ public void render(@NotNull GuiGraphics graphics, int p_98480_, int p_98481_, float p_98482_) {
var variant = Syringe.getVariant(menu.getResultSlot().getItem());
- if (variant != null && !variant.isGendered())
- maleFemaleSwitch.disabled = true;
- else
- maleFemaleSwitch.disabled = false;
+ maleFemaleSwitch.disabled = variant != null && !variant.isGendered();
this.renderBackground(graphics);
if (this.recipeBookComponent.isVisible() && this.widthTooNarrow) {
@@ -170,7 +168,7 @@ public void recipesUpdated() {
}
@Override
- public RecipeBookComponent getRecipeBookComponent() {
+ public @NotNull RecipeBookComponent getRecipeBookComponent() {
return this.recipeBookComponent;
}
}
diff --git a/src/main/java/net/ltxprogrammer/changed/client/gui/PurifierScreen.java b/src/main/java/net/ltxprogrammer/changed/client/gui/PurifierScreen.java
index b8532266d..5cc27a0da 100644
--- a/src/main/java/net/ltxprogrammer/changed/client/gui/PurifierScreen.java
+++ b/src/main/java/net/ltxprogrammer/changed/client/gui/PurifierScreen.java
@@ -11,6 +11,7 @@
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;
+import org.jetbrains.annotations.NotNull;
public class PurifierScreen extends AbstractContainerScreen {
private final PurifierMenu menu;
@@ -25,7 +26,7 @@ public PurifierScreen(PurifierMenu menu, Inventory inventory, Component text) {
private static final ResourceLocation texture = Changed.modResource("textures/gui/purifier.png");
@Override
- public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
+ public void render(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
this.renderBackground(graphics);
super.render(graphics, mouseX, mouseY, partialTicks);
this.renderTooltip(graphics, mouseX, mouseY);
@@ -42,7 +43,7 @@ protected void renderBg(GuiGraphics graphics, float partialTicks, int gx, int gy
graphics.blit(Changed.modResource("textures/gui/progress_bar_back.png"), this.leftPos + 63, this.topPos + 62, 0, 0, 48, 12, 48, 12);
var slot = menu.slots.get(0);
- float progress = (float)menu.data.get(0) / (float) PurifierBlockEntity.getTotalProgress(this.minecraft.level.getRecipeManager(), slot.getItem());
+ float progress = (float)menu.data.get(0) / PurifierBlockEntity.getTotalProgress(this.minecraft.level.getRecipeManager(), slot.getItem());
graphics.blit(Changed.modResource("textures/gui/progress_bar_front.png"), this.leftPos + 63, this.topPos + 62, 0, 0, (int)(48 * progress), 12, 48, 12);
RenderSystem.disableBlend();
diff --git a/src/main/java/net/ltxprogrammer/changed/entity/latex/LatexType.java b/src/main/java/net/ltxprogrammer/changed/entity/latex/LatexType.java
index 69ccb50fc..b394da90c 100644
--- a/src/main/java/net/ltxprogrammer/changed/entity/latex/LatexType.java
+++ b/src/main/java/net/ltxprogrammer/changed/entity/latex/LatexType.java
@@ -1,11 +1,17 @@
package net.ltxprogrammer.changed.entity.latex;
+import net.ltxprogrammer.changed.block.WhiteLatexTransportInterface;
import net.ltxprogrammer.changed.entity.ChangedEntity;
import net.ltxprogrammer.changed.entity.TransfurCause;
+import net.ltxprogrammer.changed.entity.animation.StunAnimationParameters;
+import net.ltxprogrammer.changed.entity.beast.PureWhiteLatexWolf;
+import net.ltxprogrammer.changed.entity.beast.WhiteLatexEntity;
+import net.ltxprogrammer.changed.entity.beast.boss.Behemoth;
import net.ltxprogrammer.changed.entity.variant.TransfurVariant;
-import net.ltxprogrammer.changed.init.ChangedLootContextParamSets;
-import net.ltxprogrammer.changed.init.ChangedRegistry;
+import net.ltxprogrammer.changed.entity.variant.TransfurVariantInstance;
+import net.ltxprogrammer.changed.init.*;
import net.ltxprogrammer.changed.item.AbstractLatexBucket;
+import net.ltxprogrammer.changed.process.ProcessTransfur;
import net.ltxprogrammer.changed.util.EntityUtil;
import net.ltxprogrammer.changed.world.LatexCoverGetter;
import net.ltxprogrammer.changed.world.LatexCoverState;
@@ -19,8 +25,10 @@
import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
+import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.LightningBolt;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
@@ -37,6 +45,7 @@
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraft.world.level.storage.loot.LootTable;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
+import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
@@ -46,6 +55,7 @@
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
import java.util.function.Consumer;
public abstract class LatexType {
@@ -95,6 +105,42 @@ public void onPlace(LatexCoverState state, Level level, BlockPos blockPos, Latex
public void onRemove(LatexCoverState state, Level level, BlockPos blockPos, LatexCoverState oldState, boolean flag) {}
+ public void onStruckByLighting(LatexCoverState strikePositionCoverState, Level level, BlockPos strikePosition, LightningBolt lightningBolt) {
+ if (!level.isClientSide() && level instanceof ServerLevel serverLevel) {
+ Set latexNodes = LatexCoverState.collectConnectedLatex(serverLevel, strikePosition, 16);
+
+ List entities = level.getEntitiesOfClass(
+ LivingEntity.class,
+ new AABB(strikePosition).inflate(24),
+ entity -> entity instanceof PureWhiteLatexWolf || entity instanceof Behemoth
+ || ProcessTransfur.getPlayerTransfurVariantSafe(EntityUtil.playerOrNull(entity)).map(TransfurVariantInstance::getChangedEntity).orElse(null) instanceof WhiteLatexEntity
+ );
+ for (LivingEntity living : entities) {
+ boolean entityInWhiteLatex = WhiteLatexTransportInterface.isEntityInWhiteLatex(living);
+ if (entityInWhiteLatex || latexNodes.stream().map(LatexCoverState.LatexNode::pos).anyMatch((pos -> living.blockPosition().equals(pos)))) {
+ if (living.addEffect(
+ new MobEffectInstance(
+ ChangedEffects.SHOCK.get(),
+ 20 * 4, // 4 seconds
+ 0,
+ true, // can be considered "ambient" in this context
+ true // can bee seen by the player
+ )
+ )) {
+ ChangedAnimationEvents.broadcastEntityAnimation(living, ChangedAnimationEvents.SHOCK_STUN.get(), StunAnimationParameters.INSTANCE);
+ }
+ }
+ }
+
+ // Latex is Weak to Shock, and a LightingBolt is a very powerful shock soo it die when struck by it
+ if (strikePositionCoverState.isAir()) return;
+ LatexCoverState.setAtAndUpdate(level, strikePosition, ChangedLatexTypes.NONE.get().defaultCoverState());
+ for (Direction value : Direction.values()) {
+ LatexCoverState.setAtAndUpdate(level, strikePosition.relative(value), ChangedLatexTypes.NONE.get().defaultCoverState()); // Cross like removal
+ }
+ }
+ }
+
public void animateTick(LatexCoverState state, Level level, BlockPos pos, RandomSource random) {}
public abstract ResourceLocation getLootTable();
@@ -201,11 +247,11 @@ public Object getRenderPropertiesInternal() {
public void initializeClient(Consumer consumer) {}
public void randomTick(LatexCoverState state, ServerLevel level, BlockPos blockPos, RandomSource random) {}
-
+
public void entityInside(LatexCoverState state, Level level, BlockPos blockPos, Entity entity) {}
public void spawnAfterBreak(LatexCoverState state, ServerLevel level, BlockPos blockPos, ItemStack itemStack, boolean dropXp) {}
-
+
public List getDrops(LatexCoverState coverState, LootParams.Builder builder) {
ResourceLocation resourcelocation = this.getLootTable();
if (resourcelocation == BuiltInLootTables.EMPTY) {
@@ -323,4 +369,4 @@ public boolean isAir() {
return true;
}
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/net/ltxprogrammer/changed/entity/variant/TransfurVariantInstance.java b/src/main/java/net/ltxprogrammer/changed/entity/variant/TransfurVariantInstance.java
index 58bebba55..fa30c65fd 100644
--- a/src/main/java/net/ltxprogrammer/changed/entity/variant/TransfurVariantInstance.java
+++ b/src/main/java/net/ltxprogrammer/changed/entity/variant/TransfurVariantInstance.java
@@ -27,6 +27,7 @@
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;
+import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.stats.Stats;
import net.minecraft.tags.FluidTags;
@@ -38,6 +39,7 @@
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
+import net.minecraft.world.level.Level;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.common.ForgeMod;
@@ -539,6 +541,11 @@ protected double clamp(double min, double max, double x) {
}
public static void syncEntityPosRotWithEntity(LivingEntity set, LivingEntity get) {
+ if (get.level() instanceof ServerLevel getServerLevel) {
+ Level setLevel = set.level();
+ if (getServerLevel != setLevel) set.changeDimension(getServerLevel);
+ }
+
set.setDeltaMovement(get.getDeltaMovement());
set.setPos(get.getX(), get.getY(), get.getZ());
set.setXRot(get.getXRot());
diff --git a/src/main/java/net/ltxprogrammer/changed/mixin/entity/LightingBoltMixin.java b/src/main/java/net/ltxprogrammer/changed/mixin/entity/LightingBoltMixin.java
new file mode 100644
index 000000000..ba22f676c
--- /dev/null
+++ b/src/main/java/net/ltxprogrammer/changed/mixin/entity/LightingBoltMixin.java
@@ -0,0 +1,38 @@
+package net.ltxprogrammer.changed.mixin.entity;
+
+import net.ltxprogrammer.changed.init.ChangedLatexTypes;
+import net.ltxprogrammer.changed.world.LatexCoverState;
+import net.minecraft.core.BlockPos;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.LightningBolt;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.LightningRodBlock;
+import net.minecraft.world.level.block.state.BlockState;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(LightningBolt.class)
+public abstract class LightingBoltMixin extends Entity {
+ @Shadow protected abstract BlockPos getStrikePosition();
+
+ public LightingBoltMixin(EntityType> entityType, Level level) {
+ super(entityType, level);
+ }
+
+ @Inject(method = "spawnFire", at = @At("HEAD"), cancellable = true) // This trigger is better
+ private void latexCoverIsStruckByLighting(CallbackInfo ci) {
+ BlockPos strikePosition = this.getStrikePosition();
+ Level level = level();
+ LatexCoverState strikePositionCoverState = LatexCoverState.getAt(level, strikePosition);
+ LightningBolt self = (LightningBolt) (Object) this;
+ if (!strikePositionCoverState.isAir()) {
+ ci.cancel();
+ strikePositionCoverState.onStruckByLighting(level, strikePosition, self);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/ltxprogrammer/changed/world/LatexCoverState.java b/src/main/java/net/ltxprogrammer/changed/world/LatexCoverState.java
index 996d95af7..486820b0c 100644
--- a/src/main/java/net/ltxprogrammer/changed/world/LatexCoverState.java
+++ b/src/main/java/net/ltxprogrammer/changed/world/LatexCoverState.java
@@ -1,10 +1,12 @@
package net.ltxprogrammer.changed.world;
import com.google.common.collect.ImmutableMap;
+import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import net.ltxprogrammer.changed.Changed;
import net.ltxprogrammer.changed.entity.latex.LatexType;
+import net.ltxprogrammer.changed.entity.latex.SpreadingLatexType;
import net.ltxprogrammer.changed.init.ChangedLatexTypes;
import net.ltxprogrammer.changed.init.ChangedRegistry;
import net.ltxprogrammer.changed.util.Cacheable;
@@ -18,6 +20,7 @@
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.LightningBolt;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
@@ -40,7 +43,7 @@
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import javax.annotation.Nullable;
-import java.util.List;
+import java.util.*;
public class LatexCoverState extends StateHolder {
protected static final Direction[] UPDATE_SHAPE_ORDER = new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.DOWN, Direction.UP};
@@ -292,6 +295,10 @@ public void onRemove(Level level, BlockPos blockPos, LatexCoverState oldState, b
this.getType().onRemove(this.asState(), level, blockPos, oldState, flag);
}
+ public void onStruckByLighting(Level level, BlockPos blockPos, LightningBolt lightningBolt) {
+ this.getType().onStruckByLighting(this, level, blockPos, lightningBolt);
+ }
+
public void onLatexCoverStateChange(Level level, BlockPos blockPos, LatexCoverState oldState) {
}
@@ -399,6 +406,52 @@ public Vec3 findClosestSurface(Vec3 position, @Nullable Direction.Axis axis) {
return getType().findClosestSurface(this.asState(), position, axis);
}
+ public static Set collectConnectedLatex(
+ ServerLevel level,
+ BlockPos source,
+ int maxDepth
+ ) {
+ Set visited = new HashSet<>();
+ Set result = new HashSet<>();
+
+ Queue> queue = new ArrayDeque<>();
+ queue.add(Pair.of(source, 0));
+ visited.add(source);
+
+ LatexCoverState sourceState = LatexCoverState.getAt(level, source);
+ if (sourceState.isAir())
+ return result;
+
+ while (!queue.isEmpty()) {
+ var entry = queue.poll();
+ BlockPos pos = entry.getFirst();
+ int depth = entry.getSecond();
+
+ if (depth > maxDepth)
+ continue;
+
+ LatexCoverState state = LatexCoverState.getAt(level, pos);
+ if (state.isAir() || !state.is(sourceState.getType()))
+ continue;
+
+ if (!(state.getType() instanceof SpreadingLatexType))
+ continue;
+
+ result.add(new LatexNode(pos, state));
+
+ for (Direction dir : Direction.values()) {
+ BlockPos next = pos.relative(dir);
+ if (visited.add(next)) {
+ queue.add(Pair.of(next, depth + 1));
+ }
+ }
+ }
+
+ return result;
+ }
+
+ public record LatexNode(BlockPos pos, LatexCoverState state) {};
+
public interface ShapeGetter {
VoxelShape get(LatexCoverState state, LatexCoverGetter p_45741_, BlockPos p_45742_, CollisionContext p_45743_);
}
diff --git a/src/main/resources/changed.mixins.json b/src/main/resources/changed.mixins.json
index 54caf6bf6..8885ae774 100644
--- a/src/main/resources/changed.mixins.json
+++ b/src/main/resources/changed.mixins.json
@@ -24,6 +24,7 @@
"entity.ArrowMixin",
"entity.EntityMixin",
"entity.IronGolemMixin",
+ "entity.LightingBoltMixin",
"entity.LivingEntityMixin",
"entity.MobMixin",
"entity.NearestAttackableTargetGoalMixin",