Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Limit number of Loki ring offsets and prevent cost calculation overflow #4686

Merged
merged 1 commit into from
Jun 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand;
Expand Down Expand Up @@ -52,6 +53,11 @@

public class RingOfLokiItem extends RelicBaubleItem implements WireframeCoordinateListProvider {

/**
* This limit exists to prevent players from accidentally NBT-banning themselves from a world or server.
* TODO 1.21: It might be possible to increase this if the storage tag structure is optimized.
*/
private static final int MAX_NUM_CURSORS = 1023;
private static final String TAG_CURSOR_LIST = "cursorList";
private static final String TAG_CURSOR_PREFIX = "cursor";
private static final String TAG_CURSOR_COUNT = "cursorCount";
Expand Down Expand Up @@ -99,7 +105,11 @@ public static InteractionResult onPlayerInteract(Player player, Level world, Int

boolean removed = cursors.remove(relPos);
if (!removed) {
cursors.add(relPos);
if (cursors.size() < MAX_NUM_CURSORS) {
cursors.add(relPos);
} else {
player.displayClientMessage(Component.translatable("botaniamisc.lokiRingLimitReached"), true);
}
}
setCursorList(lokiRing, cursors);
}
Expand All @@ -108,7 +118,9 @@ public static InteractionResult onPlayerInteract(Player player, Level world, Int

return InteractionResult.SUCCESS;
} else {
int cost = Math.min(cursors.size(), (int) Math.pow(Math.E, cursors.size() * 0.25));
int numCursors = cursors.size();
// particularly large cursor counts can overflow after exponentiation
int cost = numCursors > 10 ? numCursors : Math.min(numCursors, (int) Math.pow(Math.E, numCursors * 0.25));
ItemStack original = stack.copy();
int successes = 0;
for (BlockPos cursor : cursors) {
Expand Down
1 change: 1 addition & 0 deletions Xplat/src/main/resources/assets/botania/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@
"botaniamisc.invalidDodge": "Invalid Dodge Packet",
"botaniamisc.rannuncarpus.state_sensitive": "Match Exact State",
"botaniamisc.rannuncarpus.state_insensitive": "Match Block Only",
"botaniamisc.lokiRingLimitReached": "Selection limit reached",

"botania.tater_birthday.0": "Wow, is this for me?",
"botania.tater_birthday.1": "It's my birthday today; I'm %d years old now!",
Expand Down
2 changes: 2 additions & 0 deletions web/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ and start a new "Upcoming" section.
* Missing lookup references for derivatives of certain decorative blocks (e.g. quartz variants) have been added for the quick-lookup feature while holding the book
* Lexica Botania acknowledges that Trinkets are used on Fabric instead of Curios
* Various entries were updated to match recent changes and fix old errors
* Change: The Ring of Loki now has a (reasonably high) selection limit to prevent players from accidentally "NBT-banning" themselves from their world or server by going too hard with it
* Remove: Config option `orechidPriorityMods` didn't have any effect since 1.16, never made it to Fabric, and is now gone in the Forge version as well; pack authors should use data pack recipes to define Orechid outputs and weights
* Fix: Flight bar for Flügel Tiara no longer overlaps with the refilling air bubbles indicator or the mount health bar, if that uses more than one row
* Fix: The Manaseer Monocle's flower radius indicator no longer jumps around if you are very far from the world origin, and should also not Z-fight with the binding radius indicator of luminizers anymore
Expand All @@ -47,6 +48,7 @@ and start a new "Upcoming" section.
* Fix: Floating flower islands properly show the soil type on Forge, and are no longer invisible in Patchouli multiblock visualizations (although that latter part is merely a workaround for a Patchouli issue at the moment)
* Fix: Position of the binding information icon on flowers' wand HUD has been adjusted to not overlap with longer flower names
* Fix: Suspicious stew effect from Pure Daisy actually works now, clearing all active status effects
* Fix: Potential integer overflow in Ring of Loki mana calculation

---

Expand Down