From cae7efdf4b0bec78b0a7a28e2e493e0feb8126ca Mon Sep 17 00:00:00 2001 From: gnembon Date: Mon, 22 Jul 2019 03:37:14 -0300 Subject: [PATCH 01/10] profile expression --- src/main/java/carpet/script/Expression.java | 14 ++++++++++++++ src/main/java/carpet/script/value/BlockValue.java | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/carpet/script/Expression.java b/src/main/java/carpet/script/Expression.java index 469d65fe..128f89ff 100644 --- a/src/main/java/carpet/script/Expression.java +++ b/src/main/java/carpet/script/Expression.java @@ -2527,6 +2527,20 @@ public class Expression implements Cloneable return (cc, tt) -> time; }); + addLazyFunction("profile_expr", 1, (c, t, lv) -> + { + LazyValue lazy = lv.get(0); + long end = System.nanoTime()+50000000L; + long it = 0; + while (System.nanoTime() res; + }); + addLazyFunction("var", 1, (c, t, lv) -> { String varname = lv.get(0).evalValue(c).getString(); if (!c.isAVariable(varname)) diff --git a/src/main/java/carpet/script/value/BlockValue.java b/src/main/java/carpet/script/value/BlockValue.java index 11073e6b..a6277555 100644 --- a/src/main/java/carpet/script/value/BlockValue.java +++ b/src/main/java/carpet/script/value/BlockValue.java @@ -208,7 +208,7 @@ public class BlockValue extends Value data = be.toTag(tag); return data; } - throw new InternalExpressionException("Attemted to fetch block data without world or stored block data"); + return null; } From 465eb44315855ad5bb3d5c840fd659d89be9c93f Mon Sep 17 00:00:00 2001 From: gnembon Date: Tue, 23 Jul 2019 13:07:08 -0300 Subject: [PATCH 02/10] fixed tnt logging not working --- src/main/java/carpet/mixins/TntEntityMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/carpet/mixins/TntEntityMixin.java b/src/main/java/carpet/mixins/TntEntityMixin.java index 8818cc8d..fb120b2b 100644 --- a/src/main/java/carpet/mixins/TntEntityMixin.java +++ b/src/main/java/carpet/mixins/TntEntityMixin.java @@ -17,7 +17,7 @@ import carpet.logging.logHelpers.TNTLogHelper; @Mixin(TntEntity.class) public abstract class TntEntityMixin extends Entity { - private TNTLogHelper logHelper = null; + private TNTLogHelper logHelper; public TntEntityMixin(EntityType entityType_1, World world_1) { From afb80b62b42e2a51220a7b02b8f9b37a16323541 Mon Sep 17 00:00:00 2001 From: gnembon Date: Thu, 25 Jul 2019 01:11:44 -0300 Subject: [PATCH 03/10] fixed mob spawning in negative space --- src/main/java/carpet/mixins/SpawnHelperMixin.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/carpet/mixins/SpawnHelperMixin.java b/src/main/java/carpet/mixins/SpawnHelperMixin.java index dba85845..af352d57 100644 --- a/src/main/java/carpet/mixins/SpawnHelperMixin.java +++ b/src/main/java/carpet/mixins/SpawnHelperMixin.java @@ -11,6 +11,7 @@ import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.SpawnHelper; @@ -43,9 +44,15 @@ public class SpawnHelperMixin if (CarpetSettings.lagFreeSpawning) { BlockPos.Mutable blockpos = new BlockPos.Mutable(); - for (int y = (int)bb.minY, maxy = (int)Math.ceil(bb.maxY); y < maxy; y++) - for (int x = (int)bb.minX, maxx = (int)Math.ceil(bb.maxX); x < maxx; x++) - for (int z = (int)bb.minZ, maxz = (int)Math.ceil(bb.maxZ); z < maxz; z++) + int minX = MathHelper.floor(bb.minX); + int maxX = MathHelper.ceil(bb.maxX); + int minY = MathHelper.floor(bb.minY); + int maxY = MathHelper.ceil(bb.maxY); + int minZ = MathHelper.floor(bb.minZ); + int maxZ = MathHelper.ceil(bb.maxZ); + for (int y = minY; y < maxY; y++) + for (int x = minX; x < maxX; x++) + for (int z = minZ; z < maxZ; z++) { blockpos.set(x, y, z); VoxelShape box = world.getBlockState(blockpos).getCollisionShape(world, blockpos); From 32dc6b17e870a263763232201939a3cace2fa785 Mon Sep 17 00:00:00 2001 From: gnembon Date: Thu, 25 Jul 2019 09:08:51 -0300 Subject: [PATCH 04/10] entity events --- .../java/carpet/fakes/EntityInterface.java | 9 ++++++ .../mixins/Entity_scarpetEventsMixin.java | 30 +++++++++++++++++++ .../LivingEntity_scarpetEventsMixin.java | 23 ++++++++++++++ .../java/carpet/script/CarpetEventServer.java | 22 ++++++++++++++ .../java/carpet/script/CarpetExpression.java | 15 ++++++++++ src/main/java/carpet/script/Fluff.java | 3 ++ .../java/carpet/script/value/EntityValue.java | 17 +++++++++++ 7 files changed, 119 insertions(+) create mode 100644 src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java create mode 100644 src/main/java/carpet/mixins/LivingEntity_scarpetEventsMixin.java diff --git a/src/main/java/carpet/fakes/EntityInterface.java b/src/main/java/carpet/fakes/EntityInterface.java index deb9a033..6b4a4d0f 100644 --- a/src/main/java/carpet/fakes/EntityInterface.java +++ b/src/main/java/carpet/fakes/EntityInterface.java @@ -1,6 +1,15 @@ package carpet.fakes; +import carpet.script.CarpetContext; +import carpet.script.CarpetEventServer; +import carpet.script.ScriptHost; + public interface EntityInterface { float getMainYaw(float partialTicks); + //scarpet part + void onDeathCallback(String reason); + void setDeathCallback(CarpetContext cc, String function); + void onDamageCallback(); + void setDamageCallback(CarpetEventServer.ScheduledCall call); } diff --git a/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java b/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java new file mode 100644 index 00000000..0ee90509 --- /dev/null +++ b/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java @@ -0,0 +1,30 @@ +package carpet.mixins; + +import carpet.CarpetServer; +import carpet.fakes.EntityInterface; +import carpet.script.CarpetContext; +import carpet.script.CarpetEventServer; +import carpet.script.ScriptHost; +import carpet.settings.CarpetSettings; +import net.minecraft.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(Entity.class) +public abstract class Entity_scarpetEventsMixin implements EntityInterface +{ + private CarpetEventServer.ScheduledCall deathCall; + @Override + public void onDeathCallback(String reason) + { + if (deathCall != null) + { + CarpetServer.scriptServer.events.onEntityDeath(deathCall, (Entity)(Object)this, reason); + } + } + + @Override + public void setDeathCallback(CarpetContext cc, String function) + { + deathCall = CarpetServer.scriptServer.events.makeDeathCall(cc, function); + } +} diff --git a/src/main/java/carpet/mixins/LivingEntity_scarpetEventsMixin.java b/src/main/java/carpet/mixins/LivingEntity_scarpetEventsMixin.java new file mode 100644 index 00000000..ee51d29e --- /dev/null +++ b/src/main/java/carpet/mixins/LivingEntity_scarpetEventsMixin.java @@ -0,0 +1,23 @@ +package carpet.mixins; + +import carpet.fakes.EntityInterface; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.world.World; +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(LivingEntity.class) +public abstract class LivingEntity_scarpetEventsMixin +{ + + @Inject(method = "onDeath", at = @At("HEAD")) + private void onDeathCall(DamageSource damageSource_1, CallbackInfo ci) + { + ((EntityInterface)this).onDeathCallback(damageSource_1.name); + } +} diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index 4fcf43d4..e4b0fd0e 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -6,6 +6,7 @@ import carpet.script.value.EntityValue; import carpet.script.value.ListValue; import carpet.script.value.NumericValue; import carpet.script.value.StringValue; +import carpet.settings.CarpetSettings; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.command.ServerCommandSource; @@ -74,6 +75,11 @@ public class CarpetEventServer { CarpetServer.scriptServer.runas(context_origin, context_source, host, udf, args); } + + public void execute(List args) + { + CarpetServer.scriptServer.runas(context_origin, context_source, host, udf, args); + } } public static class CallbackList @@ -347,4 +353,20 @@ public class CarpetEventServer { eventHandlers.get("player_stops_sprinting").call( () -> Arrays.asList(((c, t) -> new EntityValue(player))), player::getCommandSource); } + + public ScheduledCall makeDeathCall(CarpetContext cc, String function) + { + UserDefinedFunction udf = cc.host.globalFunctions.get(function); + if (udf == null || udf.getArguments().size() != 2) + { + // call won't match arguments + return null; + } + return new ScheduledCall(cc, function, null, 0); + } + + public void onEntityDeath(ScheduledCall call, Entity e, String reason) + { + call.execute( Arrays.asList( (c, t)-> new EntityValue(e), (c, t)-> new StringValue(reason))); + } } diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index 2fc5dad7..8bb4fb06 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -1804,6 +1804,21 @@ public class CarpetExpression ((EntityValue) v).set(what, ListValue.wrap(lv.subList(2, lv.size()).stream().map((vv) -> vv.evalValue(c)).collect(Collectors.toList()))); return lv.get(0); }); + + // or update + this.expr.addLazyFunction("entity_event", 3, (c, t, lv) -> + { + Value v = lv.get(0).evalValue(c); + if (!(v instanceof EntityValue)) + throw new InternalExpressionException("First argument to get should be an entity"); + String what = lv.get(1).evalValue(c).getString(); + Value functionValue = lv.get(2).evalValue(c); + String function = null; + if (!(functionValue instanceof NullValue)) + function = functionValue.getString(); + ((EntityValue) v).setEvent((CarpetContext)c, what, function); + return LazyValue.NULL; + }); } /** diff --git a/src/main/java/carpet/script/Fluff.java b/src/main/java/carpet/script/Fluff.java index 5cd29ad4..93b0ca60 100644 --- a/src/main/java/carpet/script/Fluff.java +++ b/src/main/java/carpet/script/Fluff.java @@ -12,6 +12,9 @@ public abstract class Fluff @FunctionalInterface public interface TriFunction { R apply(A a, B b, C c); } + @FunctionalInterface + public interface TriConsumer { void accept(A a, B b, C c); } + @FunctionalInterface public interface QuadFunction { R apply(A a, B b, C c, D d);} diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 0b5dab95..4c27b140 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -1,8 +1,12 @@ package carpet.script.value; +import carpet.fakes.EntityInterface; import carpet.fakes.MobEntityInterface; import carpet.helpers.Tracer; +import carpet.script.CarpetContext; +import carpet.script.Fluff; import carpet.script.exception.InternalExpressionException; +import carpet.settings.CarpetSettings; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.client.network.packet.EntityPositionS2CPacket; @@ -427,6 +431,7 @@ public class EntityValue extends Value private static void updateVelocity(Entity e) { + e.velocityModified = true; ((ServerWorld)e.getEntityWorld()).method_14178().sendToNearbyPlayers(e, new EntityVelocityUpdateS2CPacket(e)); } @@ -680,6 +685,7 @@ public class EntityValue extends Value } }); //requires mixing + // gamemode // spectate // "fire" @@ -697,4 +703,15 @@ public class EntityValue extends Value // "jump" // "nbt" <-big one, for now use run('data merge entity ... }}; + + public void setEvent(CarpetContext cc, String event, String fun) + { + if (!(events.containsKey(event))) + throw new InternalExpressionException("unknown entity event: " + event); + events.get(event).accept(cc, entity, fun); + } + + private static Map> events = new HashMap>() {{ + put("on_death", (c, e, f) -> { ((EntityInterface)e).setDeathCallback(c, f); }); + }}; } From 6505afdfdbaf88692cbea63903d54186898ca988 Mon Sep 17 00:00:00 2001 From: gnembon Date: Thu, 25 Jul 2019 14:10:01 -0300 Subject: [PATCH 05/10] better entity events, untested --- .../java/carpet/fakes/EntityInterface.java | 9 +++- .../mixins/Entity_scarpetEventsMixin.java | 32 +++++++++++- .../java/carpet/script/CarpetEventServer.java | 50 +++++++++++++++---- .../java/carpet/script/CarpetExpression.java | 22 +++++--- src/main/java/carpet/script/Fluff.java | 3 ++ .../java/carpet/script/value/EntityValue.java | 9 ++-- 6 files changed, 100 insertions(+), 25 deletions(-) diff --git a/src/main/java/carpet/fakes/EntityInterface.java b/src/main/java/carpet/fakes/EntityInterface.java index 6b4a4d0f..723e5425 100644 --- a/src/main/java/carpet/fakes/EntityInterface.java +++ b/src/main/java/carpet/fakes/EntityInterface.java @@ -3,13 +3,18 @@ package carpet.fakes; import carpet.script.CarpetContext; import carpet.script.CarpetEventServer; import carpet.script.ScriptHost; +import carpet.script.value.Value; + +import java.util.List; public interface EntityInterface { float getMainYaw(float partialTicks); //scarpet part void onDeathCallback(String reason); - void setDeathCallback(CarpetContext cc, String function); + void setDeathCallback(CarpetContext cc, String function, List extraArgs); void onDamageCallback(); - void setDamageCallback(CarpetEventServer.ScheduledCall call); + void setDamageCallback(CarpetContext cc, String function, List extraArgs); + void onRemovedCallback(); + void setRemovedCallback(CarpetContext cc, String function, List extraArgs); } diff --git a/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java b/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java index 0ee90509..bb798e6c 100644 --- a/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java +++ b/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java @@ -5,14 +5,26 @@ import carpet.fakes.EntityInterface; import carpet.script.CarpetContext; import carpet.script.CarpetEventServer; import carpet.script.ScriptHost; +import carpet.script.value.Value; import carpet.settings.CarpetSettings; import net.minecraft.entity.Entity; +import org.lwjgl.system.CallbackI; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; @Mixin(Entity.class) public abstract class Entity_scarpetEventsMixin implements EntityInterface { + @Shadow public boolean removed; private CarpetEventServer.ScheduledCall deathCall; + private CarpetEventServer.ScheduledCall removeCall; + + @Override public void onDeathCallback(String reason) { @@ -23,8 +35,24 @@ public abstract class Entity_scarpetEventsMixin implements EntityInterface } @Override - public void setDeathCallback(CarpetContext cc, String function) + public void setDeathCallback(CarpetContext cc, String function, List extraArgs) { - deathCall = CarpetServer.scriptServer.events.makeDeathCall(cc, function); + deathCall = CarpetServer.scriptServer.events.makeDeathCall(cc, function, extraArgs); + } + + @Override + public void setRemovedCallback(CarpetContext cc, String function, List extraArgs) + { + removeCall = CarpetServer.scriptServer.events.makeRemovedCall(cc, function, extraArgs); + } + + + @Inject(method = "remove", at = @At("HEAD")) + private void onRemove(CallbackInfo ci) + { + if (!removed && removeCall != null) + { + CarpetServer.scriptServer.events.onEntityRemoved(removeCall, (Entity)(Object)this); + } } } diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index e4b0fd0e..b0839442 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -6,6 +6,7 @@ import carpet.script.value.EntityValue; import carpet.script.value.ListValue; import carpet.script.value.NumericValue; import carpet.script.value.StringValue; +import carpet.script.value.Value; import carpet.settings.CarpetSettings; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundTag; @@ -34,6 +35,7 @@ import java.util.Map; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; public class CarpetEventServer { @@ -78,7 +80,15 @@ public class CarpetEventServer public void execute(List args) { - CarpetServer.scriptServer.runas(context_origin, context_source, host, udf, args); + if (this.args == null) + CarpetServer.scriptServer.runas(context_origin, context_source, host, udf, args); + else + { + List combinedArgs = new ArrayList<>(); + combinedArgs.addAll(args); + combinedArgs.addAll(this.args); + CarpetServer.scriptServer.runas(context_origin, context_source, host, udf, combinedArgs); + } } } @@ -221,6 +231,24 @@ public class CarpetEventServer return new Callback(null, funName); } + private ScheduledCall makeEventCall(CarpetContext cc, String function, List extraArgs, int argCount) + { + UserDefinedFunction udf = cc.host.globalFunctions.get(function); + if (udf == null || udf.getArguments().size() != argCount) + { + // call won't match arguments + return null; + } + List lazyArgs = null; + if (extraArgs != null) + { + lazyArgs = new ArrayList<>(); + for (Value v : extraArgs) + lazyArgs.add( (c, t) -> v); + } + return new ScheduledCall(cc, function, lazyArgs, 0); + } + public void onTick() { eventHandlers.get("tick").call(Collections::emptyList, CarpetServer.minecraft_server::getCommandSource); @@ -354,19 +382,23 @@ public class CarpetEventServer eventHandlers.get("player_stops_sprinting").call( () -> Arrays.asList(((c, t) -> new EntityValue(player))), player::getCommandSource); } - public ScheduledCall makeDeathCall(CarpetContext cc, String function) + public ScheduledCall makeDeathCall(CarpetContext cc, String function, List extraArgs) { - UserDefinedFunction udf = cc.host.globalFunctions.get(function); - if (udf == null || udf.getArguments().size() != 2) - { - // call won't match arguments - return null; - } - return new ScheduledCall(cc, function, null, 0); + return makeEventCall(cc, function, extraArgs, 2); } + public ScheduledCall makeRemovedCall(CarpetContext cc, String function, List extraArgs) + { + return makeEventCall(cc, function, extraArgs, 1); + } + public void onEntityDeath(ScheduledCall call, Entity e, String reason) { call.execute( Arrays.asList( (c, t)-> new EntityValue(e), (c, t)-> new StringValue(reason))); } + public void onEntityRemoved(ScheduledCall removeCall, Entity entity) + { + removeCall.execute(Collections.singletonList((c, t) -> new EntityValue(entity))); + } + } diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index 8bb4fb06..d6e9c534 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -3,7 +3,6 @@ package carpet.script; import carpet.CarpetServer; import carpet.fakes.MinecraftServerInterface; import carpet.helpers.FeatureGenerator; -import carpet.helpers.Tracer; import carpet.script.Fluff.TriFunction; import carpet.script.exception.CarpetExpressionException; import carpet.script.exception.ExpressionException; @@ -50,7 +49,6 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; import net.minecraft.particle.ParticleEffect; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.server.MinecraftServer; @@ -65,9 +63,6 @@ import net.minecraft.text.LiteralText; import net.minecraft.text.TranslatableText; import net.minecraft.util.Clearable; import net.minecraft.util.Identifier; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.EulerAngle; @@ -84,7 +79,7 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -1806,8 +1801,10 @@ public class CarpetExpression }); // or update - this.expr.addLazyFunction("entity_event", 3, (c, t, lv) -> + this.expr.addLazyFunction("entity_event", -1, (c, t, lv) -> { + if (lv.size()<3) + throw new InternalExpressionException("entity_event requires at least 3 arguments, entity, event to be handled, and function name, with optional arguments"); Value v = lv.get(0).evalValue(c); if (!(v instanceof EntityValue)) throw new InternalExpressionException("First argument to get should be an entity"); @@ -1816,7 +1813,16 @@ public class CarpetExpression String function = null; if (!(functionValue instanceof NullValue)) function = functionValue.getString(); - ((EntityValue) v).setEvent((CarpetContext)c, what, function); + List args = null; + if (lv.size()==4) + args = Collections.singletonList(lv.get(3).evalValue(c)); + else if (lv.size()>4) + { + args = new ArrayList<>(lv.subList(3, lv.size()).stream().map((vv) -> vv.evalValue(c)).collect(Collectors.toList())); + } + + ((EntityValue) v).setEvent((CarpetContext)c, what, function, args); + return LazyValue.NULL; }); } diff --git a/src/main/java/carpet/script/Fluff.java b/src/main/java/carpet/script/Fluff.java index 93b0ca60..77dc72b1 100644 --- a/src/main/java/carpet/script/Fluff.java +++ b/src/main/java/carpet/script/Fluff.java @@ -15,6 +15,9 @@ public abstract class Fluff @FunctionalInterface public interface TriConsumer { void accept(A a, B b, C c); } + @FunctionalInterface + public interface QuadConsumer { void accept(A a, B b, C c, D d); } + @FunctionalInterface public interface QuadFunction { R apply(A a, B b, C c, D d);} diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 4c27b140..7d5952ea 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -704,14 +704,15 @@ public class EntityValue extends Value // "nbt" <-big one, for now use run('data merge entity ... }}; - public void setEvent(CarpetContext cc, String event, String fun) + public void setEvent(CarpetContext cc, String event, String fun, List args) { if (!(events.containsKey(event))) throw new InternalExpressionException("unknown entity event: " + event); - events.get(event).accept(cc, entity, fun); + events.get(event).accept(cc, entity, fun, args); } - private static Map> events = new HashMap>() {{ - put("on_death", (c, e, f) -> { ((EntityInterface)e).setDeathCallback(c, f); }); + private static Map>> events = new HashMap>>() {{ + put("on_death", (c, e, f, l) -> ((EntityInterface)e).setDeathCallback(c, f, l)); + put("on_removed", (c, e, f, l) -> ((EntityInterface)e).setRemovedCallback(c, f, l)); }}; } From a4149282c693ea4b827aff9f279203bfba062955 Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 26 Jul 2019 04:29:12 -0300 Subject: [PATCH 06/10] fix in arg count --- src/main/java/carpet/script/CarpetEventServer.java | 2 +- src/main/java/carpet/settings/CarpetSettings.java | 2 +- src/main/resources/carpet.mixins.json | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index b0839442..507b2a48 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -234,7 +234,7 @@ public class CarpetEventServer private ScheduledCall makeEventCall(CarpetContext cc, String function, List extraArgs, int argCount) { UserDefinedFunction udf = cc.host.globalFunctions.get(function); - if (udf == null || udf.getArguments().size() != argCount) + if (udf == null || (udf.getArguments().size()-extraArgs.size()) != argCount) { // call won't match arguments return null; diff --git a/src/main/java/carpet/settings/CarpetSettings.java b/src/main/java/carpet/settings/CarpetSettings.java index 96767a49..e0b9d4a4 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.0-v190721"; + public static final String carpetVersion = "1.0.1-v190726"; public static final Logger LOG = LogManager.getLogger(); public static boolean skipGenerationChecks = false; public static boolean impendingFillSkipUpdates = false; diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index e137da04..e3c56c81 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -112,6 +112,9 @@ "PickaxeItem_missingToolsMixin", "ShearsItem_missingToolsMixin", + "Entity_scarpetEventsMixin", + "LivingEntity_scarpetEventsMixin", + "PistonBlock_movableTEMixin", "PistonBlockEntity_movableTEMixin", From 38459a8d11bbbe33d7a6ed4cb62ef871b9f2c7c5 Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 26 Jul 2019 14:56:12 -0300 Subject: [PATCH 07/10] mining ghost block restrictions --- ...erInteractionManager_ghostBlocksMixin.java | 31 +++++++++++++++++++ .../java/carpet/settings/CarpetSettings.java | 3 ++ src/main/resources/carpet.mixins.json | 2 ++ 3 files changed, 36 insertions(+) create mode 100644 src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java diff --git a/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java b/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java new file mode 100644 index 00000000..72494ab4 --- /dev/null +++ b/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java @@ -0,0 +1,31 @@ +package carpet.mixins; + +import carpet.settings.CarpetSettings; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +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.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ServerPlayerInteractionManager.class) +public class ServerPlayerInteractionManager_ghostBlocksMixin +{ + @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") + + ) + private float noCheatBlockBreakSpeed(BlockState blockState, PlayerEntity playerEntity_1, BlockView blockView_1, BlockPos blockPos_1, + // 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) + return 1.0f; + return blockState.calcBlockBreakingDelta(playerEntity_1, blockView_1, blockPos_1); + } +} diff --git a/src/main/java/carpet/settings/CarpetSettings.java b/src/main/java/carpet/settings/CarpetSettings.java index 96767a49..1ed1c41a 100644 --- a/src/main/java/carpet/settings/CarpetSettings.java +++ b/src/main/java/carpet/settings/CarpetSettings.java @@ -229,6 +229,9 @@ 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) + public static boolean miningGhostBlockFix; + private static class PushLimitLimits extends Validator { @Override public Integer validate(ServerCommandSource source, ParsedRule currentRule, Integer newValue, String string) { return (newValue>0 && newValue <= 1024) ? newValue : null; diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index e137da04..c337f5a1 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -13,6 +13,8 @@ "StructureBlockBlockEntity_fillUpdatesMixin", "Structure_fillUpdatesMixin", + "ServerPlayerInteractionManager_ghostBlocksMixin", + "ServerMetadata_motdMixin", "MinecraftServer_coreMixin", From ceffb9efbd420e2553552acfab7e2c05c16066ed Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 26 Jul 2019 15:28:11 -0300 Subject: [PATCH 08/10] disable gbf for now --- ...verPlayerInteractionManager_ghostBlocksMixin.java | 12 ++++++++++++ src/main/java/carpet/settings/CarpetSettings.java | 2 +- src/main/resources/carpet.mixins.json | 2 -- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java b/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java index 72494ab4..09552f0c 100644 --- a/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java +++ b/src/main/java/carpet/mixins/ServerPlayerInteractionManager_ghostBlocksMixin.java @@ -10,8 +10,11 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.BlockView; import org.spongepowered.asm.mixin.Mixin; 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 { @@ -28,4 +31,13 @@ public class ServerPlayerInteractionManager_ghostBlocksMixin return 1.0f; return blockState.calcBlockBreakingDelta(playerEntity_1, blockView_1, blockPos_1); } + + + @ModifyConstant(method = "method_14263", + constant = @Constant(doubleValue = 36D)) + private double addDistance(double original) { + if (CarpetSettings.miningGhostBlockFix) + return 1024D; + return original; + } } diff --git a/src/main/java/carpet/settings/CarpetSettings.java b/src/main/java/carpet/settings/CarpetSettings.java index cb0647ee..7fe5cfaa 100644 --- a/src/main/java/carpet/settings/CarpetSettings.java +++ b/src/main/java/carpet/settings/CarpetSettings.java @@ -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 3c41dda5..e3c56c81 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -13,8 +13,6 @@ "StructureBlockBlockEntity_fillUpdatesMixin", "Structure_fillUpdatesMixin", - "ServerPlayerInteractionManager_ghostBlocksMixin", - "ServerMetadata_motdMixin", "MinecraftServer_coreMixin", From f1e8c558b97598824448472a7753992ac8cfd31f Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 26 Jul 2019 15:29:04 -0300 Subject: [PATCH 09/10] version --- gradle.properties | 2 +- src/main/resources/fabric.mod.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 17fa2a32..9b00f21b 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.0+v190721 + mod_version = 1.0.1+v190726 maven_group = carpet archives_base_name = fabric-carpet diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 535fb707..4617f22d 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.0", + "version": "1.0.1", "name": "Carpet Mod in Fabric", "description": "Carpet made out of fabric", From 8d2253d24bd1adc1e29333178e82f88af7eb1f9e Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 26 Jul 2019 15:41:52 -0300 Subject: [PATCH 10/10] not needed --- src/main/java/carpet/script/value/EntityValue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 7d5952ea..48cf3ef1 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -432,7 +432,7 @@ public class EntityValue extends Value private static void updateVelocity(Entity e) { e.velocityModified = true; - ((ServerWorld)e.getEntityWorld()).method_14178().sendToNearbyPlayers(e, new EntityVelocityUpdateS2CPacket(e)); + //((ServerWorld)e.getEntityWorld()).method_14178().sendToNearbyPlayers(e, new EntityVelocityUpdateS2CPacket(e)); }