update to 24w33a

This commit is contained in:
gnembon committed 2024-08-18 19:10:40 +02:00
1 parent 9940feb7d3
commit d11586fdaf
58 files changed
+379 -875

No files matched your search

+3 -3
View File
@@ -3,10 +3,10 @@ org.gradle.jvmargs=-Xmx1G
# Fabric Properties # Fabric Properties
# check https://fabricmc.net/develop/ # check https://fabricmc.net/develop/
minecraft_version=1.21.1 minecraft_version=24w33a
loader_version=0.15.11 loader_version=0.15.11
jsr305_version=3.0.2 jsr305_version=3.0.2
fabric_version=0.99.2+1.21 fabric_version=0.102.0+1.21
# Mod Properties # Mod Properties
mod_version = 1.4.147 mod_version = 1.4.147
@@ -17,7 +17,7 @@ org.gradle.jvmargs=-Xmx1G
# The Curseforge versions "names" or ids for the main branch (comma separated: 1.16.4,1.16.5) # The Curseforge versions "names" or ids for the main branch (comma separated: 1.16.4,1.16.5)
# This is needed because CF uses too vague names for prereleases and release candidates # This is needed because CF uses too vague names for prereleases and release candidates
# Can also be the version ID directly coming from https://minecraft.curseforge.com/api/game/versions?token=[API_TOKEN] # Can also be the version ID directly coming from https://minecraft.curseforge.com/api/game/versions?token=[API_TOKEN]
release-curse-versions = Minecraft 1.21.1:1.21.1 release-curse-versions = Minecraft 1.21.2:1.21.2-Snapshot
# Whether or not to build another branch on release # Whether or not to build another branch on release
release-extra-branch = false release-extra-branch = false
# The name of the second branch to release # The name of the second branch to release
@@ -14,6 +14,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.Mob;
@@ -54,7 +55,7 @@ public class PerimeterInfoCommand
if (mobId != null) if (mobId != null)
{ {
nbttagcompound.putString("id", mobId); nbttagcompound.putString("id", mobId);
Entity baseEntity = EntityType.loadEntityRecursive(nbttagcompound, source.getLevel(), (entity_1x) -> { Entity baseEntity = EntityType.loadEntityRecursive(nbttagcompound, source.getLevel(), EntitySpawnReason.COMMAND, (entity_1x) -> {
entity_1x.moveTo(new BlockPos(pos.getX(), source.getLevel().getMinBuildHeight()-10, pos.getZ()), entity_1x.getYRot(), entity_1x. getXRot()); entity_1x.moveTo(new BlockPos(pos.getX(), source.getLevel().getMinBuildHeight()-10, pos.getZ()), entity_1x.getYRot(), entity_1x. getXRot());
return !source.getLevel().addWithUUID(entity_1x) ? null : entity_1x; return !source.getLevel().addWithUUID(entity_1x) ? null : entity_1x;
}); });
@@ -0,0 +1,10 @@
package carpet.fakes;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
public interface DefaultRedstoneWireEvaluatorInferface
{
int calculateTargetStrengthCM(final Level level, final BlockPos pos);
}
@@ -10,5 +10,5 @@ public interface IngredientInterface
* Gets all the stacks of the ingredients for a given item recipe. Also used for {@link carpet.helpers.HopperCounter#guessColor} * Gets all the stacks of the ingredients for a given item recipe. Also used for {@link carpet.helpers.HopperCounter#guessColor}
* to guess the colour of an item to display it prettily * to guess the colour of an item to display it prettily
*/ */
List<Collection<ItemStack>> getRecipeStacks(); //List<Collection<ItemStack>> getRecipeStacks();
} }
@@ -100,7 +100,7 @@ public class BlockRotator
} }
} }
// Send block update to the block that just have been rotated. // Send block update to the block that just have been rotated.
world.neighborChanged(blockpos, block, source.pos()); world.neighborChanged(blockpos, block, null);
return stack; return stack;
} }
@@ -11,7 +11,7 @@ import carpet.script.utils.Tracer;
import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.commands.arguments.EntityAnchorArgument;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket; import net.minecraft.network.protocol.game.ClientboundSetHeldSlotPacket;
import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
@@ -282,7 +282,7 @@ public class EntityPlayerActionPack
public void setSlot(int slot) public void setSlot(int slot)
{ {
player.getInventory().selected = slot-1; player.getInventory().selected = slot-1;
player.connection.send(new ClientboundSetCarriedItemPacket(slot-1)); player.connection.send(new ClientboundSetHeldSlotPacket(slot-1));
} }
public enum ActionType public enum ActionType
@@ -317,9 +317,9 @@ public class EntityPlayerActionPack
if (pos.getY() < player.level().getMaxBuildHeight() - (side == Direction.UP ? 1 : 0) && world.mayInteract(player, pos)) if (pos.getY() < player.level().getMaxBuildHeight() - (side == Direction.UP ? 1 : 0) && world.mayInteract(player, pos))
{ {
InteractionResult result = player.gameMode.useItemOn(player, world, player.getItemInHand(hand), hand, blockHit); InteractionResult result = player.gameMode.useItemOn(player, world, player.getItemInHand(hand), hand, blockHit);
if (result.consumesAction()) if (result instanceof InteractionResult.Success success)
{ {
if (result.shouldSwing()) player.swing(hand); if (success.swingSource() == InteractionResult.SwingSource.SERVER) player.swing(hand);
ap.itemUseCooldown = 3; ap.itemUseCooldown = 3;
return true; return true;
} }
@@ -1,7 +1,6 @@
package carpet.helpers; package carpet.helpers;
import carpet.CarpetServer; import carpet.CarpetServer;
import carpet.fakes.IngredientInterface;
import carpet.fakes.RecipeManagerInterface; import carpet.fakes.RecipeManagerInterface;
import carpet.utils.Messenger; import carpet.utils.Messenger;
import it.unimi.dsi.fastutil.objects.Object2LongLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2LongLinkedOpenHashMap;
@@ -22,7 +21,7 @@ import net.minecraft.world.item.DyeItem;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.PlacementInfo;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.block.AbstractBannerBlock; import net.minecraft.world.level.block.AbstractBannerBlock;
@@ -32,12 +31,12 @@ import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.material.MapColor; import net.minecraft.world.level.material.MapColor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static java.util.Map.entry; import static java.util.Map.entry;
@@ -376,16 +375,13 @@ public class HopperCounter
{ {
for (Recipe<?> r: ((RecipeManagerInterface) CarpetServer.minecraft_server.getRecipeManager()).getAllMatching(type, id, registryAccess)) for (Recipe<?> r: ((RecipeManagerInterface) CarpetServer.minecraft_server.getRecipeManager()).getAllMatching(type, id, registryAccess))
{ {
for (Ingredient ingredient: r.getIngredients()) for (Optional<PlacementInfo.SlotInfo> ingredient: r.placementInfo().slotInfo())
{ {
for (Collection<ItemStack> stacks : ((IngredientInterface) (Object) ingredient).getRecipeStacks()) for(ItemStack stack : ingredient.get().possibleItems())
{ {
for (ItemStack iStak : stacks) TextColor cand = fromItem(stack.getItem(), registryAccess);
{ if (cand != null)
TextColor cand = fromItem(iStak.getItem(), registryAccess); return cand;
if (cand != null)
return cand;
}
} }
} }
} }
@@ -1,80 +1,39 @@
package carpet.helpers; package carpet.helpers;
//Author: masa //Author: masa
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import net.minecraft.Util;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.item.PrimedTnt;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import carpet.logging.logHelpers.ExplosionLogHelper; import carpet.logging.logHelpers.ExplosionLogHelper;
import carpet.mixins.ExplosionAccessor; import carpet.mixins.ExplosionAccessor;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.utils.Messenger;
import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import static carpet.script.CarpetEventServer.Event.EXPLOSION_OUTCOME;
public class OptimizedExplosion public class OptimizedExplosion
{ {
private static List<Entity> entitylist;
private static Vec3 vec3dmem;
private static long tickmem;
// For disabling the explosion particles and sound
public static int explosionSound = 0;
// masa's optimizations // masa's optimizations
private static Object2DoubleOpenHashMap<Pair<Vec3, AABB>> densityCache = new Object2DoubleOpenHashMap<>(); private static Object2DoubleOpenHashMap<Pair<Vec3, AABB>> densityCache = new Object2DoubleOpenHashMap<>();
private static MutablePair<Vec3, AABB> pairMutable = new MutablePair<>();
private static Object2ObjectOpenHashMap<BlockPos, BlockState> stateCache = new Object2ObjectOpenHashMap<>(); private static Object2ObjectOpenHashMap<BlockPos, BlockState> stateCache = new Object2ObjectOpenHashMap<>();
private static Object2ObjectOpenHashMap<BlockPos, FluidState> fluidCache = new Object2ObjectOpenHashMap<>(); private static Object2ObjectOpenHashMap<BlockPos, FluidState> fluidCache = new Object2ObjectOpenHashMap<>();
private static BlockPos.MutableBlockPos posMutable = new BlockPos.MutableBlockPos(0, 0, 0); private static BlockPos.MutableBlockPos posMutable = new BlockPos.MutableBlockPos(0, 0, 0);
private static ObjectOpenHashSet<BlockPos> affectedBlockPositionsSet = new ObjectOpenHashSet<>(); private static ObjectOpenHashSet<BlockPos> affectedBlockPositionsSet = new ObjectOpenHashSet<>();
private static boolean firstRay; private static boolean firstRay;
private static boolean rayCalcDone; private static boolean rayCalcDone;
private static ArrayList<Float> chances = new ArrayList<>();
private static BlockPos blastChanceLocation;
// Creating entity list for scarpet event public static List<BlockPos> doExplosionA(Explosion e, ExplosionLogHelper eLogger) {
private static List<Entity> entityList = new ArrayList<>();
public static void doExplosionA(Explosion e, ExplosionLogHelper eLogger) {
ExplosionAccessor eAccess = (ExplosionAccessor) e; ExplosionAccessor eAccess = (ExplosionAccessor) e;
entityList.clear(); List<BlockPos> toBlow;
boolean eventNeeded = EXPLOSION_OUTCOME.isNeeded() && !eAccess.getLevel().isClientSide();
blastCalc(e);
if (!CarpetSettings.explosionNoBlockDamage && eAccess.getDamageSource() != null) { if (!CarpetSettings.explosionNoBlockDamage && eAccess.getDamageSource() != null) {
rayCalcDone = false; rayCalcDone = false;
@@ -88,291 +47,14 @@ public class OptimizedExplosion
stateCache.clear(); stateCache.clear();
fluidCache.clear(); fluidCache.clear();
e.getToBlow().addAll(affectedBlockPositionsSet); toBlow = new ArrayList<>(affectedBlockPositionsSet);
affectedBlockPositionsSet.clear(); affectedBlockPositionsSet.clear();
} else {
toBlow = Collections.emptyList();
} }
float f3 = eAccess.getRadius() * 2.0F;
int k1 = Mth.floor(eAccess.getX() - (double) f3 - 1.0D);
int l1 = Mth.floor(eAccess.getX() + (double) f3 + 1.0D);
int i2 = Mth.floor(eAccess.getY() - (double) f3 - 1.0D);
int i1 = Mth.floor(eAccess.getY() + (double) f3 + 1.0D);
int j2 = Mth.floor(eAccess.getZ() - (double) f3 - 1.0D);
int j1 = Mth.floor(eAccess.getZ() + (double) f3 + 1.0D);
Vec3 vec3d = new Vec3(eAccess.getX(), eAccess.getY(), eAccess.getZ());
if (vec3dmem == null || !vec3dmem.equals(vec3d) || tickmem != eAccess.getLevel().getGameTime()) {
vec3dmem = vec3d;
tickmem = eAccess.getLevel().getGameTime();
entitylist = eAccess.getLevel().getEntities(null, new AABB(k1, i2, j2, l1, i1, j1));
explosionSound = 0;
}
explosionSound++;
Entity explodingEntity = eAccess.getSource();
for (int k2 = 0; k2 < entitylist.size(); ++k2) {
Entity entity = entitylist.get(k2);
if (entity == explodingEntity) {
// entitylist.remove(k2);
removeFast(entitylist, k2);
k2--;
continue;
}
if (entity instanceof PrimedTnt && explodingEntity != null &&
entity.getX() == explodingEntity.getX() &&
entity.getY() == explodingEntity.getY() &&
entity.getZ() == explodingEntity.getZ()) {
if (eLogger != null) {
eLogger.onEntityImpacted(entity, new Vec3(0,-0.9923437498509884d, 0));
}
continue;
}
if (!entity.ignoreExplosion(e)) {
double d12 = Math.sqrt(entity.distanceToSqr(eAccess.getX(), eAccess.getY(), eAccess.getZ())) / (double) f3;
if (d12 <= 1.0D) {
double d5 = entity.getX() - eAccess.getX();
// Change in 1.16 snapshots to fix a bug with TNT jumping
double d7 = (entity instanceof PrimedTnt ? entity.getY() : entity.getEyeY()) - eAccess.getY();
double d9 = entity.getZ() - eAccess.getZ();
double d13 = (double) Math.sqrt(d5 * d5 + d7 * d7 + d9 * d9);
if (d13 != 0.0D) {
d5 = d5 / d13;
d7 = d7 / d13;
d9 = d9 / d13;
double density;
pairMutable.setLeft(vec3d);
pairMutable.setRight(entity.getBoundingBox());
density = densityCache.getOrDefault(pairMutable, Double.MAX_VALUE);
if (density == Double.MAX_VALUE)
{
Pair<Vec3, AABB> pair = Pair.of(vec3d, entity.getBoundingBox());
density = Explosion.getSeenPercent(vec3d, entity);
densityCache.put(pair, density);
}
// If it is needed, it saves the entity
if (eventNeeded) {
entityList.add(entity);
}
double d10 = (1.0D - d12) * density;
if (eAccess.getDamageSource() != null)
{
entity.hurt(eAccess.getDamageSource(),
(float) ((int) ((d10 * d10 + d10) / 2.0D * 7.0D * (double) f3 + 1.0D)));
}
double d11 = d10;
if (entity instanceof LivingEntity lev) {
d11 = d10 * Mth.clamp(1.0 - lev.getAttributeValue(Attributes.EXPLOSION_KNOCKBACK_RESISTANCE), 0.0, 1.0);
}
if (eLogger != null) {
eLogger.onEntityImpacted(entity, new Vec3(d5 * d11, d7 * d11, d9 * d11));
}
entity.setDeltaMovement(entity.getDeltaMovement().add(d5 * d11, d7 * d11, d9 * d11));
if (entity instanceof Player player) {
if (!player.isSpectator()
&& (!player.isCreative() || !player.getAbilities().flying)) { //getAbilities
e.getHitPlayers().put(player, new Vec3(d5 * d10, d7 * d10, d9 * d10));
}
}
}
}
}
}
densityCache.clear(); densityCache.clear();
}
public static void doExplosionB(Explosion e, boolean spawnParticles) return toBlow;
{
ExplosionAccessor eAccess = (ExplosionAccessor) e;
Level world = eAccess.getLevel();
double posX = eAccess.getX();
double posY = eAccess.getY();
double posZ = eAccess.getZ();
// If it is needed, calls scarpet event
if (EXPLOSION_OUTCOME.isNeeded() && !world.isClientSide()) {
EXPLOSION_OUTCOME.onExplosion((ServerLevel) world, eAccess.getSource(), e::getIndirectSourceEntity, eAccess.getX(), eAccess.getY(), eAccess.getZ(), eAccess.getRadius(), eAccess.isFire(), e.getToBlow(), entityList, eAccess.getBlockInteraction());
}
boolean damagesTerrain = eAccess.getBlockInteraction() != Explosion.BlockInteraction.KEEP;
// explosionSound incremented till disabling the explosion particles and sound
if (explosionSound < 100 || explosionSound % 100 == 0)
{
world.playSound(null, posX, posY, posZ, SoundEvents.GENERIC_EXPLODE.value(), SoundSource.BLOCKS, 4.0F,
(1.0F + (world.random.nextFloat() - world.random.nextFloat()) * 0.2F) * 0.7F);
if (spawnParticles)
{
if (eAccess.getRadius() >= 2.0F && damagesTerrain)
{
world.addParticle(ParticleTypes.EXPLOSION_EMITTER, posX, posY, posZ, 1.0D, 0.0D, 0.0D);
}
else
{
world.addParticle(ParticleTypes.EXPLOSION, posX, posY, posZ, 1.0D, 0.0D, 0.0D);
}
}
}
if (damagesTerrain)
{
ObjectArrayList<Pair<ItemStack, BlockPos>> objectArrayList = new ObjectArrayList<>();
Util.shuffle((ObjectArrayList<BlockPos>) e.getToBlow(), world.random);
boolean dropFromExplosions = CarpetSettings.xpFromExplosions || e.getIndirectSourceEntity() instanceof Player;
for (BlockPos blockpos : e.getToBlow())
{
BlockState state = world.getBlockState(blockpos);
Block block = state.getBlock();
if (!state.isAir())
{
if (block.dropFromExplosion(e) && world instanceof ServerLevel serverLevel)
{
BlockEntity blockEntity = state.hasBlockEntity() ? world.getBlockEntity(blockpos) : null; //hasBlockEntity()
LootParams.Builder lootBuilder = (new LootParams.Builder((ServerLevel)eAccess.getLevel()))
.withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(blockpos))
.withParameter(LootContextParams.TOOL, ItemStack.EMPTY)
.withOptionalParameter(LootContextParams.BLOCK_ENTITY, blockEntity)
.withOptionalParameter(LootContextParams.THIS_ENTITY, eAccess.getSource());
if (eAccess.getBlockInteraction() == Explosion.BlockInteraction.DESTROY_WITH_DECAY)
lootBuilder.withParameter(LootContextParams.EXPLOSION_RADIUS, eAccess.getRadius());
state.spawnAfterBreak(serverLevel, blockpos, ItemStack.EMPTY, dropFromExplosions);
state.getDrops(lootBuilder).forEach((itemStackx) -> {
method_24023(objectArrayList, itemStackx, blockpos.immutable());
});
}
world.setBlock(blockpos, Blocks.AIR.defaultBlockState(), 3);
block.wasExploded(world, blockpos, e);
}
}
objectArrayList.forEach(p -> Block.popResource(world, p.getRight(), p.getLeft()));
}
if (eAccess.isFire())
{
for (BlockPos blockpos1 : e.getToBlow())
{
// Use the same Chunk reference because the positions are in the same xz-column
ChunkAccess chunk = world.getChunk(blockpos1.getX() >> 4, blockpos1.getZ() >> 4);
BlockPos down = blockpos1.below(1);
if (eAccess.getRandom().nextInt(3) == 0 &&
chunk.getBlockState(blockpos1).isAir() &&
chunk.getBlockState(down).isSolidRender(world, down)
)
{
world.setBlockAndUpdate(blockpos1, Blocks.FIRE.defaultBlockState());
}
}
}
}
// copied from Explosion, need to move the code to the explosion code anyways and use shadows for
// simplicity, its not jarmodding anyways
private static void method_24023(ObjectArrayList<Pair<ItemStack, BlockPos>> objectArrayList, ItemStack itemStack, BlockPos blockPos) {
int i = objectArrayList.size();
for(int j = 0; j < i; ++j) {
Pair<ItemStack, BlockPos> pair = objectArrayList.get(j);
ItemStack itemStack2 = pair.getLeft();
if (ItemEntity.areMergable(itemStack2, itemStack)) {
ItemStack itemStack3 = ItemEntity.merge(itemStack2, itemStack, 16);
objectArrayList.set(j, Pair.of(itemStack3, pair.getRight()));
if (itemStack.isEmpty()) {
return;
}
}
}
objectArrayList.add(Pair.of(itemStack, blockPos));
}
private static void removeFast(List<Entity> lst, int index) {
if (index < lst.size() - 1)
lst.set(index, lst.get(lst.size() - 1));
lst.remove(lst.size() - 1);
}
private static void rayCalcs(Explosion e) {
ExplosionAccessor eAccess = (ExplosionAccessor) e;
boolean first = true;
for (int j = 0; j < 16; ++j) {
for (int k = 0; k < 16; ++k) {
for (int l = 0; l < 16; ++l) {
if (j == 0 || j == 15 || k == 0 || k == 15 || l == 0 || l == 15) {
double d0 = (double) ((float) j / 15.0F * 2.0F - 1.0F);
double d1 = (double) ((float) k / 15.0F * 2.0F - 1.0F);
double d2 = (double) ((float) l / 15.0F * 2.0F - 1.0F);
double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
d0 = d0 / d3;
d1 = d1 / d3;
d2 = d2 / d3;
float rand = eAccess.getLevel().random.nextFloat();
if (CarpetSettings.tntRandomRange >= 0) {
rand = (float) CarpetSettings.tntRandomRange;
}
float f = eAccess.getRadius() * (0.7F + rand * 0.6F);
double d4 = eAccess.getX();
double d6 = eAccess.getY();
double d8 = eAccess.getZ();
for (float f1 = 0.3F; f > 0.0F; f -= 0.22500001F) {
BlockPos blockpos = BlockPos.containing(d4, d6, d8);
BlockState state = eAccess.getLevel().getBlockState(blockpos);
FluidState fluidState = eAccess.getLevel().getFluidState(blockpos);
if (!state.isAir()) {
float f2 = Math.max(state.getBlock().getExplosionResistance(), fluidState.getExplosionResistance());
if (eAccess.getSource() != null)
f2 = eAccess.getSource().getBlockExplosionResistance(e, eAccess.getLevel(), blockpos, state, fluidState, f2);
f -= (f2 + 0.3F) * 0.3F;
}
if (f > 0.0F && (eAccess.getSource() == null ||
eAccess.getSource().shouldBlockExplode(e, eAccess.getLevel(), blockpos, state, f)))
{
affectedBlockPositionsSet.add(blockpos);
}
else if (first) {
return;
}
first = false;
d4 += d0 * 0.30000001192092896D;
d6 += d1 * 0.30000001192092896D;
d8 += d2 * 0.30000001192092896D;
}
}
}
}
}
} }
private static void getAffectedPositionsOnPlaneX(Explosion e, int x, int yStart, int yEnd, int zStart, int zEnd) private static void getAffectedPositionsOnPlaneX(Explosion e, int x, int yStart, int yEnd, int zStart, int zEnd)
@@ -454,9 +136,10 @@ public class OptimizedExplosion
float rand = eAccess.getLevel().random.nextFloat(); float rand = eAccess.getLevel().random.nextFloat();
float sizeRand = (CarpetSettings.tntRandomRange >= 0 ? (float) CarpetSettings.tntRandomRange : rand); float sizeRand = (CarpetSettings.tntRandomRange >= 0 ? (float) CarpetSettings.tntRandomRange : rand);
float size = eAccess.getRadius() * (0.7F + sizeRand * 0.6F); float size = eAccess.getRadius() * (0.7F + sizeRand * 0.6F);
double posX = eAccess.getX(); Vec3 vec3 = eAccess.getCenter();
double posY = eAccess.getY(); double posX = vec3.x;
double posZ = eAccess.getZ(); double posY = vec3.y;
double posZ = vec3.z;
for (float f1 = 0.3F; size > 0.0F; size -= 0.22500001F) for (float f1 = 0.3F; size > 0.0F; size -= 0.22500001F)
{ {
@@ -508,112 +191,4 @@ public class OptimizedExplosion
return false; return false;
} }
public static void setBlastChanceLocation(BlockPos p){
blastChanceLocation = p;
}
private static void blastCalc(Explosion e){
ExplosionAccessor eAccess = (ExplosionAccessor) e;
if(blastChanceLocation == null || blastChanceLocation.distToLowCornerSqr(eAccess.getX(), eAccess.getY(), eAccess.getZ()) > 200) return;
chances.clear();
for (int j = 0; j < 16; ++j) {
for (int k = 0; k < 16; ++k) {
for (int l = 0; l < 16; ++l) {
if (j == 0 || j == 15 || k == 0 || k == 15 || l == 0 || l == 15) {
double d0 = (double) ((float) j / 15.0F * 2.0F - 1.0F);
double d1 = (double) ((float) k / 15.0F * 2.0F - 1.0F);
double d2 = (double) ((float) l / 15.0F * 2.0F - 1.0F);
double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
d0 = d0 / d3;
d1 = d1 / d3;
d2 = d2 / d3;
float f = eAccess.getRadius() * (0.7F + 0.6F);
double d4 = eAccess.getX();
double d6 = eAccess.getY();
double d8 = eAccess.getZ();
boolean found = false;
for (float f1 = 0.3F; f > 0.0F; f -= 0.22500001F) {
BlockPos blockpos = BlockPos.containing(d4, d6, d8);
BlockState state = eAccess.getLevel().getBlockState(blockpos);
FluidState fluidState = eAccess.getLevel().getFluidState(blockpos);
if (!state.isAir()) {
float f2 = Math.max(state.getBlock().getExplosionResistance(), fluidState.getExplosionResistance());
if (eAccess.getSource() != null)
f2 = eAccess.getSource().getBlockExplosionResistance(e, eAccess.getLevel(), blockpos, state, fluidState, f2);
f -= (f2 + 0.3F) * 0.3F;
}
if (f > 0.0F && (eAccess.getSource() == null ||
eAccess.getSource().shouldBlockExplode(e, eAccess.getLevel(), blockpos, state, f))) {
if(!found && blockpos.equals(blastChanceLocation)){
chances.add(f);
found = true;
}
}
d4 += d0 * 0.30000001192092896D;
d6 += d1 * 0.30000001192092896D;
d8 += d2 * 0.30000001192092896D;
}
}
}
}
}
//showTNTblastChance(e);
}
private static void showTNTblastChance(Explosion e){
ExplosionAccessor eAccess = (ExplosionAccessor) e;
double randMax = 0.6F * eAccess.getRadius();
double total = 0;
boolean fullyBlownUp = false;
boolean first = true;
int rays = 0;
for(float f3 : chances){
rays++;
double calc = f3 - randMax;
if(calc > 0) fullyBlownUp = true;
double chancePerRay = (Math.abs(calc) / randMax);
if(!fullyBlownUp){
if(first){
first = false;
total = chancePerRay;
}else {
total = total * chancePerRay;
}
}
}
if(fullyBlownUp) total = 0;
double chance = 1 - total;
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setRoundingMode (RoundingMode.DOWN);
nf.setMaximumFractionDigits(2);
for(Player player : eAccess.getLevel().players()){
Messenger.m(player,"w Pop: ",
"c " + nf.format(chance) + " ",
"^w Chance for the block to be destroyed by the blast: " + chance,
"?" + chance,
"w Remain: ",
String.format("c %.2f ", total),
"^w Chance the block survives the blast: " + total,
"?" + total,
"w Rays: ",
String.format("c %d ", rays),
"^w TNT blast rays going through the block",
"?" + rays,
"w Size: ",
String.format("c %.1f ", eAccess.getRadius()),
"^w TNT blast size",
"?" + eAccess.getRadius(),
"w @: ",
String.format("c [%.1f %.1f %.1f] ", eAccess.getX(), eAccess.getY(), eAccess.getZ()),
"^w TNT blast location X:" + eAccess.getX() + " Y:" + eAccess.getY() + " Z:" + eAccess.getZ(),
"?" + eAccess.getX() + " " + eAccess.getY() + " " + eAccess.getZ()
);
}
}
} }
@@ -676,7 +676,7 @@ public class RedstoneWireTurbo
// call BlockStateBase#neighborChanged directly. This change mostly // call BlockStateBase#neighborChanged directly. This change mostly
// restores old behavior, at the cost of bypassing the // restores old behavior, at the cost of bypassing the
// max-chained-neighbor-updates server property. // max-chained-neighbor-updates server property.
worldIn.getBlockState(upd.self).handleNeighborChanged(worldIn, upd.self, wire, upd.parent, false); worldIn.getBlockState(upd.self).handleNeighborChanged(worldIn, upd.self, wire, null, false);
} }
} }
@@ -4,7 +4,7 @@ import carpet.CarpetSettings;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.cauldron.CauldronInteraction; import net.minecraft.core.cauldron.CauldronInteraction;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
@@ -21,14 +21,14 @@ public class AbstractCauldronBlock_stackableSBoxesMixin
{ {
@Redirect(method = "useItemOn", at = @At( @Redirect(method = "useItemOn", at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/core/cauldron/CauldronInteraction;interact(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/ItemInteractionResult;" target = "Lnet/minecraft/core/cauldron/CauldronInteraction;interact(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/InteractionResult;"
)) ))
private ItemInteractionResult wrapInteractor(final CauldronInteraction cauldronBehavior, final BlockState blockState, final Level world, final BlockPos blockPos, final Player playerEntity, final InteractionHand hand, final ItemStack itemStack) private InteractionResult wrapInteractor(final CauldronInteraction cauldronBehavior, final BlockState blockState, final Level world, final BlockPos blockPos, final Player playerEntity, final InteractionHand hand, final ItemStack itemStack)
{ {
int count = -1; int count = -1;
if (CarpetSettings.shulkerBoxStackSize > 1 && itemStack.getItem() instanceof BlockItem && ((BlockItem)itemStack.getItem()).getBlock() instanceof ShulkerBoxBlock) if (CarpetSettings.shulkerBoxStackSize > 1 && itemStack.getItem() instanceof BlockItem && ((BlockItem)itemStack.getItem()).getBlock() instanceof ShulkerBoxBlock)
count = itemStack.getCount(); count = itemStack.getCount();
ItemInteractionResult result = cauldronBehavior.interact(blockState, world, blockPos, playerEntity, hand, itemStack); InteractionResult result = cauldronBehavior.interact(blockState, world, blockPos, playerEntity, hand, itemStack);
if (count > 0 && result.consumesAction()) if (count > 0 && result.consumesAction())
{ {
ItemStack current = playerEntity.getItemInHand(hand); ItemStack current = playerEntity.getItemInHand(hand);
@@ -0,0 +1,22 @@
package carpet.mixins;
import carpet.fakes.AbstractContainerMenuInterface;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.AbstractCraftingMenu;
import net.minecraft.world.inventory.RecipeBookMenu;
import net.minecraft.world.item.crafting.RecipeHolder;
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;
@Mixin(AbstractCraftingMenu.class)
public class AbstractCraftingMenu_scarpetMixin
{
@Inject(method = "handlePlacement",at = @At("HEAD"), cancellable = true)
private void selectRecipeCallback(boolean craftAll, boolean b, RecipeHolder<?> recipe, Inventory player, CallbackInfoReturnable<RecipeBookMenu.PostPlaceAction> cir) {
if(((AbstractContainerMenuInterface) this).callSelectRecipeListener((ServerPlayer) player.player ,recipe,craftAll))
cir.setReturnValue(RecipeBookMenu.PostPlaceAction.NOTHING);
}
}
@@ -2,18 +2,21 @@ package carpet.mixins;
import carpet.fakes.AbstractContainerMenuInterface; import carpet.fakes.AbstractContainerMenuInterface;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.AbstractFurnaceMenu;
import net.minecraft.world.inventory.RecipeBookMenu; import net.minecraft.world.inventory.RecipeBookMenu;
import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeHolder;
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.CallbackInfoReturnable;
@Mixin(RecipeBookMenu.class) @Mixin(AbstractFurnaceMenu.class)
public class RecipeBookMenu_scarpetMixin { public class AbstractFurnaceMenu_scarpetMixin
{
@Inject(method = "handlePlacement",at = @At("HEAD"), cancellable = true) @Inject(method = "handlePlacement",at = @At("HEAD"), cancellable = true)
private void selectRecipeCallback(boolean craftAll, RecipeHolder<?> recipe, ServerPlayer player, CallbackInfo ci) { private void selectRecipeCallback(boolean craftAll, boolean b, RecipeHolder<?> recipe, Inventory player, CallbackInfoReturnable<RecipeBookMenu.PostPlaceAction> cir) {
if(((AbstractContainerMenuInterface) this).callSelectRecipeListener(player,recipe,craftAll)) if(((AbstractContainerMenuInterface) this).callSelectRecipeListener((ServerPlayer) player.player ,recipe,craftAll))
ci.cancel(); cir.setReturnValue(RecipeBookMenu.PostPlaceAction.NOTHING);
} }
} }
@@ -4,6 +4,7 @@ import carpet.CarpetSettings;
import carpet.fakes.LevelInterface; import carpet.fakes.LevelInterface;
import net.minecraft.world.level.redstone.NeighborUpdater; import net.minecraft.world.level.redstone.NeighborUpdater;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.level.redstone.Orientation;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@@ -29,10 +30,10 @@ public class BarrierBlock_updateSuppressionBlockMixin extends Block {
} }
@Override @Override
public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean notify) { public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, Orientation fromPos, boolean notify) {
if (CarpetSettings.updateSuppressionBlock != -1) { if (CarpetSettings.updateSuppressionBlock != -1) {
if (fromPos.equals(pos.above())) { if (true/*fromPos.equals(pos.above())*/) { // todo neighbour updates don't have source
BlockState stateAbove = level.getBlockState(fromPos); BlockState stateAbove = level.getBlockState(pos.above());
if (stateAbove.is(Blocks.ACTIVATOR_RAIL) && !stateAbove.getValue(PoweredRailBlock.POWERED)) { if (stateAbove.is(Blocks.ACTIVATOR_RAIL) && !stateAbove.getValue(PoweredRailBlock.POWERED)) {
level.scheduleTick(pos, this, 1); level.scheduleTick(pos, this, 1);
NeighborUpdater updater = ((LevelInterface)level).getNeighborUpdater(); NeighborUpdater updater = ((LevelInterface)level).getNeighborUpdater();
@@ -0,0 +1,49 @@
package carpet.mixins;
import carpet.CarpetSettings;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientCommonPacketListenerImpl;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.client.multiplayer.CommonListenerCookie;
import net.minecraft.network.Connection;
import net.minecraft.network.protocol.game.ClientboundExplodePacket;
import net.minecraft.world.phys.Vec3;
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;
@Mixin(ClientPacketListener.class)
public abstract class ClientPacketListener_explosionMixin extends ClientCommonPacketListenerImpl
{
private static Vec3 vec3dmem;
private static long tickmem;
// For disabling the explosion particles and sounds if explosions are stacking up
protected ClientPacketListener_explosionMixin(final Minecraft minecraft, final Connection connection, final CommonListenerCookie commonListenerCookie)
{
super(minecraft, connection, commonListenerCookie);
}
@Inject(method = "handleExplosion", at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/multiplayer/ClientLevel;playLocalSound(DDDLnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FFZ)V"
), cancellable = true)
private void onHandleExplosion(final ClientboundExplodePacket clientboundExplodePacket, final CallbackInfo ci)
{
if (CarpetSettings.optimizedTNT)
{
Vec3 vec3d = clientboundExplodePacket.center();
long tick = minecraft.level.getGameTime();
if (vec3dmem == null || !vec3dmem.equals(vec3d) || tickmem != tick) {
vec3dmem = vec3d;
tickmem = tick;
} else {
ci.cancel();
}
}
}
}
@@ -0,0 +1,20 @@
package carpet.mixins;
import carpet.fakes.DefaultRedstoneWireEvaluatorInferface;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.redstone.DefaultRedstoneWireEvaluator;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@Mixin(DefaultRedstoneWireEvaluator.class)
public abstract class DefaultRedstoneWireEvaluator_redstoneMixin implements DefaultRedstoneWireEvaluatorInferface
{
@Shadow protected abstract int calculateTargetStrength(final Level level, final BlockPos blockPos);
@Override
public int calculateTargetStrengthCM(final Level level, final BlockPos pos)
{
return calculateTargetStrength(level, pos);
}
}
@@ -1,5 +1,6 @@
package carpet.mixins; package carpet.mixins;
import net.minecraft.world.level.redstone.Orientation;
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.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
@@ -23,7 +24,7 @@ public class DispenserBlock_qcMixin {
target = "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z" target = "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z"
) )
) )
private boolean carpet_hasQuasiSignal(Level _level, BlockPos above, BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { private boolean carpet_hasQuasiSignal(Level _level, BlockPos above, BlockState state, Level level, BlockPos pos, Block neighborBlock, Orientation neighborPos, boolean movedByPiston) {
return QuasiConnectivity.hasQuasiSignal(level, pos); return QuasiConnectivity.hasQuasiSignal(level, pos);
} }
} }
@@ -1,37 +1,22 @@
package carpet.mixins; package carpet.mixins;
import net.minecraft.util.RandomSource; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.level.ServerExplosion;
import net.minecraft.world.phys.Vec3;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.Level;
@Mixin(Explosion.class) @Mixin(ServerExplosion.class)
public interface ExplosionAccessor { public interface ExplosionAccessor {
@Accessor @Accessor
boolean isFire(); ServerLevel getLevel();
@Accessor @Accessor
Explosion.BlockInteraction getBlockInteraction(); Vec3 getCenter();
@Accessor
Level getLevel();
@Accessor
RandomSource getRandom();
@Accessor
double getX();
@Accessor
double getY();
@Accessor
double getZ();
@Accessor @Accessor
float getRadius(); float getRadius();
@@ -4,11 +4,12 @@ import carpet.helpers.OptimizedExplosion;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.logging.LoggerRegistry; import carpet.logging.LoggerRegistry;
import carpet.logging.logHelpers.ExplosionLogHelper; import carpet.logging.logHelpers.ExplosionLogHelper;
import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.server.level.ServerLevel;
import net.minecraft.core.Holder;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.monster.breeze.Breeze; import net.minecraft.world.entity.monster.breeze.Breeze;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.ServerExplosion;
import net.minecraft.world.level.material.FluidState;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -23,75 +24,68 @@ import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.ExplosionDamageCalculator; import net.minecraft.world.level.ExplosionDamageCalculator;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(value = Explosion.class) import java.util.List;
import java.util.Optional;
@Mixin(value = ServerExplosion.class)
public abstract class Explosion_optimizedTntMixin public abstract class Explosion_optimizedTntMixin
{ {
@Shadow @Shadow @Final private ServerLevel level;
@Final
private ObjectArrayList<BlockPos> toBlow;
@Shadow @Final private Level level;
@Shadow @Nullable public abstract LivingEntity getIndirectSourceEntity(); @Shadow @Nullable public abstract LivingEntity getIndirectSourceEntity();
private ExplosionLogHelper eLogger; private ExplosionLogHelper eLogger;
@Inject(method = "explode", at = @At("HEAD"), @Inject(method = "calculateExplodedPositions", at = @At("HEAD"),
cancellable = true) cancellable = true)
private void onExplosionA(CallbackInfo ci) private void calculateExplodedPositionsCM(final CallbackInfoReturnable<List<BlockPos>> cir)
{ {
if (CarpetSettings.optimizedTNT && !level.isClientSide && !(getIndirectSourceEntity() instanceof Breeze)) if (CarpetSettings.optimizedTNT && !level.isClientSide && !(getIndirectSourceEntity() instanceof Breeze))
{ {
OptimizedExplosion.doExplosionA((Explosion) (Object) this, eLogger); cir.setReturnValue(OptimizedExplosion.doExplosionA((Explosion) (Object) this, eLogger));
ci.cancel();
} }
} }
@Inject(method = "finalizeExplosion", at = @At("HEAD"), @Inject(method = "interactWithBlocks", at = @At("HEAD"))
cancellable = true) private void interactWithBlocksCM(final List<BlockPos> list, final CallbackInfo ci)
private void onExplosionB(boolean spawnParticles, CallbackInfo ci)
{ {
if (eLogger != null) if (eLogger != null)
{ {
eLogger.setAffectBlocks( ! toBlow.isEmpty()); eLogger.setAffectBlocks( ! list.isEmpty());
eLogger.onExplosionDone(this.level.getGameTime()); eLogger.onExplosionDone(this.level.getGameTime());
} }
if (CarpetSettings.explosionNoBlockDamage) if (CarpetSettings.explosionNoBlockDamage)
{ {
toBlow.clear(); list.clear();
} }
if (CarpetSettings.optimizedTNT && !level.isClientSide && !(getIndirectSourceEntity() instanceof Breeze))
{
OptimizedExplosion.doExplosionB((Explosion) (Object) this, spawnParticles);
ci.cancel();
}
}
//optional due to Overwrite in Lithium
//should kill most checks if no block damage is requested
@Redirect(method = "explode", require = 0, at = @At(value = "INVOKE",
target ="Lnet/minecraft/world/level/Level;getBlockState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;"))
private BlockState noBlockCalcsWithNoBLockDamage(Level world, BlockPos pos)
{
if (CarpetSettings.explosionNoBlockDamage) return Blocks.BEDROCK.defaultBlockState();
return world.getBlockState(pos);
} }
@Inject(method = "<init>(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Lnet/minecraft/world/level/ExplosionDamageCalculator;DDDFZLnet/minecraft/world/level/Explosion$BlockInteraction;Lnet/minecraft/core/particles/ParticleOptions;Lnet/minecraft/core/particles/ParticleOptions;Lnet/minecraft/core/Holder;)V", //optional due to Overwrite in Lithium
//should kill most checks if no block damage is requested
@Redirect(method = "calculateExplodedPositions", require = 0, at = @At(value = "INVOKE",
target ="Lnet/minecraft/world/level/ExplosionDamageCalculator;getBlockExplosionResistance(Lnet/minecraft/world/level/Explosion;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/material/FluidState;)Ljava/util/Optional;"))
private Optional<Float> noBlockCalcsWithNoBLockDamage(final ExplosionDamageCalculator instance, final Explosion explosion, final BlockGetter blockGetter, final BlockPos blockPos, final BlockState blockState, final FluidState fluidState)
{
if (CarpetSettings.explosionNoBlockDamage) return Optional.of(Blocks.BEDROCK.getExplosionResistance());
return instance.getBlockExplosionResistance(explosion, blockGetter, blockPos, blockState, fluidState);
}
@Inject(method = "<init>",
at = @At(value = "RETURN")) at = @At(value = "RETURN"))
private void onExplosionCreated(Level world, Entity entity, DamageSource damageSource, ExplosionDamageCalculator explosionBehavior, double x, double y, double z, float power, boolean createFire, Explosion.BlockInteraction destructionType, ParticleOptions particleOptions, ParticleOptions particleOptions2, Holder soundEvent, CallbackInfo ci) private void onExplostion(ServerLevel world, Entity entity, DamageSource damageSource, final ExplosionDamageCalculator explosionBehavior, final Vec3 vec3, final float power, final boolean createFire, final Explosion.BlockInteraction destructionType, final CallbackInfo ci)
{ {
if (LoggerRegistry.__explosions && ! world.isClientSide) if (LoggerRegistry.__explosions && ! world.isClientSide)
{ {
eLogger = new ExplosionLogHelper(x, y, z, power, createFire, destructionType, level.registryAccess()); eLogger = new ExplosionLogHelper(vec3.x, vec3.y, vec3.z, power, createFire, destructionType, level.registryAccess());
} }
} }
@Redirect(method = "explode", @Redirect(method = "hurtEntities",
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V")) at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V"))
private void setVelocityAndUpdateLogging(Entity entity, Vec3 velocity) private void setVelocityAndUpdateLogging(Entity entity, Vec3 velocity)
{ {
@@ -1,8 +1,6 @@
package carpet.mixins; package carpet.mixins;
import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.level.ServerExplosion;
import net.minecraft.core.Holder;
import net.minecraft.core.particles.ParticleOptions;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -14,66 +12,48 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.ExplosionDamageCalculator;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import static carpet.script.CarpetEventServer.Event.EXPLOSION_OUTCOME; import static carpet.script.CarpetEventServer.Event.EXPLOSION_OUTCOME;
@Mixin(value = Explosion.class, priority = 990) @Mixin(value = ServerExplosion.class, priority = 990)
public abstract class Explosion_scarpetEventMixin public abstract class Explosion_scarpetEventMixin
{ {
@Shadow @Final private Level level; @Shadow @Final private ServerLevel level;
@Shadow @Final private double x; @Shadow @Final private Vec3 center;
@Shadow @Final private double y;
@Shadow @Final private double z;
@Shadow @Final private float radius; @Shadow @Final private float radius;
@Shadow @Final private boolean fire; @Shadow @Final private boolean fire;
@Shadow @Final private ObjectArrayList<BlockPos> toBlow;
@Shadow @Final private Explosion.BlockInteraction blockInteraction; @Shadow @Final private Explosion.BlockInteraction blockInteraction;
@Shadow @Final private @Nullable Entity source; @Shadow @Final private @Nullable Entity source;
@Shadow /*@Nullable*/ public abstract /*@Nullable*/ LivingEntity getIndirectSourceEntity(); @Shadow /*@Nullable*/ public abstract /*@Nullable*/ LivingEntity getIndirectSourceEntity();
@Shadow public static float getSeenPercent(Vec3 source, Entity entity) {return 0.0f;} private List<Entity> affectedEntities = new ArrayList<>();
private List<Entity> affectedEntities; @Inject(method = "explode", at = @At("HEAD"))
private void explodeCM(CallbackInfo ci)
@Inject(method = "<init>(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Lnet/minecraft/world/level/ExplosionDamageCalculator;DDDFZLnet/minecraft/world/level/Explosion$BlockInteraction;Lnet/minecraft/core/particles/ParticleOptions;Lnet/minecraft/core/particles/ParticleOptions;Lnet/minecraft/core/Holder;)V",
at = @At(value = "RETURN"))
private void onExplosionCreated(Level world, Entity entity, DamageSource damageSource, ExplosionDamageCalculator explosionBehavior, double x, double y, double z, float power, boolean createFire, Explosion.BlockInteraction destructionType, ParticleOptions particleOptions, ParticleOptions particleOptions2, Holder soundEvent, CallbackInfo ci)
{ {
if (EXPLOSION_OUTCOME.isNeeded() && !world.isClientSide()) affectedEntities.clear();
{
affectedEntities = new ArrayList<>();
}
} }
@Redirect(method = "explode", at=@At( @Redirect(method = "hurtEntities", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;onExplosionHit(Lnet/minecraft/world/entity/Entity;)V"))
value = "INVOKE", private void onEntityHit(Entity instance, Entity entity)
target = "Lnet/minecraft/world/level/Explosion;getSeenPercent(Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/entity/Entity;)F")
)
private float onExplosion(Vec3 source, Entity entity)
{ {
if (affectedEntities != null) affectedEntities.add(instance);
{ instance.onExplosionHit(entity);
affectedEntities.add(entity);
}
return getSeenPercent(source, entity);
} }
@Inject(method = "finalizeExplosion", at = @At("HEAD")) @Inject(method = "explode", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/ServerExplosion;hurtEntities()V", shift = At.Shift.AFTER))
private void onExplosion(boolean spawnParticles, CallbackInfo ci) private void onExplosionDone(CallbackInfo ci, List list)
{ {
if (EXPLOSION_OUTCOME.isNeeded() && !level.isClientSide()) if (EXPLOSION_OUTCOME.isNeeded() && !level.isClientSide())
{ {
EXPLOSION_OUTCOME.onExplosion((ServerLevel) level, source, this::getIndirectSourceEntity, x, y, z, radius, fire, toBlow, affectedEntities, blockInteraction); EXPLOSION_OUTCOME.onExplosion((ServerLevel) level, source, this::getIndirectSourceEntity, center, radius, fire, list, affectedEntities, blockInteraction);
} }
} }
} }
@@ -16,14 +16,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
public class FlowingFluid_liquidDamageDisabledMixin public class FlowingFluid_liquidDamageDisabledMixin
{ {
@Inject( @Inject(
method = "canHoldFluid", method = "canHoldAnyFluid",
at = @At( at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/world/level/block/state/BlockState;blocksMotion()Z" target = "Lnet/minecraft/world/level/block/state/BlockState;blocksMotion()Z"
), ),
cancellable = true cancellable = true
) )
private void stopBreakingBlock(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid, CallbackInfoReturnable<Boolean> cir) private static void stopBreakingBlock(final BlockState state, final CallbackInfoReturnable<Boolean> cir)
{ {
if (CarpetSettings.liquidDamageDisabled) if (CarpetSettings.liquidDamageDisabled)
{ {
@@ -1,12 +1,10 @@
package carpet.mixins; package carpet.mixins;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LightningBolt; import net.minecraft.world.entity.LightningBolt;
import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.entity.SpawnGroupData;
import net.minecraft.world.entity.monster.ElderGuardian; import net.minecraft.world.entity.monster.ElderGuardian;
import net.minecraft.world.entity.monster.Guardian; import net.minecraft.world.entity.monster.Guardian;
import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.monster.Monster;
@@ -28,7 +26,7 @@ public abstract class Guardian_renewableSpongesMixin extends Monster
{ {
ElderGuardian elderGuardian = new ElderGuardian(EntityType.ELDER_GUARDIAN ,this.level()); ElderGuardian elderGuardian = new ElderGuardian(EntityType.ELDER_GUARDIAN ,this.level());
elderGuardian.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); elderGuardian.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot());
elderGuardian.finalizeSpawn(serverWorld ,this.level().getCurrentDifficultyAt(elderGuardian.blockPosition()), MobSpawnType.CONVERSION, null); elderGuardian.finalizeSpawn(serverWorld ,this.level().getCurrentDifficultyAt(elderGuardian.blockPosition()), EntitySpawnReason.CONVERSION, null);
elderGuardian.setNoAi(this.isNoAi()); elderGuardian.setNoAi(this.isNoAi());
if (this.hasCustomName()) if (this.hasCustomName())
@@ -1,24 +1,11 @@
package carpet.mixins; package carpet.mixins;
import carpet.fakes.IngredientInterface;
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 java.util.Arrays;
import java.util.Collection;
import java.util.List;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
@Mixin(Ingredient.class) @Mixin(Ingredient.class)
public class Ingredient_scarpetMixin implements IngredientInterface public class Ingredient_scarpetMixin// implements IngredientInterface
{ {
@Shadow @Final private Ingredient.Value[] values;
@Override
public List<Collection<ItemStack>> getRecipeStacks()
{
return Arrays.stream(values).map(Ingredient.Value::getItems).toList();
}
} }
@@ -2,18 +2,20 @@ package carpet.mixins;
import carpet.network.CarpetClient; import carpet.network.CarpetClient;
import carpet.script.utils.ShapesRenderer; import carpet.script.utils.ShapesRenderer;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.framegraph.FrameGraphBuilder;
import com.mojang.blaze3d.framegraph.FramePass;
import net.minecraft.client.Camera; import net.minecraft.client.Camera;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.FogParameters;
import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.LevelTargetBundle;
import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.RenderBuffers; import net.minecraft.client.renderer.RenderBuffers;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import org.joml.Matrix4f; 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.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;
@@ -21,30 +23,25 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(LevelRenderer.class) @Mixin(LevelRenderer.class)
public class LevelRenderer_scarpetRenderMixin public class LevelRenderer_scarpetRenderMixin
{ {
@Shadow @Final private LevelTargetBundle targets;
@Inject(method = "<init>", at = @At("RETURN")) @Inject(method = "<init>", at = @At("RETURN"))
private void addRenderers(Minecraft minecraft, EntityRenderDispatcher entityRenderDispatcher, BlockEntityRenderDispatcher blockEntityRenderDispatcher, RenderBuffers renderBuffers, CallbackInfo ci) private void addRenderers(Minecraft minecraft, EntityRenderDispatcher entityRenderDispatcher, BlockEntityRenderDispatcher blockEntityRenderDispatcher, RenderBuffers renderBuffers, CallbackInfo ci)
{ {
CarpetClient.shapes = new ShapesRenderer(minecraft); CarpetClient.shapes = new ShapesRenderer(minecraft);
} }
@Inject(method = "renderLevel", at = @At( @Inject(method = "addParticlesPass", at = @At("RETURN"))
value = "INVOKE", private void renderScarpetThingsLate(FrameGraphBuilder frameGraphBuilder, Camera camera, LightTexture lightTexture, float f, FogParameters fogParameters, CallbackInfo ci)
target = "Lnet/minecraft/client/renderer/Sheets;translucentCullBlockSheet()Lnet/minecraft/client/renderer/RenderType;", shift = At.Shift.BEFORE
//target = "Lnet/minecraft/client/render/RenderLayer;getWaterMask()Lnet/minecraft/client/render/RenderLayer;", shift = At.Shift.AFTER
//target = "Lnet/minecraft/client/render/BufferBuilderStorage;getEffectVertexConsumers()Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;", shift = At.Shift.BEFORE
//target = "Lnet/minecraft/client/render/WorldRenderer;renderChunkDebugInfo(Lnet/minecraft/client/render/Camera;)V", shift = At.Shift.AFTER
//target = "Lnet/minecraft/client/render/BackgroundRenderer;method_23792()V", shift = At.Shift.AFTER
//target = "Lnet/minecraft/client/render/BufferBuilderStorage;getEntityVertexConsumers()Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;", shift = At.Shift.AFTER
//target = "Lnet/minecraft/client/render/WorldRenderer;renderChunkDebugInfo(Lnet/minecraft/client/render/Camera;)V", shift = At.Shift.AFTER // before return
))
private void renderScarpetThings(final DeltaTracker deltaTracker, final boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightmapTextureManager, Matrix4f modelViewMatrix, Matrix4f matrix4f, CallbackInfo ci)
{ {
// in normal circumstances we want to render shapes at the very end so it appears correctly behind stuff. // in normal circumstances we want to render shapes at the very end so it appears correctly behind stuff.
// we might actually not need to play with render hooks here. // we might actually not need to play with render hooks here.
//if (!FabricAPIHooks.WORLD_RENDER_EVENTS && CarpetClient.shapes != null ) //if (!FabricAPIHooks.WORLD_RENDER_EVENTS && CarpetClient.shapes != null )
if (CarpetClient.shapes != null) if (CarpetClient.shapes != null)
{ {
CarpetClient.shapes.render(modelViewMatrix, camera, deltaTracker.getGameTimeDeltaPartialTick(false)); FramePass pass = frameGraphBuilder.addPass("scarpet_shapes");
targets.main = pass.readsAndWrites(targets.main);
pass.executes(() -> CarpetClient.shapes.render(null, camera, f));
} }
} }
} }
@@ -5,7 +5,6 @@ import carpet.fakes.LevelInterface;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.server.level.FullChunkStatus; import net.minecraft.server.level.FullChunkStatus;
import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
@@ -28,12 +27,6 @@ public abstract class Level_movableBEMixin implements LevelInterface, LevelAcces
@Shadow @Shadow
public abstract LevelChunk getChunkAt(BlockPos blockPos_1); public abstract LevelChunk getChunkAt(BlockPos blockPos_1);
@Shadow
public abstract BlockState getBlockState(BlockPos blockPos_1);
//@Shadow
//public abstract ChunkManager getChunkManager();
@Shadow @Shadow
public abstract void setBlocksDirty(BlockPos blockPos_1, BlockState s1, BlockState s2); public abstract void setBlocksDirty(BlockPos blockPos_1, BlockState s1, BlockState s2);
@@ -50,8 +43,6 @@ public abstract class Level_movableBEMixin implements LevelInterface, LevelAcces
@Shadow public abstract void updateNeighbourForOutputSignal(BlockPos pos, Block block); @Shadow public abstract void updateNeighbourForOutputSignal(BlockPos pos, Block block);
//@Shadow public abstract boolean setBlockState(BlockPos pos, BlockState state, int flags);
@Shadow public abstract boolean isDebug(); @Shadow public abstract boolean isDebug();
/** /**
@@ -86,7 +77,7 @@ public abstract class Level_movableBEMixin implements LevelInterface, LevelAcces
{ {
BlockState blockState_3 = this.getBlockState(blockPos_1); BlockState blockState_3 = this.getBlockState(blockPos_1);
if (blockState_3 != blockState_2 && (blockState_3.getLightBlock((BlockGetter) this, blockPos_1) != blockState_2.getLightBlock((BlockGetter) this, blockPos_1) || blockState_3.getLightEmission() != blockState_2.getLightEmission() || blockState_3.useShapeForLightOcclusion() || blockState_2.useShapeForLightOcclusion())) if (blockState_3 != blockState_2 && (blockState_3.getLightBlock() != blockState_2.getLightBlock() || blockState_3.getLightEmission() != blockState_2.getLightEmission() || blockState_3.useShapeForLightOcclusion() || blockState_2.useShapeForLightOcclusion()))
{ {
ProfilerFiller profiler = getProfiler(); ProfilerFiller profiler = getProfiler();
profiler.push("queueCheckLight"); profiler.push("queueCheckLight");
@@ -25,8 +25,8 @@ public abstract class LivingEntity_creativeFlyMixin extends Entity
super(type, world); super(type, world);
} }
@ModifyConstant(method = "travel", constant = @Constant(floatValue = 0.91F), expect = 2) @ModifyConstant(method = "travelInAir", constant = @Constant(floatValue = 0.91F), expect = 1)
private float drag(float original) private float dragAir(float original)
{ {
if (CarpetSettings.creativeFlyDrag != 0.09 && (Object)this instanceof Player) if (CarpetSettings.creativeFlyDrag != 0.09 && (Object)this instanceof Player)
{ {
@@ -37,7 +37,6 @@ public abstract class LivingEntity_creativeFlyMixin extends Entity
return original; return original;
} }
@Inject(method = "getFrictionInfluencedSpeed(F)F", at = @At("HEAD"), cancellable = true) @Inject(method = "getFrictionInfluencedSpeed(F)F", at = @At("HEAD"), cancellable = true)
private void flyingAltSpeed(float slipperiness, CallbackInfoReturnable<Float> cir) private void flyingAltSpeed(float slipperiness, CallbackInfoReturnable<Float> cir)
{ {
@@ -11,7 +11,7 @@ import net.minecraft.server.MinecraftServer;
public abstract class MinecraftServer_pingPlayerSampleLimit public abstract class MinecraftServer_pingPlayerSampleLimit
{ {
@ModifyConstant(method = "tickServer", constant = @Constant(intValue = 12), require = 0, allow = 1) @ModifyConstant(method = "buildPlayerStatus", constant = @Constant(intValue = 12), require = 1)
private int modifyPlayerSampleLimit(int value) private int modifyPlayerSampleLimit(int value)
{ {
return CarpetSettings.pingPlayerListLimit; return CarpetSettings.pingPlayerListLimit;
@@ -102,7 +102,7 @@ public abstract class MinecraftServer_scarpetMixin extends ReentrantBlockableEve
@Override @Override
public void reloadAfterReload(RegistryAccess newRegs) public void reloadAfterReload(RegistryAccess newRegs)
{ {
resources.managers().updateRegistryTags(); resources.managers().updateStaticRegistryTags();
getPlayerList().saveAll(); getPlayerList().saveAll();
getPlayerList().reloadResources(); getPlayerList().reloadResources();
functionManager.replaceLibrary(this.resources.managers().getFunctionLibrary()); functionManager.replaceLibrary(this.resources.managers().getFunctionLibrary());
@@ -36,42 +36,34 @@ public abstract class MinecraftServer_tickspeedMixin extends ReentrantBlockableE
} }
@Inject(method = "tickServer", at = @At( @Inject(method = "autoSave", at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/server/MinecraftServer;saveEverything(ZZZ)Z", // save target = "Lnet/minecraft/server/MinecraftServer;saveEverything(ZZZ)Z", // save
shift = At.Shift.BEFORE shift = At.Shift.BEFORE
)) ))
private void startAutosave(BooleanSupplier booleanSupplier_1, CallbackInfo ci) private void startAutosave(final CallbackInfo ci)
{ {
currentSection = CarpetProfiler.start_section(null, "Autosave", CarpetProfiler.TYPE.GENERAL); currentSection = CarpetProfiler.start_section(null, "Autosave", CarpetProfiler.TYPE.GENERAL);
} }
@Inject(method = "tickServer", at = @At( @Inject(method = "autoSave", at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/server/MinecraftServer;saveEverything(ZZZ)Z", target = "Lnet/minecraft/server/MinecraftServer;saveEverything(ZZZ)Z",
shift = At.Shift.AFTER shift = At.Shift.AFTER
)) ))
private void finishAutosave(BooleanSupplier booleanSupplier_1, CallbackInfo ci) private void finishAutosave(final CallbackInfo ci)
{ {
CarpetProfiler.end_current_section(currentSection); CarpetProfiler.end_current_section(currentSection);
} }
@Inject(method = "tickChildren", at = @At( @Inject(method = "tickConnection", at = @At("HEAD"))
value = "INVOKE", private void startNetwork(final CallbackInfo ci)
target = "Lnet/minecraft/server/MinecraftServer;getConnection()Lnet/minecraft/server/network/ServerConnectionListener;",
shift = At.Shift.BEFORE
))
private void startNetwork(BooleanSupplier booleanSupplier_1, CallbackInfo ci)
{ {
currentSection = CarpetProfiler.start_section(null, "Network", CarpetProfiler.TYPE.GENERAL); currentSection = CarpetProfiler.start_section(null, "Network", CarpetProfiler.TYPE.GENERAL);
} }
@Inject(method = "tickChildren", at = @At( @Inject(method = "tickConnection", at = @At("RETURN"))
value = "INVOKE", private void finishNetwork(final CallbackInfo ci)
target = "Lnet/minecraft/server/players/PlayerList;tick()V",
shift = At.Shift.AFTER
))
private void finishNetwork(BooleanSupplier booleanSupplier_1, CallbackInfo ci)
{ {
CarpetProfiler.end_current_section(currentSection); CarpetProfiler.end_current_section(currentSection);
} }
@@ -3,6 +3,7 @@ package carpet.mixins;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.fakes.LevelInterface; import carpet.fakes.LevelInterface;
import carpet.utils.SpawnReporter; import carpet.utils.SpawnReporter;
import net.minecraft.world.entity.EntitySpawnReason;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -12,9 +13,9 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.List;
import java.util.Map; import java.util.Map;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.tags.BlockTags; import net.minecraft.tags.BlockTags;
@@ -24,7 +25,6 @@ import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.entity.SpawnGroupData; import net.minecraft.world.entity.SpawnGroupData;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@@ -133,9 +133,9 @@ public class NaturalSpawnerMixin
@Redirect(method = "getMobForSpawn", at = @At( @Redirect(method = "getMobForSpawn", at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/world/entity/EntityType;create(Lnet/minecraft/world/level/Level;)Lnet/minecraft/world/entity/Entity;" target = "Lnet/minecraft/world/entity/EntityType;create(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/EntitySpawnReason;)Lnet/minecraft/world/entity/Entity;"
)) ))
private static Entity create(EntityType<?> entityType, Level world_1) private static Entity create(final EntityType entityType, final Level world_1, final EntitySpawnReason entitySpawnReason)
{ {
if (CarpetSettings.lagFreeSpawning) if (CarpetSettings.lagFreeSpawning)
{ {
@@ -143,11 +143,11 @@ public class NaturalSpawnerMixin
if (precookedMobs.containsKey(entityType)) if (precookedMobs.containsKey(entityType))
//this mob has been <init>'s but not used yet //this mob has been <init>'s but not used yet
return precookedMobs.get(entityType); return precookedMobs.get(entityType);
Entity e = entityType.create(world_1); Entity e = entityType.create(world_1, entitySpawnReason);
precookedMobs.put(entityType, e); precookedMobs.put(entityType, e);
return e; return e;
} }
return entityType.create(world_1); return entityType.create(world_1, entitySpawnReason);
} }
@Redirect(method = "spawnCategoryForPosition(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/NaturalSpawner$SpawnPredicate;Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;)V", at = @At( @Redirect(method = "spawnCategoryForPosition(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/NaturalSpawner$SpawnPredicate;Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;)V", at = @At(
@@ -176,9 +176,9 @@ public class NaturalSpawnerMixin
@Redirect(method = "spawnCategoryForPosition(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/NaturalSpawner$SpawnPredicate;Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;)V", at = @At( @Redirect(method = "spawnCategoryForPosition(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/NaturalSpawner$SpawnPredicate;Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;)V", at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/world/entity/Mob;finalizeSpawn(Lnet/minecraft/world/level/ServerLevelAccessor;Lnet/minecraft/world/DifficultyInstance;Lnet/minecraft/world/entity/MobSpawnType;Lnet/minecraft/world/entity/SpawnGroupData;)Lnet/minecraft/world/entity/SpawnGroupData;" target = "Lnet/minecraft/world/entity/Mob;finalizeSpawn(Lnet/minecraft/world/level/ServerLevelAccessor;Lnet/minecraft/world/DifficultyInstance;Lnet/minecraft/world/entity/EntitySpawnReason;Lnet/minecraft/world/entity/SpawnGroupData;)Lnet/minecraft/world/entity/SpawnGroupData;"
)) ))
private static SpawnGroupData spawnEntity(Mob mobEntity, ServerLevelAccessor serverWorldAccess, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData) private static SpawnGroupData spawnEntity(Mob mobEntity, ServerLevelAccessor serverWorldAccess, DifficultyInstance difficulty, EntitySpawnReason spawnReason, SpawnGroupData entityData)
{ {
if (!SpawnReporter.mockSpawns) // WorldAccess if (!SpawnReporter.mockSpawns) // WorldAccess
return mobEntity.finalizeSpawn(serverWorldAccess, difficulty, spawnReason, entityData); return mobEntity.finalizeSpawn(serverWorldAccess, difficulty, spawnReason, entityData);
@@ -271,17 +271,13 @@ public class NaturalSpawnerMixin
@Inject(method = "spawnForChunk", at = @At("HEAD")) @Inject(method = "spawnForChunk", at = @At("HEAD"))
// allows to change mobcaps and captures each category try per dimension before it fails due to full mobcaps. // allows to change mobcaps and captures each category try per dimension before it fails due to full mobcaps.
private static void checkSpawns(ServerLevel world, LevelChunk chunk, NaturalSpawner.SpawnState info, private static void checkSpawns(ServerLevel world, LevelChunk chunk, NaturalSpawner.SpawnState info,
boolean spawnAnimals, boolean spawnMonsters, boolean shouldSpawnAnimals, CallbackInfo ci) List<MobCategory> list, CallbackInfo ci)
{ {
if (SpawnReporter.trackingSpawns()) if (SpawnReporter.trackingSpawns())
{ {
MobCategory[] var6 = SPAWNING_CATEGORIES; for (MobCategory entityCategory: list)
int var7 = var6.length; {
for(int var8 = 0; var8 < var7; ++var8) {
MobCategory entityCategory = var6[var8];
if ((spawnAnimals || !entityCategory.isFriendly()) && (spawnMonsters || entityCategory.isFriendly()) && (shouldSpawnAnimals || !entityCategory.isPersistent()) )
{
ResourceKey<Level> dim = world.dimension(); // getDimensionType; ResourceKey<Level> dim = world.dimension(); // getDimensionType;
int newCap = entityCategory.getMaxInstancesPerChunk(); //(int) ((double)entityCategory.getCapacity()*(Math.pow(2.0,(SpawnReporter.mobcap_exponent/4)))); int newCap = entityCategory.getMaxInstancesPerChunk(); //(int) ((double)entityCategory.getCapacity()*(Math.pow(2.0,(SpawnReporter.mobcap_exponent/4))));
int int_2 = SpawnReporter.chunkCounts.get(dim); // eligible chunks for spawning int int_2 = SpawnReporter.chunkCounts.get(dim); // eligible chunks for spawning
@@ -311,7 +307,6 @@ public class NaturalSpawnerMixin
//else //else
//full mobcaps - and key in local_spawns will be missing //full mobcaps - and key in local_spawns will be missing
} }
}
} }
} }
} }
@@ -6,7 +6,7 @@ import net.minecraft.tags.TagKey;
import net.minecraft.world.item.DiggerItem; import net.minecraft.world.item.DiggerItem;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.PickaxeItem; import net.minecraft.world.item.PickaxeItem;
import net.minecraft.world.item.Tier; import net.minecraft.world.item.ToolMaterial;
import net.minecraft.world.item.component.Tool; import net.minecraft.world.item.component.Tool;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
@@ -18,8 +18,10 @@ import org.spongepowered.asm.mixin.Mixin;
public class PickaxeItem_missingToolsMixin extends DiggerItem public class PickaxeItem_missingToolsMixin extends DiggerItem
{ {
protected PickaxeItem_missingToolsMixin(Tier material, TagKey<Block> tag, Properties settings) {
super(material, tag, settings); protected PickaxeItem_missingToolsMixin(final ToolMaterial toolMaterial, final TagKey<Block> tagKey, final float f, final float g, final Properties properties)
{
super(toolMaterial, tagKey, f, g, properties);
} }
@Override @Override
@@ -6,6 +6,7 @@ import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@@ -42,9 +43,13 @@ public class RecipeManager_scarpetMixin implements RecipeManagerInterface
Collection<RecipeHolder<?>> typeRecipes = byType.get(type); Collection<RecipeHolder<?>> typeRecipes = byType.get(type);
Registry<Item> regs = registryAccess.registryOrThrow(Registries.ITEM); Registry<Item> regs = registryAccess.registryOrThrow(Registries.ITEM);
Item item = regs.get(itemId); Item item = regs.get(itemId);
if (item == Items.AIR)
{
return List.of();
}
return typeRecipes.stream() return typeRecipes.stream()
.<Recipe<?>>map(RecipeHolder::value) .<Recipe<?>>map(RecipeHolder::value)
.filter(r -> r.getResultItem(registryAccess).getItem() == item) .filter(r -> r.getResultItem(registryAccess).is(item))
.toList(); .toList();
} }
} }
@@ -1,9 +1,13 @@
package carpet.mixins; package carpet.mixins;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.fakes.DefaultRedstoneWireEvaluatorInferface;
import carpet.fakes.RedstoneWireBlockInterface; import carpet.fakes.RedstoneWireBlockInterface;
import carpet.helpers.RedstoneWireTurbo; import carpet.helpers.RedstoneWireTurbo;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import net.minecraft.world.level.redstone.DefaultRedstoneWireEvaluator;
import net.minecraft.world.level.redstone.Orientation;
import net.minecraft.world.level.redstone.RedstoneWireEvaluator;
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.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
@@ -21,16 +25,15 @@ import net.minecraft.world.level.block.RedStoneWireBlock;
import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import javax.annotation.Nullable;
import static net.minecraft.world.level.block.RedStoneWireBlock.POWER; import static net.minecraft.world.level.block.RedStoneWireBlock.POWER;
@Mixin(RedStoneWireBlock.class) @Mixin(RedStoneWireBlock.class)
public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockInterface { public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockInterface {
@Shadow @Shadow
private void updatePowerStrength(Level world_1, BlockPos blockPos_1, BlockState blockState_1) { } private void updatePowerStrength(Level world_1, BlockPos blockPos_1, BlockState blockState_1, @Nullable final Orientation orientation) { }
@Shadow
private int calculateTargetStrength(Level world, BlockPos pos) { return 0; }
@Override @Override
@Accessor("shouldSignal") @Accessor("shouldSignal")
@@ -40,6 +43,8 @@ public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockIn
@Accessor("shouldSignal") @Accessor("shouldSignal")
public abstract boolean getWiresGivePower(); public abstract boolean getWiresGivePower();
private RedstoneWireEvaluator legacy = new DefaultRedstoneWireEvaluator((RedStoneWireBlock)(Object) this);
// = // =
private RedstoneWireTurbo wireTurbo = null; private RedstoneWireTurbo wireTurbo = null;
@@ -52,20 +57,22 @@ public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockIn
// = // =
public void fastUpdate(Level world, BlockPos pos, BlockState state, BlockPos source) { public void fastUpdate(Level world, BlockPos pos, BlockState state, Orientation o) {
// [CM] fastRedstoneDust -- update based on carpet rule // [CM] fastRedstoneDust -- update based on carpet rule
if (CarpetSettings.fastRedstoneDust) { if (CarpetSettings.fastRedstoneDust) {
BlockPos source = null; // todo this probably removes all improvements from the original method
// so needs to be evaluated if its worth keeping
wireTurbo.updateSurroundingRedstone(world, pos, state, source); wireTurbo.updateSurroundingRedstone(world, pos, state, source);
return; return;
} }
updatePowerStrength(world, pos, state); updatePowerStrength(world, pos, state, o);
} }
/** /**
* @author theosib, soykaf, gnembon * @author theosib, soykaf, gnembon
*/ */
@Inject(method = "updatePowerStrength", at = @At("HEAD"), cancellable = true) @Inject(method = "updatePowerStrength", at = @At("HEAD"), cancellable = true)
private void updateLogicAlternative(Level world, BlockPos pos, BlockState state, CallbackInfo cir) { private void updateLogicAlternative(Level world, BlockPos pos, BlockState state, Orientation orientation, CallbackInfo cir) {
if (CarpetSettings.fastRedstoneDust) { if (CarpetSettings.fastRedstoneDust) {
updateLogicPublic(world, pos, state); updateLogicPublic(world, pos, state);
cir.cancel(); cir.cancel();
@@ -74,7 +81,7 @@ public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockIn
@Override @Override
public BlockState updateLogicPublic(Level world_1, BlockPos blockPos_1, BlockState blockState_1) { public BlockState updateLogicPublic(Level world_1, BlockPos blockPos_1, BlockState blockState_1) {
int i = this.calculateTargetStrength(world_1, blockPos_1); int i = ((DefaultRedstoneWireEvaluatorInferface)legacy).calculateTargetStrengthCM(world_1, blockPos_1);
BlockState blockState = blockState_1; BlockState blockState = blockState_1;
if (blockState_1.getValue(POWER) != i) { if (blockState_1.getValue(POWER) != i) {
blockState_1 = blockState_1.setValue(POWER, i); blockState_1 = blockState_1.setValue(POWER, i);
@@ -107,28 +114,33 @@ public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockIn
// = // =
@Redirect(method = "onPlace", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V")) @Redirect(method = "onPlace", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/redstone/Orientation;)V"))
private void redirectOnBlockAddedUpdate(RedStoneWireBlock self, Level world_1, BlockPos blockPos_1, BlockState blockState_1) { private void redirectOnBlockAddedUpdate(RedStoneWireBlock self, Level world_1, BlockPos blockPos_1, BlockState blockState_1, Orientation o) {
fastUpdate(world_1, blockPos_1, blockState_1, null); fastUpdate(world_1, blockPos_1, blockState_1, o);
} }
@Redirect(method = "onRemove", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V")) @Redirect(method = "onRemove", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/redstone/Orientation;)V"))
private void redirectOnStateReplacedUpdate(RedStoneWireBlock self, Level world_1, BlockPos blockPos_1, BlockState blockState_1) { private void redirectOnStateReplacedUpdate(RedStoneWireBlock self, Level world_1, BlockPos blockPos_1, BlockState blockState_1, Orientation o) {
fastUpdate(world_1, blockPos_1, blockState_1, null); fastUpdate(world_1, blockPos_1, blockState_1, o);
} }
@Redirect(method = "neighborChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V")) @Redirect(method = "neighborChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/redstone/Orientation;)V"))
//private void red(final RedStoneWireBlock instance, final Level level,
// final BlockPos blockPos, final BlockState blockState, final Orientation orientation)
private void redirectNeighborUpdateUpdate( private void redirectNeighborUpdateUpdate(
RedStoneWireBlock self, RedStoneWireBlock self,
Level world_1, Level world_1,
BlockPos blockPos_1, BlockPos blockPos_1,
BlockState blockState_1, BlockState blockState_1,
Orientation o,
BlockState blockState_2, BlockState blockState_2,
Level world_2, Level world_2,
BlockPos blockPos_2, BlockPos blockPos_2,
Block block_1, Block block_1,
BlockPos blockPos_3, Orientation o2,
boolean boolean_1) { boolean b
fastUpdate(world_1, blockPos_1, blockState_1, blockPos_3); )
{
fastUpdate(world_1, blockPos_1, blockState_1, o);
} }
} }
@@ -27,7 +27,7 @@ public abstract class ServerChunkCacheMixin
@Shadow @Final private DistanceManager distanceManager; @Shadow @Final private DistanceManager distanceManager;
@Redirect(method = "tickChunks", at = @At( @Redirect(method = "tickChunks(Lnet/minecraft/util/profiling/ProfilerFiller;JLjava/util/List;)V", at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/server/level/DistanceManager;getNaturalSpawnChunkCount()I" target = "Lnet/minecraft/server/level/DistanceManager;getNaturalSpawnChunkCount()I"
)) ))
@@ -54,7 +54,7 @@ public abstract class ServerChunkCacheMixin
} }
@Inject(method = "tickChunks", at = @At("RETURN")) @Inject(method = "tickChunks(Lnet/minecraft/util/profiling/ProfilerFiller;JLjava/util/List;)V", at = @At("RETURN"))
private void onFinishSpawnWorldCycle(CallbackInfo ci) private void onFinishSpawnWorldCycle(CallbackInfo ci)
{ {
LevelData levelData = this.level.getLevelData(); // levelProperies class LevelData levelData = this.level.getLevelData(); // levelProperies class
@@ -19,36 +19,13 @@ public abstract class ServerChunkCache_profilerMixin
CarpetProfiler.ProfilerToken currentSection; CarpetProfiler.ProfilerToken currentSection;
@Inject(method = "tickChunks", at = @At("HEAD")) @Inject(method = "tickChunks(Lnet/minecraft/util/profiling/ProfilerFiller;JLjava/util/List;)V", at = @At("HEAD"))
private void startSpawningSection(CallbackInfo ci) private void startSpawningSection(CallbackInfo ci)
{ {
currentSection = CarpetProfiler.start_section(level, "Spawning", CarpetProfiler.TYPE.GENERAL); currentSection = CarpetProfiler.start_section(level, "Spawning", CarpetProfiler.TYPE.GENERAL);
} }
@Inject(method = "tickChunks", at = @At( @Inject(method = "tickChunks(Lnet/minecraft/util/profiling/ProfilerFiller;JLjava/util/List;)V", at = @At("RETURN"))
value = "FIELD",
target = "net/minecraft/server/level/ServerChunkCache.level:Lnet/minecraft/server/level/ServerLevel;",
ordinal = 10
))
private void skipChunkTicking(CallbackInfo ci)
{
if (currentSection != null)
{
CarpetProfiler.end_current_section(currentSection);
}
}
@Inject(method = "tickChunks", at = @At(
value = "INVOKE",
target = "net/minecraft/server/level/ServerLevel.tickChunk(Lnet/minecraft/world/level/chunk/LevelChunk;I)V",
shift = At.Shift.AFTER
))
private void resumeSpawningSection(CallbackInfo ci)
{
currentSection = CarpetProfiler.start_section(level, "Spawning", CarpetProfiler.TYPE.GENERAL);
}
@Inject(method = "tickChunks", at = @At("RETURN"))
private void stopSpawningSection(CallbackInfo ci) private void stopSpawningSection(CallbackInfo ci)
{ {
if (currentSection != null) if (currentSection != null)
@@ -56,18 +33,4 @@ public abstract class ServerChunkCache_profilerMixin
CarpetProfiler.end_current_section(currentSection); CarpetProfiler.end_current_section(currentSection);
} }
} }
//@Redirect(method = "tick", at = @At(
// value = "INVOKE",
// target = "Lnet/minecraft/server/level/DistanceManager;purgeStaleTickets()V"
//))
//private void pauseTicketSystem(DistanceManager distanceManager)
//{
// pausing expiry of tickets
// that will prevent also chunks from unloading, so require a deep frozen state
//ServerTickRateManager trm = ((MinecraftServerInterface) level.getServer()).getTickRateManager();
//if (!trm.runsNormally() && trm.deeplyFrozen()) return;
//distanceManager.purgeStaleTickets();
//}
} }
@@ -1,5 +1,6 @@
package carpet.mixins; package carpet.mixins;
import carpet.fakes.EntityInterface;
import net.minecraft.network.protocol.game.ServerboundChatCommandPacket; import net.minecraft.network.protocol.game.ServerboundChatCommandPacket;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@@ -51,9 +52,14 @@ public class ServerGamePacketListenerImpl_scarpetEventsMixin
{ {
@Shadow public ServerPlayer player; @Shadow public ServerPlayer player;
@Inject(method = "handlePlayerInput", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;setPlayerInput(FFZZ)V")) @Inject(method = "handlePlayerInput", at = @At("HEAD"))
private void checkMoves(ServerboundPlayerInputPacket p, CallbackInfo ci) private void checkMoves(ServerboundPlayerInputPacket p, CallbackInfo ci)
{ {
// todo this may not ride on the right thread moment, so needs to be checked
if (!((EntityInterface)player.getVehicle()).isPermanentVehicle()) // won't since that method makes sure its not null
player.setShiftKeyDown(p.isShiftKeyDown());
if (PLAYER_RIDES.isNeeded() && (p.getXxa() != 0.0F || p.getZza() != 0.0F || p.isJumping() || p.isShiftKeyDown())) if (PLAYER_RIDES.isNeeded() && (p.getXxa() != 0.0F || p.getZza() != 0.0F || p.isJumping() || p.isShiftKeyDown()))
{ {
PLAYER_RIDES.onMountControls(player, p.getXxa(), p.getZza(), p.isJumping(), p.isShiftKeyDown()); PLAYER_RIDES.onMountControls(player, p.getXxa(), p.getZza(), p.isJumping(), p.isShiftKeyDown());
@@ -246,7 +252,7 @@ public class ServerGamePacketListenerImpl_scarpetEventsMixin
{ {
if (PLAYER_CHOOSES_RECIPE.isNeeded()) if (PLAYER_CHOOSES_RECIPE.isNeeded())
{ {
if(PLAYER_CHOOSES_RECIPE.onRecipeSelected(player, packet.getRecipe(), packet.isShiftDown())) ci.cancel(); if(PLAYER_CHOOSES_RECIPE.onRecipeSelected(player, packet.getRecipe(), packet.isUseMaxItems())) ci.cancel();
} }
} }
@@ -24,6 +24,7 @@ import net.minecraft.world.level.entity.LevelEntityGetter;
import net.minecraft.world.level.entity.PersistentEntitySectionManager; import net.minecraft.world.level.entity.PersistentEntitySectionManager;
import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.ServerLevelData;
import net.minecraft.world.level.storage.WritableLevelData; import net.minecraft.world.level.storage.WritableLevelData;
import net.minecraft.world.phys.Vec3;
import org.spongepowered.asm.mixin.Final; 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;
@@ -31,7 +32,6 @@ import org.spongepowered.asm.mixin.Unique;
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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -65,8 +65,8 @@ public abstract class ServerLevel_scarpetMixin extends Level implements ServerWo
return getGameRules().getBoolean(rule) ? Explosion.BlockInteraction.DESTROY_WITH_DECAY : Explosion.BlockInteraction.DESTROY; return getGameRules().getBoolean(rule) ? Explosion.BlockInteraction.DESTROY_WITH_DECAY : Explosion.BlockInteraction.DESTROY;
} }
@Inject(method = "explode", at = @At("HEAD")) @Inject(method = "explode", at = @At("HEAD"), cancellable = true)
private void handleExplosion(/*@Nullable*/ Entity entity, /*@Nullable*/ DamageSource damageSource, /*@Nullable*/ ExplosionDamageCalculator explosionBehavior, double d, double e, double f, float g, boolean bl, ExplosionInteraction explosionInteraction, ParticleOptions particleOptions, ParticleOptions particleOptions2, Holder<SoundEvent> soundEvent, CallbackInfoReturnable<Explosion> cir) private void handleExplosion(final Entity entity, final DamageSource damageSource, final ExplosionDamageCalculator explosionDamageCalculator, final double x, final double y, final double z, final float g, final boolean bl, final ExplosionInteraction explosionInteraction, final ParticleOptions particleOptions, final ParticleOptions particleOptions2, final Holder<SoundEvent> holder, final CallbackInfo ci)
{ {
if (EXPLOSION.isNeeded()) { if (EXPLOSION.isNeeded()) {
Explosion.BlockInteraction var10000 = switch (explosionInteraction) { Explosion.BlockInteraction var10000 = switch (explosionInteraction) {
@@ -74,10 +74,12 @@ public abstract class ServerLevel_scarpetMixin extends Level implements ServerWo
case BLOCK -> this.getCMDestroyType(GameRules.RULE_BLOCK_EXPLOSION_DROP_DECAY); case BLOCK -> this.getCMDestroyType(GameRules.RULE_BLOCK_EXPLOSION_DROP_DECAY);
case MOB -> this.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? this.getCMDestroyType(GameRules.RULE_MOB_EXPLOSION_DROP_DECAY) : Explosion.BlockInteraction.KEEP; case MOB -> this.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? this.getCMDestroyType(GameRules.RULE_MOB_EXPLOSION_DROP_DECAY) : Explosion.BlockInteraction.KEEP;
case TNT -> this.getCMDestroyType(GameRules.RULE_TNT_EXPLOSION_DROP_DECAY); case TNT -> this.getCMDestroyType(GameRules.RULE_TNT_EXPLOSION_DROP_DECAY);
case TRIGGER -> Explosion.BlockInteraction.TRIGGER_BLOCK;
default -> throw new IncompatibleClassChangeError(); default -> throw new IncompatibleClassChangeError();
}; };
EXPLOSION.onExplosion((ServerLevel) (Object) this, entity, null, d, e, f, g, bl, null, null, var10000); boolean cancelled = EXPLOSION.onExplosion((ServerLevel) (Object) this, entity, null, new Vec3(x, y, z), g, bl, null, null, var10000);
if (cancelled) ci.cancel();
} }
} }
@@ -3,7 +3,7 @@ package carpet.mixins;
import carpet.helpers.BlockRotator; import carpet.helpers.BlockRotator;
import net.minecraft.server.level.ServerPlayerGameMode; import net.minecraft.server.level.ServerPlayerGameMode;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@@ -19,13 +19,13 @@ public class ServerPlayerGameMode_cactusMixin
@Redirect(method = "useItemOn", at = @At( @Redirect(method = "useItemOn", at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/world/level/block/state/BlockState;useItemOn(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/phys/BlockHitResult;)Lnet/minecraft/world/ItemInteractionResult;" target = "Lnet/minecraft/world/level/block/state/BlockState;useItemOn(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/phys/BlockHitResult;)Lnet/minecraft/world/InteractionResult;"
)) ))
private ItemInteractionResult activateWithOptionalCactus(final BlockState blockState, final ItemStack itemStack, final Level world_1, final Player playerEntity_1, final InteractionHand hand_1, final BlockHitResult blockHitResult_1) private InteractionResult activateWithOptionalCactus(final BlockState blockState, final ItemStack itemStack, final Level world_1, final Player playerEntity_1, final InteractionHand hand_1, final BlockHitResult blockHitResult_1)
{ {
boolean flipped = BlockRotator.flipBlockWithCactus(blockState, world_1, playerEntity_1, hand_1, blockHitResult_1); boolean flipped = BlockRotator.flipBlockWithCactus(blockState, world_1, playerEntity_1, hand_1, blockHitResult_1);
if (flipped) if (flipped)
return ItemInteractionResult.SUCCESS; return InteractionResult.SUCCESS;
return blockState.useItemOn(itemStack, world_1, playerEntity_1, hand_1, blockHitResult_1); return blockState.useItemOn(itemStack, world_1, playerEntity_1, hand_1, blockHitResult_1);
} }
@@ -83,16 +83,6 @@ public abstract class ServerPlayer_scarpetEventMixin extends Player implements S
} }
} }
@Redirect(method = "setPlayerInput", at = @At(
value = "INVOKE",
target = "Lnet/minecraft/server/level/ServerPlayer;setShiftKeyDown(Z)V"
))
private void setSneakingConditionally(ServerPlayer serverPlayerEntity, boolean sneaking)
{
if (!((EntityInterface)serverPlayerEntity.getVehicle()).isPermanentVehicle()) // won't since that method makes sure its not null
serverPlayerEntity.setShiftKeyDown(sneaking);
}
private Vec3 previousLocation; private Vec3 previousLocation;
private ResourceKey<Level> previousDimension; private ResourceKey<Level> previousDimension;
@@ -1,11 +1,6 @@
package carpet.mixins; package carpet.mixins;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.client.model.ShulkerModel;
@Mixin(net.minecraft.client.renderer.blockentity.ShulkerBoxRenderer.class) @Mixin(net.minecraft.client.renderer.blockentity.ShulkerBoxRenderer.class)
public interface ShulkerBoxAccessMixin { public interface ShulkerBoxAccessMixin {
@Accessor("model")
ShulkerModel getModel();
} }
@@ -6,6 +6,7 @@ import net.minecraft.server.commands.SummonCommand;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.DifficultyInstance; import net.minecraft.world.DifficultyInstance;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LightningBolt; import net.minecraft.world.entity.LightningBolt;
import net.minecraft.world.entity.animal.horse.SkeletonHorse; import net.minecraft.world.entity.animal.horse.SkeletonHorse;
@@ -31,7 +32,7 @@ public class SummonCommand_lightningMixin
DifficultyInstance localDifficulty_1 = world.getCurrentDifficultyAt(at); DifficultyInstance localDifficulty_1 = world.getCurrentDifficultyAt(at);
boolean boolean_2 = world.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && world.random.nextDouble() < (double)localDifficulty_1.getEffectiveDifficulty() * 0.01D; boolean boolean_2 = world.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && world.random.nextDouble() < (double)localDifficulty_1.getEffectiveDifficulty() * 0.01D;
if (boolean_2) { if (boolean_2) {
SkeletonHorse skeletonHorseEntity_1 = EntityType.SKELETON_HORSE.create(world); SkeletonHorse skeletonHorseEntity_1 = EntityType.SKELETON_HORSE.create(world, EntitySpawnReason.EVENT);
skeletonHorseEntity_1.setTrap(true); skeletonHorseEntity_1.setTrap(true);
skeletonHorseEntity_1.setAge(0); skeletonHorseEntity_1.setAge(0);
skeletonHorseEntity_1.setPos(entity.getX(), entity.getY(), entity.getZ()); skeletonHorseEntity_1.setPos(entity.getX(), entity.getY(), entity.getZ());
@@ -77,7 +77,7 @@ public class EntityPlayerMPFake extends ServerPlayer
EntityPlayerMPFake instance = new EntityPlayerMPFake(server, worldIn, current, ClientInformation.createDefault(), false); EntityPlayerMPFake instance = new EntityPlayerMPFake(server, worldIn, current, ClientInformation.createDefault(), false);
instance.fixStartingPosition = () -> instance.moveTo(pos.x, pos.y, pos.z, (float) yaw, (float) pitch); instance.fixStartingPosition = () -> instance.moveTo(pos.x, pos.y, pos.z, (float) yaw, (float) pitch);
server.getPlayerList().placeNewPlayer(new FakeClientConnection(PacketFlow.SERVERBOUND), instance, new CommonListenerCookie(current, 0, instance.clientInformation(), false)); server.getPlayerList().placeNewPlayer(new FakeClientConnection(PacketFlow.SERVERBOUND), instance, new CommonListenerCookie(current, 0, instance.clientInformation(), false));
instance.teleportTo(worldIn, pos.x, pos.y, pos.z, (float) yaw, (float) pitch); instance.teleportTo(worldIn, pos.x, pos.y, pos.z, (float) yaw, (float) pitch, true);
instance.setHealth(20.0F); instance.setHealth(20.0F);
instance.unsetRemoved(); instance.unsetRemoved();
instance.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(0.6F); instance.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(0.6F);
@@ -215,7 +215,7 @@ public class EntityPlayerMPFake extends ServerPlayer
} }
@Override @Override
public Entity changeDimension(DimensionTransition serverLevel) public Player changeDimension(DimensionTransition serverLevel)
{ {
super.changeDimension(serverLevel); super.changeDimension(serverLevel);
if (wonGame) { if (wonGame) {
@@ -1051,11 +1051,11 @@ public class CarpetEventServer
public static final Event EXPLOSION_OUTCOME = new Event("explosion_outcome", 8, true) public static final Event EXPLOSION_OUTCOME = new Event("explosion_outcome", 8, true)
{ {
@Override @Override
public void onExplosion(ServerLevel world, Entity e, Supplier<LivingEntity> attacker, double x, double y, double z, float power, boolean createFire, List<BlockPos> affectedBlocks, List<Entity> affectedEntities, Explosion.BlockInteraction type) public boolean onExplosion(ServerLevel world, Entity e, Supplier<LivingEntity> attacker, Vec3 center, float power, boolean createFire, List<BlockPos> affectedBlocks, List<Entity> affectedEntities, Explosion.BlockInteraction type)
{ {
handler.call( handler.call(
() -> Arrays.asList( () -> Arrays.asList(
ListValue.fromTriple(x, y, z), ValueConversions.of(center),
NumericValue.of(power), NumericValue.of(power),
EntityValue.of(e), EntityValue.of(e),
EntityValue.of(attacker != null ? attacker.get() : Event.getExplosionCausingEntity(e)), EntityValue.of(attacker != null ? attacker.get() : Event.getExplosionCausingEntity(e)),
@@ -1067,6 +1067,7 @@ public class CarpetEventServer
ListValue.wrap(affectedEntities.stream().map(EntityValue::of)) ListValue.wrap(affectedEntities.stream().map(EntityValue::of))
), () -> world.getServer().createCommandSourceStack().withLevel(world) ), () -> world.getServer().createCommandSourceStack().withLevel(world)
); );
return false;
} }
}; };
@@ -1074,11 +1075,11 @@ public class CarpetEventServer
public static final Event EXPLOSION = new Event("explosion", 6, true) public static final Event EXPLOSION = new Event("explosion", 6, true)
{ {
@Override @Override
public void onExplosion(ServerLevel world, Entity e, Supplier<LivingEntity> attacker, double x, double y, double z, float power, boolean createFire, List<BlockPos> affectedBlocks, List<Entity> affectedEntities, Explosion.BlockInteraction type) public boolean onExplosion(ServerLevel world, Entity e, Supplier<LivingEntity> attacker, Vec3 center, float power, boolean createFire, List<BlockPos> affectedBlocks, List<Entity> affectedEntities, Explosion.BlockInteraction type)
{ {
handler.call( return handler.call(
() -> Arrays.asList( () -> Arrays.asList(
ListValue.fromTriple(x, y, z), ValueConversions.of(center),
NumericValue.of(power), NumericValue.of(power),
EntityValue.of(e), EntityValue.of(e),
EntityValue.of(attacker != null ? attacker.get() : Event.getExplosionCausingEntity(e)), EntityValue.of(attacker != null ? attacker.get() : Event.getExplosionCausingEntity(e)),
@@ -1306,8 +1307,9 @@ public class CarpetEventServer
{ {
} }
public void onExplosion(ServerLevel world, Entity e, Supplier<LivingEntity> attacker, double x, double y, double z, float power, boolean createFire, List<BlockPos> affectedBlocks, List<Entity> affectedEntities, Explosion.BlockInteraction type) public boolean onExplosion(ServerLevel world, Entity e, Supplier<LivingEntity> attacker, Vec3 center, float power, boolean createFire, List<BlockPos> affectedBlocks, List<Entity> affectedEntities, Explosion.BlockInteraction type)
{ {
return false;
} }
public void onWorldEvent(ServerLevel world, BlockPos pos) public void onWorldEvent(ServerLevel world, BlockPos pos)
@@ -33,9 +33,9 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntitySelector; import net.minecraft.world.entity.EntitySelector;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
@@ -142,7 +142,7 @@ public class Entities
Vec3 vec3d = position.vec; Vec3 vec3d = position.vec;
ServerLevel serverWorld = cc.level(); ServerLevel serverWorld = cc.level();
Entity entity = EntityType.loadEntityRecursive(tag, serverWorld, e -> { Entity entity = EntityType.loadEntityRecursive(tag, serverWorld, EntitySpawnReason.COMMAND, e -> {
e.moveTo(vec3d.x, vec3d.y, vec3d.z, e.getYRot(), e.getXRot()); e.moveTo(vec3d.x, vec3d.y, vec3d.z, e.getYRot(), e.getXRot());
return e; return e;
}); });
@@ -150,9 +150,9 @@ public class Entities
{ {
return Value.NULL; return Value.NULL;
} }
if (!hasTag && entity instanceof final Mob mob) if (!hasTag && entity instanceof Mob mob)
{ {
mob.finalizeSpawn(serverWorld, serverWorld.getCurrentDifficultyAt(entity.blockPosition()), MobSpawnType.COMMAND, null); mob.finalizeSpawn(serverWorld, serverWorld.getCurrentDifficultyAt(entity.blockPosition()), EntitySpawnReason.COMMAND, null);
} }
if (!serverWorld.tryAddFreshEntityWithPassengers(entity)) if (!serverWorld.tryAddFreshEntityWithPassengers(entity))
{ {
@@ -21,7 +21,6 @@ import carpet.script.value.Value;
import carpet.script.value.ValueConversions; import carpet.script.value.ValueConversions;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@@ -44,6 +43,7 @@ import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.AbstractCookingRecipe; import net.minecraft.world.item.crafting.AbstractCookingRecipe;
import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.CustomRecipe;
import net.minecraft.world.item.crafting.PlacementInfo;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.item.crafting.ShapedRecipe; import net.minecraft.world.item.crafting.ShapedRecipe;
@@ -83,12 +83,12 @@ public class Inventories
Registry<Item> blocks = cc.registry(Registries.ITEM); Registry<Item> blocks = cc.registry(Registries.ITEM);
if (lv.isEmpty()) if (lv.isEmpty())
{ {
return ListValue.wrap(blocks.getTagNames().map(ValueConversions::of)); return ListValue.wrap(blocks.getTags().map(ValueConversions::of));
} }
Item item = NBTSerializableValue.parseItem(lv.get(0).getString(), cc.registryAccess()).getItem(); Item item = NBTSerializableValue.parseItem(lv.get(0).getString(), cc.registryAccess()).getItem();
if (lv.size() == 1) if (lv.size() == 1)
{ {
return ListValue.wrap(blocks.getTags().filter(e -> e.getSecond().stream().anyMatch(h -> (h.value() == item))).map(e -> ValueConversions.of(e.getFirst()))); return ListValue.wrap(blocks.getTags().filter(e -> e.stream().anyMatch(h -> (h.value() == item))).map(ValueConversions::of));
} }
String tag = lv.get(1).getString(); String tag = lv.get(1).getString();
Optional<HolderSet.Named<Item>> tagSet = blocks.getTag(TagKey.create(Registries.ITEM, InputValidator.identifierOf(tag))); Optional<HolderSet.Named<Item>> tagSet = blocks.getTag(TagKey.create(Registries.ITEM, InputValidator.identifierOf(tag)));
@@ -124,22 +124,20 @@ public class Inventories
{ {
ItemStack result = recipe.getResultItem(regs); ItemStack result = recipe.getResultItem(regs);
List<Value> ingredientValue = new ArrayList<>(); List<Value> ingredientValue = new ArrayList<>();
recipe.getIngredients().forEach(ingredient -> { recipe.placementInfo().slotInfo().forEach(ingredient -> {
// I am flattening ingredient lists per slot. if (ingredient.isEmpty())
// consider recipe_data('wooden_sword','crafting') and ('iron_nugget', 'blasting') and notice difference
// in depths of lists.
List<Collection<ItemStack>> stacks = Vanilla.Ingredient_getRecipeStacks(ingredient);
if (stacks.isEmpty())
{ {
ingredientValue.add(Value.NULL); ingredientValue.add(Value.NULL);
return;
} }
else PlacementInfo.SlotInfo value = ingredient.get();
{ int position = value.placerOutputPosition();
List<Value> alternatives = new ArrayList<>();
stacks.forEach(col -> col.stream().map(is -> ValueConversions.of(is, regs)).forEach(alternatives::add)); List<Value> alternatives = new ArrayList<>();
ingredientValue.add(ListValue.wrap(alternatives)); value.possibleItems().stream().map(is -> ValueConversions.of(is, regs)).forEach(alternatives::add);
} ingredientValue.add(ListValue.wrap(alternatives));
}); });
Value recipeSpec; Value recipeSpec;
if (recipe instanceof ShapedRecipe shapedRecipe) if (recipe instanceof ShapedRecipe shapedRecipe)
{ {
@@ -39,6 +39,7 @@ import net.minecraft.core.HolderSet;
import net.minecraft.core.QuartPos; import net.minecraft.core.QuartPos;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
@@ -50,6 +51,7 @@ import net.minecraft.server.level.Ticket;
import net.minecraft.server.level.TicketType; import net.minecraft.server.level.TicketType;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.level.ServerExplosion;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.chunk.PalettedContainer; import net.minecraft.world.level.chunk.PalettedContainer;
import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.chunk.status.ChunkStatus;
@@ -695,7 +697,7 @@ public class WorldAccess
expression.addContextFunction("update", -1, (c, t, lv) -> expression.addContextFunction("update", -1, (c, t, lv) ->
booleanStateTest(c, "update", lv, (s, p) -> booleanStateTest(c, "update", lv, (s, p) ->
{ {
((CarpetContext) c).level().neighborChanged(p, s.getBlock(), p); ((CarpetContext) c).level().neighborChanged(p, s.getBlock(), null);
return true; return true;
})); }));
@@ -1071,10 +1073,9 @@ public class WorldAccess
} }
} }
LivingEntity theAttacker = attacker; LivingEntity theAttacker = attacker;
float thePowah = powah;
// copy of ServerWorld.createExplosion #TRACK# // copy of ServerWorld.createExplosion #TRACK#
Explosion explosion = new Explosion(cc.level(), source, null, null, pos.x, pos.y, pos.z, powah, createFire, mode, ParticleTypes.EXPLOSION, ParticleTypes.EXPLOSION_EMITTER, SoundEvents.GENERIC_EXPLODE) ServerExplosion explosion = new ServerExplosion(cc.level(), source, null, null, pos, powah, createFire, mode)
{ {
@Override @Override
@Nullable @Nullable
@@ -1085,16 +1086,11 @@ public class WorldAccess
} }
}; };
explosion.explode(); explosion.explode();
explosion.finalizeExplosion(false); ParticleOptions explosionParticle = explosion.isSmall() ? ParticleTypes.EXPLOSION : ParticleTypes.EXPLOSION_EMITTER;
if (mode == Explosion.BlockInteraction.KEEP)
{
explosion.clearToBlow();
}
Explosion.BlockInteraction finalMode = mode;
cc.level().players().forEach(spe -> { cc.level().players().forEach(spe -> {
if (spe.distanceToSqr(pos) < 4096.0D) if (spe.distanceToSqr(pos) < 4096.0D)
{ {
spe.connection.send(new ClientboundExplodePacket(pos.x, pos.y, pos.z, thePowah, explosion.getToBlow(), explosion.getHitPlayers().get(spe), finalMode, ParticleTypes.EXPLOSION, ParticleTypes.EXPLOSION_EMITTER, SoundEvents.GENERIC_EXPLODE)); spe.connection.send(new ClientboundExplodePacket(pos, Optional.ofNullable(explosion.getHitPlayers().get(spe)), explosionParticle, SoundEvents.GENERIC_EXPLODE));
} }
}); });
return Value.TRUE; return Value.TRUE;
@@ -1239,13 +1235,13 @@ public class WorldAccess
Registry<Block> blocks = cc.registry(Registries.BLOCK); Registry<Block> blocks = cc.registry(Registries.BLOCK);
if (lv.isEmpty()) if (lv.isEmpty())
{ {
return ListValue.wrap(blocks.getTagNames().map(ValueConversions::of)); return ListValue.wrap(blocks.getTags().map(ValueConversions::of));
} }
BlockArgument blockLocator = BlockArgument.findIn(cc, lv, 0, true); BlockArgument blockLocator = BlockArgument.findIn(cc, lv, 0, true);
if (blockLocator.offset == lv.size()) if (blockLocator.offset == lv.size())
{ {
Block target = blockLocator.block.getBlockState().getBlock(); Block target = blockLocator.block.getBlockState().getBlock();
return ListValue.wrap(blocks.getTags().filter(e -> e.getSecond().stream().anyMatch(h -> (h.value() == target))).map(e -> ValueConversions.of(e.getFirst()))); return ListValue.wrap(blocks.getTags().filter(e -> e.stream().anyMatch(h -> (h.value() == target))).map(ValueConversions::of));
} }
String tag = lv.get(blockLocator.offset).getString(); String tag = lv.get(blockLocator.offset).getString();
Optional<HolderSet.Named<Block>> tagSet = blocks.getTag(TagKey.create(Registries.BLOCK, InputValidator.identifierOf(tag))); Optional<HolderSet.Named<Block>> tagSet = blocks.getTag(TagKey.create(Registries.BLOCK, InputValidator.identifierOf(tag)));
-6
View File
@@ -7,7 +7,6 @@ import carpet.fakes.BlockStateArgumentInterface;
import carpet.fakes.ChunkTicketManagerInterface; import carpet.fakes.ChunkTicketManagerInterface;
import carpet.fakes.CommandDispatcherInterface; import carpet.fakes.CommandDispatcherInterface;
import carpet.fakes.EntityInterface; import carpet.fakes.EntityInterface;
import carpet.fakes.IngredientInterface;
import carpet.fakes.InventoryBearerInterface; import carpet.fakes.InventoryBearerInterface;
import carpet.fakes.ItemEntityInterface; import carpet.fakes.ItemEntityInterface;
import carpet.fakes.LivingEntityInterface; import carpet.fakes.LivingEntityInterface;
@@ -108,11 +107,6 @@ public class Vanilla
return Map.of(); //return ((ThreadedAnvilChunkStorageInterface) chunkMap).regenerateChunkRegion(requestedChunks); return Map.of(); //return ((ThreadedAnvilChunkStorageInterface) chunkMap).regenerateChunkRegion(requestedChunks);
} }
public static List<Collection<ItemStack>> Ingredient_getRecipeStacks(Ingredient ingredient)
{
return ((IngredientInterface) (Object) ingredient).getRecipeStacks();
}
public static List<Recipe<?>> RecipeManager_getAllMatching(RecipeManager recipeManager, RecipeType<?> type, ResourceLocation output, RegistryAccess registryAccess) public static List<Recipe<?>> RecipeManager_getAllMatching(RecipeManager recipeManager, RecipeType<?> type, ResourceLocation output, RegistryAccess registryAccess)
{ {
return ((RecipeManagerInterface) recipeManager).getAllMatching(type, output, registryAccess); return ((RecipeManagerInterface) recipeManager).getAllMatching(type, output, registryAccess);
@@ -1,13 +1,5 @@
package carpet.script.external; package carpet.script.external;
import carpet.mixins.ShulkerBoxAccessMixin;
import net.minecraft.client.model.ShulkerModel;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity;
public class VanillaClient public class VanillaClient
{ {
public static ShulkerModel<?> ShulkerBoxRenderer_model(BlockEntityRenderer<ShulkerBoxBlockEntity> shulkerBoxRenderer) {
return ((ShulkerBoxAccessMixin)shulkerBoxRenderer).getModel();
}
} }
@@ -23,7 +23,7 @@ public class BiomeInfo
{ {
public static final Map<String, BiFunction<ServerLevel, Biome, Value>> biomeFeatures = new HashMap<>() public static final Map<String, BiFunction<ServerLevel, Biome, Value>> biomeFeatures = new HashMap<>()
{{ {{
put("tags", (w, b) -> ListValue.wrap(w.registryAccess().registryOrThrow(Registries.BIOME).getTags().filter(p -> p.getSecond().stream().anyMatch(h -> h.value() == b)).map(p -> p.getFirst().location()).map(ValueConversions::of))); put("tags", (w, b) -> ListValue.wrap(w.registryAccess().registryOrThrow(Registries.BIOME).getTags().filter(p -> p.stream().anyMatch(h -> h.value() == b)).map(ValueConversions::of)));
put("temperature", (w, b) -> NumericValue.of(b.getBaseTemperature())); put("temperature", (w, b) -> NumericValue.of(b.getBaseTemperature()));
put("fog_color", (w, b) -> ValueConversions.ofRGB(b.getSpecialEffects().getFogColor())); put("fog_color", (w, b) -> ValueConversions.ofRGB(b.getSpecialEffects().getFogColor()));
put("foliage_color", (w, b) -> ValueConversions.ofRGB(b.getSpecialEffects().getFoliageColorOverride().orElse(4764952))); // client Biome.getDefaultFoliageColor put("foliage_color", (w, b) -> ValueConversions.ofRGB(b.getSpecialEffects().getFoliageColorOverride().orElse(4764952))); // client Biome.getDefaultFoliageColor
@@ -31,7 +31,7 @@ public class BiomeInfo
put("water_color", (w, b) -> ValueConversions.ofRGB(b.getSpecialEffects().getWaterColor())); put("water_color", (w, b) -> ValueConversions.ofRGB(b.getSpecialEffects().getWaterColor()));
put("water_fog_color", (w, b) -> ValueConversions.ofRGB(b.getSpecialEffects().getWaterFogColor())); put("water_fog_color", (w, b) -> ValueConversions.ofRGB(b.getSpecialEffects().getWaterFogColor()));
put("humidity", (w, b) -> NumericValue.of(Vanilla.Biome_getClimateSettings(b).downfall())); put("humidity", (w, b) -> NumericValue.of(Vanilla.Biome_getClimateSettings(b).downfall()));
put("precipitation", (w, b) -> StringValue.of(b.getPrecipitationAt(new BlockPos(0, w.getSeaLevel(), 0)).name().toLowerCase(Locale.ROOT))); put("precipitation", (w, b) -> StringValue.of(b.getPrecipitationAt(new BlockPos(0, w.getSeaLevel(), 0), w.getSeaLevel()).name().toLowerCase(Locale.ROOT)));
put("features", (w, b) -> { put("features", (w, b) -> {
Registry<ConfiguredFeature<?, ?>> registry = w.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE); Registry<ConfiguredFeature<?, ?>> registry = w.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE);
return ListValue.wrap( return ListValue.wrap(
@@ -304,8 +304,7 @@ public class FeatureGenerator
return spawnCustomStructure( return spawnCustomStructure(
new JigsawStructure(new Structure.StructureSettings( new JigsawStructure(new Structure.StructureSettings(l.registryAccess().lookup(Registries.BIOME).orElseThrow().getOrThrow(BiomeTags.HAS_BASTION_REMNANT),
l.registryAccess().registryOrThrow(Registries.BIOME).getOrCreateTag(BiomeTags.HAS_BASTION_REMNANT),
Map.of(), Map.of(),
GenerationStep.Decoration.SURFACE_STRUCTURES, GenerationStep.Decoration.SURFACE_STRUCTURES,
TerrainAdjustment.NONE TerrainAdjustment.NONE
@@ -334,7 +333,7 @@ public class FeatureGenerator
return spawnCustomStructure( return spawnCustomStructure(
new JigsawStructure(new Structure.StructureSettings( new JigsawStructure(new Structure.StructureSettings(
l.registryAccess().registryOrThrow(Registries.BIOME).getOrCreateTag(BiomeTags.HAS_BASTION_REMNANT), l.registryAccess().lookup(Registries.BIOME).orElseThrow().getOrThrow(BiomeTags.HAS_BASTION_REMNANT),
Map.of(), Map.of(),
GenerationStep.Decoration.SURFACE_STRUCTURES, GenerationStep.Decoration.SURFACE_STRUCTURES,
TerrainAdjustment.NONE TerrainAdjustment.NONE
@@ -363,7 +362,7 @@ public class FeatureGenerator
return spawnCustomStructure( return spawnCustomStructure(
new JigsawStructure(new Structure.StructureSettings( new JigsawStructure(new Structure.StructureSettings(
l.registryAccess().registryOrThrow(Registries.BIOME).getOrCreateTag(BiomeTags.HAS_BASTION_REMNANT), l.registryAccess().lookup(Registries.BIOME).orElseThrow().getOrThrow(BiomeTags.HAS_BASTION_REMNANT),
Map.of(), Map.of(),
GenerationStep.Decoration.SURFACE_STRUCTURES, GenerationStep.Decoration.SURFACE_STRUCTURES,
TerrainAdjustment.NONE TerrainAdjustment.NONE
@@ -392,7 +391,7 @@ public class FeatureGenerator
return spawnCustomStructure( return spawnCustomStructure(
new JigsawStructure(new Structure.StructureSettings( new JigsawStructure(new Structure.StructureSettings(
l.registryAccess().registryOrThrow(Registries.BIOME).getOrCreateTag(BiomeTags.HAS_BASTION_REMNANT), l.registryAccess().lookup(Registries.BIOME).orElseThrow().getOrThrow(BiomeTags.HAS_BASTION_REMNANT),
Map.of(), Map.of(),
GenerationStep.Decoration.SURFACE_STRUCTURES, GenerationStep.Decoration.SURFACE_STRUCTURES,
TerrainAdjustment.NONE TerrainAdjustment.NONE
@@ -2,7 +2,6 @@ package carpet.script.utils;
import carpet.script.CarpetScriptServer; import carpet.script.CarpetScriptServer;
import carpet.script.external.Carpet; import carpet.script.external.Carpet;
import carpet.script.external.VanillaClient;
import carpet.script.utils.shapes.ShapeDirection; import carpet.script.utils.shapes.ShapeDirection;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
@@ -12,7 +11,6 @@ import com.mojang.blaze3d.vertex.ByteBufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormat;
import com.mojang.blaze3d.vertex.VertexFormat.Mode; import com.mojang.blaze3d.vertex.VertexFormat.Mode;
import com.mojang.math.Axis; import com.mojang.math.Axis;
@@ -26,34 +24,27 @@ import java.util.function.BiFunction;
import net.minecraft.client.Camera; import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.client.model.ShulkerModel;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Sheets;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.resources.model.Material;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.LeavesBlock;
import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.ShulkerBoxBlock;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.joml.Matrix4f; import org.joml.Matrix4f;
@@ -160,7 +151,6 @@ public class ShapesRenderer
Matrix4fStack matrixStack = RenderSystem.getModelViewStack(); Matrix4fStack matrixStack = RenderSystem.getModelViewStack();
matrixStack.pushMatrix(); matrixStack.pushMatrix();
matrixStack.mul(matrices.last().pose()); matrixStack.mul(matrices.last().pose());
RenderSystem.applyModelViewMatrix();
// lines // lines
RenderSystem.lineWidth(0.5F); RenderSystem.lineWidth(0.5F);
@@ -180,7 +170,6 @@ public class ShapesRenderer
}); });
RenderSystem.lineWidth(1.0F); RenderSystem.lineWidth(1.0F);
matrixStack.popMatrix(); matrixStack.popMatrix();
RenderSystem.applyModelViewMatrix();
} }
if (!labels.isEmpty()) if (!labels.isEmpty())
@@ -439,15 +428,8 @@ public class ShapesRenderer
} }
} }
} }
if (BlockEntity instanceof ShulkerBoxBlockEntity sbBlockEntity) if (BlockEntity != null)
{ {
sbrender(sbBlockEntity, partialTick,
matrices, immediate, light, OverlayTexture.NO_OVERLAY);
}
else
{
if (BlockEntity != null)
{
BlockEntityRenderer<BlockEntity> blockEntityRenderer = client.getBlockEntityRenderDispatcher().getRenderer(BlockEntity); BlockEntityRenderer<BlockEntity> blockEntityRenderer = client.getBlockEntityRenderDispatcher().getRenderer(BlockEntity);
if (blockEntityRenderer != null) if (blockEntityRenderer != null)
{ {
@@ -455,7 +437,6 @@ public class ShapesRenderer
matrices, immediate, light, OverlayTexture.NO_OVERLAY); matrices, immediate, light, OverlayTexture.NO_OVERLAY);
} }
}
} }
} }
else else
@@ -480,44 +461,6 @@ public class ShapesRenderer
{ {
return true; return true;
} }
// copy and modifiy a bit from net.minecraft.client.renderer.blockentity.ShulkerBoxRenderer.render
public void sbrender(ShulkerBoxBlockEntity shulkerBoxBlockEntity, float f, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, int j)
{
Direction direction = Direction.UP;
if (shulkerBoxBlockEntity.hasLevel())
{
BlockState blockState = shulkerBoxBlockEntity.getBlockState();
if (blockState.getBlock() instanceof ShulkerBoxBlock)
{
direction = blockState.getValue(ShulkerBoxBlock.FACING);
}
}
DyeColor dyeColor = shulkerBoxBlockEntity.getColor();
Material material;
if (dyeColor == null)
{
material = Sheets.DEFAULT_SHULKER_TEXTURE_LOCATION;
}
else
{
material = Sheets.SHULKER_TEXTURE_LOCATION.get(dyeColor.getId());
}
poseStack.pushPose();
poseStack.translate(0.5, 0.5, 0.5);
poseStack.scale(0.9995F, 0.9995F, 0.9995F);
poseStack.mulPose(direction.getRotation());
poseStack.scale(1.0F, -1.0F, -1.0F);
poseStack.translate(0.0, -1.0, 0.0);
ShulkerModel<?> model = VanillaClient.ShulkerBoxRenderer_model(client.getBlockEntityRenderDispatcher().getRenderer(shulkerBoxBlockEntity));
ModelPart modelPart = model.getLid();
modelPart.setPos(0.0F, 24.0F - shulkerBoxBlockEntity.getProgress(f) * 0.5F * 16.0F, 0.0F);
modelPart.yRot = 270.0F * shulkerBoxBlockEntity.getProgress(f) * (float) (Math.PI / 180.0);
VertexConsumer vertexConsumer = material.buffer(multiBufferSource, RenderType::entityCutoutNoCull);
model.renderToBuffer(poseStack, vertexConsumer, i, j, 0xffffffff);
poseStack.popPose();
}
} }
@@ -165,7 +165,7 @@ public class SystemInfo
put("world_gamerules", c -> { put("world_gamerules", c -> {
Map<Value, Value> rules = new HashMap<>(); Map<Value, Value> rules = new HashMap<>();
GameRules gameRules = c.level().getGameRules(); GameRules gameRules = c.level().getGameRules();
GameRules.visitGameRuleTypes(new GameRules.GameRuleTypeVisitor() gameRules.visitGameRuleTypes(new GameRules.GameRuleTypeVisitor()
{ {
@Override @Override
public <T extends GameRules.Value<T>> void visit(GameRules.Key<T> key, GameRules.Type<T> type) public <T extends GameRules.Value<T>> void visit(GameRules.Key<T> key, GameRules.Type<T> type)
@@ -25,8 +25,8 @@ import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.StringTag; import net.minecraft.nbt.StringTag;
import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket;
import net.minecraft.network.protocol.game.ClientboundSetExperiencePacket; import net.minecraft.network.protocol.game.ClientboundSetExperiencePacket;
import net.minecraft.network.protocol.game.ClientboundSetHeldSlotPacket;
import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket; import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket;
import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
@@ -457,7 +457,7 @@ public class EntityValue extends Value
put("scoreboard_tags", (e, a) -> ListValue.wrap(e.getTags().stream().map(StringValue::new))); put("scoreboard_tags", (e, a) -> ListValue.wrap(e.getTags().stream().map(StringValue::new)));
put("entity_tags", (e, a) -> { put("entity_tags", (e, a) -> {
EntityType<?> type = e.getType(); EntityType<?> type = e.getType();
return ListValue.wrap(e.getServer().registryAccess().registryOrThrow(Registries.ENTITY_TYPE).getTags().filter(entry -> entry.getSecond().stream().anyMatch(h -> h.value() == type)).map(entry -> ValueConversions.of(entry.getFirst()))); return ListValue.wrap(e.getServer().registryAccess().registryOrThrow(Registries.ENTITY_TYPE).getTags().filter(entry -> entry.stream().anyMatch(h -> h.value() == type)).map(entry -> ValueConversions.of(entry)));
}); });
// deprecated // deprecated
put("has_tag", (e, a) -> BooleanValue.of(e.getTags().contains(a.getString()))); put("has_tag", (e, a) -> BooleanValue.of(e.getTags().contains(a.getString())));
@@ -1019,7 +1019,7 @@ public class EntityValue extends Value
if (e instanceof ServerPlayer player) if (e instanceof ServerPlayer player)
{ {
int slot = NumericValue.asNumber(v).getInt(); int slot = NumericValue.asNumber(v).getInt();
player.connection.send(new ClientboundSetCarriedItemPacket(slot)); player.connection.send(new ClientboundSetHeldSlotPacket(slot));
} }
}); });
@@ -10,6 +10,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.advancements.critereon.MinMaxBounds; import net.minecraft.advancements.critereon.MinMaxBounds;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.GlobalPos; import net.minecraft.core.GlobalPos;
import net.minecraft.core.HolderSet;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.core.Vec3i; import net.minecraft.core.Vec3i;
@@ -189,6 +190,11 @@ public class ValueConversions
return of(tagKey.location()); return of(tagKey.location());
} }
public static Value of(HolderSet.Named<?> tagKey)
{
return of(tagKey.key().location());
}
public static Value of(@Nullable ResourceLocation id) public static Value of(@Nullable ResourceLocation id)
{ {
if (id == null) // should be Value.NULL if (id == null) // should be Value.NULL
+2 -2
View File
@@ -9,8 +9,8 @@ import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.PathfinderMob;
import net.minecraft.world.entity.ai.goal.RandomStrollGoal; import net.minecraft.world.entity.ai.goal.RandomStrollGoal;
import net.minecraft.world.entity.ai.util.DefaultRandomPos; import net.minecraft.world.entity.ai.util.DefaultRandomPos;
@@ -75,7 +75,7 @@ public class BlockInfo
private static Component wander_chances(BlockPos pos, ServerLevel worldIn) private static Component wander_chances(BlockPos pos, ServerLevel worldIn)
{ {
PathfinderMob creature = new ZombifiedPiglin(EntityType.ZOMBIFIED_PIGLIN, worldIn); PathfinderMob creature = new ZombifiedPiglin(EntityType.ZOMBIFIED_PIGLIN, worldIn);
creature.finalizeSpawn(worldIn, worldIn.getCurrentDifficultyAt(pos), MobSpawnType.NATURAL, null); creature.finalizeSpawn(worldIn, worldIn.getCurrentDifficultyAt(pos), EntitySpawnReason.NATURAL, null);
creature.moveTo(pos, 0.0F, 0.0F); creature.moveTo(pos, 0.0F, 0.0F);
RandomStrollGoal wander = new RandomStrollGoal(creature, 0.8D); RandomStrollGoal wander = new RandomStrollGoal(creature, 0.8D);
int success = 0; int success = 0;
@@ -6,10 +6,10 @@ import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.tags.FluidTags; import net.minecraft.tags.FluidTags;
import net.minecraft.world.entity.AgeableMob; import net.minecraft.world.entity.AgeableMob;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.entity.SpawnPlacements; import net.minecraft.world.entity.SpawnPlacements;
import net.minecraft.world.entity.ambient.AmbientCreature; import net.minecraft.world.entity.ambient.AmbientCreature;
import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.animal.WaterAnimal;
@@ -179,8 +179,8 @@ public class PerimeterDiagnostics
if (SpawnPlacements.isSpawnPositionOk(sle.type, worldServer, pos)) if (SpawnPlacements.isSpawnPositionOk(sle.type, worldServer, pos))
{ {
el.moveTo(pos.getX() + 0.5F, pos.getY(), pos.getZ()+0.5F, 0.0F, 0.0F); el.moveTo(pos.getX() + 0.5F, pos.getY(), pos.getZ()+0.5F, 0.0F, 0.0F);
return el.checkSpawnObstruction(worldServer) && el.checkSpawnRules(worldServer, MobSpawnType.NATURAL) && return el.checkSpawnObstruction(worldServer) && el.checkSpawnRules(worldServer, EntitySpawnReason.NATURAL) &&
SpawnPlacements.checkSpawnRules(el.getType(),(ServerLevel)el.getCommandSenderWorld(), MobSpawnType.NATURAL, el.blockPosition(), el.getCommandSenderWorld().random) && SpawnPlacements.checkSpawnRules(el.getType(),(ServerLevel)el.getCommandSenderWorld(), EntitySpawnReason.NATURAL, el.blockPosition(), el.getCommandSenderWorld().random) &&
worldServer.noCollision(el); // check collision rules once they stop fiddling with them after 1.14.1 worldServer.noCollision(el); // check collision rules once they stop fiddling with them after 1.14.1
} }
return false; return false;
@@ -13,11 +13,11 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.tags.BlockTags; import net.minecraft.tags.BlockTags;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.entity.SpawnPlacements; import net.minecraft.world.entity.SpawnPlacements;
import net.minecraft.world.entity.animal.Ocelot; import net.minecraft.world.entity.animal.Ocelot;
import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.DyeColor;
@@ -421,7 +421,7 @@ public class SpawnReporter
Mob mob; Mob mob;
try try
{ {
mob = (Mob) spawnEntry.type.create(worldIn); mob = (Mob) spawnEntry.type.create(worldIn, EntitySpawnReason.NATURAL);
} }
catch (Exception e) catch (Exception e)
{ {
@@ -443,9 +443,9 @@ public class SpawnReporter
for (int i = 0; i < 20; ++i) for (int i = 0; i < 20; ++i)
{ {
if ( if (
SpawnPlacements.checkSpawnRules(etype,worldIn, MobSpawnType.NATURAL, pos, worldIn.random) && SpawnPlacements.checkSpawnRules(etype,worldIn, EntitySpawnReason.NATURAL, pos, worldIn.random) &&
SpawnPlacements.isSpawnPositionOk(etype, worldIn, pos) && SpawnPlacements.isSpawnPositionOk(etype, worldIn, pos) &&
mob.checkSpawnRules(worldIn, MobSpawnType.NATURAL) mob.checkSpawnRules(worldIn, EntitySpawnReason.NATURAL)
// && mob.canSpawn(worldIn) // entity collisions // mostly - except ocelots // && mob.canSpawn(worldIn) // entity collisions // mostly - except ocelots
) )
{ {
@@ -459,7 +459,7 @@ public class SpawnReporter
willSpawn += 1; willSpawn += 1;
} }
} }
mob.finalizeSpawn(worldIn, worldIn.getCurrentDifficultyAt(mob.blockPosition()), MobSpawnType.NATURAL, null); mob.finalizeSpawn(worldIn, worldIn.getCurrentDifficultyAt(mob.blockPosition()), EntitySpawnReason.NATURAL, null);
// the code invokes onInitialSpawn after getCanSpawHere // the code invokes onInitialSpawn after getCanSpawHere
fits = fits && worldIn.noCollision(mob); fits = fits && worldIn.noCollision(mob);
@@ -467,7 +467,7 @@ public class SpawnReporter
try try
{ {
mob = (Mob) spawnEntry.type.create(worldIn); mob = (Mob) spawnEntry.type.create(worldIn, EntitySpawnReason.NATURAL);
} }
catch (Exception e) catch (Exception e)
{ {
+1 -1
View File
@@ -2,7 +2,6 @@ accessWidener v1 named
accessible class net/minecraft/server/level/ChunkMap$DistanceManager accessible class net/minecraft/server/level/ChunkMap$DistanceManager
accessible class net/minecraft/server/level/ThreadedLevelLightEngine$TaskType accessible class net/minecraft/server/level/ThreadedLevelLightEngine$TaskType
accessible class net/minecraft/world/item/crafting/Ingredient$Value
accessible class net/minecraft/world/level/lighting/BlockLightSectionStorage$BlockDataLayerStorageMap accessible class net/minecraft/world/level/lighting/BlockLightSectionStorage$BlockDataLayerStorageMap
accessible class net/minecraft/world/level/border/WorldBorder$BorderExtent accessible class net/minecraft/world/level/border/WorldBorder$BorderExtent
accessible class net/minecraft/world/level/border/WorldBorder$StaticBorderExtent accessible class net/minecraft/world/level/border/WorldBorder$StaticBorderExtent
@@ -12,6 +11,7 @@ accessible class net/minecraft/world/level/block/entity/SculkSensorBlockEntity$V
#TODO fields and methods should be fetched via interfaces unless there is a good reason not to #TODO fields and methods should be fetched via interfaces unless there is a good reason not to
accessible method net/minecraft/world/level/border/WorldBorder getListeners ()Ljava/util/List; accessible method net/minecraft/world/level/border/WorldBorder getListeners ()Ljava/util/List;
accessible method net/minecraft/world/level/redstone/DefaultRedstoneWireEvaluator calculateTargetStrength (Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)I
accessible method net/minecraft/server/level/DistanceManager purgeStaleTickets ()V accessible method net/minecraft/server/level/DistanceManager purgeStaleTickets ()V
#cause I don't want to deal with the interfaces until stuff is stable #cause I don't want to deal with the interfaces until stuff is stable
+5 -3
View File
@@ -139,7 +139,8 @@
"MerchantResultSlot_scarpetEventMixin", "MerchantResultSlot_scarpetEventMixin",
"AbstractContainerMenu_scarpetMixin", "AbstractContainerMenu_scarpetMixin",
"AbstractContainerMenuSubclasses_scarpetMixin", "AbstractContainerMenuSubclasses_scarpetMixin",
"RecipeBookMenu_scarpetMixin", "AbstractCraftingMenu_scarpetMixin",
"AbstractFurnaceMenu_scarpetMixin",
"DistanceManager_scarpetMixin", "DistanceManager_scarpetMixin",
"PoiRecord_scarpetMixin", "PoiRecord_scarpetMixin",
"ServerLevel_scarpetMixin", "ServerLevel_scarpetMixin",
@@ -150,7 +151,6 @@
"CommandDispatcher_scarpetCommandsMixin", "CommandDispatcher_scarpetCommandsMixin",
"RecipeManager_scarpetMixin", "RecipeManager_scarpetMixin",
"Ingredient_scarpetMixin",
"BlockInput_scarpetMixin", "BlockInput_scarpetMixin",
"BlockPredicate_scarpetMixin", "BlockPredicate_scarpetMixin",
"TagPredicate_scarpetMixin", "TagPredicate_scarpetMixin",
@@ -180,19 +180,21 @@
"ChestBlock_customStickyMixin", "ChestBlock_customStickyMixin",
"PistonStructureResolver_customStickyMixin", "PistonStructureResolver_customStickyMixin",
"DefaultRedstoneWireEvaluator_redstoneMixin",
"CustomPacketPayload_networkStuffMixin", "CustomPacketPayload_networkStuffMixin",
"ServerGamePacketListenerimpl_connectionMixin" "ServerGamePacketListenerimpl_connectionMixin"
], ],
"client": [ "client": [
"Minecraft_tickMixin", "Minecraft_tickMixin",
"ShulkerBoxAccessMixin",
"MinecraftMixin", "MinecraftMixin",
"Gui_tablistMixin", "Gui_tablistMixin",
"PlayerTabOverlayMixin", "PlayerTabOverlayMixin",
"PistonHeadRenderer_movableBEMixin", "PistonHeadRenderer_movableBEMixin",
"StructureBlockRenderer_mixin", "StructureBlockRenderer_mixin",
"ClientPacketListener_clientCommandMixin", "ClientPacketListener_clientCommandMixin",
"ClientPacketListener_explosionMixin",
"LevelRenderer_fogOffMixin", "LevelRenderer_fogOffMixin",
"LevelRenderer_creativeNoClipMixin", "LevelRenderer_creativeNoClipMixin",
"ClientPacketListener_customPacketsMixin", "ClientPacketListener_customPacketsMixin",