Merge branch 'master' into 1.17

# Conflicts:
#	src/main/java/carpet/commands/PerimeterInfoCommand.java
#	src/main/resources/carpet.mixins.json
This commit is contained in:
gnembon committed 2021-04-04 22:34:38 -03:00
commit 0cce983092
14 files changed
+93 -21

No files matched your search

+1 -1
View File
@@ -610,7 +610,7 @@ Available options in the scarpet app space:
* `world_folder` - name of the direct folder in the saves that holds world files * `world_folder` - name of the direct folder in the saves that holds world files
* `world_carpet_rules` - returns all Carpet rules in a map form (`rule`->`value`). Note that the values are always returned as strings, so you can't do boolean comparisons directly. Includes rules from extensions with their namespace (`namespace:rule`->`value`). You can later listen to rule changes with the `on_carpet_rule_changes(rule, newValue)` event. * `world_carpet_rules` - returns all Carpet rules in a map form (`rule`->`value`). Note that the values are always returned as strings, so you can't do boolean comparisons directly. Includes rules from extensions with their namespace (`namespace:rule`->`value`). You can later listen to rule changes with the `on_carpet_rule_changes(rule, newValue)` event.
* `world_gamerules` - returns all gamerules in a map form (`rule`->`value`). Like carpet rules, values are returned as strings, so you can use appropriate value conversions using `bool()` or `number()` to convert them to other values. Gamerules are read-only to discourage app programmers to mess up with the settings intentionally applied by server admins. Isn't that just super annoying when a datapack messes up with your gamerule settings? It is still possible to change them though using `run('gamerule ...`. * `world_gamerules` - returns all gamerules in a map form (`rule`->`value`). Like carpet rules, values are returned as strings, so you can use appropriate value conversions using `bool()` or `number()` to convert them to other values. Gamerules are read-only to discourage app programmers to mess up with the settings intentionally applied by server admins. Isn't that just super annoying when a datapack messes up with your gamerule settings? It is still possible to change them though using `run('gamerule ...`.
* `world_spawn_point` - world spawn point
Relevant gameplay related properties Relevant gameplay related properties
* `game_difficulty` - current difficulty of the game: `'peaceful'`, `'easy'`, `'normal'`, or `'hard'` * `game_difficulty` - current difficulty of the game: `'peaceful'`, `'easy'`, `'normal'`, or `'hard'`
+6 -5
View File
@@ -227,11 +227,12 @@ length('foo') => 3
### `rand(expr), rand(expr, seed)` ### `rand(expr), rand(expr, seed)`
returns a random number from `0.0` (inclusive) to `expr` (exclusive). In boolean context (in conditions, returns a random number from `0.0` (inclusive) to `expr` (exclusive). In boolean context (in conditions,
boolean functions, or `bool`), returns false if the randomly selected value is less than 1\. This means boolean functions, or `bool`), returns false if the randomly selected value is less than 1. This means
that `rand(2)` returns true half of the time and `rand(5)` returns true for 80% (4/5) of the time. If seed is not that `bool(rand(2))` returns true half of the time and `!rand(5)` returns true for 20% (1/5) of the time. If seed is not
provided, uses a random seed. If seed is provided, each consecutive call to rand() will act like 'next' call to the provided, uses a random seed that's shared across all scarpet apps.
same random object. Scarpet keeps track of up to 1024 custom random number generators, so if you exceed this number If seed is provided, each consecutive call to rand() will act like 'next' call to the
(per app), then your random sequence will revert to the beginning. same random object. Scarpet keeps track of up to 65536 custom random number generators (custom seeds, per app),
so if you exceed this number, your random sequences will revert to the beginning and start over.
<pre> <pre>
map(range(10), floor(rand(10))) => [5, 8, 0, 6, 9, 3, 9, 9, 1, 8] map(range(10), floor(rand(10))) => [5, 8, 0, 6, 9, 3, 9, 9, 1, 8]
@@ -57,8 +57,8 @@ public class PerimeterInfoCommand
}); });
if (!(baseEntity instanceof MobEntity)) if (!(baseEntity instanceof MobEntity))
{ {
Messenger.m(source, "r Failed to spawn test entity"); Messenger.m(source, "r /perimeterinfo requires a mob entity to test agains.");
if (baseEntity != null) baseEntity.discard(); // discard //remove(); if (baseEntity != null) baseEntity.discard();
return 0; return 0;
} }
entityliving = (MobEntity) baseEntity; entityliving = (MobEntity) baseEntity;
@@ -13,6 +13,7 @@ import carpet.script.exception.CarpetExpressionException;
import carpet.script.value.FunctionValue; import carpet.script.value.FunctionValue;
import carpet.script.value.Value; import carpet.script.value.Value;
import carpet.settings.SettingsManager; import carpet.settings.SettingsManager;
import carpet.utils.CarpetProfiler;
import carpet.utils.Messenger; import carpet.utils.Messenger;
import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.arguments.StringArgumentType;
@@ -396,6 +397,7 @@ public class ScriptCommand
{ {
try try
{ {
CarpetProfiler.ProfilerToken currentSection = CarpetProfiler.start_section(null, "Scarpet ace", CarpetProfiler.TYPE.GENERAL);
host.setChatErrorSnooper(source); host.setChatErrorSnooper(source);
long start = System.nanoTime(); long start = System.nanoTime();
Value result = call.get(); Value result = call.get();
@@ -412,7 +414,9 @@ public class ScriptCommand
metric = "s"; metric = "s";
} }
Messenger.m(source, "wi = ", "wb "+result.getString(), "gi ("+time+metric+")"); Messenger.m(source, "wi = ", "wb "+result.getString(), "gi ("+time+metric+")");
return (int)result.readInteger(); int intres = (int)result.readInteger();
CarpetProfiler.end_current_section(currentSection);
return intres;
} }
catch (CarpetExpressionException e) catch (CarpetExpressionException e)
{ {
@@ -0,0 +1,38 @@
package carpet.mixins;
import carpet.CarpetSettings;
import net.minecraft.block.BlockState;
import net.minecraft.block.ShapeContext;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.item.WallStandingBlockItem;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.world.WorldView;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(WallStandingBlockItem.class)
public class WallStandingBlockItem_creativeNoClipMixin
{
@Redirect(method = "getPlacementState", at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/WorldView;canPlace(Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Z"
))
private boolean canCreativePlayerPlace(
WorldView worldView, BlockState state, BlockPos pos, ShapeContext context,
ItemPlacementContext itemcontext
)
{
PlayerEntity player = itemcontext.getPlayer();
if (CarpetSettings.creativeNoClip && player != null && player.isCreative() && player.abilities.flying)
{
// copy from canPlace
VoxelShape voxelShape = state.getCollisionShape(worldView, pos, context);
return voxelShape.isEmpty() || worldView.intersectsEntities(player, voxelShape.offset(pos.getX(), pos.getY(), pos.getZ()));
}
return worldView.canPlace(state, pos, context);
}
}
@@ -14,6 +14,7 @@ import carpet.script.value.StringValue;
import carpet.script.value.Value; import carpet.script.value.Value;
import carpet.script.value.ValueConversions; import carpet.script.value.ValueConversions;
import carpet.settings.ParsedRule; import carpet.settings.ParsedRule;
import carpet.utils.CarpetProfiler;
import carpet.utils.Messenger; import carpet.utils.Messenger;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@@ -204,6 +205,7 @@ public class CarpetEventServer
{ {
if (callList.size() > 0) if (callList.size() > 0)
{ {
CarpetProfiler.ProfilerToken currentSection = CarpetProfiler.start_section(null, "Scarpet events", CarpetProfiler.TYPE.GENERAL);
List<Value> argv = argumentSupplier.get(); // empty for onTickDone List<Value> argv = argumentSupplier.get(); // empty for onTickDone
ServerCommandSource source; ServerCommandSource source;
try try
@@ -225,6 +227,7 @@ public class CarpetEventServer
if (!call.execute(source, argv)) fails.add(call); if (!call.execute(source, argv)) fails.add(call);
} }
for (Callback call : fails) callList.remove(call); for (Callback call : fails) callList.remove(call);
CarpetProfiler.end_current_section(currentSection);
} }
} }
@@ -18,6 +18,7 @@ import carpet.script.value.MapValue;
import carpet.script.value.NumericValue; import carpet.script.value.NumericValue;
import carpet.script.value.StringValue; import carpet.script.value.StringValue;
import carpet.script.value.Value; import carpet.script.value.Value;
import carpet.utils.CarpetProfiler;
import carpet.utils.Messenger; import carpet.utils.Messenger;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
@@ -127,6 +128,7 @@ public class CarpetScriptHost extends ScriptHost
private static int execute(CommandContext<ServerCommandSource> ctx, String hostName, FunctionArgument<Value> funcSpec, List<String> paramNames) throws CommandSyntaxException private static int execute(CommandContext<ServerCommandSource> ctx, String hostName, FunctionArgument<Value> funcSpec, List<String> paramNames) throws CommandSyntaxException
{ {
CarpetProfiler.ProfilerToken currentSection = CarpetProfiler.start_section(null, "Scarpet command", CarpetProfiler.TYPE.GENERAL);
CarpetScriptHost cHost = CarpetServer.scriptServer.modules.get(hostName).retrieveOwnForExecution(ctx.getSource()); CarpetScriptHost cHost = CarpetServer.scriptServer.modules.get(hostName).retrieveOwnForExecution(ctx.getSource());
List<String> argNames = funcSpec.function.getArguments(); List<String> argNames = funcSpec.function.getArguments();
if ((argNames.size()-funcSpec.args.size()) != paramNames.size()) if ((argNames.size()-funcSpec.args.size()) != paramNames.size())
@@ -140,7 +142,9 @@ public class CarpetScriptHost extends ScriptHost
Value response = cHost.handleCommand(ctx.getSource(), funcSpec.function, args); Value response = cHost.handleCommand(ctx.getSource(), funcSpec.function, args);
// will skip prints for new // will skip prints for new
//if (!response.isNull()) Messenger.m(ctx.getSource(), "gi " + response.getString()); //if (!response.isNull()) Messenger.m(ctx.getSource(), "gi " + response.getString());
return (int) response.readInteger(); int intres = (int) response.readInteger();
CarpetProfiler.end_current_section(currentSection);
return intres;
} }
public LiteralArgumentBuilder<ServerCommandSource> addPathToCommand( public LiteralArgumentBuilder<ServerCommandSource> addPathToCommand(
@@ -210,12 +214,15 @@ public class CarpetScriptHost extends ScriptHost
return s -> { return s -> {
try try
{ {
CarpetProfiler.ProfilerToken currentSection = CarpetProfiler.start_section(null, "Scarpet command", CarpetProfiler.TYPE.GENERAL);
CarpetScriptHost cHost = null; CarpetScriptHost cHost = null;
cHost = CarpetServer.scriptServer.modules.get(hostName).retrieveOwnForExecution(s); cHost = CarpetServer.scriptServer.modules.get(hostName).retrieveOwnForExecution(s);
Value response = cHost.handleCommand(s, fun, Collections.singletonList( Value response = cHost.handleCommand(s, fun, Collections.singletonList(
(s.getEntity() instanceof ServerPlayerEntity)?new EntityValue(s.getEntity()):Value.NULL) (s.getEntity() instanceof ServerPlayerEntity)?new EntityValue(s.getEntity()):Value.NULL)
); );
return response.getBoolean(); boolean res = response.getBoolean();
CarpetProfiler.end_current_section(currentSection);
return res;
} }
catch (CommandSyntaxException e) catch (CommandSyntaxException e)
{ {
@@ -546,7 +553,10 @@ public class CarpetScriptHost extends ScriptHost
{ {
try try
{ {
return callLegacy(source, call, coords, arg); CarpetProfiler.ProfilerToken currentSection = CarpetProfiler.start_section(null, "Scarpet legacy", CarpetProfiler.TYPE.GENERAL);
Value res = callLegacy(source, call, coords, arg);
CarpetProfiler.end_current_section(currentSection);
return res;
} }
catch (CarpetExpressionException exc) catch (CarpetExpressionException exc)
{ {
@@ -1,19 +1,15 @@
package carpet.script; package carpet.script;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.script.argument.FunctionArgument;
import carpet.script.bundled.BundledModule; import carpet.script.bundled.BundledModule;
import carpet.CarpetServer; import carpet.CarpetServer;
import carpet.script.bundled.FileModule; import carpet.script.bundled.FileModule;
import carpet.script.bundled.Module; import carpet.script.bundled.Module;
import carpet.script.command.CommandToken;
import carpet.script.exception.InvalidCallbackException; import carpet.script.exception.InvalidCallbackException;
import carpet.script.value.FunctionValue; import carpet.script.value.FunctionValue;
import carpet.script.value.StringValue;
import carpet.script.value.Value; import carpet.script.value.Value;
import carpet.utils.CarpetProfiler;
import carpet.utils.Messenger; import carpet.utils.Messenger;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.CommandNode;
@@ -229,6 +225,7 @@ public class CarpetScriptServer
public boolean addScriptHost(ServerCommandSource source, String name, Function<ServerCommandSource, Boolean> commandValidator, public boolean addScriptHost(ServerCommandSource source, String name, Function<ServerCommandSource, Boolean> commandValidator,
boolean perPlayer, boolean autoload, boolean isRuleApp) boolean perPlayer, boolean autoload, boolean isRuleApp)
{ {
CarpetProfiler.ProfilerToken currentSection = CarpetProfiler.start_section(null, "Scarpet loading", CarpetProfiler.TYPE.GENERAL);
if (commandValidator == null) commandValidator = p -> true; if (commandValidator == null) commandValidator = p -> true;
long start = System.nanoTime(); long start = System.nanoTime();
name = name.toLowerCase(Locale.ROOT); name = name.toLowerCase(Locale.ROOT);
@@ -301,6 +298,7 @@ public class CarpetScriptServer
FunctionValue onStart = newHost.getFunction("__on_start"); FunctionValue onStart = newHost.getFunction("__on_start");
if (onStart != null) newHost.callNow(onStart, Collections.emptyList()); if (onStart != null) newHost.callNow(onStart, Collections.emptyList());
} }
CarpetProfiler.end_current_section(currentSection);
long end = System.nanoTime(); long end = System.nanoTime();
CarpetSettings.LOG.info("App "+name+" loaded in "+(end-start)/1000000+" ms"); CarpetSettings.LOG.info("App "+name+" loaded in "+(end-start)/1000000+" ms");
return true; return true;
@@ -412,11 +410,16 @@ public class CarpetScriptServer
public void tick() public void tick()
{ {
CarpetProfiler.ProfilerToken token;
token = CarpetProfiler.start_section(null, "Scarpet schedule", CarpetProfiler.TYPE.GENERAL);
events.tick(); events.tick();
CarpetProfiler.end_current_section(token);
token = CarpetProfiler.start_section(null, "Scarpet app data", CarpetProfiler.TYPE.GENERAL);
for (CarpetScriptHost host : modules.values()) for (CarpetScriptHost host : modules.values())
{ {
host.tick(); host.tick();
} }
CarpetProfiler.end_current_section(token);
} }
public void onClose() public void onClose()
+1 -1
View File
@@ -765,7 +765,7 @@ public class Expression
{ {
if (token.surface.equals(";")) if (token.surface.equals(";"))
{ {
throw new ExpressionException(c, this, token, "Unnecessary semicolon"); throw new ExpressionException(c, this, token, "Empty expression found for ';'");
} }
throw new ExpressionException(c, this, token, "Missing parameter(s) for operator " + token); throw new ExpressionException(c, this, token, "Missing parameter(s) for operator " + token);
} }
+1 -1
View File
@@ -37,7 +37,7 @@ public abstract class ScriptHost
public Random getRandom(long aLong) public Random getRandom(long aLong)
{ {
if (randomizers.size() > 1024) if (randomizers.size() > 65536)
randomizers.clear(); randomizers.clear();
return randomizers.computeIfAbsent(aLong, Random::new); return randomizers.computeIfAbsent(aLong, Random::new);
} }
@@ -14,6 +14,7 @@ import carpet.script.value.NumericValue;
import carpet.script.value.StringValue; import carpet.script.value.StringValue;
import carpet.script.value.Value; import carpet.script.value.Value;
import carpet.script.value.ValueConversions; import carpet.script.value.ValueConversions;
import carpet.utils.CarpetProfiler;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.arguments.ArgumentType;
@@ -365,6 +366,7 @@ public abstract class CommandArgument
{ {
if (customSuggester != null) if (customSuggester != null)
{ {
CarpetProfiler.ProfilerToken currentSection = CarpetProfiler.start_section(null, "Scarpet command", CarpetProfiler.TYPE.GENERAL);
Map<Value, Value> params = new HashMap<>(); Map<Value, Value> params = new HashMap<>();
for(ParsedCommandNode<ServerCommandSource> pnode : context.getNodes()) for(ParsedCommandNode<ServerCommandSource> pnode : context.getNodes())
{ {
@@ -379,7 +381,9 @@ public abstract class CommandArgument
args.addAll(customSuggester.args); args.addAll(customSuggester.args);
Value response = host.handleCommand(context.getSource(), customSuggester.function, args); Value response = host.handleCommand(context.getSource(), customSuggester.function, args);
if (!(response instanceof ListValue)) throw error("Custom suggester should return a list of options"+" for custom type "+suffix); if (!(response instanceof ListValue)) throw error("Custom suggester should return a list of options"+" for custom type "+suffix);
return ((ListValue) response).getItems().stream().map(Value::getString).collect(Collectors.toList()); Collection<String> res = ((ListValue) response).getItems().stream().map(Value::getString).collect(Collectors.toList());
CarpetProfiler.end_current_section(currentSection);
return res;
} }
if (needsMatching) return examples; if (needsMatching) return examples;
//return Lists.newArrayList(""); //return Lists.newArrayList("");
@@ -18,6 +18,7 @@ import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.SharedConstants; import net.minecraft.SharedConstants;
import net.minecraft.util.WorldSavePath; import net.minecraft.util.WorldSavePath;
import net.minecraft.world.GameRules; import net.minecraft.world.GameRules;
import net.minecraft.world.WorldProperties;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.nio.file.Path; import java.nio.file.Path;
@@ -52,6 +53,11 @@ public class SystemInfo {
return StringValue.of(tlf); return StringValue.of(tlf);
}); });
put("world_dimensions", c -> ListValue.wrap(c.s.getMinecraftServer().getWorldRegistryKeys().stream().map(k -> ValueConversions.of(k.getValue())).collect(Collectors.toList()))); put("world_dimensions", c -> ListValue.wrap(c.s.getMinecraftServer().getWorldRegistryKeys().stream().map(k -> ValueConversions.of(k.getValue())).collect(Collectors.toList())));
put("world_spawn_point", c -> {
WorldProperties prop = c.s.getMinecraftServer().getOverworld().getLevelProperties();
return ListValue.of(NumericValue.of(prop.getSpawnX()), NumericValue.of(prop.getSpawnY()), NumericValue.of(prop.getSpawnZ()));
});
put("game_difficulty", c -> StringValue.of(c.s.getMinecraftServer().getSaveProperties().getDifficulty().getName())); put("game_difficulty", c -> StringValue.of(c.s.getMinecraftServer().getSaveProperties().getDifficulty().getName()));
put("game_hardcore", c -> new NumericValue(c.s.getMinecraftServer().getSaveProperties().isHardcore())); put("game_hardcore", c -> new NumericValue(c.s.getMinecraftServer().getSaveProperties().isHardcore()));
put("game_storage_format", c -> StringValue.of(c.s.getMinecraftServer().getSaveProperties().getFormatName(c.s.getMinecraftServer().getSaveProperties().getVersion()))); put("game_storage_format", c -> StringValue.of(c.s.getMinecraftServer().getSaveProperties().getFormatName(c.s.getMinecraftServer().getSaveProperties().getVersion())));
@@ -31,7 +31,9 @@ public class CarpetProfiler
private static int tick_health_elapsed = 0; private static int tick_health_elapsed = 0;
private static TYPE test_type = TYPE.NONE; //1 for ticks, 2 for entities; private static TYPE test_type = TYPE.NONE; //1 for ticks, 2 for entities;
private static long current_tick_start = 0; private static long current_tick_start = 0;
private static final String[] GENERAL_SECTIONS = {"Network", "Autosave", "Async Tasks", "Datapacks",}; private static final String[] GENERAL_SECTIONS = {"Network", "Autosave", "Async Tasks", "Datapacks",
"Scarpet ace", "Scarpet legacy", "Scarpet events", "Scarpet schedule",
"Scarpet command", "Scarpet loading", "Scarpet app data"};
private static final String[] SECTIONS = { private static final String[] SECTIONS = {
"Spawning and Random Ticks", "Ticket Manager","Unloading", "Spawning and Random Ticks", "Ticket Manager","Unloading",
"Blocks", "Entities", "Block Entities", "Blocks", "Entities", "Block Entities",
+1
View File
@@ -196,6 +196,7 @@
"PlayerEntity_creativeNoClipMixin", "PlayerEntity_creativeNoClipMixin",
"PistonBlockEntity_playerHandlingMixin", "PistonBlockEntity_playerHandlingMixin",
"BlockItem_creativeNoClipMixin", "BlockItem_creativeNoClipMixin",
"WallStandingBlockItem_creativeNoClipMixin",
"LivingEntity_creativeFlyMixin", "LivingEntity_creativeFlyMixin",
"BaseRangeDecorator_cleanLogsMixin" "BaseRangeDecorator_cleanLogsMixin"
], ],