├── .gitignore ├── README.md ├── pom.xml └── src └── main ├── java └── thorny │ └── grasscutters │ └── setLevel │ ├── commands │ └── setLevelCommand.java │ └── setLevel.java └── resources └── plugin.json /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | !**/src/main/**/target/ 4 | !**/src/test/**/target/ 5 | 6 | ### IntelliJ IDEA ### 7 | .idea/modules.xml 8 | .idea/jarRepositories.xml 9 | .idea/compiler.xml 10 | .idea/libraries/ 11 | *.iws 12 | *.iml 13 | *.ipr 14 | 15 | ### Eclipse ### 16 | .apt_generated 17 | .classpath 18 | .factorypath 19 | .project 20 | .settings 21 | .springBeans 22 | .sts4-cache 23 | 24 | ### NetBeans ### 25 | /nbproject/private/ 26 | /nbbuild/ 27 | /dist/ 28 | /nbdist/ 29 | /.nb-gradle/ 30 | build/ 31 | !**/src/main/**/build/ 32 | !**/src/test/**/build/ 33 | 34 | ### VS Code ### 35 | .vscode/ 36 | 37 | ### Mac OS ### 38 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SetLevel Basics 2 | 3 | This is a simple plugin to easily set character level in game. 4 | 5 | There will probably be issues if you don't use the commands as intended so follow the usage. 6 | 7 | ### No relog needed for levels to set! 8 | 9 | ## Installation 10 | 11 | Get latest release from [releases](https://github.com/NotThorny/setLevel/releases) 12 | 13 | Place setLevel.jar into your `\grasscutter\plugins` folder and restart the server if it was already running 14 | 15 | ## Usage 16 | 17 | `/level [level]` 18 | 19 | -Sets the level of the current character 20 | 21 | `/level team [level]` 22 | 23 | -Sets the level of all characters on current team 24 | 25 | `/level all [level]` 26 | 27 | -Sets the level of all owned characters 28 | 29 | ## Version 30 | 31 | Made for grasscutter 1.3.1 and 1.4.4, but should work on most versions. 32 | 33 | ## Issues 34 | 35 | None yet. 36 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | NotThorny 8 | setLevel 9 | 1.0.0 10 | 11 | 12 | 17 13 | 17 14 | 15 | 16 | 17 | 21 | 22 | sonatype 23 | https://s01.oss.sonatype.org/content/groups/public/ 24 | 25 | 26 | 27 | 28 | 29 | xyz.grasscutters 30 | grasscutter 31 | 1.7.4 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/main/java/thorny/grasscutters/setLevel/commands/setLevelCommand.java: -------------------------------------------------------------------------------- 1 | package thorny.grasscutters.setLevel.commands; 2 | 3 | import java.util.List; 4 | 5 | import emu.grasscutter.command.Command; 6 | import emu.grasscutter.command.CommandHandler; 7 | import emu.grasscutter.command.Command.TargetRequirement; 8 | import emu.grasscutter.game.avatar.Avatar; 9 | import emu.grasscutter.game.player.Player; 10 | import emu.grasscutter.server.packet.send.PacketAvatarAddNotify; 11 | import emu.grasscutter.server.packet.send.PacketSceneEntityAppearNotify; 12 | 13 | // Command usage 14 | @Command(label = "level", aliases = "lv", usage = "[level]", targetRequirement = TargetRequirement.NONE) 15 | public class setLevelCommand implements CommandHandler { 16 | public int level; 17 | 18 | @Override 19 | public void execute(Player sender, Player targetPlayer, List args) { 20 | 21 | if (!(args.size() < 1)) { 22 | try { 23 | switch (args.get(0)) { 24 | case "all" -> allLevel(sender, targetPlayer, args); 25 | case "team" -> teamLevel(sender, targetPlayer, args); 26 | default -> activeLevel(sender, targetPlayer, args); 27 | } // switch 28 | } catch (Exception e) { 29 | this.sendUsageMessage(sender); 30 | return; 31 | } 32 | reloadLevel(targetPlayer, args); 33 | } else this.sendUsageMessage(sender); 34 | }// execute 35 | 36 | // Change levels of all characters on the active team 37 | public void teamLevel(Player sender, Player targetPlayer, List args) { 38 | level = checkLevel(Integer.parseInt(args.get(1))); 39 | 40 | targetPlayer.getTeamManager().getActiveTeam().forEach(entity -> { 41 | setAvatar(sender, entity.getAvatar(), level); 42 | }); 43 | } 44 | 45 | // Change level of current character 46 | private void activeLevel(Player sender, Player targetPlayer, List args) { 47 | Avatar avatar = targetPlayer.getTeamManager().getCurrentAvatarEntity().getAvatar(); 48 | level = checkLevel(Integer.parseInt(args.get(0))); 49 | setAvatar(sender, avatar, level); 50 | } 51 | 52 | // Change level of all owned characters 53 | public void allLevel(Player sender, Player targetPlayer, List args) { 54 | level = checkLevel(Integer.parseInt(args.get(1))); 55 | 56 | // Iterate through all owned 57 | sender.getAvatars().forEach(a -> { 58 | setAvatar(sender, a, level); 59 | }); 60 | } 61 | 62 | // Validate level is between 1 and 90 63 | private int checkLevel(int level) { 64 | level = (level < 1) ? 1 : level; 65 | level = (level > 90) ? 90 : level; 66 | return level; 67 | } // checkLevel 68 | 69 | // Sets level, promotion level, and recalculates stats 70 | private void setAvatar(Player sender, Avatar avatar, int level) { 71 | avatar.setPromoteLevel(Avatar.getMinPromoteLevel(level)); 72 | avatar.setLevel(level); 73 | avatar.recalcStats(); 74 | avatar.save(); 75 | sender.sendPacket(new PacketAvatarAddNotify(avatar, false)); 76 | } // setAvatar 77 | 78 | // Reload the current scene 79 | public void reloadLevel(Player targetPlayer, List args) { 80 | try { 81 | // Transfer back and forth to refresh world without relog 82 | targetPlayer.getWorld().transferPlayerToScene(targetPlayer, 1, targetPlayer.getPosition()); 83 | targetPlayer.getWorld().transferPlayerToScene(targetPlayer, targetPlayer.getSceneId(), 84 | targetPlayer.getPosition()); 85 | targetPlayer.getScene().broadcastPacket(new PacketSceneEntityAppearNotify(targetPlayer)); 86 | 87 | // Send completion message 88 | switch (args.get(0)) { 89 | case "all" -> CommandHandler.sendMessage(targetPlayer, "Changed all character levels!"); 90 | case "team" -> CommandHandler.sendMessage(targetPlayer, "Changed team levels!"); 91 | default -> CommandHandler.sendMessage(targetPlayer, "Changed level!"); 92 | } // switch 93 | 94 | } catch (Exception e) { 95 | CommandHandler.sendMessage(targetPlayer, "Failed to reload! Relog to apply changes."); 96 | } // catch 97 | } // reloadLevel 98 | } // setLevelCommand -------------------------------------------------------------------------------- /src/main/java/thorny/grasscutters/setLevel/setLevel.java: -------------------------------------------------------------------------------- 1 | package thorny.grasscutters.setLevel; 2 | 3 | import emu.grasscutter.plugin.Plugin; 4 | 5 | public final class setLevel extends Plugin { 6 | private static setLevel instance; 7 | public static setLevel getInstance() { 8 | return instance; 9 | } 10 | @Override public void onLoad() { 11 | // Set the plugin instance. 12 | instance = this; 13 | } 14 | @Override public void onEnable() { 15 | 16 | // Register commands. 17 | this.getHandle().registerCommand(new thorny.grasscutters.setLevel.commands.setLevelCommand()); 18 | 19 | // Log a plugin status message. 20 | this.getLogger().info("The setLevel plugin has been enabled."); 21 | } 22 | 23 | @Override public void onDisable() { 24 | // Log a plugin status message. 25 | this.getLogger().info("How could you do this to me... setLevel has been disabled."); 26 | } 27 | } -------------------------------------------------------------------------------- /src/main/resources/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "setLevel", 3 | "description": "Set levels of characters in-game", 4 | "version": "0.1.0-dev", 5 | "authors": [ "NotThorny" ], 6 | "api": 2, 7 | 8 | "mainClass": "thorny.grasscutters.setLevel.setLevel", 9 | 10 | "comments": [ 11 | "Don't bug test this because it will break" 12 | ] 13 | } --------------------------------------------------------------------------------