From e021ca39b2ec0d3033e3e7b0b00d0f7814e260c5 Mon Sep 17 00:00:00 2001 From: gnembon Date: Sun, 28 Jul 2019 09:01:30 -0300 Subject: [PATCH 1/3] added breeding tracking --- .../java/carpet/helpers/ParticleDisplay.java | 73 +++++++++++++++++ .../logHelpers/PathfindingVisualizer.java | 64 ++------------- .../carpet/mixins/VillagerEntity_aiMixin.java | 78 ++++++++++++++++++- src/main/java/carpet/utils/MobAI.java | 5 +- 4 files changed, 158 insertions(+), 62 deletions(-) create mode 100644 src/main/java/carpet/helpers/ParticleDisplay.java diff --git a/src/main/java/carpet/helpers/ParticleDisplay.java b/src/main/java/carpet/helpers/ParticleDisplay.java new file mode 100644 index 00000000..38f50a52 --- /dev/null +++ b/src/main/java/carpet/helpers/ParticleDisplay.java @@ -0,0 +1,73 @@ +package carpet.helpers; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.command.arguments.ParticleArgumentType; +import net.minecraft.particle.ParticleEffect; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.Vec3d; + +import java.util.HashMap; +import java.util.Map; + +public class ParticleDisplay +{ + private static Map particleCache = new HashMap<>(); + + private static ParticleEffect parseParticle(String name) + { + try + { + return ParticleArgumentType.readParameters(new StringReader(name)); + } + catch (CommandSyntaxException e) + { + throw new RuntimeException("No such particle: "+name); + } + } + private static ParticleEffect getEffect(String name) + { + if (name == null) return null; + ParticleEffect res = particleCache.get(name); + if (res != null) return res; + particleCache.put(name, parseParticle(name)); + return particleCache.get(name); + } + + public static void drawParticleLine(ServerPlayerEntity player, Vec3d from, Vec3d to,String main) + { + drawParticleLine(player, from, to, main, null, 1, 0.0); + } + + public static void drawParticleLine(ServerPlayerEntity player, Vec3d from, Vec3d to, String main, String accent, int count, double spread) + { + ParticleEffect accentParticle = getEffect(accent); + ParticleEffect mainParticle = getEffect(main); + + if (accentParticle != null) ((ServerWorld)player.world).spawnParticles( + player, + accentParticle, + true, + to.x, to.y, to.z, count, + spread, spread, spread, 0.0); + + double lineLengthSq = from.squaredDistanceTo(to); + if (lineLengthSq == 0) return; + + Vec3d incvec = to.subtract(from).normalize();// multiply(50/sqrt(lineLengthSq)); + int pcount = 0; + for (Vec3d delta = new Vec3d(0.0,0.0,0.0); + delta.lengthSquared() optional_1 = this.brain.getOptionalMemory(MemoryModuleType.GOLEM_LAST_SEEN_TIME); @@ -58,8 +83,57 @@ public abstract class VillagerEntity_aiMixin extends AbstractTraderEntity (recentlySeen?"rb ":"lb ")+time )); this.setCustomNameVisible(true); } + else if (MobAI.isTracking(this, MobAI.TrackingType.VILLAGER_BREEDING)) + { + if (age % 50 == 0 || age < 20) + { + totalFood = getAvailableFood() / 12; + hasBed = this.brain.getOptionalMemory(MemoryModuleType.HOME).isPresent(); + displayAge = getBreedingAge(); + + } + if (Math.abs(displayAge) < 100 && displayAge !=0) displayAge = getBreedingAge(); + + this.setCustomName(Messenger.c( + (hasBed?"eb ":"fb ")+"\u263d ", + (totalFood>0?"eb ":"fb ")+"\u2668",(totalFood>0?"e ":"f ")+totalFood+" ", + (displayAge==0?"eb ":"fb ")+"\u2661",(displayAge==0?"e ":"f ")+displayAge+"" + )); + this.setCustomNameVisible(true); + } } + @Inject(method = "interactMob", at = @At("HEAD"), cancellable = true) + private void onInteract(PlayerEntity playerEntity_1, Hand hand_1, CallbackInfoReturnable cir) + { + if (MobAI.isTracking(this, MobAI.TrackingType.VILLAGER_BREEDING)) + { + ItemStack itemStack_1 = playerEntity_1.getStackInHand(hand_1); + if (itemStack_1.getItem() == Items.EMERALD) + { + GlobalPos bedPos = this.brain.getOptionalMemory(MemoryModuleType.HOME).orElse(null); + if (bedPos == null || bedPos.getDimension() != dimension) + { + sayNo(); + ((ServerWorld) getEntityWorld()).spawnParticles(ParticleTypes.BARRIER, x, y + getStandingEyeHeight() + 1, z, 1, 0.1, 0.1, 0.1, 0.0); + } + else + { + + ParticleDisplay.drawParticleLine((ServerPlayerEntity) playerEntity_1, getPos(), new Vec3d(bedPos.getPos()).add(0.5, 0.5, 0.5), "dust 0 0 0 1", "happy_villager", 100, 0.2); + } + } + else if (itemStack_1.getItem() == Items.ROTTEN_FLESH) + { + while(getAvailableFood() >= 12) eatForBreeding(); + + } + cir.setReturnValue(false); + cir.cancel(); + } + } + + @Inject(method = "summonGolem", at = @At( value = "INVOKE", target = "Lnet/minecraft/util/math/Box;expand(DDD)Lnet/minecraft/util/math/Box;", @@ -67,7 +141,7 @@ public abstract class VillagerEntity_aiMixin extends AbstractTraderEntity )) private void particleIt(long long_1, int int_1, CallbackInfo ci) { - if (MobAI.isTracking(this, MobAI.TrackingType.IRON_GOLEM_SPAWNING) && !getEntityWorld().isClient()) + if (MobAI.isTracking(this, MobAI.TrackingType.IRON_GOLEM_SPAWNING)) { ((ServerWorld) getEntityWorld()).spawnParticles(ParticleTypes.BARRIER, x, y+3, z, 1, 0.1, 0.1, 0.1, 0.0); } diff --git a/src/main/java/carpet/utils/MobAI.java b/src/main/java/carpet/utils/MobAI.java index 76f94401..7e173e65 100644 --- a/src/main/java/carpet/utils/MobAI.java +++ b/src/main/java/carpet/utils/MobAI.java @@ -25,6 +25,8 @@ public class MobAI public static boolean isTracking(Entity e, TrackingType type) { + if (e.getEntityWorld().isClient()) + return false; Set currentTrackers = aiTrackers.get(e.getType()); if (currentTrackers == null) return false; @@ -72,7 +74,8 @@ public class MobAI public enum TrackingType { - IRON_GOLEM_SPAWNING("iron_golem_spawning", Sets.newHashSet(EntityType.VILLAGER)); + IRON_GOLEM_SPAWNING("iron_golem_spawning", Sets.newHashSet(EntityType.VILLAGER)), + VILLAGER_BREEDING("villager_breeding", Sets.newHashSet(EntityType.VILLAGER)); public Set types; public String name; TrackingType(String name, Set applicableTypes) From f393a36eaae3a974803c74a9febbd559cea942b0 Mon Sep 17 00:00:00 2001 From: gnembon Date: Sun, 28 Jul 2019 12:29:02 -0300 Subject: [PATCH 2/3] ghost blocks fix --- gradle.properties | 2 +- ...erInteractionManager_ghostBlocksMixin.java | 48 +++++++++++++++++++ ...erInteractionManager_ghostBlocksMixin.java | 27 +++++++++-- .../java/carpet/settings/CarpetSettings.java | 4 +- src/main/resources/carpet.mixins.json | 4 ++ src/main/resources/fabric.mod.json | 4 +- 6 files changed, 79 insertions(+), 10 deletions(-) create mode 100644 src/main/java/carpet/mixins/ClientPlayerInteractionManager_ghostBlocksMixin.java diff --git a/gradle.properties b/gradle.properties index 9b00f21b..e2d3c9cc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.4.8+build.155 # Mod Properties - mod_version = 1.0.1+v190726 + mod_version = 1.0.2+v190728 maven_group = carpet archives_base_name = fabric-carpet diff --git a/src/main/java/carpet/mixins/ClientPlayerInteractionManager_ghostBlocksMixin.java b/src/main/java/carpet/mixins/ClientPlayerInteractionManager_ghostBlocksMixin.java new file mode 100644 index 00000000..890db547 --- /dev/null +++ b/src/main/java/carpet/mixins/ClientPlayerInteractionManager_ghostBlocksMixin.java @@ -0,0 +1,48 @@ +package carpet.mixins; + + +import carpet.settings.CarpetSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerInteractionManager; +import net.minecraft.server.network.packet.PlayerInteractBlockC2SPacket; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.IWorld; +import org.spongepowered.asm.mixin.Final; +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.Redirect; + +@Mixin(ClientPlayerInteractionManager.class) +public abstract class ClientPlayerInteractionManager_ghostBlocksMixin +{ + + @Shadow @Final private MinecraftClient client; + + @Redirect(method = "breakBlock", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/Block;onBroken(Lnet/minecraft/world/IWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)V") + ) + private void requestServerStatusForBlock(Block block, IWorld iWorld_1, BlockPos blockPos_1, BlockState blockState_1) { + if ((CarpetSettings.miningGhostBlockFix || ( + !client.isInSingleplayer() && + !client.isIntegratedServerRunning() && + client.getNetworkHandler().getCommandDispatcher().getRoot().getChild("carpet") == null)) && + blockState_1.getHardness(client.world, blockPos_1) > 0.0 && + blockState_1.getCollisionShape(iWorld_1, blockPos_1) != VoxelShapes.empty() + ) + { + client.getNetworkHandler().sendPacket(new PlayerInteractBlockC2SPacket( + Hand.MAIN_HAND, + new BlockHitResult(new Vec3d(blockPos_1), Direction.DOWN, blockPos_1, false) + )); + } + } +} \ No newline at end of file diff --git a/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java b/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java index 09552f0c..bb2377b5 100644 --- a/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java +++ b/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java @@ -3,21 +3,23 @@ package carpet.mixins; import carpet.settings.CarpetSettings; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerInteractionManager; import net.minecraft.server.network.packet.PlayerActionC2SPacket; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.BlockView; 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.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; import org.spongepowered.asm.mixin.injection.Redirect; //needs tests, WIP @Mixin(ServerPlayerInteractionManager.class) public class ServerPlayerInteractionManager_ghostBlocksMixin { + @Shadow public ServerPlayerEntity player; + @Redirect(method = "method_14263", at = @At( value = "INVOKE", target = "Lnet/minecraft/block/BlockState;calcBlockBreakingDelta(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;)F") @@ -27,12 +29,21 @@ public class ServerPlayerInteractionManager_ghostBlocksMixin // main args BlockPos blockPos_1a, PlayerActionC2SPacket.Action playerActionC2SPacket$Action_1, Direction direction_1, int int_1) { - if (CarpetSettings.miningGhostBlockFix && playerActionC2SPacket$Action_1 == PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK) + float progress = blockState.calcBlockBreakingDelta(playerEntity_1, blockView_1, blockPos_1); + if (CarpetSettings.miningGhostBlockFix && + (playerActionC2SPacket$Action_1 == PlayerActionC2SPacket.Action.START_DESTROY_BLOCK) && + !playerEntity_1.onGround && + progress >= 0.2 + ) + return progress*5; + if (CarpetSettings.miningGhostBlockFix && + (playerActionC2SPacket$Action_1 == PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK) + ) return 1.0f; - return blockState.calcBlockBreakingDelta(playerEntity_1, blockView_1, blockPos_1); + return progress; } - + /* @ModifyConstant(method = "method_14263", constant = @Constant(doubleValue = 36D)) private double addDistance(double original) { @@ -40,4 +51,10 @@ public class ServerPlayerInteractionManager_ghostBlocksMixin return 1024D; return original; } + @Inject(method = "method_14263", at = @At("HEAD")) + private void logAction(BlockPos blockPos_1, PlayerActionC2SPacket.Action playerActionC2SPacket$Action_1, Direction direction_1, int int_1, CallbackInfo ci) + { + CarpetSettings.LOG.error("Got action: "+playerActionC2SPacket$Action_1+"("+int_1+")"); + } + */ } diff --git a/src/main/java/carpet/settings/CarpetSettings.java b/src/main/java/carpet/settings/CarpetSettings.java index 7fe5cfaa..e0017634 100644 --- a/src/main/java/carpet/settings/CarpetSettings.java +++ b/src/main/java/carpet/settings/CarpetSettings.java @@ -26,7 +26,7 @@ import static carpet.settings.RuleCategory.SURVIVAL; public class CarpetSettings { - public static final String carpetVersion = "1.0.1-v190726"; + public static final String carpetVersion = "1.0.2-v190728"; public static final Logger LOG = LogManager.getLogger(); public static boolean skipGenerationChecks = false; public static boolean impendingFillSkipUpdates = false; @@ -229,7 +229,7 @@ public class CarpetSettings @Rule(desc = "smooth client animations with low tps settings", extra = "works only in SP, and will slow down players", category = CREATIVE) public static boolean smoothClientAnimations; - //@Rule(desc="Fixes mining ghost blocks by allowing ANY mining speed from clients", category = SURVIVAL) + @Rule(desc="Fixes mining ghost blocks by allowing ANY mining speed from clients", category = SURVIVAL) public static boolean miningGhostBlockFix; private static class PushLimitLimits extends Validator { diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index e3c56c81..6dd81eaa 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -87,6 +87,8 @@ "PlayerEntity_horseFixMixin", + "ServerPlayerInteractionManager_ghostBlocksMixin", + "HopperBlockEntityMixin", "ContainerMixin", "ClientConnectionMixin", @@ -128,6 +130,8 @@ "InGameHudMixin", "PlayerListHudMixin", + "ClientPlayerInteractionManager_ghostBlocksMixin", + "BlockEntityRenderDispatcher_movableTEMixin", "PistonBlockEntityRenderer_movableTEMixin" ], diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 4617f22d..9d9a583c 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "id": "carpet", - "version": "1.0.1", + "version": "1.0.2", "name": "Carpet Mod in Fabric", "description": "Carpet made out of fabric", @@ -25,7 +25,7 @@ "carpet.mixins.json" ], - "requires": { + "depends": { "fabricloader": ">=0.4.0" }, "suggests": { From 2e3cb4f7c94fbb484feb93a5a89551a3cd716068 Mon Sep 17 00:00:00 2001 From: gnembon Date: Sun, 28 Jul 2019 12:32:11 -0300 Subject: [PATCH 3/3] ghost blocks fix --- src/main/java/carpet/utils/MobAI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/carpet/utils/MobAI.java b/src/main/java/carpet/utils/MobAI.java index 7e173e65..0a202b16 100644 --- a/src/main/java/carpet/utils/MobAI.java +++ b/src/main/java/carpet/utils/MobAI.java @@ -75,7 +75,7 @@ public class MobAI public enum TrackingType { IRON_GOLEM_SPAWNING("iron_golem_spawning", Sets.newHashSet(EntityType.VILLAGER)), - VILLAGER_BREEDING("villager_breeding", Sets.newHashSet(EntityType.VILLAGER)); + VILLAGER_BREEDING("breeding", Sets.newHashSet(EntityType.VILLAGER)); public Set types; public String name; TrackingType(String name, Set applicableTypes)