Mixin Fixes
This commit is contained in:
parent
e104752c6d
commit
e25ab5698d
14 changed files with 45 additions and 69 deletions
|
@ -1,5 +1,6 @@
|
||||||
package ru.betterend.mixin.client;
|
package ru.betterend.mixin.client;
|
||||||
|
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -18,6 +19,7 @@ import ru.bclib.client.gui.BlockSignEditScreen;
|
||||||
@Mixin(ClientPacketListener.class)
|
@Mixin(ClientPacketListener.class)
|
||||||
public class ClientPlayNetworkHandlerMixin
|
public class ClientPlayNetworkHandlerMixin
|
||||||
{
|
{
|
||||||
|
@Final
|
||||||
@Shadow
|
@Shadow
|
||||||
private Minecraft minecraft;
|
private Minecraft minecraft;
|
||||||
|
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
package ru.betterend.mixin.client;
|
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
|
|
||||||
import net.minecraft.client.renderer.block.model.BlockModelDefinition;
|
|
||||||
|
|
||||||
@Mixin(BlockModelDefinition.Context.class)
|
|
||||||
public interface ContextGsonAccessor {
|
|
||||||
@Accessor
|
|
||||||
Gson getGson();
|
|
||||||
}
|
|
|
@ -1,16 +1,14 @@
|
||||||
package ru.betterend.mixin.client;
|
package ru.betterend.mixin.client;
|
||||||
|
|
||||||
|
import net.minecraft.client.model.HumanoidModel;
|
||||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||||
|
import net.minecraft.client.renderer.entity.HumanoidMobRenderer;
|
||||||
|
import net.minecraft.client.renderer.entity.MobRenderer;
|
||||||
|
import net.minecraft.world.entity.Mob;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import net.minecraft.client.model.HumanoidModel;
|
|
||||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
|
||||||
import net.minecraft.client.renderer.entity.HumanoidMobRenderer;
|
|
||||||
import net.minecraft.client.renderer.entity.MobRenderer;
|
|
||||||
import net.minecraft.world.entity.Mob;
|
|
||||||
import ru.betterend.client.render.ArmoredElytraLayer;
|
import ru.betterend.client.render.ArmoredElytraLayer;
|
||||||
|
|
||||||
@Mixin(HumanoidMobRenderer.class)
|
@Mixin(HumanoidMobRenderer.class)
|
||||||
|
|
|
@ -1,16 +1,14 @@
|
||||||
package ru.betterend.mixin.client;
|
package ru.betterend.mixin.client;
|
||||||
|
|
||||||
|
import net.minecraft.client.model.PlayerModel;
|
||||||
|
import net.minecraft.client.player.AbstractClientPlayer;
|
||||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||||
|
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
||||||
|
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import net.minecraft.client.model.PlayerModel;
|
|
||||||
import net.minecraft.client.player.AbstractClientPlayer;
|
|
||||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
|
||||||
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
|
||||||
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
|
||||||
import ru.betterend.client.render.ArmoredElytraLayer;
|
import ru.betterend.client.render.ArmoredElytraLayer;
|
||||||
|
|
||||||
@Mixin(PlayerRenderer.class)
|
@Mixin(PlayerRenderer.class)
|
||||||
|
|
|
@ -65,7 +65,7 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "onTake", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "onTake", at = @At("HEAD"), cancellable = true)
|
||||||
protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfoReturnable<ItemStack> info) {
|
protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfo info) {
|
||||||
if (be_currentRecipe != null) {
|
if (be_currentRecipe != null) {
|
||||||
inputSlots.getItem(0).shrink(be_currentRecipe.getInputCount());
|
inputSlots.getItem(0).shrink(be_currentRecipe.getInputCount());
|
||||||
stack = be_currentRecipe.craft(inputSlots, player);
|
stack = be_currentRecipe.craft(inputSlots, player);
|
||||||
|
@ -85,7 +85,8 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc
|
||||||
world.levelEvent(1030, blockPos, 0);
|
world.levelEvent(1030, blockPos, 0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
info.setReturnValue(stack);
|
//TODO: no more return, does this still work?
|
||||||
|
//info.setReturnValue(stack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ public abstract class ChorusPlantBlockMixin extends Block {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "getStateForPlacement", at = @At("RETURN"), cancellable = true)
|
@Inject(method = "getStateForPlacement(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;", at = @At("RETURN"), cancellable = true)
|
||||||
private void be_getStateForPlacement(BlockPlaceContext ctx, CallbackInfoReturnable<BlockState> info) {
|
private void be_getStateForPlacement(BlockPlaceContext ctx, CallbackInfoReturnable<BlockState> info) {
|
||||||
BlockPos pos = ctx.getClickedPos();
|
BlockPos pos = ctx.getClickedPos();
|
||||||
Level world = ctx.getLevel();
|
Level world = ctx.getLevel();
|
||||||
|
|
|
@ -27,11 +27,7 @@ public class ChunkBiomeContainerMixin implements IBiomeArray {
|
||||||
|
|
||||||
@Final
|
@Final
|
||||||
@Shadow
|
@Shadow
|
||||||
public static int HORIZONTAL_MASK;
|
private static int HORIZONTAL_MASK;
|
||||||
|
|
||||||
@Final
|
|
||||||
@Shadow
|
|
||||||
public static int VERTICAL_MASK;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void be_setBiome(Biome biome, BlockPos pos) {
|
public void be_setBiome(Biome biome, BlockPos pos) {
|
||||||
|
@ -78,9 +74,12 @@ public class ChunkBiomeContainerMixin implements IBiomeArray {
|
||||||
biomes[index] = biome;
|
biomes[index] = biome;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Shadow @Final private int quartMinY;
|
||||||
|
@Shadow @Final private int quartHeight;
|
||||||
|
|
||||||
private int be_getArrayIndex(int biomeX, int biomeY, int biomeZ) {
|
private int be_getArrayIndex(int biomeX, int biomeY, int biomeZ) {
|
||||||
int i = biomeX & HORIZONTAL_MASK;
|
int i = biomeX & HORIZONTAL_MASK;
|
||||||
int j = Mth.clamp(biomeY, 0, VERTICAL_MASK);
|
int j = Mth.clamp(biomeY - this.quartMinY, 0, this.quartHeight);
|
||||||
int k = biomeZ & HORIZONTAL_MASK;
|
int k = biomeZ & HORIZONTAL_MASK;
|
||||||
return j << WIDTH_BITS + WIDTH_BITS | k << WIDTH_BITS | i;
|
return j << WIDTH_BITS + WIDTH_BITS | k << WIDTH_BITS | i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,9 +19,9 @@ import ru.betterend.interfaces.TeleportingEntity;
|
||||||
@Mixin(Entity.class)
|
@Mixin(Entity.class)
|
||||||
public abstract class EntityMixin implements TeleportingEntity {
|
public abstract class EntityMixin implements TeleportingEntity {
|
||||||
@Shadow
|
@Shadow
|
||||||
public float yRot;
|
private float yRot;
|
||||||
@Shadow
|
@Shadow
|
||||||
public float xRot;
|
private float xRot;
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
public Level level;
|
public Level level;
|
||||||
|
|
|
@ -22,7 +22,7 @@ import net.minecraft.world.level.storage.WorldData;
|
||||||
import ru.betterend.world.generator.GeneratorOptions;
|
import ru.betterend.world.generator.GeneratorOptions;
|
||||||
|
|
||||||
@Mixin(MinecraftServer.class)
|
@Mixin(MinecraftServer.class)
|
||||||
public class MinecraftServerMixin {
|
public abstract class MinecraftServerMixin {
|
||||||
@Shadow
|
@Shadow
|
||||||
private ServerResources resources;
|
private ServerResources resources;
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ public class MinecraftServerMixin {
|
||||||
protected WorldData worldData;
|
protected WorldData worldData;
|
||||||
|
|
||||||
@Inject(method = "overworld", at = @At(value = "HEAD"), cancellable = true)
|
@Inject(method = "overworld", at = @At(value = "HEAD"), cancellable = true)
|
||||||
private final void be_overworld(CallbackInfoReturnable<ServerLevel> info) {
|
private void be_overworld(CallbackInfoReturnable<ServerLevel> info) {
|
||||||
if (GeneratorOptions.swapOverworldToEnd()) {
|
if (GeneratorOptions.swapOverworldToEnd()) {
|
||||||
ServerLevel world = levels.get(Level.END);
|
ServerLevel world = levels.get(Level.END);
|
||||||
if (world == null) {
|
if (world == null) {
|
||||||
|
@ -47,7 +47,7 @@ public class MinecraftServerMixin {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "createLevels", at = @At(value = "TAIL"))
|
@Inject(method = "createLevels", at = @At(value = "TAIL"))
|
||||||
private final void be_createLevels(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) {
|
private void be_createLevels(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) {
|
||||||
if (GeneratorOptions.swapOverworldToEnd()) {
|
if (GeneratorOptions.swapOverworldToEnd()) {
|
||||||
ServerLevel world = levels.get(Level.END);
|
ServerLevel world = levels.get(Level.END);
|
||||||
if (world == null) {
|
if (world == null) {
|
||||||
|
@ -57,19 +57,19 @@ public class MinecraftServerMixin {
|
||||||
ServerLevelData serverWorldProperties = worldData.overworldData();
|
ServerLevelData serverWorldProperties = worldData.overworldData();
|
||||||
net.minecraft.world.level.levelgen.WorldGenSettings generatorOptions = worldData.worldGenSettings();
|
net.minecraft.world.level.levelgen.WorldGenSettings generatorOptions = worldData.worldGenSettings();
|
||||||
boolean bl = generatorOptions.isDebug();
|
boolean bl = generatorOptions.isDebug();
|
||||||
setInitialSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl, true);
|
setInitialSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Shadow private static void setInitialSpawn(ServerLevel serverLevel, ServerLevelData serverLevelData, boolean bl, boolean bl2) {};
|
||||||
|
|
||||||
@Inject(method = "setInitialSpawn", at = @At(value = "HEAD"), cancellable = true)
|
@Inject(method = "setInitialSpawn", at = @At(value = "HEAD"), cancellable = true)
|
||||||
private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) {
|
private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, CallbackInfo info) {
|
||||||
if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) {
|
if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) {
|
||||||
info.cancel();
|
info.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Shadow
|
|
||||||
private static void setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl) {}
|
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
public PlayerList getPlayerList() {
|
public PlayerList getPlayerList() {
|
||||||
|
|
|
@ -32,8 +32,8 @@ public abstract class NoiseBasedChunkGeneratorMixin extends ChunkGenerator {
|
||||||
TerrainGenerator.initNoise(seed);
|
TerrainGenerator.initNoise(seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "fillNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2)
|
@Inject(method = "fillNoiseColumn([DIIII)V", at = @At("HEAD"), cancellable = true, allow = 2)
|
||||||
private void be_fillNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) {
|
private void be_fillNoiseColumn(double[] buffer, int x, int z, int k, int l, CallbackInfo info) {
|
||||||
if (GeneratorOptions.useNewGenerator() && settings.get().stable(NoiseGeneratorSettings.END)) {
|
if (GeneratorOptions.useNewGenerator() && settings.get().stable(NoiseGeneratorSettings.END)) {
|
||||||
TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource());
|
TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource());
|
||||||
info.cancel();
|
info.cancel();
|
||||||
|
|
|
@ -163,9 +163,9 @@ public class PlayerListMixin {
|
||||||
this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER,
|
this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER,
|
||||||
new ServerPlayer[] { serverPlayer }));
|
new ServerPlayer[] { serverPlayer }));
|
||||||
|
|
||||||
for (int i = 0; i < this.players.size(); ++i) {
|
for (ServerPlayer player : this.players) {
|
||||||
serverPlayer.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER,
|
serverPlayer.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER,
|
||||||
new ServerPlayer[] { (ServerPlayer) this.players.get(i) }));
|
new ServerPlayer[]{(ServerPlayer) player}));
|
||||||
}
|
}
|
||||||
|
|
||||||
serverLevel3.addNewPlayer(serverPlayer);
|
serverLevel3.addNewPlayer(serverPlayer);
|
||||||
|
@ -176,10 +176,7 @@ public class PlayerListMixin {
|
||||||
this.server.isResourcePackRequired(), this.server.getResourcePackPrompt());
|
this.server.isResourcePackRequired(), this.server.getResourcePackPrompt());
|
||||||
}
|
}
|
||||||
|
|
||||||
Iterator<?> var24 = serverPlayer.getActiveEffects().iterator();
|
for (MobEffectInstance statusEffectInstance : serverPlayer.getActiveEffects()) {
|
||||||
|
|
||||||
while (var24.hasNext()) {
|
|
||||||
MobEffectInstance statusEffectInstance = (MobEffectInstance) var24.next();
|
|
||||||
serverPlayNetworkHandler
|
serverPlayNetworkHandler
|
||||||
.send(new ClientboundUpdateMobEffectPacket(serverPlayer.getId(), statusEffectInstance));
|
.send(new ClientboundUpdateMobEffectPacket(serverPlayer.getId(), statusEffectInstance));
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,7 +132,7 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt
|
||||||
}
|
}
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
abstract ServerLevel getLevel();
|
public abstract ServerLevel getLevel();
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
abstract void triggerDimensionChangeTriggers(ServerLevel origin);
|
abstract void triggerDimensionChangeTriggers(ServerLevel origin);
|
||||||
|
|
|
@ -7,8 +7,6 @@ import org.spongepowered.asm.mixin.Shadow;
|
||||||
import ru.betterend.util.ShuffelingListExtended;
|
import ru.betterend.util.ShuffelingListExtended;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
@Mixin(ShufflingList.class)
|
@Mixin(ShufflingList.class)
|
||||||
public abstract class ShuffelingListMixin<U> implements ShuffelingListExtended<U> {
|
public abstract class ShuffelingListMixin<U> implements ShuffelingListExtended<U> {
|
||||||
|
|
|
@ -1,38 +1,35 @@
|
||||||
package ru.betterend.mixin.common;
|
package ru.betterend.mixin.common;
|
||||||
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
import net.minecraft.core.Vec3i;
|
|
||||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
|
||||||
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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.BlockPos.MutableBlockPos;
|
import net.minecraft.core.BlockPos.MutableBlockPos;
|
||||||
|
import net.minecraft.core.Vec3i;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.util.Mth;
|
import net.minecraft.util.Mth;
|
||||||
import net.minecraft.world.entity.EntityType;
|
import net.minecraft.world.entity.EntityType;
|
||||||
import net.minecraft.world.entity.boss.enderdragon.EndCrystal;
|
import net.minecraft.world.entity.boss.enderdragon.EndCrystal;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
import net.minecraft.world.level.WorldGenLevel;
|
|
||||||
import net.minecraft.world.level.block.Blocks;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.block.IronBarsBlock;
|
import net.minecraft.world.level.block.IronBarsBlock;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
|
||||||
import net.minecraft.world.level.levelgen.Heightmap.Types;
|
import net.minecraft.world.level.levelgen.Heightmap.Types;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||||
import net.minecraft.world.level.levelgen.feature.SpikeFeature;
|
import net.minecraft.world.level.levelgen.feature.SpikeFeature;
|
||||||
import net.minecraft.world.level.levelgen.feature.configurations.SpikeConfiguration;
|
import net.minecraft.world.level.levelgen.feature.configurations.SpikeConfiguration;
|
||||||
import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings;
|
import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings;
|
||||||
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
|
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
|
||||||
|
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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
import ru.bclib.api.WorldDataAPI;
|
import ru.bclib.api.WorldDataAPI;
|
||||||
import ru.bclib.util.BlocksHelper;
|
import ru.bclib.util.BlocksHelper;
|
||||||
import ru.bclib.util.StructureHelper;
|
import ru.bclib.util.StructureHelper;
|
||||||
import ru.betterend.BetterEnd;
|
import ru.betterend.BetterEnd;
|
||||||
import ru.betterend.world.generator.GeneratorOptions;
|
import ru.betterend.world.generator.GeneratorOptions;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
@Mixin(SpikeFeature.class)
|
@Mixin(SpikeFeature.class)
|
||||||
public class SpikeFeatureMixin {
|
public class SpikeFeatureMixin {
|
||||||
@Inject(method = "place", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "place", at = @At("HEAD"), cancellable = true)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue