Skip to content

Commit

Permalink
fixed crash with HBM NTM nukes
Browse files Browse the repository at this point in the history
  • Loading branch information
FalsePattern committed Dec 23, 2024
1 parent 4d221c8 commit e8e7776
Show file tree
Hide file tree
Showing 8 changed files with 365 additions and 2 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ repositories {

dependencies {
////////////////Our dependencies////////////////
implementationSplit("com.falsepattern:falsepatternlib-mc1.7.10:1.5.4")
implementationSplit("com.falsepattern:falsepatternlib-mc1.7.10:1.5.5")
implementation("it.unimi.dsi:fastutil:8.5.13")
implementationSplit("com.falsepattern:chunkapi-mc1.7.10:0.6.0")

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/falsepattern/endlessids/EndlessIDs.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
name = Tags.MODNAME,
acceptedMinecraftVersions = "[1.7.10]",
dependencies = "required-after:chunkapi@[0.6.0,);" +
"required-after:falsepatternlib@[1.5.4,);" +
"required-after:falsepatternlib@[1.5.5,);" +
"after:antiidconflict")
public class EndlessIDs {
public static final byte[] ZERO_LENGTH_BIOME_ARRAY_PLACEHOLDER = new byte[0];
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* EndlessIDs
*
* Copyright (C) 2022-2024 FalsePattern
* All Rights Reserved
*
* The above copyright notice, this permission notice and the words "MEGA"
* shall be included in all copies or substantial portions of the Software.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package com.falsepattern.endlessids.mixin.helpers;

public interface IHBMBiomeSyncPacket {
void eid$setBiome(short biome);
short eid$getBiome();

void eid$setBiomeArray(short[] biomeArray);
short[] eid$getBiomeArray();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* EndlessIDs
*
* Copyright (C) 2022-2024 FalsePattern
* All Rights Reserved
*
* The above copyright notice, this permission notice and the words "MEGA"
* shall be included in all copies or substantial portions of the Software.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package com.falsepattern.endlessids.mixin.helpers.stubpackage.com.hbm.packet;

import com.falsepattern.endlessids.mixin.helpers.IHBMBiomeSyncPacket;

public abstract class BiomeSyncPacket extends com.hbm.packet.BiomeSyncPacket implements IHBMBiomeSyncPacket {
public int chunkX;
public int chunkZ;
public byte blockX;
public byte blockZ;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/*
* EndlessIDs
*
* Copyright (C) 2022-2024 FalsePattern
* All Rights Reserved
*
* The above copyright notice, this permission notice and the words "MEGA"
* shall be included in all copies or substantial portions of the Software.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package com.falsepattern.endlessids.mixin.mixins.common.biome.ntm;

import com.falsepattern.endlessids.EndlessIDs;
import com.falsepattern.endlessids.mixin.helpers.IHBMBiomeSyncPacket;
import com.hbm.packet.BiomeSyncPacket;
import io.netty.buffer.ByteBuf;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import java.util.Arrays;

@Mixin(value = BiomeSyncPacket.class,
remap = false)
public abstract class BiomeSyncPacketMixin implements IHBMBiomeSyncPacket {
@Shadow
int chunkX;
@Shadow
int chunkZ;
@Shadow
byte[] biomeArray;
@Shadow
byte blockX;
@Shadow
byte blockZ;

@Unique
private short eid$biome;
@Unique
private short[] eid$biomeArray;

@Override
public void eid$setBiome(short biome) {
eid$biome = biome;
}

@Override
public short eid$getBiome() {
return eid$biome;
}

@Override
public void eid$setBiomeArray(short[] biomeArray) {
this.biomeArray = EndlessIDs.FAKE_BIOME_ARRAY_PLACEHOLDER;
eid$biomeArray = Arrays.copyOf(biomeArray, biomeArray.length);
}

@Override
public short[] eid$getBiomeArray() {
return eid$biomeArray;
}

@Inject(method = "toBytes",
at = @At("HEAD"),
cancellable = true,
require = 1)
private void toBytes(ByteBuf buf, CallbackInfo ci) {
ci.cancel();
buf.writeInt(chunkX);
buf.writeInt(chunkZ);
if (eid$biomeArray == null) {
buf.writeBoolean(false);
buf.writeShort(eid$biome);
buf.writeByte(blockX);
buf.writeByte(blockZ);
} else {
buf.writeBoolean(true);
for (int i = 0; i < 256; i++) {
buf.writeShort(eid$biomeArray[i]);
}
}
}

@Inject(method = "fromBytes",
at = @At(value = "HEAD"),
cancellable = true,
require = 1)
private void fromBytes(ByteBuf buf, CallbackInfo ci) {
ci.cancel();
chunkX = buf.readInt();
chunkZ = buf.readInt();
if (!buf.readBoolean()) {
eid$biome = buf.readShort();
blockX = buf.readByte();
blockZ = buf.readByte();
} else {
eid$biomeArray = new short[256];
for (int i = 0; i < 256; i++) {
eid$biomeArray[i] = buf.readShort();
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* EndlessIDs
*
* Copyright (C) 2022-2024 FalsePattern
* All Rights Reserved
*
* The above copyright notice, this permission notice and the words "MEGA"
* shall be included in all copies or substantial portions of the Software.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package com.falsepattern.endlessids.mixin.mixins.common.biome.ntm;

import com.falsepattern.endlessids.mixin.helpers.ChunkBiomeHook;
import com.falsepattern.endlessids.mixin.helpers.stubpackage.com.hbm.packet.BiomeSyncPacket;
import lombok.val;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import net.minecraft.client.Minecraft;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;

@Mixin(value = com.hbm.packet.BiomeSyncPacket.Handler.class,
remap = false)
public abstract class BiomeSyncPacket_HandlerMixin implements IMessageHandler<com.hbm.packet.BiomeSyncPacket, IMessage> {
@Inject(method = "onMessage(Lcom/hbm/packet/BiomeSyncPacket;Lcpw/mods/fml/common/network/simpleimpl/MessageContext;)Lcpw/mods/fml/common/network/simpleimpl/IMessage;",
at = @At(value = "HEAD"),
cancellable = true,
require = 1)
private void onMessage(com.hbm.packet.BiomeSyncPacket $m, MessageContext ctx, CallbackInfoReturnable<IMessage> cir) {
val world = Minecraft.getMinecraft().theWorld;
val m = (BiomeSyncPacket) $m;
if (world.getChunkProvider().chunkExists(m.chunkX, m.chunkZ)) {
val chunk = world.getChunkFromChunkCoords(m.chunkX, m.chunkZ);
val chunkHook = (ChunkBiomeHook) chunk;
chunk.isModified = true;
val biomeArray = m.eid$getBiomeArray();
val chunkBiomeArray = chunkHook.getBiomeShortArray();
if (biomeArray == null) {
val bX = m.blockX & 0xf;
val bZ = m.blockZ & 0xf;
chunkBiomeArray[bZ << 4 | bX] = m.eid$getBiome();
val cX = (m.chunkX << 4) + bX;
val cZ = (m.chunkZ << 4) + bZ;
world.markBlockRangeForRenderUpdate(cX, 0, cZ, cX, 255, cZ);
} else {
System.arraycopy(biomeArray, 0, chunkBiomeArray, 0, 256);
val cX = m.chunkX << 4;
val cZ = m.chunkZ << 4;
world.markBlockRangeForRenderUpdate(cX, 0, cZ, cX + 15, 255, cZ + 15);
}
}
cir.setReturnValue(null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/*
* EndlessIDs
*
* Copyright (C) 2022-2024 FalsePattern
* All Rights Reserved
*
* The above copyright notice, this permission notice and the words "MEGA"
* shall be included in all copies or substantial portions of the Software.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package com.falsepattern.endlessids.mixin.mixins.common.biome.ntm;

import com.falsepattern.endlessids.constants.ExtendedConstants;
import com.falsepattern.endlessids.mixin.helpers.ChunkBiomeHook;
import com.falsepattern.endlessids.mixin.helpers.IHBMBiomeSyncPacket;
import com.hbm.packet.BiomeSyncPacket;
import com.hbm.packet.PacketDispatcher;
import com.hbm.world.WorldUtil;
import lombok.val;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.chunk.Chunk;
import cpw.mods.fml.common.network.NetworkRegistry;

@Mixin(value = WorldUtil.class,
remap = false)
public abstract class WorldUtilMixin {
@Inject(method = "setBiome",
at = @At("HEAD"),
cancellable = true,
require = 1)
private static void extendSetBiome(World world, int x, int z, BiomeGenBase biome, CallbackInfo ci) {
ci.cancel();
val chunk = world.getChunkFromBlockCoords(x, z);
((ChunkBiomeHook)chunk).getBiomeShortArray()[(z & 0xf) << 4 | x & 0xf] =
(short) (biome.biomeID & ExtendedConstants.biomeIDMask);
chunk.isModified = true;
}

@Inject(method = "syncBiomeChange(Lnet/minecraft/world/World;II)V",
at = @At("HEAD"),
cancellable = true,
require = 1)
private static void extendSyncBiomeChange(World world, int x, int z, CallbackInfo ci) {
ci.cancel();
Chunk chunk = world.getChunkFromBlockCoords(x, z);
val packet = new BiomeSyncPacket(x >> 4, z >> 4, null);
((IHBMBiomeSyncPacket)packet).eid$setBiomeArray(((ChunkBiomeHook)chunk).getBiomeShortArray());
PacketDispatcher.wrapper.sendToAllAround(packet, new NetworkRegistry.TargetPoint(world.provider.dimensionId,
x, 128.0F, z,
1024.0F));
}

@Inject(method = "syncBiomeChangeBlock",
at = @At("HEAD"),
cancellable = true,
require = 1)
private static void extendSyncBiomeChangeBlock(World world, int x, int z, CallbackInfo ci) {
ci.cancel();
Chunk chunk = world.getChunkFromBlockCoords(x, z);
short biome = ((ChunkBiomeHook)chunk).getBiomeShortArray()[(z & 15) << 4 | x & 15];
val packet = new BiomeSyncPacket(x, z, (byte)0);
((IHBMBiomeSyncPacket)packet).eid$setBiome(biome);
PacketDispatcher.wrapper.sendToAllAround(packet, new NetworkRegistry.TargetPoint(world.provider.dimensionId,
x, 128.0F, z,
1024.0F));
}

@Inject(method = "syncBiomeChange(Lnet/minecraft/world/World;Lnet/minecraft/world/chunk/Chunk;)V",
at = @At("HEAD"),
cancellable = true,
require = 1)
private static void extendSyncBiomeChange(World world, Chunk chunk, CallbackInfo ci) {
ci.cancel();
ChunkCoordIntPair coord = chunk.getChunkCoordIntPair();
val packet = new BiomeSyncPacket(coord.chunkXPos, coord.chunkZPos, null);
((IHBMBiomeSyncPacket)packet).eid$setBiomeArray(((ChunkBiomeHook)chunk).getBiomeShortArray());
PacketDispatcher.wrapper.sendToAllAround(packet, new NetworkRegistry.TargetPoint(world.provider.dimensionId,
coord.getCenterXPos(),
128.0F,
coord.getCenterZPosition(),
1024.0F));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,11 @@ public enum Mixin implements IMixin {
GSChunkProviderSpaceLakesMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.GALAXYSPACE)), "biome.galaxyspace.ChunkProviderSpaceLakesMixin"),
GSChunkProviderVenusSSMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.GALAXYSPACE)), "biome.galaxyspace.ChunkProviderVenusSSMixin"),
//endregion GalaxySpace
//region HBM's Nuclear Tech Nod
NTMBiomeSyncPacket_HandlerMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.HBM_NTM)), "biome.ntm.BiomeSyncPacket_HandlerMixin"),
NTMBiomeSyncPacketMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.HBM_NTM)), "biome.ntm.BiomeSyncPacketMixin"),
NTMWorldUtilMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.HBM_NTM)), "biome.ntm.WorldUtilMixin"),
//endregion HBM's Nuclear Tech Nod
//region Highlands
HighlandsConfigMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.HIGHLANDS)), "biome.highlands.ConfigMixin"),
//endregion Highlands
Expand Down

0 comments on commit e8e7776

Please sign in to comment.