diff --git a/docs/scarpet/Full.md b/docs/scarpet/Full.md index 68206456..427ecb67 100644 --- a/docs/scarpet/Full.md +++ b/docs/scarpet/Full.md @@ -2217,11 +2217,15 @@ It returns a `map` with a report indicating how many chunks were affected, and h These functions help scan larger areas of blocks without using generic loop functions, like nested `loop`. -### `scan(cx, cy, cz, dx, dy, dz, px?, py?, pz?, expr)` +### `scan(cx, cy, cz, dx, dy, dz, px?, py?, pz?, expr)`, `scan(center, range, lower_range?, expr)` -Evaluates expression over area of blocks defined by its center (`cx, cy, cz`), expanded in all directions -by `dx, dy, dz` blocks, or optionally in negative with `d` coords, and `p` coords in positive values. `expr` -receives `_x, _y, _z` as coords of current analyzed block and `_`, which represents the block itself. +Evaluates expression over area of blocks defined by its center `center = (cx, cy, cz)`, expanded in all directions +by `range = (dx, dy, dz)` blocks, or optionally in negative with `range` coords, and `upper_range` coords in +positive values. +`center` can be defined either as a three coordinates, list of three coords, or block value. +`range` and `lower_range` can have the same representations, just if its a block, it computes the distance to the center +as range instead of taking the values as is. +`expr` receives `_x, _y, _z` as coords of current analyzed block and `_`, which represents the block itself. Returns number of successful evaluations of `expr` (with `true` boolean result) unless called in void context, which would cause the expression not be evaluated for their boolean value. @@ -2951,9 +2955,12 @@ scoreboard_add('counter') scoreboard_add('lvl','level') -### `scoreboard_remove(objective)` +### `scoreboard_remove(objective)` `scoreboard_remove(objective, key)` -Removes an objective. Returns `true` if objective has existed and has been removed. +Removes an entire objective, or an entry in the scoreboard associated with the key. +Returns `true` if objective has existed and has been removed, or previous +value of the scoreboard if players score is removed. Returns `null` if objective didn't exist, or a key was missing +for the objective. ### `scoreboard_display(place, objective)` diff --git a/docs/scarpet/api/Scoreboard.md b/docs/scarpet/api/Scoreboard.md index a509bb15..b638fb93 100644 --- a/docs/scarpet/api/Scoreboard.md +++ b/docs/scarpet/api/Scoreboard.md @@ -17,9 +17,12 @@ scoreboard_add('counter') scoreboard_add('lvl','level') -### `scoreboard_remove(objective)` +### `scoreboard_remove(objective)` `scoreboard_remove(objective, key)` -Removes an objective. Returns `true` if objective has existed and has been removed. +Removes an entire objective, or an entry in the scoreboard associated with the key. +Returns `true` if objective has existed and has been removed, or previous +value of the scoreboard if players score is removed. Returns `null` if objective didn't exist, or a key was missing +for the objective. ### `scoreboard_display(place, objective)` diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index 7d0100c8..fb7c933b 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -1295,6 +1295,26 @@ public class CarpetExpression } + private static String getScoreboardKeyFromValue(Value keyValue) + { + if (keyValue instanceof EntityValue) + { + Entity e = ((EntityValue) keyValue).getEntity(); + if (e instanceof PlayerEntity) + { + return e.getName().getString(); + } + else + { + return e.getUuidAsString(); + } + } + else + { + return keyValue.getString(); + } + } + private void API_Scoreboard() { // scoreboard(player,'objective') @@ -1316,24 +1336,7 @@ public class CarpetExpression Value ret = ListValue.wrap(scoreboard.getAllPlayerScores(objective).stream().map(s -> new StringValue(s.getPlayerName())).collect(Collectors.toList())); return (_c, _t) -> ret; } - String key; - Value keyValue = lv.get(1).evalValue(c); - if (keyValue instanceof EntityValue) - { - Entity e = ((EntityValue) keyValue).getEntity(); - if (e instanceof PlayerEntity) - { - key = e.getDisplayName().getString(); - } - else - { - key = e.getUuidAsString(); - } - } - else - { - key = keyValue.getString(); - } + String key = getScoreboardKeyFromValue(lv.get(1).evalValue(c)); if (!scoreboard.playerHasObjective(key, objective) && lv.size()==2) return LazyValue.NULL; ScoreboardPlayerScore scoreboardPlayerScore = scoreboard.getPlayerScore(key, objective); @@ -1345,15 +1348,24 @@ public class CarpetExpression return (_c, _t) -> retval; }); - this.expr.addLazyFunction("scoreboard_remove", 1, (c, t, lv)-> { + this.expr.addLazyFunction("scoreboard_remove", -1, (c, t, lv)-> { CarpetContext cc = (CarpetContext)c; Scoreboard scoreboard = cc.s.getMinecraftServer().getScoreboard(); String objectiveName = lv.get(0).evalValue(c).getString(); ScoreboardObjective objective = scoreboard.getObjective(objectiveName); if (objective == null) return LazyValue.FALSE; - scoreboard.removeObjective(objective); - return LazyValue.TRUE; + if (lv.size() == 0) + { + scoreboard.removeObjective(objective); + return LazyValue.TRUE; + } + String key = getScoreboardKeyFromValue(lv.get(1).evalValue(c)); + if (!scoreboard.playerHasObjective(key, objective)) return LazyValue.NULL; + ScoreboardPlayerScore scoreboardPlayerScore = scoreboard.getPlayerScore(key, objective); + Value previous = new NumericValue(scoreboardPlayerScore.getScore()); + scoreboard.resetPlayerScore(key, objective); + return (c_, t_) -> previous; }); // objective_add('lvl','level') diff --git a/src/main/java/carpet/utils/Messenger.java b/src/main/java/carpet/utils/Messenger.java index 82a93ad0..23babb33 100644 --- a/src/main/java/carpet/utils/Messenger.java +++ b/src/main/java/carpet/utils/Messenger.java @@ -3,7 +3,6 @@ package carpet.utils; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.entity.EntityCategory; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.Formatting; @@ -80,7 +79,7 @@ public class Messenger } }; - private static BaseText _applyStyleToTextComponent(BaseText comp, String style) + public static Style parseStyle(String style) { Style myStyle= Style.EMPTY.withColor(Formatting.WHITE); for (CarpetFormatting cf: CarpetFormatting.values()) @@ -154,7 +153,8 @@ public class Messenger return previous_message; } BaseText txt = new LiteralText(str); - return _applyStyleToTextComponent(txt, desc); + txt.setStyle(parseStyle(desc)); + return txt; } public static BaseText tp(String desc, Vec3d pos) { return tp(desc, pos.x, pos.y, pos.z); } public static BaseText tp(String desc, BlockPos pos) { return tp(desc, pos.getX(), pos.getY(), pos.getZ()); } @@ -274,7 +274,7 @@ public class Messenger public static BaseText s(String text, String style) { BaseText message = new LiteralText(text); - _applyStyleToTextComponent(message, style); + message.setStyle(parseStyle(style)); return message; }