Merge pull request #2313 from Grasscutters/dev-4.0

Upgrade to REL4.0.x
This commit is contained in:
Magix
2023-08-31 22:05:36 -07:00
committed by GitHub
Unverified
5204 changed files with 698829 additions and 576748 deletions
@@ -0,0 +1,22 @@
package emu.grasscutter;
public final class DebugConstants {
public static boolean LOG_ABILITIES = false;
public static boolean LOG_LUA_SCRIPTS = false;
public static boolean LOG_QUEST_START = false;
public static boolean LOG_MISSING_ABILITIES = false;
public static boolean LOG_MISSING_LUA_SCRIPTS = false;
public static boolean LOG_MISSING_ABILITY_HANDLERS = false;
/**
* WARNING: THIS IS A DANGEROUS SETTING. DO NOT ENABLE UNLESS YOU KNOW WHAT YOU ARE DOING. This
* allows the *client* to send *ANY* token and UID pair to the server. The server will then accept
* the token and UID pair as valid, and set the account's token to the client specified one. This
* can allow for IMPERSONATION and HIJACKING of accounts/servers.
*/
public static final boolean ACCEPT_CLIENT_TOKEN = false;
private DebugConstants() {
// Prevent instantiation.
}
}
@@ -1,12 +1,14 @@
package emu.grasscutter;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.utils.objects.SparseSet;
import emu.grasscutter.utils.Utils;
import emu.grasscutter.utils.objects.SparseSet;
import java.util.Arrays;
public final class GameConstants {
public static String VERSION = "3.7.0";
public static String VERSION = "4.0.0";
public static int[] VERSION_PARTS = {4, 0, 0};
public static boolean DEBUG = false;
public static final int DEFAULT_TEAMS = 4;
@@ -30,7 +32,18 @@ public final class GameConstants {
"Avatar_Freeze_Duration_Reducer",
"Avatar_Attack_ReviveEnergy",
"Avatar_Component_Initializer",
"Avatar_FallAnthem_Achievement_Listener"
"Avatar_FallAnthem_Achievement_Listener",
"GrapplingHookSkill_Ability",
"Avatar_PlayerBoy_DiveStamina_Reduction",
"Ability_Avatar_Dive_SealEcho",
"Absorb_SealEcho_Bullet_01",
"Absorb_SealEcho_Bullet_02",
"Ability_Avatar_Dive_CrabShield",
"ActivityAbility_Absorb_Shoot",
"SceneAbility_DiveVolume"
};
public static final String[] DEFAULT_TEAM_ABILITY_STRINGS = {
"Ability_Avatar_Dive_Team"
};
public static final SparseSet ILLEGAL_WEAPONS = new SparseSet("""
10000-10008, 11411, 11506-11508, 12505, 12506, 12508, 12509,
+43 -22
View File
@@ -1,8 +1,5 @@
package emu.grasscutter;
import static emu.grasscutter.config.Configuration.SERVER;
import static emu.grasscutter.utils.lang.Language.translate;
import ch.qos.logback.classic.*;
import emu.grasscutter.auth.*;
import emu.grasscutter.command.*;
@@ -21,16 +18,20 @@ import emu.grasscutter.tools.Tools;
import emu.grasscutter.utils.*;
import emu.grasscutter.utils.lang.Language;
import io.netty.util.concurrent.FastThreadLocalThread;
import java.io.*;
import java.util.Calendar;
import java.util.concurrent.*;
import javax.annotation.Nullable;
import lombok.*;
import org.jline.reader.*;
import org.jline.terminal.*;
import org.reflections.Reflections;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.io.*;
import java.util.Calendar;
import java.util.concurrent.*;
import static emu.grasscutter.config.Configuration.SERVER;
import static emu.grasscutter.utils.lang.Language.translate;
public final class Grasscutter {
public static final File configFile = new File("./config.json");
public static final Reflections reflector = new Reflections("emu.grasscutter");
@@ -108,15 +109,6 @@ public final class Grasscutter {
logger.info(translate("messages.status.game_version", GameConstants.VERSION));
logger.info(translate("messages.status.version", BuildConfig.VERSION, BuildConfig.GIT_HASH));
if (runMode != ServerRunMode.DISPATCH_ONLY) {
// Load all resources.
Grasscutter.updateDayOfWeek();
ResourceLoader.loadAll();
// Generate handbooks.
Tools.createGmHandbooks(false);
}
// Initialize database.
DatabaseManager.initialize();
@@ -150,16 +142,31 @@ public final class Grasscutter {
httpServer.addRouter(HandbookHandler.class);
}
// Check if the HTTP server should start.
var started = config.server.http.startImmediately;
if (started) {
Grasscutter.getLogger().info("HTTP server is starting...");
Grasscutter.startDispatch();
Grasscutter.getLogger().info("Game server is starting...");
}
// Load resources.
if (runMode != ServerRunMode.DISPATCH_ONLY) {
// Load all resources.
Grasscutter.updateDayOfWeek();
ResourceLoader.loadAll();
// Generate handbooks.
Tools.createGmHandbooks(false);
}
// Start servers.
if (runMode == ServerRunMode.HYBRID) {
httpServer.start();
if (!started) Grasscutter.startDispatch();
gameServer.start();
} else if (runMode == ServerRunMode.DISPATCH_ONLY) {
httpServer.start();
// Start dispatch server.
dispatchServer = new DispatchServer("0.0.0.0", 1111);
dispatchServer.start();
if (!started) Grasscutter.startDispatch();
} else if (runMode == ServerRunMode.GAME_ONLY) {
gameServer.start();
} else {
@@ -204,6 +211,20 @@ public final class Grasscutter {
}
}
/**
* Utility method for starting the:
* - SDK server
* - Dispatch server
*/
public static void startDispatch() throws Exception {
httpServer.start(); // Start the SDK/HTTP server.
if (Grasscutter.getRunMode() == ServerRunMode.DISPATCH_ONLY) {
dispatchServer = new DispatchServer("0.0.0.0", 1111); // Create the dispatch server.
dispatchServer.start(); // Start the dispatch server.
}
}
/*
* Methods for the language system component.
*/
@@ -4,10 +4,9 @@ import emu.grasscutter.game.Account;
import emu.grasscutter.server.http.objects.*;
import emu.grasscutter.utils.DispatchUtils;
import io.javalin.http.Context;
import lombok.*;
import javax.annotation.Nullable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
/** Defines an authenticator for the server. Can be changed by plugins. */
public interface AuthenticationSystem {
@@ -1,7 +1,6 @@
package emu.grasscutter.auth;
import emu.grasscutter.server.http.objects.ComboTokenResJson;
import emu.grasscutter.server.http.objects.LoginResultJson;
import emu.grasscutter.server.http.objects.*;
/**
* Handles username/password authentication from the client.
@@ -1,13 +1,12 @@
package emu.grasscutter.auth;
import static emu.grasscutter.config.Configuration.ACCOUNT;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.auth.DefaultAuthenticators.*;
import emu.grasscutter.game.Account;
import emu.grasscutter.server.http.objects.ComboTokenResJson;
import emu.grasscutter.server.http.objects.LoginResultJson;
import emu.grasscutter.server.http.objects.*;
import static emu.grasscutter.config.Configuration.ACCOUNT;
import static emu.grasscutter.utils.lang.Language.translate;
/**
* The default Grasscutter authentication implementation. Allows all users to access any account.
@@ -1,8 +1,5 @@
package emu.grasscutter.auth;
import static emu.grasscutter.config.Configuration.ACCOUNT;
import static emu.grasscutter.utils.lang.Language.translate;
import at.favre.lib.crypto.bcrypt.BCrypt;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.Grasscutter.ServerRunMode;
@@ -13,12 +10,16 @@ import emu.grasscutter.server.dispatch.*;
import emu.grasscutter.server.http.objects.*;
import emu.grasscutter.utils.*;
import io.javalin.http.ContentType;
import javax.crypto.Cipher;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.concurrent.*;
import javax.crypto.Cipher;
import static emu.grasscutter.config.Configuration.ACCOUNT;
import static emu.grasscutter.utils.lang.Language.translate;
/** A class containing default authenticators. */
public final class DefaultAuthenticators {
@@ -1,8 +1,7 @@
package emu.grasscutter.auth;
import emu.grasscutter.auth.AuthenticationSystem.AuthenticationRequest;
import lombok.Builder;
import lombok.Getter;
import lombok.*;
/** Handles player authentication for the web GM handbook. */
public interface HandbookAuthenticator {
@@ -1,7 +1,6 @@
package emu.grasscutter.command;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface Command {
@@ -1,12 +1,12 @@
package emu.grasscutter.command;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.event.game.ReceiveCommandFeedbackEvent;
import java.util.List;
import java.util.StringJoiner;
import java.util.*;
import static emu.grasscutter.utils.lang.Language.translate;
public interface CommandHandler {
@@ -1,11 +1,9 @@
package emu.grasscutter.command;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Nonnull;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.regex.*;
public class CommandHelpers {
public static final Pattern lvlRegex =
@@ -1,14 +1,16 @@
package emu.grasscutter.command;
import static emu.grasscutter.config.Configuration.SERVER;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.event.game.ExecuteCommandEvent;
import it.unimi.dsi.fastutil.objects.*;
import java.util.*;
import org.reflections.Reflections;
import java.util.*;
import static emu.grasscutter.config.Configuration.SERVER;
@SuppressWarnings({"UnusedReturnValue", "unused"})
public final class CommandMap {
private static final int INVALID_UID = Integer.MIN_VALUE;
@@ -52,7 +54,7 @@ public final class CommandMap {
* @return Instance chaining.
*/
public CommandMap registerCommand(String label, CommandHandler command) {
Grasscutter.getLogger().debug("Registered command: " + label);
Grasscutter.getLogger().trace("Registered command: " + label);
label = label.toLowerCase();
// Get command data.
@@ -75,7 +77,7 @@ public final class CommandMap {
* @return Instance chaining.
*/
public CommandMap unregisterCommand(String label) {
Grasscutter.getLogger().debug("Unregistered command: " + label);
Grasscutter.getLogger().trace("Un-registered command: " + label);
CommandHandler handler = this.commands.get(label);
if (handler == null) return this;
@@ -136,7 +138,7 @@ public final class CommandMap {
String arg = args.get(i);
if (arg.startsWith("@")) {
arg = args.remove(i).substring(1);
if (arg.equals("")) {
if (arg.isEmpty()) {
// This is a special case to target nothing, distinct from failing to assign a target.
// This is specifically to allow in-game players to run a command without targeting
// themselves or anyone else.
@@ -180,7 +182,7 @@ public final class CommandMap {
}
private boolean setPlayerTarget(String playerId, Player player, String targetUid) {
if (targetUid.equals("")) { // Clears the default targetPlayer.
if (targetUid.isEmpty()) { // Clears the default targetPlayer.
targetPlayerIds.removeInt(playerId);
CommandHandler.sendTranslatedMessage(player, "commands.execution.clear_target");
return true;
@@ -217,6 +219,14 @@ public final class CommandMap {
* @param rawMessage The messaged used to invoke the command.
*/
public void invoke(Player player, Player targetPlayer, String rawMessage) {
// Invoke the ExecuteCommandEvent.
var event = new ExecuteCommandEvent(player, targetPlayer, rawMessage);
if (!event.call()) return;
player = event.getSender();
targetPlayer = event.getTarget();
rawMessage = event.getCommand();
// The console outputs in-game command. [{Account Username} (Player UID: {Player Uid})]
if (SERVER.logCommands) {
if (player != null) {
@@ -234,7 +244,7 @@ public final class CommandMap {
}
rawMessage = rawMessage.trim();
if (rawMessage.length() == 0) {
if (rawMessage.isEmpty()) {
CommandHandler.sendTranslatedMessage(player, "commands.generic.not_specified");
return;
}
@@ -250,17 +260,16 @@ public final class CommandMap {
this.setPlayerTarget(playerId, player, label.substring(1));
return;
} else if (label.equalsIgnoreCase("target")) { // target [[@]UID]
if (args.size() > 0) {
if (!args.isEmpty()) {
String targetUidStr = args.get(0);
if (targetUidStr.startsWith("@")) {
targetUidStr = targetUidStr.substring(1);
}
this.setPlayerTarget(playerId, player, targetUidStr);
return;
} else {
this.setPlayerTarget(playerId, player, "");
return;
}
return;
}
// Get command handler.
@@ -275,7 +284,7 @@ public final class CommandMap {
// Get the command's annotation.
Command annotation = this.annotations.get(label);
// Resolve targetPlayer
// Resolve 'targetPlayer'.
try {
targetPlayer = getTargetPlayer(playerId, player, targetPlayer, args);
} catch (IllegalArgumentException e) {
@@ -315,11 +324,12 @@ public final class CommandMap {
}
// Copy player and handler to final properties.
final Player targetPlayerF = targetPlayer; // Is there a better way to do this?
final CommandHandler handlerF = handler; // Is there a better way to do this?
final var playerF = player;
final var targetPlayerF = targetPlayer;
final var handlerF = handler;
// Invoke execute method for handler.
Runnable runnable = () -> handlerF.execute(player, targetPlayerF, args);
Runnable runnable = () -> handlerF.execute(playerF, targetPlayerF, args);
if (annotation.threading()) {
new Thread(runnable).start();
} else {
@@ -1,7 +1,5 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import at.favre.lib.crypto.bcrypt.BCrypt;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.*;
@@ -9,9 +7,12 @@ import emu.grasscutter.config.Configuration;
import emu.grasscutter.database.*;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.player.Player;
import java.util.List;
import java.util.stream.Collectors;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "account",
usage = {
@@ -1,14 +1,12 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.achievement.AchievementData;
import emu.grasscutter.game.achievement.AchievementControlReturns;
import emu.grasscutter.game.achievement.Achievements;
import emu.grasscutter.game.achievement.*;
import emu.grasscutter.game.player.Player;
import java.util.List;
import java.util.Optional;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
@Command(
@@ -1,15 +1,13 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketServerAnnounceNotify;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.*;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "announce",
@@ -1,10 +1,10 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.game.GameSession;
import java.util.List;
@Command(
@@ -1,19 +1,16 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.command.CommandHelpers.*;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.inventory.Inventory;
import emu.grasscutter.game.inventory.ItemType;
import emu.grasscutter.command.*;
import emu.grasscutter.game.inventory.*;
import emu.grasscutter.game.player.Player;
import java.util.List;
import java.util.Map;
import lombok.Setter;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import lombok.Setter;
import static emu.grasscutter.command.CommandHelpers.*;
@Command(
label = "clear",
@@ -1,9 +1,9 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import java.util.List;
@Command(
@@ -1,12 +1,12 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketCutsceneBeginNotify;
import java.util.List;
import lombok.val;
import java.util.List;
@Command(
label = "cutscene",
aliases = {"c"},
@@ -0,0 +1,72 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import java.util.List;
@Command(
label = "debug",
usage = "/debug",
permission = "grasscutter.command.debug",
targetRequirement = Command.TargetRequirement.NONE)
public final class DebugCommand implements CommandHandler {
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
if (sender == null) return;
if (args.isEmpty()) {
sender.dropMessage("No arguments provided. (check command for help)");
return;
}
var subCommand = args.get(0);
args.remove(0);
switch (subCommand) {
default -> sender.dropMessage("No arguments provided. (check command for help)");
case "abilities" -> {
if (args.isEmpty()) {
sender.dropMessage("No arguments provided. (check command for help)");
return;
}
var scene = sender.getScene();
var entityId = Integer.parseInt(args.get(0));
var entity =
args.size() > 1 && args.get(1).equals("config")
? scene.getEntityByConfigId(entityId)
: scene.getEntityById(entityId);
if (entity == null) {
sender.dropMessage("Entity not found.");
return;
}
try {
var abilities = entity.getInstancedAbilities();
for (var i = 0; i < abilities.size(); i++) {
try {
var ability = abilities.get(i);
Grasscutter.getLogger()
.debug(
"Ability #{}: {}; Modifiers: {}",
i,
ability.toString(),
ability.getModifiers().keySet());
} catch (Exception exception) {
Grasscutter.getLogger().warn("Failed to print ability #{}.", i, exception);
}
}
if (abilities.isEmpty()) {
Grasscutter.getLogger().debug("No abilities found on {}.", entity.toString());
}
} catch (Exception exception) {
Grasscutter.getLogger().warn("Failed to get abilities.", exception);
}
sender.dropMessage("Check console for abilities.");
}
}
}
}
@@ -1,12 +1,12 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "enter_dungeon",
aliases = {"enterdungeon", "dungeon"},
@@ -1,23 +1,20 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.command.CommandHelpers.*;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ElementType;
import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.game.props.*;
import emu.grasscutter.game.world.Scene;
import emu.grasscutter.server.event.entity.EntityDamageEvent;
import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import lombok.Setter;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.regex.Pattern;
import lombok.Setter;
import static emu.grasscutter.command.CommandHelpers.*;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "entity",
@@ -1,29 +1,23 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.*;
import emu.grasscutter.data.*;
import emu.grasscutter.data.excels.ItemData;
import emu.grasscutter.data.excels.avatar.AvatarData;
import emu.grasscutter.data.excels.reliquary.*;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.inventory.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.*;
import lombok.Setter;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.regex.Pattern;
import static emu.grasscutter.GameConstants.*;
import static emu.grasscutter.command.CommandHelpers.*;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.GameDepot;
import emu.grasscutter.data.excels.ItemData;
import emu.grasscutter.data.excels.avatar.AvatarData;
import emu.grasscutter.data.excels.reliquary.ReliquaryAffixData;
import emu.grasscutter.data.excels.reliquary.ReliquaryMainPropData;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.inventory.ItemType;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.game.props.FightProperty;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.regex.Pattern;
import lombok.Setter;
@Command(
label = "give",
aliases = {"g", "item", "giveitem"},
@@ -1,16 +1,16 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.world.SceneGroupInstance;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.world.SceneGroupInstance;
import java.util.List;
@Command(
label = "group",
aliases = {"g"},
aliases = {"gr"},
usage = {"(refresh) [<groupId>] [<suiteId>]"},
permission = "player.group",
permissionTargeted = "player.group.others")
@@ -1,15 +1,14 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify;
import emu.grasscutter.server.packet.send.PacketAvatarLifeStateChangeNotify;
import emu.grasscutter.server.packet.send.*;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "heal",
aliases = {"h"},
@@ -1,14 +1,12 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.CommandMap;
import emu.grasscutter.command.*;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.player.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "help",
@@ -0,0 +1,68 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.*;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.tools.Tools;
import java.util.List;
@Command(label = "info", aliases = {"troubleshoot", "helpme"},
usage = "/info", targetRequirement = Command.TargetRequirement.NONE)
public final class InfoCommand implements CommandHandler {
// This command can use the 'grasscutter.command.troubleshoot' permission to show sensitive information.
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
// Collect server information.
var build = "%s (%s)".formatted(
BuildConfig.VERSION, BuildConfig.GIT_HASH);
var playerCount = Grasscutter.getGameServer()
.getPlayers().size();
var resourceInfo = Tools.resourcesInfo();
// Collect configuration information.
var config = Grasscutter.getConfig();
var gameOptions = config.server.game;
var questingEnabled = gameOptions.gameOptions.questing.enabled;
var scriptsEnabled = gameOptions.enableScriptInBigWorld;
var fastRequire = config.server.fastRequire;
CommandHandler.sendMessage(sender, """
Created by Meledy
- currently maintained by KingRainbow44
- formerly maintained by Birdulon
Other Credits
- Slushy Team (akio, azzu, Areha11Fz, tamil; protocol)
- Yuki (resource minifying & packaging)
- Dimbreath (dumping most resources)""");
// TODO: Send to remote server (Grasscutter API) and send dump link.
if (
sender == null
|| sender.getAccount()
.hasPermission("grasscutter.command.troubleshoot")
|| playerCount == 1
) {
CommandHandler.sendMessage(sender, """
Server Information
Revision: %s
Player Count: %d
Questing Enabled: %s
Scripts Enabled: %s
Operating System: %s
Using Fast Require: %s
Resource Information: %s
discord.gg/T5vZU6UyeG"""
.formatted(
build, playerCount, questingEnabled, scriptsEnabled, fastRequire,
System.getProperty("os.name"), resourceInfo.toString()
)
);
} else {
CommandHandler.sendMessage(sender, """
Grasscutter Discord: discord.gg/T5vZU6UyeG""");
}
}
}
@@ -1,8 +1,8 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import java.util.List;
@Command(
@@ -1,15 +1,14 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.entity.EntityMonster;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.command.*;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.world.Scene;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "killall",
usage = {"[<sceneId>]"},
@@ -1,17 +1,15 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.game.props.LifeState;
import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify;
import emu.grasscutter.server.packet.send.PacketLifeStateChangeNotify;
import emu.grasscutter.game.props.*;
import emu.grasscutter.server.packet.send.*;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "killCharacter",
aliases = {"suicide", "kill"},
@@ -1,14 +1,13 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.utils.Utils;
import java.util.List;
import java.util.Locale;
import java.util.*;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "language",
@@ -1,13 +1,12 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import java.util.List;
import java.util.Map;
import java.util.*;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "list",
@@ -1,15 +1,15 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.*;
import emu.grasscutter.command.Command.TargetRequirement;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.player.Player;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "permission",
usage = {"add <permission>", "remove <permission>", "clear", "list"},
@@ -1,9 +1,9 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.world.Position;
import java.util.List;
@Command(
@@ -1,13 +1,15 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.quest.GameQuest;
import java.util.List;
import emu.grasscutter.game.quest.enums.*;
import java.util.*;
import java.util.stream.Collectors;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "quest",
aliases = {"q"},
@@ -15,27 +17,30 @@ import java.util.stream.Collectors;
permission = "player.quest",
permissionTargeted = "player.quest.others")
public final class QuestCommand implements CommandHandler {
private static final List<String> SINGLE_ARG = List.of("dungeons", "list");
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
if (args.size() != 2 || (args.size() == 1 && !args.get(0).toLowerCase().equals("dungeons"))) {
if (args.isEmpty()) {
sendUsageMessage(sender);
return;
}
String cmd = args.get(0).toLowerCase();
int questId;
var cmd = args.get(0).toLowerCase();
int questId = -1;
try {
questId = Integer.parseInt(args.get(1));
} catch (Exception e) {
CommandHandler.sendMessage(sender, translate(sender, "commands.quest.invalid_id"));
return;
if (!SINGLE_ARG.contains(cmd)) {
try {
questId = Integer.parseInt(args.get(1));
} catch (Exception e) {
CommandHandler.sendMessage(sender, translate(sender, "commands.quest.invalid_id"));
return;
}
}
switch (cmd) {
case "add" -> {
GameQuest quest = targetPlayer.getQuestManager().addQuest(questId);
var quest = targetPlayer.getQuestManager().addQuest(questId);
if (quest != null) {
CommandHandler.sendMessage(sender, translate(sender, "commands.quest.added", questId));
@@ -45,7 +50,7 @@ public final class QuestCommand implements CommandHandler {
CommandHandler.sendMessage(sender, translate(sender, "commands.quest.not_found"));
}
case "finish" -> {
GameQuest quest = targetPlayer.getQuestManager().getQuestById(questId);
var quest = targetPlayer.getQuestManager().getQuestById(questId);
if (quest == null) {
CommandHandler.sendMessage(sender, translate(sender, "commands.quest.not_found"));
@@ -112,7 +117,7 @@ public final class QuestCommand implements CommandHandler {
var shouldAdd = !loggedQuests.contains(questId);
if (shouldAdd) loggedQuests.add(questId);
else loggedQuests.remove(loggedQuests.indexOf(questId));
else loggedQuests.remove(questId);
CommandHandler.sendMessage(
sender,
@@ -147,6 +152,25 @@ public final class QuestCommand implements CommandHandler {
.map(entry -> "%s: %s".formatted(entry.getKey(), entry.getValue()))
.collect(Collectors.joining(", ")));
}
case "list" -> {
var questManager = targetPlayer.getQuestManager();
var mainQuests = questManager.getActiveMainQuests();
var allQuestIds =
mainQuests.stream()
.filter(quest -> questManager.getLoggedQuests().contains(quest.getParentQuestId()))
.filter(quest -> quest.getState() != ParentQuestState.PARENT_QUEST_STATE_FINISHED)
.map(quest -> quest.getChildQuests().values())
.flatMap(Collection::stream)
.filter(quest -> quest.getState() == QuestState.QUEST_STATE_UNFINISHED)
.map(GameQuest::getSubQuestId)
.map(String::valueOf)
.toList();
CommandHandler.sendMessage(
sender,
"Quests: "
+ (allQuestIds.isEmpty() ? "(no active quests)" : String.join(", ", allQuestIds)));
}
default -> this.sendUsageMessage(sender);
}
}
@@ -1,13 +1,13 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "reload",
permission = "server.reload",
@@ -1,14 +1,14 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.player.Player;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "resetConst",
aliases = {"resetconstellation"},
@@ -1,12 +1,12 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "resetShopLimit",
aliases = {"resetshop"},
@@ -1,16 +1,14 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.mail.Mail;
import emu.grasscutter.game.player.Player;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.*;
import static emu.grasscutter.utils.lang.Language.translate;
@SuppressWarnings("ConstantConditions")
@Command(
@@ -1,10 +1,10 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.*;
import emu.grasscutter.command.Command.TargetRequirement;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.player.Player;
import java.util.List;
@Command(
@@ -1,14 +1,12 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.game.world.Scene;
import emu.grasscutter.game.world.World;
import emu.grasscutter.game.world.*;
import emu.grasscutter.server.packet.send.PacketSceneEntityAppearNotify;
import java.util.List;
@Command(
@@ -1,15 +1,15 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.data.GameData;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketAvatarFetterDataNotify;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "setFetterLevel",
usage = {"<level>"},
@@ -1,17 +1,13 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.data.GameData;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.PlayerProperty;
import emu.grasscutter.game.tower.TowerLevelRecord;
import emu.grasscutter.server.packet.send.PacketOpenStateChangeNotify;
import emu.grasscutter.server.packet.send.PacketSceneAreaUnlockNotify;
import emu.grasscutter.server.packet.send.PacketScenePointUnlockNotify;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import emu.grasscutter.server.packet.send.*;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.IntStream;
@@ -86,6 +82,12 @@ public final class SetPropCommand implements CommandHandler {
this.props.put("fly", flyable);
this.props.put("glider", flyable);
this.props.put("canglide", flyable);
Prop dive = new Prop("CanDive", PlayerProperty.PROP_PLAYER_CAN_DIVE, PseudoProp.CAN_DIVE);
this.props.put("dive", dive);
this.props.put("swim", dive);
this.props.put("water", dive);
this.props.put("candive", dive);
}
@Override
@@ -129,6 +131,7 @@ public final class SetPropCommand implements CommandHandler {
case SET_OPENSTATE -> this.setOpenState(targetPlayer, value, 1);
case UNSET_OPENSTATE -> this.setOpenState(targetPlayer, value, 0);
case UNLOCK_MAP -> unlockMap(targetPlayer, value);
case CAN_DIVE -> canDive(targetPlayer, value);
default -> targetPlayer.setProperty(prop.prop, value);
};
@@ -219,6 +222,20 @@ public final class SetPropCommand implements CommandHandler {
return true;
}
private boolean canDive(Player targetPlayer, int value) {
// allow diving and set max stamina OR not
if (value == 0) {
targetPlayer.setProperty(PlayerProperty.PROP_PLAYER_CAN_DIVE, 0);
targetPlayer.setProperty(PlayerProperty.PROP_DIVE_MAX_STAMINA, 0);
targetPlayer.setProperty(PlayerProperty.PROP_DIVE_CUR_STAMINA, 0);
} else {
targetPlayer.setProperty(PlayerProperty.PROP_PLAYER_CAN_DIVE, 1);
targetPlayer.setProperty(PlayerProperty.PROP_DIVE_MAX_STAMINA, 10000);
targetPlayer.setProperty(PlayerProperty.PROP_DIVE_CUR_STAMINA, 10000);
}
return true;
}
private boolean unlockMap(Player targetPlayer, int value) {
// Unlock.
GameData.getScenePointsPerScene()
@@ -270,7 +287,8 @@ public final class SetPropCommand implements CommandHandler {
SET_OPENSTATE,
UNSET_OPENSTATE,
UNLOCK_MAP,
IS_FLYABLE
IS_FLYABLE,
CAN_DIVE
}
static class Prop {
@@ -1,15 +1,13 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
@Command(
label = "setStats",
@@ -1,18 +1,18 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.server.packet.send.PacketScenePlayerSoundNotify;
import java.util.List;
import lombok.val;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "sound",
aliases = {"s", "audio"},
aliases = {"audio"},
usage = {"[<audioname>] [<x><y><z>]"},
permission = "player.sound",
permissionTargeted = "player.sound.others")
@@ -1,27 +1,23 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.*;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.*;
import emu.grasscutter.data.excels.monster.MonsterData;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.*;
import emu.grasscutter.game.world.*;
import lombok.Setter;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.regex.Pattern;
import static emu.grasscutter.command.CommandHelpers.*;
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.GadgetData;
import emu.grasscutter.data.excels.ItemData;
import emu.grasscutter.data.excels.monster.MonsterData;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.EntityType;
import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.game.world.Scene;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.regex.Pattern;
import lombok.Setter;
@Command(
label = "spawn",
aliases = {"drop", "s"},
@@ -1,13 +1,13 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "stop",
aliases = {"shutdown"},
@@ -1,12 +1,12 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.avatar.AvatarSkillDepotData;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.utils.lang.Language;
import java.util.List;
@Command(
@@ -1,14 +1,12 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketChangeMpTeamAvatarRsp;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.*;
import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
@Command(
label = "team",
@@ -1,13 +1,13 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "teleportAll",
aliases = {"tpall"},
@@ -1,14 +1,14 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "teleport",
aliases = {"tp"},
@@ -1,17 +1,16 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.activity.trialavatar.TrialAvatarActivityHandler;
import emu.grasscutter.game.activity.trialavatar.TrialAvatarPlayerData;
import emu.grasscutter.command.*;
import emu.grasscutter.game.activity.trialavatar.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ActivityType;
import emu.grasscutter.server.packet.send.PacketActivityInfoNotify;
import emu.grasscutter.utils.JsonUtils;
import java.util.List;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "trialAvatarActivity",
aliases = {"taa"},
@@ -1,46 +0,0 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.BuildConfig;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.tools.Tools;
import java.util.List;
@Command(label = "troubleshoot", aliases = {"helpme"},
usage = "/troubleshoot", permission = "grasscutter.command.troubleshoot",
targetRequirement = Command.TargetRequirement.NONE)
public final class TroubleshootCommand implements CommandHandler {
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
// Collect server information.
var build = "%s (%s)".formatted(
BuildConfig.VERSION, BuildConfig.GIT_HASH);
var playerCount = Grasscutter.getGameServer()
.getPlayers().size();
var resourceInfo = Tools.resourcesInfo();
// Collect configuration information.
var config = Grasscutter.getConfig();
var gameOptions = config.server.game;
var questingEnabled = gameOptions.gameOptions.questing.enabled;
var scriptsEnabled = gameOptions.enableScriptInBigWorld;
// TODO: Send to remote server (Grasscutter API) and send dump link.
CommandHandler.sendMessage(sender, """
Troubleshooting/Debug Information
Revision: %s
Player Count: %d
Questing Enabled: %s
Scripts Enabled: %s
Operating System: %s
Resource Information: %s"""
.formatted(
build, playerCount, questingEnabled, scriptsEnabled,
System.getProperty("os.name"), resourceInfo.toString()
)
);
}
}
@@ -1,9 +1,9 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.player.Player;
import java.util.List;
@Command(
@@ -1,16 +1,13 @@
package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.data.GameData;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.player.PlayerProgressManager;
import emu.grasscutter.game.player.*;
import emu.grasscutter.server.packet.send.PacketOpenStateChangeNotify;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import static emu.grasscutter.utils.lang.Language.translate;
@Command(
label = "unlockall",
@@ -1,9 +1,9 @@
package emu.grasscutter.command.commands;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.command.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ClimateType;
import java.util.List;
@Command(
@@ -29,9 +29,13 @@ public class ConfigContainer {
* Version 9 - 'limits' was added for handbook requests.
* Version 10 - 'trialCostumes' was added for enabling costumes
* on trial avatars.
* Version 11 - 'server.fastRequire' was added for disabling the new
* Lua script require system if performance is a concern.
* Version 12 - 'http.startImmediately' was added to control whether the
* HTTP server should start immediately.
*/
private static int version() {
return 10;
return 12;
}
/**
@@ -41,7 +45,7 @@ public class ConfigContainer {
try { // Check if the server is using a legacy config.
var configObject = JsonUtils.loadToClass(Grasscutter.configFile.toPath(), JsonObject.class);
if (!configObject.has("version")) {
Grasscutter.getLogger().info("Updating legacy ..");
Grasscutter.getLogger().info("Updating legacy config...");
Grasscutter.saveConfig(null);
}
} catch (Exception ignored) { }
@@ -111,6 +115,12 @@ public class ConfigContainer {
public ServerRunMode runMode = ServerRunMode.HYBRID;
public boolean logCommands = false;
/**
* If enabled, the 'require' Lua function will load the script's compiled varient into the context. (faster; doesn't work as well)
* If disabled, all 'require' calls will be replaced with the referenced script's source. (slower; works better)
*/
public boolean fastRequire = true;
public HTTP http = new HTTP();
public Game game = new Game();
@@ -134,6 +144,9 @@ public class ConfigContainer {
/* Server options. */
public static class HTTP {
/* This starts the HTTP server before the game server. */
public boolean startImmediately = false;
public String bindAddress = "0.0.0.0";
public int bindPort = 443;
@@ -1,11 +1,12 @@
package emu.grasscutter.config;
import static emu.grasscutter.Grasscutter.config;
import emu.grasscutter.utils.FileUtils;
import java.nio.file.Path;
import java.util.Locale;
import static emu.grasscutter.Grasscutter.config;
/**
* A data container for the server's configuration.
*
@@ -38,6 +39,7 @@ public final class Configuration extends ConfigContainer {
config.server.game.gameOptions.inventoryLimits;
public static final GameOptions.HandbookOptions HANDBOOK =
config.server.game.gameOptions.handbook;
public static final boolean FAST_REQUIRE = config.server.fastRequire;
private static final String DATA_FOLDER = config.folderStructure.data;
private static final String PLUGINS_FOLDER = config.folderStructure.plugins;
private static final String SCRIPTS_FOLDER = config.folderStructure.scripts;
@@ -3,19 +3,13 @@ package emu.grasscutter.data;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.server.http.handlers.GachaHandler;
import emu.grasscutter.tools.Tools;
import emu.grasscutter.utils.FileUtils;
import emu.grasscutter.utils.JsonUtils;
import emu.grasscutter.utils.TsvUtils;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import emu.grasscutter.utils.*;
import lombok.val;
import java.io.*;
import java.nio.file.*;
import java.util.*;
public class DataLoader {
/**
@@ -98,7 +92,7 @@ public class DataLoader {
public static <T> List<T> loadTableToList(String resourcePath, Class<T> classType)
throws IOException {
val path = FileUtils.getDataPathTsjJsonTsv(resourcePath);
Grasscutter.getLogger().debug("Loading data table from: " + path);
Grasscutter.getLogger().trace("Loading data table from: " + path);
return switch (FileUtils.getFileExtension(path)) {
case "json" -> JsonUtils.loadToList(path, classType);
case "tsj" -> TsvUtils.loadTsjToListSetField(path, classType);
@@ -4,58 +4,34 @@ import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.binout.*;
import emu.grasscutter.data.binout.config.*;
import emu.grasscutter.data.binout.routes.Route;
import emu.grasscutter.data.custom.TrialAvatarActivityCustomData;
import emu.grasscutter.data.custom.TrialAvatarCustomData;
import emu.grasscutter.data.custom.*;
import emu.grasscutter.data.excels.*;
import emu.grasscutter.data.excels.achievement.AchievementData;
import emu.grasscutter.data.excels.achievement.AchievementGoalData;
import emu.grasscutter.data.excels.activity.ActivityCondExcelConfigData;
import emu.grasscutter.data.excels.activity.ActivityData;
import emu.grasscutter.data.excels.activity.ActivityShopData;
import emu.grasscutter.data.excels.activity.ActivityWatcherData;
import emu.grasscutter.data.excels.achievement.*;
import emu.grasscutter.data.excels.activity.*;
import emu.grasscutter.data.excels.avatar.*;
import emu.grasscutter.data.excels.codex.*;
import emu.grasscutter.data.excels.dungeon.*;
import emu.grasscutter.data.excels.monster.MonsterCurveData;
import emu.grasscutter.data.excels.monster.MonsterData;
import emu.grasscutter.data.excels.monster.MonsterDescribeData;
import emu.grasscutter.data.excels.monster.MonsterSpecialNameData;
import emu.grasscutter.data.excels.quest.QuestData;
import emu.grasscutter.data.excels.quest.QuestGlobalVarData;
import emu.grasscutter.data.excels.reliquary.ReliquaryAffixData;
import emu.grasscutter.data.excels.reliquary.ReliquaryLevelData;
import emu.grasscutter.data.excels.reliquary.ReliquaryMainPropData;
import emu.grasscutter.data.excels.reliquary.ReliquarySetData;
import emu.grasscutter.data.excels.tower.TowerFloorData;
import emu.grasscutter.data.excels.tower.TowerLevelData;
import emu.grasscutter.data.excels.tower.TowerScheduleData;
import emu.grasscutter.data.excels.giving.*;
import emu.grasscutter.data.excels.monster.*;
import emu.grasscutter.data.excels.quest.*;
import emu.grasscutter.data.excels.reliquary.*;
import emu.grasscutter.data.excels.scene.*;
import emu.grasscutter.data.excels.tower.*;
import emu.grasscutter.data.excels.trial.*;
import emu.grasscutter.data.excels.weapon.WeaponCurveData;
import emu.grasscutter.data.excels.weapon.WeaponLevelData;
import emu.grasscutter.data.excels.weapon.WeaponPromoteData;
import emu.grasscutter.data.excels.world.WeatherData;
import emu.grasscutter.data.excels.world.WorldAreaData;
import emu.grasscutter.data.excels.world.WorldLevelData;
import emu.grasscutter.data.server.ActivityCondGroup;
import emu.grasscutter.data.server.DropSubfieldMapping;
import emu.grasscutter.data.server.DropTableExcelConfigData;
import emu.grasscutter.data.server.GadgetMapping;
import emu.grasscutter.data.server.MonsterMapping;
import emu.grasscutter.data.server.SubfieldMapping;
import emu.grasscutter.data.excels.weapon.*;
import emu.grasscutter.data.excels.world.*;
import emu.grasscutter.data.server.*;
import emu.grasscutter.game.dungeons.DungeonDropEntry;
import emu.grasscutter.game.quest.QuestEncryptionKey;
import emu.grasscutter.game.quest.RewindData;
import emu.grasscutter.game.quest.TeleportData;
import emu.grasscutter.game.quest.*;
import emu.grasscutter.game.quest.enums.QuestCond;
import emu.grasscutter.game.world.GroupReplacementData;
import emu.grasscutter.utils.Utils;
import it.unimi.dsi.fastutil.ints.*;
import lombok.*;
import javax.annotation.Nullable;
import java.lang.reflect.Field;
import java.util.*;
import javax.annotation.Nullable;
import lombok.Getter;
import lombok.Setter;
import lombok.val;
@SuppressWarnings({"unused", "MismatchedQueryAndUpdateOfCollection"})
public final class GameData {
@@ -165,6 +141,9 @@ public final class GameData {
private static final Int2ObjectMap<AvatarTalentData> avatarTalentDataMap =
new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<BargainData> bargainDataMap = new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<BattlePassMissionData> battlePassMissionDataMap =
new Int2ObjectOpenHashMap<>();
@@ -266,6 +245,13 @@ public final class GameData {
@Getter
private static final Int2ObjectMap<GatherData> gatherDataMap = new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<GivingData> givingDataMap = new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<GivingGroupData> givingGroupDataMap =
new Int2ObjectOpenHashMap<>();
@Getter
@Deprecated // This is to prevent people from using this map. This is for the resource loader
// only!
@@ -280,12 +266,27 @@ public final class GameData {
private static final Int2ObjectMap<HomeWorldLevelData> homeWorldLevelDataMap =
new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<HomeWorldNPCData> homeWorldNPCDataMap =
new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<InvestigationMonsterData> investigationMonsterDataMap =
new Int2ObjectOpenHashMap<>();
@Getter private static final Int2ObjectMap<ItemData> itemDataMap = new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<MapLayerData> mapLayerDataMap = new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<MapLayerFloorData> mapLayerFloorDataMap =
new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<MapLayerGroupData> mapLayerGroupDataMap =
new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<MonsterCurveData> monsterCurveDataMap =
new Int2ObjectOpenHashMap<>();
@@ -352,6 +353,10 @@ public final class GameData {
@Getter
private static final Int2ObjectMap<SceneData> sceneDataMap = new Int2ObjectLinkedOpenHashMap<>();
@Getter
private static final Int2ObjectMap<SceneTagData> sceneTagDataMap =
new Int2ObjectLinkedOpenHashMap<>();
@Getter
private static final Int2ObjectMap<TalkConfigData> talkConfigDataMap =
new Int2ObjectOpenHashMap<>();
@@ -2,19 +2,14 @@ package emu.grasscutter.data;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.ResourceLoader.AvatarConfig;
import emu.grasscutter.data.excels.reliquary.ReliquaryAffixData;
import emu.grasscutter.data.excels.reliquary.ReliquaryMainPropData;
import emu.grasscutter.data.excels.reliquary.*;
import emu.grasscutter.game.managers.blossom.BlossomConfig;
import emu.grasscutter.game.world.SpawnDataEntry;
import emu.grasscutter.utils.objects.WeightedList;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.Getter;
import lombok.Setter;
import it.unimi.dsi.fastutil.ints.*;
import lombok.*;
import java.util.*;
public class GameDepot {
public static final int[] BLOCK_SIZE = new int[] {50, 500}; // Scales
@@ -1,8 +1,5 @@
package emu.grasscutter.data;
import static emu.grasscutter.utils.FileUtils.*;
import static emu.grasscutter.utils.lang.Language.translate;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import emu.grasscutter.Grasscutter;
@@ -23,6 +20,9 @@ import emu.grasscutter.scripts.*;
import emu.grasscutter.utils.*;
import it.unimi.dsi.fastutil.Pair;
import it.unimi.dsi.fastutil.ints.*;
import lombok.*;
import javax.script.*;
import java.io.*;
import java.nio.file.*;
import java.util.*;
@@ -30,9 +30,9 @@ import java.util.Map.Entry;
import java.util.concurrent.*;
import java.util.regex.Pattern;
import java.util.stream.*;
import javax.script.*;
import lombok.*;
import org.reflections.Reflections;
import static emu.grasscutter.utils.FileUtils.*;
import static emu.grasscutter.utils.lang.Language.translate;
public final class ResourceLoader {
@@ -41,8 +41,7 @@ public final class ResourceLoader {
// Get a list of all resource classes, sorted by loadPriority
public static List<Class<?>> getResourceDefClasses() {
Reflections reflections = new Reflections(ResourceLoader.class.getPackage().getName());
Set<?> classes = reflections.getSubTypesOf(GameResource.class);
Set<?> classes = Grasscutter.reflector.getSubTypesOf(GameResource.class);
List<Class<?>> classList = new ArrayList<>(classes.size());
classes.forEach(
@@ -62,9 +61,8 @@ public final class ResourceLoader {
}
// Get a list containing sets of all resource classes, sorted by loadPriority
protected static List<Set<Class<?>>> getResourceDefClassesPrioritySets() {
val reflections = new Reflections(ResourceLoader.class.getPackage().getName());
val classes = reflections.getSubTypesOf(GameResource.class);
private static List<Set<Class<?>>> getResourceDefClassesPrioritySets() {
val classes = Grasscutter.reflector.getSubTypesOf(GameResource.class);
val priorities = ResourceType.LoadPriority.getInOrder();
Grasscutter.getLogger().debug("Priorities are " + priorities);
val map = new LinkedHashMap<ResourceType.LoadPriority, Set<Class<?>>>(priorities.size());
@@ -780,7 +778,7 @@ public final class ResourceLoader {
if (cs == null) return;
try {
cs.eval(bindings);
ScriptLoader.eval(cs, bindings);
// these are Map<String, class>
var teleportDataMap =
ScriptLoader.getSerializer()
@@ -964,7 +962,7 @@ public final class ResourceLoader {
}
try {
cs.eval(bindings);
ScriptLoader.eval(cs, bindings);
// these are Map<String, class>
var replacementsMap =
ScriptLoader.getSerializer()
@@ -1,7 +1,6 @@
package emu.grasscutter.data;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.*;
import java.util.List;
import java.util.stream.Stream;
@@ -3,8 +3,8 @@ package emu.grasscutter.data.binout;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import emu.grasscutter.game.ability.AbilityLocalIdGenerator;
import emu.grasscutter.game.ability.AbilityLocalIdGenerator.ConfigAbilitySubContainerType;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
public class AbilityData {
public String abilityName;
@@ -1,12 +1,11 @@
package emu.grasscutter.data.binout;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.*;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.*;
public class AbilityMixinData implements Serializable {
private static final long serialVersionUID = -2001232313615923575L;
@@ -3,12 +3,15 @@ package emu.grasscutter.data.binout;
import com.google.gson.annotations.SerializedName;
import emu.grasscutter.data.common.DynamicFloat;
import emu.grasscutter.game.props.ElementType;
import java.io.Serializable;
import lombok.ToString;
import java.io.Serializable;
public class AbilityModifier implements Serializable {
private static final long serialVersionUID = -2001232313615923575L;
public State state;
@SerializedName(
value = "onAdded",
alternate = {"KCICDEJLIJD"})
@@ -316,6 +319,7 @@ public class AbilityModifier implements Serializable {
public boolean ownerIsTarget;
public boolean isFromOwner;
public String key;
public String globalValueKey;
public String abilityFormula;
public String srcTarget, dstTarget;
@@ -340,6 +344,23 @@ public class AbilityModifier implements Serializable {
public int param2;
public int param3;
public String funcName;
public LuaCallType luaCallType;
@SerializedName("CallParamList")
public int[] callParamList;
public String content;
public enum LuaCallType {
FromGroup,
CurGalleryControlGroup,
CurChallengeGroup,
SpecificGroup,
AbilityGroupSourceGroup,
CurScenePlay
}
public enum DropType {
LevelControl,
BigWorldOnly,
@@ -347,6 +368,20 @@ public class AbilityModifier implements Serializable {
}
}
public enum State {
LockHP,
Invincible,
ElementFreeze,
ElementPetrifaction,
DenyLockOn,
Limbo,
NoHeal,
IgnoreAddEnergy,
IsGhostToEnemy,
IsGhostToAllied,
UnlockFrequencyLimit
}
// The following should be implemented into DynamicFloat if older resource formats need to be
// supported
// public static class AbilityModifierValue {
@@ -1,8 +1,8 @@
package emu.grasscutter.data.binout;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
public class AbilityModifierEntry {
public List<AbilityModifierAction> onModifierAdded;
@@ -1,10 +1,10 @@
package emu.grasscutter.data.binout;
import javax.annotation.Nullable;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
import javax.annotation.Nullable;
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class ConfigGadget {
@@ -1,7 +1,6 @@
package emu.grasscutter.data.binout;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
@Data
@@ -1,7 +1,6 @@
package emu.grasscutter.data.binout;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
@Data
@@ -2,48 +2,48 @@ package emu.grasscutter.data.binout;
import com.google.gson.annotations.SerializedName;
import emu.grasscutter.game.world.Position;
import java.util.List;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
import java.util.List;
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class HomeworldDefaultSaveData {
@SerializedName(
value = "KFHBFNPDJBE",
alternate = {"PKACPHDGGEI", "AKOLOBLHDFK"})
value = "homeBlockLists",
alternate = {"PKACPHDGGEI", "AKOLOBLHDFK", "KFHBFNPDJBE"})
List<HomeBlock> homeBlockLists;
@SerializedName(
value = "IJNPADKGNKE",
alternate = {"MINCKHBNING", "MBICDPDEKDM"})
value = "bornPos",
alternate = {"MINCKHBNING", "MBICDPDEKDM", "IJNPADKGNKE"})
Position bornPos;
@SerializedName(
value = "IPIIGEMFLHK",
alternate = {"EJJIOJKFKCO"})
value = "bornRot",
alternate = {"EJJIOJKFKCO", "IPIIGEMFLHK"})
Position bornRot;
@SerializedName(
value = "HHOLBNPIHEM",
alternate = {"CJAKHCIFHNP"})
value = "djinPos",
alternate = {"CJAKHCIFHNP", "HHOLBNPIHEM"})
Position djinPos;
@SerializedName(
value = "KNHCJKHCOAN",
alternate = {"AMDNOHPGKMI"})
value = "mainhouse",
alternate = {"AMDNOHPGKMI", "KNHCJKHCOAN"})
HomeFurniture mainhouse;
@SerializedName(
value = "NIHOJFEKFPG",
alternate = {"BHCPEAOPIDC"})
value = "doorLists",
alternate = {"BHCPEAOPIDC", "NIHOJFEKFPG"})
List<HomeFurniture> doorLists;
@SerializedName(
value = "EPGELGEFJFK",
alternate = {"AABEPENIFLN"})
value = "stairLists",
alternate = {"AABEPENIFLN", "EPGELGEFJFK"})
List<HomeFurniture> stairLists;
@Data
@@ -51,18 +51,18 @@ public class HomeworldDefaultSaveData {
public static class HomeBlock {
@SerializedName(
value = "FGIJCELCGFI",
alternate = {"PGDPDIDJEEL", "ANICBLBOBKD"})
value = "blockId",
alternate = {"PGDPDIDJEEL", "ANICBLBOBKD", "FGIJCELCGFI"})
int blockId;
@SerializedName(
value = "BEAPOFELABD",
alternate = {"NCIMIKKFLOH"})
value = "furnitures",
alternate = {"NCIMIKKFLOH", "BEAPOFELABD"})
List<HomeFurniture> furnitures;
@SerializedName(
value = "MLIODLGDFHJ",
alternate = {"GJGNLIINBGB"})
value = "persistentFurnitures",
alternate = {"GJGNLIINBGB", "MLIODLGDFHJ"})
List<HomeFurniture> persistentFurnitures;
}
@@ -71,15 +71,18 @@ public class HomeworldDefaultSaveData {
public static class HomeFurniture {
@SerializedName(
value = "ENHNGKJBJAB",
alternate = {"KMAAJJHPNBA", "FFLCGFGGGND"})
value = "id",
alternate = {"KMAAJJHPNBA", "FFLCGFGGGND", "ENHNGKJBJAB"})
int id;
@SerializedName(
value = "NGIEEIOLPPO",
alternate = {"JFKAHNCPDME", "BPCGGBKIAMG"})
value = "pos",
alternate = {"JFKAHNCPDME", "BPCGGBKIAMG", "NGIEEIOLPPO"})
Position pos;
// @SerializedName(value = "HEOCEHKEBFM", alternate = "LKCKOOGFDBM")
@SerializedName(
value = "rot",
alternate = {"LKCKOOGFDBM", "HEOCEHKEBFM"})
Position rot;
}
}
@@ -3,12 +3,10 @@ package emu.grasscutter.data.binout;
import dev.morphia.annotations.Entity;
import emu.grasscutter.data.GameData;
import emu.grasscutter.game.quest.enums.QuestType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import lombok.Data;
import java.util.*;
public class MainQuestData {
private int id;
private int ICLLDPJFIMA;
@@ -1,8 +1,8 @@
package emu.grasscutter.data.binout;
import emu.grasscutter.data.ResourceLoader.OpenConfigData;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
public class OpenConfigEntry {
private final String name;
@@ -3,13 +3,12 @@ package emu.grasscutter.data.binout;
import com.github.davidmoten.rtreemulti.RTree;
import com.github.davidmoten.rtreemulti.geometry.Geometry;
import emu.grasscutter.scripts.data.SceneGroup;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class SceneNpcBornData {
@@ -2,11 +2,11 @@ package emu.grasscutter.data.binout;
import com.google.gson.annotations.SerializedName;
import emu.grasscutter.game.world.Position;
import java.util.List;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
import java.util.List;
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class SceneNpcBornEntry {
@@ -1,10 +1,10 @@
package emu.grasscutter.data.binout;
import com.google.gson.annotations.SerializedName;
import java.util.List;
import java.util.Map;
import lombok.Data;
import java.util.*;
@Data
public class ScriptSceneData {
Map<String, ScriptObject> scriptObjectList;
@@ -2,6 +2,7 @@ package emu.grasscutter.data.binout;
import com.google.gson.annotations.SerializedName;
import emu.grasscutter.data.common.DynamicFloat;
import java.io.Serializable;
public class TalentData implements Serializable {
@@ -1,13 +1,11 @@
package emu.grasscutter.data.binout.config;
import emu.grasscutter.data.binout.config.fields.ConfigAbilityData;
import emu.grasscutter.data.binout.config.fields.ConfigCombat;
import emu.grasscutter.data.binout.config.fields.ConfigCommon;
import emu.grasscutter.data.binout.config.fields.ConfigGlobalValue;
import java.util.Collection;
import javax.annotation.Nullable;
import emu.grasscutter.data.binout.config.fields.*;
import lombok.Data;
import javax.annotation.Nullable;
import java.util.Collection;
@Data
public class ConfigEntityBase {
@Nullable ConfigCommon configCommon;
@@ -1,8 +1,6 @@
package emu.grasscutter.data.binout.config;
import lombok.AccessLevel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.*;
import lombok.experimental.FieldDefaults;
@Data
@@ -1,7 +1,6 @@
package emu.grasscutter.data.binout.config;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.*;
@Data
@EqualsAndHashCode(callSuper = true)
@@ -1,8 +1,9 @@
package emu.grasscutter.data.binout.config;
import java.util.List;
import lombok.Data;
import java.util.List;
@Data
public class ConfigGlobalCombat {
private DefaultAbilities defaultAbilities;
@@ -1,9 +1,10 @@
package emu.grasscutter.data.binout.config;
import emu.grasscutter.data.binout.config.fields.ConfigAbilityData;
import java.util.List;
import lombok.Getter;
import java.util.List;
public class ConfigLevelEntity {
@Getter private List<ConfigAbilityData> abilities;
@@ -1,7 +1,6 @@
package emu.grasscutter.data.binout.config.fields;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
@Data
@@ -1,8 +1,7 @@
package emu.grasscutter.data.binout.config.fields;
import com.google.gson.annotations.SerializedName;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
@Data
@@ -1,7 +1,6 @@
package emu.grasscutter.data.binout.config.fields;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
@Data
@@ -1,9 +1,9 @@
package emu.grasscutter.data.binout.config.fields;
import java.util.Map;
import java.util.Set;
import lombok.Data;
import java.util.*;
/** Contains information about the entities SGVs */
@Data
public class ConfigGlobalValue {
@@ -1,10 +1,8 @@
package emu.grasscutter.data.binout.routes;
import emu.grasscutter.net.proto.RouteOuterClass;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.val;
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@@ -2,10 +2,8 @@ package emu.grasscutter.data.binout.routes;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.net.proto.RoutePointOuterClass;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.val;
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@@ -1,10 +1,10 @@
package emu.grasscutter.data.binout.routes;
import javax.annotation.Nullable;
import lombok.AccessLevel;
import lombok.Data;
import lombok.*;
import lombok.experimental.FieldDefaults;
import javax.annotation.Nullable;
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class SceneRoutes {
@@ -4,9 +4,10 @@ import emu.grasscutter.data.excels.ProudSkillData;
import emu.grasscutter.game.ability.Ability;
import it.unimi.dsi.fastutil.floats.FloatArrayList;
import it.unimi.dsi.fastutil.objects.*;
import java.util.*;
import lombok.*;
import java.util.*;
@Getter
public class DynamicFloat {
public static DynamicFloat ZERO = new DynamicFloat(0f);
@@ -5,10 +5,8 @@ import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.dungeon.DailyDungeonData;
import emu.grasscutter.game.world.Position;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList;
import lombok.Getter;
import lombok.Setter;
import it.unimi.dsi.fastutil.ints.*;
import lombok.*;
public final class PointData {
@Getter @Setter private int id;
@@ -1,8 +1,9 @@
package emu.grasscutter.data.custom;
import emu.grasscutter.data.common.BaseTrialActivityData;
import lombok.Data;
import java.util.List;
import lombok.*;
@Data
public class TrialAvatarActivityCustomData implements BaseTrialActivityData {
@@ -1,7 +1,8 @@
package emu.grasscutter.data.custom;
import lombok.Data;
import java.util.List;
import lombok.*;
@Data
public class TrialAvatarCustomData {
@@ -0,0 +1,49 @@
package emu.grasscutter.data.excels;
import emu.grasscutter.data.*;
import lombok.Getter;
import java.util.List;
@Getter
@ResourceType(name = "BargainExcelConfigData.json")
public final class BargainData extends GameResource {
@Getter private int id;
private int questId;
private List<Integer> dialogId;
/**
* This is a list of 2 integers. The first integer is the minimum value of the bargain. The second
* integer is the maximum value of the bargain.
*/
private List<Integer> expectedValue;
private int space;
private List<Integer> successTalkId;
private int failTalkId;
private int moodNpcId;
/**
* This is a list of 2 integers. The first integer is the minimum value of the mood. The second
* integer is the maximum value of the mood.
*/
private List<Integer> randomMood;
private int moodAlertLimit;
private int moodLowLimit;
private int singleFailMoodDeduction;
private long moodLowLimitTextTextMapHash;
private long titleTextTextMapHash;
private long affordTextTextMapHash;
private long storageTextTextMapHash;
private long moodHintTextTextMapHash;
private long moodDescTextTextMapHash;
private List<Integer> singleFailTalkId;
private boolean deleteItem;
private int itemId;
}
@@ -1,15 +1,13 @@
package emu.grasscutter.data.excels;
import emu.grasscutter.data.GameResource;
import emu.grasscutter.data.ResourceType;
import emu.grasscutter.game.props.BattlePassMissionRefreshType;
import emu.grasscutter.game.props.WatcherTriggerType;
import emu.grasscutter.data.*;
import emu.grasscutter.game.props.*;
import emu.grasscutter.net.proto.BattlePassMissionOuterClass.BattlePassMission.MissionStatus;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.Getter;
import java.util.*;
import java.util.stream.Collectors;
@ResourceType(name = {"BattlePassMissionExcelConfigData.json"})
@Getter
public class BattlePassMissionData extends GameResource {
@@ -1,10 +1,10 @@
package emu.grasscutter.data.excels;
import emu.grasscutter.data.GameResource;
import emu.grasscutter.data.ResourceType;
import java.util.List;
import emu.grasscutter.data.*;
import lombok.Getter;
import java.util.List;
@ResourceType(name = "BattlePassRewardExcelConfigData.json")
@Getter
public class BattlePassRewardData extends GameResource {
@@ -1,10 +1,10 @@
package emu.grasscutter.data.excels;
import emu.grasscutter.data.GameResource;
import emu.grasscutter.data.ResourceType;
import java.util.List;
import emu.grasscutter.data.*;
import lombok.Getter;
import java.util.List;
@ResourceType(name = "BlossomRefreshExcelConfigData.json")
@Getter
public class BlossomRefreshExcelConfigData extends GameResource {
@@ -1,7 +1,6 @@
package emu.grasscutter.data.excels;
import emu.grasscutter.data.GameResource;
import emu.grasscutter.data.ResourceType;
import emu.grasscutter.data.*;
import emu.grasscutter.game.props.ServerBuffType;
import lombok.Getter;
@@ -1,11 +1,10 @@
package emu.grasscutter.data.excels;
import emu.grasscutter.data.GameResource;
import emu.grasscutter.data.ResourceType;
import java.util.HashMap;
import java.util.Map;
import emu.grasscutter.data.*;
import lombok.Getter;
import java.util.*;
@Getter
@ResourceType(name = "ChapterExcelConfigData.json")
public class ChapterData extends GameResource {
@@ -1,13 +1,11 @@
package emu.grasscutter.data.excels;
import emu.grasscutter.data.GameResource;
import emu.grasscutter.data.ResourceType;
import java.util.List;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import emu.grasscutter.data.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import java.util.List;
@ResourceType(name = "CityConfigData.json", loadPriority = ResourceType.LoadPriority.HIGH)
@Getter
@Setter

Some files were not shown because too many files have changed in this diff Show More