├── .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 | }
--------------------------------------------------------------------------------