diff --git a/docs/scarpet/api/Scoreboard.md b/docs/scarpet/api/Scoreboard.md index 98e9c9b7..51a3fd2b 100644 --- a/docs/scarpet/api/Scoreboard.md +++ b/docs/scarpet/api/Scoreboard.md @@ -10,8 +10,9 @@ With specified `objective` and ### `scoreboard_add(objective, criterion?)` -Adds a new objective to scoreboard. If `criterion` is not specified, assumes `'dummy'`. Returns `false` if objective -already existed, `true` otherwise. +Adds a new objective to scoreboard. If `criterion` is not specified, assumes `'dummy'`. +If the objective already exists, changes the criterion of that objective and returns false. +If the objective was added, returns true.
 scoreboard_add('counter')
diff --git a/src/main/java/carpet/mixins/ScoreboardObjective_scarpetMixin.java b/src/main/java/carpet/mixins/ScoreboardObjective_scarpetMixin.java
new file mode 100644
index 00000000..a7506dde
--- /dev/null
+++ b/src/main/java/carpet/mixins/ScoreboardObjective_scarpetMixin.java
@@ -0,0 +1,12 @@
+package carpet.mixins;
+
+import net.minecraft.scoreboard.ScoreboardCriterion;
+import net.minecraft.scoreboard.ScoreboardObjective;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(ScoreboardObjective.class)
+public interface ScoreboardObjective_scarpetMixin {
+    @Accessor("criterion")
+    void setCriterion(ScoreboardCriterion criterion);
+}
diff --git a/src/main/java/carpet/mixins/Scoreboard_scarpetMixin.java b/src/main/java/carpet/mixins/Scoreboard_scarpetMixin.java
new file mode 100644
index 00000000..646e2ee7
--- /dev/null
+++ b/src/main/java/carpet/mixins/Scoreboard_scarpetMixin.java
@@ -0,0 +1,16 @@
+package carpet.mixins;
+
+import net.minecraft.scoreboard.Scoreboard;
+import net.minecraft.scoreboard.ScoreboardCriterion;
+import net.minecraft.scoreboard.ScoreboardObjective;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+import java.util.List;
+import java.util.Map;
+
+@Mixin(Scoreboard.class)
+public interface Scoreboard_scarpetMixin {
+    @Accessor("objectivesByCriterion")
+    Map> getObjectivesByCriterion();
+}
diff --git a/src/main/java/carpet/script/api/Scoreboards.java b/src/main/java/carpet/script/api/Scoreboards.java
index 0ba8d9e5..89a27a1d 100644
--- a/src/main/java/carpet/script/api/Scoreboards.java
+++ b/src/main/java/carpet/script/api/Scoreboards.java
@@ -1,5 +1,7 @@
 package carpet.script.api;
 
+import carpet.mixins.ScoreboardObjective_scarpetMixin;
+import carpet.mixins.Scoreboard_scarpetMixin;
 import carpet.script.CarpetContext;
 import carpet.script.Expression;
 import carpet.script.LazyValue;
@@ -11,6 +13,7 @@ import carpet.script.value.NumericValue;
 import carpet.script.value.StringValue;
 import carpet.script.value.FormattedTextValue;
 import carpet.script.value.Value;
+import com.google.common.collect.Lists;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.scoreboard.Scoreboard;
@@ -127,8 +130,13 @@ public class Scoreboards {
             }
 
             ScoreboardObjective objective = scoreboard.getObjective(objectiveName);
-            if (objective != null)
+            if (objective != null) {
+                ((Scoreboard_scarpetMixin)scoreboard).getObjectivesByCriterion().get(objective.getCriterion()).remove(objective);
+                ((ScoreboardObjective_scarpetMixin) objective).setCriterion(criterion);
+                (((Scoreboard_scarpetMixin)scoreboard).getObjectivesByCriterion().computeIfAbsent(criterion, (criterion1) -> Lists.newArrayList())).add(objective);
+                scoreboard.updateObjective(objective);
                 return LazyValue.FALSE;
+            }
 
             scoreboard.addObjective(objectiveName, criterion, new LiteralText(objectiveName), criterion.getCriterionType());
             return LazyValue.TRUE;
diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json
index 8a90de0a..24a94b8f 100644
--- a/src/main/resources/carpet.mixins.json
+++ b/src/main/resources/carpet.mixins.json
@@ -164,6 +164,8 @@
     "BlockItem_scarpetEventMixin",
     "PlayerManager_scarpetEventsMixin",
     "PlayerInventory_scarpetEventMixin",
+    "ScoreboardObjective_scarpetMixin",
+    "Scoreboard_scarpetMixin",
 
     "ChunkTicketManager_scarpetMixin",
     "StatType_scarpetMixin",