Commit 184eec82 authored by Melledy's avatar Melledy
Browse files

Limit spawn amount if too many entities are in the world

Can be controlled in the config with `sceneEntityLimit`
parent 18721758
...@@ -20,6 +20,7 @@ import javax.swing.text.html.parser.Entity; ...@@ -20,6 +20,7 @@ import javax.swing.text.html.parser.Entity;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import static emu.grasscutter.Configuration.*;
import static emu.grasscutter.utils.Language.translate; import static emu.grasscutter.utils.Language.translate;
@Command(label = "spawn", usage = "spawn <entityId> [amount] [level(monster only)]", permission = "server.spawn", permissionTargeted = "server.spawn.others", description = "commands.spawn.description") @Command(label = "spawn", usage = "spawn <entityId> [amount] [level(monster only)]", permission = "server.spawn", permissionTargeted = "server.spawn.others", description = "commands.spawn.description")
...@@ -54,7 +55,7 @@ public final class SpawnCommand implements CommandHandler { ...@@ -54,7 +55,7 @@ public final class SpawnCommand implements CommandHandler {
CommandHandler.sendMessage(sender, translate(sender, "commands.spawn.usage")); CommandHandler.sendMessage(sender, translate(sender, "commands.spawn.usage"));
return; return;
} }
MonsterData monsterData = GameData.getMonsterDataMap().get(id); MonsterData monsterData = GameData.getMonsterDataMap().get(id);
GadgetData gadgetData = GameData.getGadgetDataMap().get(id); GadgetData gadgetData = GameData.getGadgetDataMap().get(id);
ItemData itemData = GameData.getItemDataMap().get(id); ItemData itemData = GameData.getItemDataMap().get(id);
...@@ -62,7 +63,16 @@ public final class SpawnCommand implements CommandHandler { ...@@ -62,7 +63,16 @@ public final class SpawnCommand implements CommandHandler {
CommandHandler.sendMessage(sender, translate(sender, "commands.generic.invalid.entityId")); CommandHandler.sendMessage(sender, translate(sender, "commands.generic.invalid.entityId"));
return; return;
} }
Scene scene = targetPlayer.getScene(); Scene scene = targetPlayer.getScene();
if (scene.getEntities().size() + amount > GAME_OPTIONS.sceneEntityLimit) {
amount = Math.max(Math.min(GAME_OPTIONS.sceneEntityLimit - scene.getEntities().size(), amount), 0);
CommandHandler.sendMessage(sender, translate(sender, "commands.spawn.limit_reached", amount));
if (amount <= 0) {
return;
}
}
double maxRadius = Math.sqrt(amount * 0.2 / Math.PI); double maxRadius = Math.sqrt(amount * 0.2 / Math.PI);
for (int i = 0; i < amount; i++) { for (int i = 0; i < amount; i++) {
......
...@@ -171,7 +171,7 @@ public class ConfigContainer { ...@@ -171,7 +171,7 @@ public class ConfigContainer {
public static class GameOptions { public static class GameOptions {
public InventoryLimits inventoryLimits = new InventoryLimits(); public InventoryLimits inventoryLimits = new InventoryLimits();
public AvatarLimits avatarLimits = new AvatarLimits(); public AvatarLimits avatarLimits = new AvatarLimits();
public int worldEntityLimit = 1000; // Unenforced. TODO: Implement. public int sceneEntityLimit = 1000; // Unenforced. TODO: Implement.
public boolean watchGachaConfig = false; public boolean watchGachaConfig = false;
public boolean enableShopItems = true; public boolean enableShopItems = true;
......
...@@ -306,6 +306,7 @@ ...@@ -306,6 +306,7 @@
"spawn": { "spawn": {
"usage": "Usage: spawn <entityID> [amount] [level(monster only)]", "usage": "Usage: spawn <entityID> [amount] [level(monster only)]",
"success": "Spawned %s of %s.", "success": "Spawned %s of %s.",
"limit_reached": "Scene spawn limit reached. Spawning %s entities instead.",
"description": "Spawns an entity near you" "description": "Spawns an entity near you"
}, },
"stop": { "stop": {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment