Commit 81183db1 authored by Melledy's avatar Melledy
Browse files

Merge branch 'development' into dev-world-scripts

parents 593de838 21478b0a
......@@ -4,9 +4,11 @@ import emu.grasscutter.utils.ConfigContainer;
import emu.grasscutter.utils.ConfigContainer.*;
import java.util.Locale;
import java.nio.file.Paths;
import static emu.grasscutter.Grasscutter.config;
/**
* A data container for the server's configuration.
*
......@@ -24,12 +26,12 @@ public final class Configuration extends ConfigContainer {
public static final Locale LANGUAGE = config.language.language;
public static final Locale FALLBACK_LANGUAGE = config.language.fallback;
public static final String DATA_FOLDER = config.folderStructure.data;
public static final String RESOURCES_FOLDER = config.folderStructure.resources;
public static final String KEYS_FOLDER = config.folderStructure.keys;
public static final String PLUGINS_FOLDER = config.folderStructure.plugins;
public static final String SCRIPTS_FOLDER = config.folderStructure.scripts;
public static final String PACKETS_FOLDER = config.folderStructure.packets;
private static final String DATA_FOLDER = config.folderStructure.data;
private static final String RESOURCES_FOLDER = config.folderStructure.resources;
private static final String KEYS_FOLDER = config.folderStructure.keys;
private static final String PLUGINS_FOLDER = config.folderStructure.plugins;
private static final String SCRIPTS_FOLDER = config.folderStructure.scripts;
private static final String PACKETS_FOLDER = config.folderStructure.packets;
public static final Server SERVER = config.server;
public static final Database DATABASE = config.databaseInfo;
......@@ -49,17 +51,36 @@ public final class Configuration extends ConfigContainer {
/*
* Utilities
*/
public static String DATA() {
return DATA_FOLDER;
}
public static String DATA(String path) {
return DATA_FOLDER + "/" + path;
return Paths.get(DATA_FOLDER, path).toString();
}
public static String RESOURCE(String path) {
return RESOURCES_FOLDER + "/" + path;
return Paths.get(RESOURCES_FOLDER, path).toString();
}
public static String KEY(String path) {
return Paths.get(KEYS_FOLDER, path).toString();
}
public static String PLUGIN() {
return PLUGINS_FOLDER;
}
public static String PLUGIN(String path) {
return Paths.get(PLUGINS_FOLDER, path).toString();
}
public static String SCRIPT(String path) {
return SCRIPTS_FOLDER + "/" + path;
return Paths.get(SCRIPTS_FOLDER, path).toString();
}
public static String PACKET(String path) {
return Paths.get(PACKETS_FOLDER, path).toString();
}
/**
......
......@@ -304,7 +304,7 @@ public final class Grasscutter {
getLogger().info(translate("messages.status.done"));
String input = null;
boolean isLastInterrupted = false;
while (true) {
while (config.server.game.enableConsole) {
try {
input = consoleLineReader.readLine("> ");
} catch (UserInterruptException e) {
......
package emu.grasscutter.command.commands;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketChangeMpTeamAvatarRsp;
import java.util.ArrayList;
import java.util.List;
import static emu.grasscutter.utils.Language.translate;
@Command(label = "join", usage = "join [AvatarIDs] such as\"join 10000038 10000039\"",
description = "commands.join.description", permission = "player.join")
public class JoinCommand implements CommandHandler {
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
if (targetPlayer == null) {
CommandHandler.sendMessage(sender, translate(sender, "commands.execution.need_target"));
return;
}
List<Integer> avatarIds = new ArrayList<>();
for (String arg : args) {
try {
int avatarId = Integer.parseInt(arg);
avatarIds.add(avatarId);
} catch (Exception ignored) {
ignored.printStackTrace();
CommandHandler.sendMessage(sender, translate("commands.generic.invalid.avatarId"));
return;
}
}
for (int i = 0; i < args.size(); i++) {
Avatar avatar = targetPlayer.getAvatars().getAvatarById(avatarIds.get(i));
if (avatar == null) {
CommandHandler.sendMessage(sender, translate("commands.generic.invalid.avatarId"));
return;
}
if (targetPlayer.getTeamManager().getCurrentTeamInfo().contains(avatar)){
continue;
}
targetPlayer.getTeamManager().getCurrentTeamInfo().addAvatar(avatar);
}
// Packet
targetPlayer.getTeamManager().updateTeamEntities(new PacketChangeMpTeamAvatarRsp(targetPlayer, targetPlayer.getTeamManager().getCurrentTeamInfo()));
}
}
package emu.grasscutter.command.commands;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketChangeMpTeamAvatarRsp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static emu.grasscutter.utils.Language.translate;
@Command(label = "remove", usage = "remove [indexOfYourTeams] index start from 1",
description = "commands.remove.description", permission = "player.remove")
public class RemoveCommand implements CommandHandler {
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
if (targetPlayer == null) {
CommandHandler.sendMessage(sender, translate(sender, "commands.execution.need_target"));
return;
}
List<Integer> avatarIndexList = new ArrayList<>();
for (String arg : args) {
try {
int avatarIndex = Integer.parseInt(arg);
if (!avatarIndexList.contains(avatarIndex)) {
avatarIndexList.add(avatarIndex);
}
} catch (Exception ignored) {
ignored.printStackTrace();
CommandHandler.sendMessage(sender, translate("commands.remove.invalid_index"));
return;
}
}
Collections.sort(avatarIndexList, Collections.reverseOrder());
for (int i = 0; i < avatarIndexList.size(); i++) {
if (avatarIndexList.get(i) > targetPlayer.getTeamManager().getCurrentTeamInfo().getAvatars().size() || avatarIndexList.get(i) <= 0) {
CommandHandler.sendMessage(targetPlayer, translate("commands.remove.invalid_index"));
return;
}
targetPlayer.getTeamManager().getCurrentTeamInfo().removeAvatar(avatarIndexList.get(i) - 1);
}
// Packet
targetPlayer.getTeamManager().updateTeamEntities(new PacketChangeMpTeamAvatarRsp(targetPlayer, targetPlayer.getTeamManager().getCurrentTeamInfo()));
}
}
package emu.grasscutter.command.commands;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketChangeMpTeamAvatarRsp;
import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import static emu.grasscutter.utils.Language.translate;
import static emu.grasscutter.Configuration.*;
@Command(label = "team", usage = "team <add|remove|set> [avatarId,...] [index|first|last|index-index,...]",
permission = "player.team", permissionTargeted = "player.team.others", description = "commands.team.description")
public final class TeamCommand implements CommandHandler {
private static final int BASE_AVATARID = 10000000;
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
if (targetPlayer == null) {
CommandHandler.sendMessage(sender, translate(sender, "commands.execution.need_target"));
return;
}
if (args.isEmpty()) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.usage"));
return;
}
switch (args.get(0)) {
case "add":
if (!addCommand(sender, targetPlayer, args)) return;
break;
case "remove":
if (!removeCommand(sender, targetPlayer, args)) return;
break;
case "set":
if (!setCommand(sender, targetPlayer, args)) return;
break;
default:
CommandHandler.sendMessage(sender, translate(sender, "commands.team.invalid_usage"));
CommandHandler.sendMessage(sender, translate(sender, "commands.team.usage"));
return;
}
targetPlayer.getTeamManager().updateTeamEntities(
new PacketChangeMpTeamAvatarRsp(targetPlayer, targetPlayer.getTeamManager().getCurrentTeamInfo()));
}
private boolean addCommand(Player sender, Player targetPlayer, List<String> args) {
if (args.size() < 2) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.invalid_usage"));
CommandHandler.sendMessage(sender, translate(sender, "commands.team.add_usage"));
return false;
}
int index = -1;
if (args.size() > 2) {
try {
index = Integer.parseInt(args.get(2)) - 1;
if (index < 0) index = 0;
} catch (Exception e) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.invalid_index"));
return false;
}
}
var avatarIds = args.get(1).split(",");
var currentTeamAvatars = targetPlayer.getTeamManager().getCurrentTeamInfo().getAvatars();
if (currentTeamAvatars.size() + avatarIds.length > GAME_OPTIONS.avatarLimits.singlePlayerTeam) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.add_too_much", GAME_OPTIONS.avatarLimits.singlePlayerTeam));
return false;
}
for (var avatarId: avatarIds) {
try {
int id = Integer.parseInt(avatarId);
var ret = addAvatar(sender, targetPlayer, id, index);
if (index > 0) ++index;
if (!ret) continue;
} catch (Exception e) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.failed_to_add_avatar", avatarId));
continue;
}
}
return true;
}
private boolean removeCommand(Player sender, Player targetPlayer, List<String> args) {
if (args.size() < 2) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.invalid_usage"));
CommandHandler.sendMessage(sender, translate(sender, "commands.team.remove_usage"));
return false;
}
var currentTeamAvatars = targetPlayer.getTeamManager().getCurrentTeamInfo().getAvatars();
var avatarCount = currentTeamAvatars.size();
var metaIndexList = args.get(1).split(",");
var indexes = new HashSet<Integer>();
var ignoreList = new ArrayList<Integer>();
for (var metaIndex: metaIndexList) {
// step 1: parse metaIndex to indexes
var subIndexes = transformToIndexes(metaIndex, avatarCount);
if (subIndexes == null) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.failed_to_parse_index", metaIndex));
continue;
}
// step 2: get all of the avatar id through indexes
for (var avatarIndex: subIndexes) {
try {
indexes.add(currentTeamAvatars.get(avatarIndex - 1));
} catch (Exception e) {
ignoreList.add(avatarIndex);
continue;
}
}
}
// step 3: check if user remove all of the avatar
if (indexes.size() >= avatarCount) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.remove_too_much"));
return false;
}
// step 4: hint user for ignore index
if (!ignoreList.isEmpty()) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.ignore_index", ignoreList));
}
// step 5: remove
currentTeamAvatars.removeAll(indexes);
return true;
}
private boolean setCommand(Player sender, Player targetPlayer, List<String> args) {
if (args.size() < 3) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.invalid_usage"));
CommandHandler.sendMessage(sender, translate(sender, "commands.team.set_usage"));
return false;
}
var currentTeamAvatars = targetPlayer.getTeamManager().getCurrentTeamInfo().getAvatars();
int index;
try {
index = Integer.parseInt(args.get(1)) - 1;
if (index < 0) index = 0;
} catch(Exception e) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.failed_to_parse_index", args.get(1)));
return false;
}
if (index + 1 > currentTeamAvatars.size()) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.index_out_of_range"));
return false;
}
int avatarId;
try {
avatarId = Integer.parseInt(args.get(2));
} catch(Exception e) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.failed_parse_avatar_id", args.get(2)));
return false;
}
if (avatarId < BASE_AVATARID) {
avatarId += BASE_AVATARID;
}
if (currentTeamAvatars.contains(avatarId)) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.avatar_already_in_team", avatarId));
return false;
}
if (!targetPlayer.getAvatars().hasAvatar(avatarId)) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.avatar_not_found", avatarId));
return false;
}
currentTeamAvatars.set(index, avatarId);
return true;
}
private boolean addAvatar(Player sender, Player targetPlayer, int avatarId, int index) {
if (avatarId < BASE_AVATARID) {
avatarId += BASE_AVATARID;
}
var currentTeamAvatars = targetPlayer.getTeamManager().getCurrentTeamInfo().getAvatars();
if (currentTeamAvatars.contains(avatarId)) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.avatar_already_in_team", avatarId));
return false;
}
if (!sender.getAvatars().hasAvatar(avatarId)) {
CommandHandler.sendMessage(sender, translate(sender, "commands.team.avatar_not_found", avatarId));
return false;
}
if (index < 0) {
currentTeamAvatars.add(avatarId);
} else {
currentTeamAvatars.add(index, avatarId);
}
return true;
}
private List<Integer> transformToIndexes(String metaIndexes, int listLength) {
// step 1: check if metaIndexes is a special constants
if (metaIndexes.equals("first")) {
return List.of(1);
} else if (metaIndexes.equals("last")) {
return List.of(listLength);
}
// step 2: check if metaIndexes is a range
if (metaIndexes.contains("-")) {
var range = metaIndexes.split("-");
if (range.length < 2) {
return null;
}
int min, max;
try {
min = switch (range[0]) {
case "first" -> 1;
case "last" -> listLength;
default -> Integer.parseInt(range[0]);
};
max = switch (range[1]) {
case "first" -> 1;
case "last" -> listLength;
default -> Integer.parseInt(range[1]);
};
} catch (Exception e) {
return null;
}
if (min > max) {
min ^= max;
max ^= min;
min ^= max;
}
var indexes = new ArrayList<Integer>();
for (int i = min; i <= max; ++i) {
indexes.add(i);
}
return indexes;
}
// step 3: index is a value, simply return
try {
int index = Integer.parseInt(metaIndexes);
return List.of(index);
} catch (Exception e) {
return null;
}
}
}
......@@ -358,7 +358,7 @@ public class GachaManager {
if(this.watchService == null) {
try {
this.watchService = FileSystems.getDefault().newWatchService();
Path path = new File(DATA_FOLDER).toPath();
Path path = new File(DATA()).toPath();
path.register(watchService, new WatchEvent.Kind[]{StandardWatchEventKinds.ENTRY_MODIFY}, SensitivityWatchEventModifier.HIGH);
} catch (Exception e) {
Grasscutter.getLogger().error("Unable to load the Gacha Manager Watch Service. If ServerOptions.watchGacha is true it will not auto-reload");
......
......@@ -14,28 +14,26 @@ public class PacketOpcodes {
public static final int AbilityInvocationsNotify = 1133;
public static final int AcceptCityReputationRequestReq = 2845;
public static final int AcceptCityReputationRequestRsp = 2875;
public static final int AchievementAllDataNotify = 1155;
public static final int AchievementUpdateNotify = 1146;
public static final int ActivityCoinInfoNotify = 2056;
public static final int ActivityCondStateChangeNotify = 2162;
public static final int AchievementAllDataNotify = 2685;
public static final int AchievementUpdateNotify = 2675;
public static final int ActivityCoinInfoNotify = 2080;
public static final int ActivityCondStateChangeNotify = 2102;
public static final int ActivityDisableTransferPointInteractionNotify = 8295;
public static final int ActivityInfoNotify = 2023;
public static final int ActivityPlayOpenAnimNotify = 2164;
public static final int ActivitySaleChangeNotify = 2043;
public static final int ActivityInfoNotify = 2074;
public static final int ActivityPlayOpenAnimNotify = 2187;
public static final int ActivitySaleChangeNotify = 2166;
public static final int ActivityScheduleInfoNotify = 2180;
public static final int ActivityScheduleInfoNotify_1 = 2187;
public static final int ActivitySelectAvatarCardReq = 2153;
public static final int ActivitySelectAvatarCardRsp = 2069;
public static final int ActivitySelectAvatarCardReq = 2056;
public static final int ActivitySelectAvatarCardRsp = 2174;
public static final int ActivityTakeAllScoreRewardReq = 8708;
public static final int ActivityTakeAllScoreRewardRsp = 8836;
public static final int ActivityTakeScoreRewardReq = 8767;
public static final int ActivityTakeScoreRewardRsp = 8445;
public static final int ActivityTakeWatcherRewardBatchReq = 2027;
public static final int ActivityTakeWatcherRewardBatchRsp = 2036;
public static final int ActivityTakeWatcherRewardReq = 2074;
public static final int ActivityTakeWatcherRewardRsp = 2180;
public static final int ActivityTakeWatcherRewardRsp_1 = 2187;
public static final int ActivityUpdateWatcherNotify = 2101;
public static final int ActivityTakeWatcherRewardBatchReq = 2042;
public static final int ActivityTakeWatcherRewardBatchRsp = 2013;
public static final int ActivityTakeWatcherRewardReq = 2101;
public static final int ActivityTakeWatcherRewardRsp = 2153;
public static final int ActivityUpdateWatcherNotify = 2069;
public static final int AddBlacklistReq = 4067;
public static final int AddBlacklistRsp = 4020;
public static final int AddFriendNotify = 4026;
......@@ -55,16 +53,16 @@ public class PacketOpcodes {
public static final int AnchorPointOpRsp = 4263;
public static final int AnimatorForceSetAirMoveNotify = 308;
public static final int AntiAddictNotify = 177;
public static final int ArenaChallengeFinishNotify = 2083;
public static final int ArenaChallengeFinishNotify = 2027;
public static final int AskAddFriendNotify = 4062;
public static final int AskAddFriendReq = 4037;
public static final int AskAddFriendRsp = 4093;
public static final int AsterLargeInfoNotify = 2133;
public static final int AsterLittleInfoNotify = 2058;
public static final int AsterMidCampInfoNotify = 2115;
public static final int AsterMidInfoNotify = 2151;
public static final int AsterMiscInfoNotify = 2098;
public static final int AsterProgressInfoNotify = 2065;
public static final int AsterLargeInfoNotify = 2073;
public static final int AsterLittleInfoNotify = 2098;
public static final int AsterMidCampInfoNotify = 2001;
public static final int AsterMidInfoNotify = 2051;
public static final int AsterMiscInfoNotify = 2041;
public static final int AsterProgressInfoNotify = 2151;
public static final int AvatarAddNotify = 1759;
public static final int AvatarBuffAddNotify = 367;
public static final int AvatarBuffDelNotify = 320;
......@@ -136,21 +134,21 @@ public class PacketOpcodes {
public static final int BeginCameraSceneLookNotify = 261;
public static final int BigTalentPointConvertReq = 1037;
public static final int BigTalentPointConvertRsp = 1093;
public static final int BlessingAcceptAllGivePicReq = 2176;
public static final int BlessingAcceptAllGivePicRsp = 2050;
public static final int BlessingAcceptGivePicReq = 2134;
public static final int BlessingAcceptGivePicRsp = 2117;
public static final int BlessingGetAllRecvPicRecordListReq = 2090;
public static final int BlessingGetAllRecvPicRecordListRsp = 2140;
public static final int BlessingGetFriendPicListReq = 2077;
public static final int BlessingGetFriendPicListRsp = 2182;
public static final int BlessingGiveFriendPicReq = 2161;
public static final int BlessingGiveFriendPicRsp = 2076;
public static final int BlessingRecvFriendPicNotify = 2184;
public static final int BlessingRedeemRewardReq = 2172;
public static final int BlessingRedeemRewardRsp = 2039;
public static final int BlessingScanReq = 2186;
public static final int BlessingScanRsp = 2007;
public static final int BlessingAcceptAllGivePicReq = 2032;
public static final int BlessingAcceptAllGivePicRsp = 2148;
public static final int BlessingAcceptGivePicReq = 2090;
public static final int BlessingAcceptGivePicRsp = 2140;
public static final int BlessingGetAllRecvPicRecordListReq = 2184;
public static final int BlessingGetAllRecvPicRecordListRsp = 2176;
public static final int BlessingGetFriendPicListReq = 2161;
public static final int BlessingGetFriendPicListRsp = 2076;
public static final int BlessingGiveFriendPicReq = 2134;
public static final int BlessingGiveFriendPicRsp = 2117;
public static final int BlessingRecvFriendPicNotify = 2050;
public static final int BlessingRedeemRewardReq = 2077;
public static final int BlessingRedeemRewardRsp = 2182;
public static final int BlessingScanReq = 2172;
public static final int BlessingScanRsp = 2039;
public static final int BlitzRushParkourRestartReq = 8212;
public static final int BlitzRushParkourRestartRsp = 8962;
public static final int BlossomBriefInfoNotify = 2710;
......@@ -292,6 +290,7 @@ public class PacketOpcodes {
public static final int DataResVersionNotify = 136;
public static final int DealAddFriendReq = 4044;
public static final int DealAddFriendRsp = 4045;
public static final int DebugNotify = 101;
public static final int DeleteFriendNotify = 4083;
public static final int DeleteFriendReq = 4079;
public static final int DeleteFriendRsp = 4091;
......@@ -323,10 +322,10 @@ public class PacketOpcodes {
public static final int DraftOwnerStartInviteRsp = 5415;
public static final int DraftOwnerTwiceConfirmNotify = 5434;
public static final int DraftTwiceConfirmResultNotify = 5497;
public static final int DragonSpineChapterFinishNotify = 2196;
public static final int DragonSpineChapterOpenNotify = 2070;
public static final int DragonSpineChapterProgressChangeNotify = 2001;
public static final int DragonSpineCoinChangeNotify = 2189;
public static final int DragonSpineChapterFinishNotify = 2043;
public static final int DragonSpineChapterOpenNotify = 2196;
public static final int DragonSpineChapterProgressChangeNotify = 2189;
public static final int DragonSpineCoinChangeNotify = 2123;
public static final int DropHintNotify = 673;
public static final int DropItemReq = 634;
public static final int DropItemRsp = 679;
......@@ -388,8 +387,8 @@ public class PacketOpcodes {
public static final int EchoShellTakeRewardReq = 8801;
public static final int EchoShellTakeRewardRsp = 8888;
public static final int EchoShellUpdateNotify = 8730;
public static final int EffigyChallengeInfoNotify = 2159;
public static final int EffigyChallengeResultNotify = 2024;
public static final int EffigyChallengeInfoNotify = 2071;
public static final int EffigyChallengeResultNotify = 2034;
public static final int EndCameraSceneLookNotify = 238;
public static final int EnterChessDungeonReq = 8336;
public static final int EnterChessDungeonRsp = 8581;
......@@ -405,8 +404,8 @@ public class PacketOpcodes {
public static final int EnterSceneReadyRsp = 296;
public static final int EnterSceneWeatherAreaNotify = 258;
public static final int EnterTransPointRegionNotify = 255;
public static final int EnterTrialAvatarActivityDungeonReq = 2031;
public static final int EnterTrialAvatarActivityDungeonRsp = 2175;
public static final int EnterTrialAvatarActivityDungeonReq = 2020;
public static final int EnterTrialAvatarActivityDungeonRsp = 2087;
public static final int EnterWorldAreaReq = 273;
public static final int EnterWorldAreaRsp = 263;
public static final int EntityAiKillSelfNotify = 370;
......@@ -460,17 +459,17 @@ public class PacketOpcodes {
public static final int ExitFishingRsp = 5839;
public static final int ExitSceneWeatherAreaNotify = 223;
public static final int ExitTransPointRegionNotify = 246;
public static final int ExpeditionChallengeEnterRegionNotify = 2095;
public static final int ExpeditionChallengeFinishedNotify = 2197;
public static final int ExpeditionRecallReq = 2114;
public static final int ExpeditionRecallRsp = 2108;
public static final int ExpeditionStartReq = 2032;
public static final int ExpeditionStartRsp = 2148;
public static final int ExpeditionTakeRewardReq = 2053;
public static final int ExpeditionTakeRewardRsp = 2181;
public static final int ExpeditionChallengeEnterRegionNotify = 2192;
public static final int ExpeditionChallengeFinishedNotify = 2015;
public static final int ExpeditionRecallReq = 2053;
public static final int ExpeditionRecallRsp = 2181;
public static final int ExpeditionStartReq = 2114;
public static final int ExpeditionStartRsp = 2108;
public static final int ExpeditionTakeRewardReq = 2124;
public static final int ExpeditionTakeRewardRsp = 2168;
public static final int FindHilichurlAcceptQuestNotify = 8292;
public static final int FindHilichurlFinishSecondQuestNotify = 8799;
public static final int FinishDeliveryNotify = 2126;
public static final int FinishDeliveryNotify = 2003;
public static final int FinishedParentQuestNotify = 415;
public static final int FinishedParentQuestUpdateNotify = 437;
public static final int FinishMainCoopReq = 1963;
......@@ -489,20 +488,20 @@ public class PacketOpcodes {
public static final int FishEscapeNotify = 5836;
public static final int FishingGallerySettleNotify = 8870;
public static final int FishPoolDataNotify = 5850;
public static final int FleurFairBalloonSettleNotify = 2192;
public static final int FleurFairBalloonSettleNotify = 2064;
public static final int FleurFairBuffEnergyNotify = 5392;
public static final int FleurFairFallSettleNotify = 2015;
public static final int FleurFairFallSettleNotify = 2040;
public static final int FleurFairFinishGalleryStageNotify = 5323;
public static final int FleurFairMusicGameSettleReq = 2064;
public static final int FleurFairMusicGameSettleRsp = 2040;
public static final int FleurFairMusicGameStartReq = 2105;
public static final int FleurFairMusicGameStartRsp = 2179;
public static final int FleurFairReplayMiniGameReq = 2146;
public static final int FleurFairReplayMiniGameRsp = 2089;
public static final int FleurFairMusicGameSettleReq = 2105;
public static final int FleurFairMusicGameSettleRsp = 2179;
public static final int FleurFairMusicGameStartReq = 2146;
public static final int FleurFairMusicGameStartRsp = 2089;
public static final int FleurFairReplayMiniGameReq = 2022;
public static final int FleurFairReplayMiniGameRsp = 2033;
public static final int FleurFairStageSettleNotify = 5358;
public static final int FlightActivityRestartReq = 2073;
public static final int FlightActivityRestartRsp = 2045;
public static final int FlightActivitySettleNotify = 2195;
public static final int FlightActivityRestartReq = 2115;
public static final int FlightActivityRestartRsp = 2070;
public static final int FlightActivitySettleNotify = 2045;
public static final int FocusAvatarReq = 1710;
public static final int FocusAvatarRsp = 1772;
public static final int ForceAddPlayerFriendReq = 4084;
......@@ -563,10 +562,10 @@ public class PacketOpcodes {
public static final int GalleryStartNotify = 5560;
public static final int GalleryStopNotify = 5515;
public static final int GallerySumoKillMonsterNotify = 5546;
public static final int GetActivityInfoReq = 2011;
public static final int GetActivityInfoRsp = 2170;
public static final int GetActivityScheduleReq = 2663;
public static final int GetActivityScheduleRsp = 2651;
public static final int GetActivityInfoReq = 2164;
public static final int GetActivityInfoRsp = 2023;
public static final int GetActivityScheduleReq = 2011;
public static final int GetActivityScheduleRsp = 2170;
public static final int GetActivityShopSheetInfoReq = 744;
public static final int GetActivityShopSheetInfoRsp = 745;
public static final int GetAllActivatedBargainDataReq = 480;
......@@ -583,8 +582,8 @@ public class PacketOpcodes {
public static final int GetAreaExplorePointRsp = 202;
public static final int GetAuthkeyReq = 1445;
public static final int GetAuthkeyRsp = 1475;
public static final int GetAuthSalesmanInfoReq = 2082;
public static final int GetAuthSalesmanInfoRsp = 2173;
public static final int GetAuthSalesmanInfoReq = 2031;
public static final int GetAuthSalesmanInfoRsp = 2175;
public static final int GetBargainDataReq = 467;
public static final int GetBargainDataRsp = 420;
public static final int GetBattlePassProductReq = 2643;
......@@ -595,8 +594,8 @@ public class PacketOpcodes {
public static final int GetBonusActivityRewardRsp = 2555;
public static final int GetChatEmojiCollectionReq = 4057;
public static final int GetChatEmojiCollectionRsp = 4043;
public static final int GetCityHuntingOfferReq = 4456;
public static final int GetCityHuntingOfferRsp = 4747;
public static final int GetCityHuntingOfferReq = 4345;
public static final int GetCityHuntingOfferRsp = 4348;
public static final int GetCityReputationInfoReq = 2860;
public static final int GetCityReputationInfoRsp = 2833;
public static final int GetCityReputationMapInfoReq = 2891;
......@@ -607,8 +606,8 @@ public class PacketOpcodes {
public static final int GetDailyDungeonEntryInfoRsp = 936;
public static final int GetDungeonEntryExploreConditionReq = 3208;
public static final int GetDungeonEntryExploreConditionRsp = 3391;
public static final int GetExpeditionAssistInfoListReq = 2124;
public static final int GetExpeditionAssistInfoListRsp = 2168;
public static final int GetExpeditionAssistInfoListReq = 2017;
public static final int GetExpeditionAssistInfoListRsp = 2099;
public static final int GetFriendShowAvatarInfoReq = 4061;
public static final int GetFriendShowAvatarInfoRsp = 4038;
public static final int GetFriendShowNameCardInfoReq = 4032;
......@@ -618,8 +617,8 @@ public class PacketOpcodes {
public static final int GetGachaInfoRsp = 1533;
public static final int GetHomeLevelUpRewardReq = 4508;
public static final int GetHomeLevelUpRewardRsp = 4864;
public static final int GetHuntingOfferRewardReq = 4769;
public static final int GetHuntingOfferRewardRsp = 4860;
public static final int GetHuntingOfferRewardReq = 4313;
public static final int GetHuntingOfferRewardRsp = 4301;
public static final int GetInvestigationMonsterReq = 1928;
public static final int GetInvestigationMonsterRsp = 1921;
public static final int GetMailItemReq = 1415;
......@@ -786,14 +785,14 @@ public class PacketOpcodes {
public static final int HomeUpdateFishFarmingInfoReq = 4810;
public static final int HomeUpdateFishFarmingInfoRsp = 4500;
public static final int HostPlayerNotify = 310;
public static final int HuntingFailNotify = 4345;
public static final int HuntingGiveUpReq = 4313;
public static final int HuntingGiveUpRsp = 4301;
public static final int HuntingOngoingNotify = 4348;
public static final int HuntingRevealClueNotify = 4564;
public static final int HuntingRevealFinalNotify = 4335;
public static final int HuntingStartNotify = 4694;
public static final int HuntingSuccessNotify = 4325;
public static final int HuntingFailNotify = 4315;
public static final int HuntingGiveUpReq = 4337;
public static final int HuntingGiveUpRsp = 4306;
public static final int HuntingOngoingNotify = 4327;
public static final int HuntingRevealClueNotify = 4336;
public static final int HuntingRevealFinalNotify = 4343;
public static final int HuntingStartNotify = 4317;
public static final int HuntingSuccessNotify = 4326;
public static final int InBattleMechanicusBuildingPointsNotify = 5344;
public static final int InBattleMechanicusCardResultNotify = 5388;
public static final int InBattleMechanicusConfirmCardNotify = 5397;
......@@ -827,7 +826,7 @@ public class PacketOpcodes {
public static final int LifeStateChangeNotify = 1233;
public static final int LiveEndNotify = 801;
public static final int LiveStartNotify = 820;
public static final int LoadActivityTerrainNotify = 2152;
public static final int LoadActivityTerrainNotify = 2129;
public static final int LuaEnvironmentEffectNotify = 3175;
public static final int LuaSetOptionNotify = 353;
public static final int LunaRiteAreaFinishNotify = 8822;
......@@ -1093,8 +1092,8 @@ public class PacketOpcodes {
public static final int ReadMailNotify = 1410;
public static final int ReadPrivateChatReq = 4984;
public static final int ReadPrivateChatRsp = 5029;
public static final int ReceivedTrialAvatarActivityRewardReq = 2020;
public static final int ReceivedTrialAvatarActivityRewardRsp = 2087;
public static final int ReceivedTrialAvatarActivityRewardReq = 2093;
public static final int ReceivedTrialAvatarActivityRewardRsp = 2138;
public static final int RechargeReq = 4135;
public static final int RechargeRsp = 4125;
public static final int RedeemLegendaryKeyReq = 481;
......@@ -1120,8 +1119,8 @@ public class PacketOpcodes {
public static final int RequestLiveInfoRsp = 867;
public static final int ResinCardDataUpdateNotify = 4126;
public static final int ResinChangeNotify = 623;
public static final int RestartEffigyChallengeReq = 2061;
public static final int RestartEffigyChallengeRsp = 2112;
public static final int RestartEffigyChallengeReq = 2120;
public static final int RestartEffigyChallengeRsp = 2127;
public static final int ReunionActivateNotify = 5081;
public static final int ReunionBriefInfoReq = 5085;
public static final int ReunionBriefInfoRsp = 5075;
......@@ -1151,12 +1150,12 @@ public class PacketOpcodes {
public static final int RogueResumeDungeonRsp = 8759;
public static final int RogueSwitchAvatarReq = 8856;
public static final int RogueSwitchAvatarRsp = 8141;
public static final int SalesmanDeliverItemReq = 2103;
public static final int SalesmanDeliverItemRsp = 2198;
public static final int SalesmanTakeRewardReq = 2091;
public static final int SalesmanTakeRewardRsp = 2171;
public static final int SalesmanTakeSpecialRewardReq = 2156;
public static final int SalesmanTakeSpecialRewardRsp = 2102;
public static final int SalesmanDeliverItemReq = 2091;
public static final int SalesmanDeliverItemRsp = 2171;
public static final int SalesmanTakeRewardReq = 2162;
public static final int SalesmanTakeRewardRsp = 2156;
public static final int SalesmanTakeSpecialRewardReq = 2082;
public static final int SalesmanTakeSpecialRewardRsp = 2173;
public static final int SaveCoopDialogReq = 1972;
public static final int SaveCoopDialogRsp = 1952;
public static final int SaveMainCoopReq = 1995;
......@@ -1215,35 +1214,34 @@ public class PacketOpcodes {
public static final int SceneTimeNotify = 229;
public static final int SceneTransToPointReq = 256;
public static final int SceneTransToPointRsp = 283;
public static final int SceneUnlockInfoNotify = 3386;
public static final int SceneWeatherForcastReq = 3167;
public static final int SceneWeatherForcastRsp = 3023;
public static final int SeaLampCoinNotify = 2028;
public static final int SeaLampContributeItemReq = 2122;
public static final int SeaLampContributeItemRsp = 2084;
public static final int SeaLampFlyLampNotify = 2075;
public static final int SeaLampFlyLampReq = 2174;
public static final int SeaLampFlyLampRsp = 2080;
public static final int SeaLampPopularityNotify = 2062;
public static final int SeaLampTakeContributionRewardReq = 2052;
public static final int SeaLampTakeContributionRewardRsp = 2057;
public static final int SeaLampTakePhaseRewardReq = 2109;
public static final int SeaLampTakePhaseRewardRsp = 2132;
public static final int SeaLampCoinNotify = 2152;
public static final int SeaLampContributeItemReq = 2075;
public static final int SeaLampContributeItemRsp = 2028;
public static final int SeaLampFlyLampNotify = 2062;
public static final int SeaLampFlyLampReq = 2052;
public static final int SeaLampFlyLampRsp = 2057;
public static final int SeaLampPopularityNotify = 2199;
public static final int SeaLampTakeContributionRewardReq = 2109;
public static final int SeaLampTakeContributionRewardRsp = 2132;
public static final int SeaLampTakePhaseRewardReq = 2122;
public static final int SeaLampTakePhaseRewardRsp = 2084;
public static final int SealBattleBeginNotify = 225;
public static final int SealBattleEndNotify = 249;
public static final int SealBattleProgressNotify = 285;
public static final int SeeMonsterReq = 299;
public static final int SeeMonsterRsp = 300;
public static final int SelectAsterMidDifficultyReq = 2019;
public static final int SelectAsterMidDifficultyRsp = 2003;
public static final int SelectEffigyChallengeConditionReq = 2143;
public static final int SelectEffigyChallengeConditionRsp = 2072;
public static final int SelectAsterMidDifficultyReq = 2065;
public static final int SelectAsterMidDifficultyRsp = 2058;
public static final int SelectEffigyChallengeConditionReq = 2061;
public static final int SelectEffigyChallengeConditionRsp = 2112;
public static final int SelectRoguelikeDungeonCardReq = 8964;
public static final int SelectRoguelikeDungeonCardRsp = 8572;
public static final int SelectWorktopOptionReq = 837;
public static final int SelectWorktopOptionRsp = 893;
public static final int ServerAnnounceNotify = 2199;
public static final int ServerAnnounceRevokeNotify = 2129;
public static final int ServerAnnounceNotify = 2103;
public static final int ServerAnnounceRevokeNotify = 2198;
public static final int ServerBuffChangeNotify = 332;
public static final int ServerCondMeetQuestListUpdateNotify = 401;
public static final int ServerDisconnectClientNotify = 186;
......@@ -1258,8 +1256,8 @@ public class PacketOpcodes {
public static final int SetChatEmojiCollectionRsp = 4077;
public static final int SetCoopChapterViewedReq = 1980;
public static final int SetCoopChapterViewedRsp = 1988;
public static final int SetCurExpeditionChallengeIdReq = 2017;
public static final int SetCurExpeditionChallengeIdRsp = 2099;
public static final int SetCurExpeditionChallengeIdReq = 2095;
public static final int SetCurExpeditionChallengeIdRsp = 2197;
public static final int SetEntityClientDataNotify = 3303;
public static final int SetEquipLockStateReq = 635;
public static final int SetEquipLockStateRsp = 657;
......@@ -1306,14 +1304,14 @@ public class PacketOpcodes {
public static final int SocialDataNotify = 4063;
public static final int SpringUseReq = 1720;
public static final int SpringUseRsp = 1727;
public static final int StartArenaChallengeLevelReq = 2022;
public static final int StartArenaChallengeLevelRsp = 2033;
public static final int StartArenaChallengeLevelReq = 2083;
public static final int StartArenaChallengeLevelRsp = 2097;
public static final int StartBuoyantCombatGalleryReq = 8313;
public static final int StartBuoyantCombatGalleryRsp = 8754;
public static final int StartCoopPointReq = 1956;
public static final int StartCoopPointRsp = 1962;
public static final int StartEffigyChallengeReq = 2123;
public static final int StartEffigyChallengeRsp = 2166;
public static final int StartEffigyChallengeReq = 2159;
public static final int StartEffigyChallengeRsp = 2024;
public static final int StartFishingReq = 5845;
public static final int StartFishingRsp = 5848;
public static final int StartRogueEliteCellChallengeReq = 8620;
......@@ -1342,12 +1340,12 @@ public class PacketOpcodes {
public static final int SumoSwitchTeamRsp = 8356;
public static final int SyncScenePlayTeamEntityNotify = 3296;
public static final int SyncTeamEntityNotify = 338;
public static final int TakeAchievementGoalRewardReq = 2695;
public static final int TakeAchievementGoalRewardRsp = 2698;
public static final int TakeAchievementRewardReq = 2685;
public static final int TakeAchievementRewardRsp = 2675;
public static final int TakeAsterSpecialRewardReq = 2051;
public static final int TakeAsterSpecialRewardRsp = 2041;
public static final int TakeAchievementGoalRewardReq = 2663;
public static final int TakeAchievementGoalRewardRsp = 2651;
public static final int TakeAchievementRewardReq = 2695;
public static final int TakeAchievementRewardRsp = 2698;
public static final int TakeAsterSpecialRewardReq = 2133;
public static final int TakeAsterSpecialRewardRsp = 2195;
public static final int TakeBattlePassMissionPointReq = 2617;
public static final int TakeBattlePassMissionPointRsp = 2636;
public static final int TakeBattlePassRewardReq = 2613;
......@@ -1362,18 +1360,18 @@ public class PacketOpcodes {
public static final int TakeCompoundOutputRsp = 117;
public static final int TakeCoopRewardReq = 1996;
public static final int TakeCoopRewardRsp = 1981;
public static final int TakeDeliveryDailyRewardReq = 2055;
public static final int TakeDeliveryDailyRewardRsp = 2104;
public static final int TakeEffigyFirstPassRewardReq = 2071;
public static final int TakeEffigyFirstPassRewardRsp = 2034;
public static final int TakeEffigyRewardReq = 2113;
public static final int TakeEffigyRewardRsp = 2008;
public static final int TakeDeliveryDailyRewardReq = 2126;
public static final int TakeDeliveryDailyRewardRsp = 2019;
public static final int TakeEffigyFirstPassRewardReq = 2113;
public static final int TakeEffigyFirstPassRewardRsp = 2008;
public static final int TakeEffigyRewardReq = 2143;
public static final int TakeEffigyRewardRsp = 2072;
public static final int TakeFirstShareRewardReq = 4008;
public static final int TakeFirstShareRewardRsp = 4017;
public static final int TakeFurnitureMakeReq = 4751;
public static final int TakeFurnitureMakeRsp = 4457;
public static final int TakeHuntingOfferReq = 4750;
public static final int TakeHuntingOfferRsp = 4782;
public static final int TakeHuntingOfferReq = 4335;
public static final int TakeHuntingOfferRsp = 4325;
public static final int TakeInvestigationRewardReq = 1926;
public static final int TakeInvestigationRewardRsp = 1925;
public static final int TakeInvestigationTargetRewardReq = 1915;
......@@ -1421,17 +1419,17 @@ public class PacketOpcodes {
public static final int TowerSurrenderRsp = 2462;
public static final int TowerTeamSelectReq = 2493;
public static final int TowerTeamSelectRsp = 2444;
public static final int TreasureMapBonusChallengeNotify = 2121;
public static final int TreasureMapCurrencyNotify = 2127;
public static final int TreasureMapDetectorDataNotify = 4272;
public static final int TreasureMapGuideTaskDoneNotify = 2200;
public static final int TreasureMapBonusChallengeNotify = 2188;
public static final int TreasureMapCurrencyNotify = 2177;
public static final int TreasureMapDetectorDataNotify = 4271;
public static final int TreasureMapGuideTaskDoneNotify = 2186;
public static final int TreasureMapHostInfoNotify = 8960;
public static final int TreasureMapMpChallengeNotify = 2177;
public static final int TreasureMapPreTaskDoneNotify = 2188;
public static final int TreasureMapRegionActiveNotify = 2141;
public static final int TreasureMapRegionInfoNotify = 2120;
public static final int TrialAvatarFirstPassDungeonNotify = 2093;
public static final int TrialAvatarInDungeonIndexNotify = 2138;
public static final int TreasureMapMpChallengeNotify = 2200;
public static final int TreasureMapPreTaskDoneNotify = 2007;
public static final int TreasureMapRegionActiveNotify = 2121;
public static final int TreasureMapRegionInfoNotify = 2141;
public static final int TrialAvatarFirstPassDungeonNotify = 2055;
public static final int TrialAvatarInDungeonIndexNotify = 2104;
public static final int TriggerCreateGadgetToEquipPartNotify = 373;
public static final int TriggerRoguelikeCurseNotify = 8878;
public static final int TriggerRoguelikeRuneReq = 8607;
......@@ -1476,8 +1474,6 @@ public class PacketOpcodes {
public static final int UseWidgetRetractGadgetRsp = 4297;
public static final int VehicleInteractReq = 862;
public static final int VehicleInteractRsp = 889;
public static final int VehicleSpawnReq = 809;
public static final int VehicleSpawnRsp = 865;
public static final int VehicleStaminaNotify = 866;
public static final int ViewCodexReq = 4210;
public static final int ViewCodexRsp = 4209;
......@@ -1485,7 +1481,7 @@ public class PacketOpcodes {
public static final int WatcherChangeNotify = 2233;
public static final int WatcherEventNotify = 2210;
public static final int WatcherEventTypeNotify = 2215;
public static final int WaterSpritePhaseFinishNotify = 2097;
public static final int WaterSpritePhaseFinishNotify = 2036;
public static final int WeaponAwakenReq = 664;
public static final int WeaponAwakenRsp = 601;
public static final int WeaponPromoteReq = 626;
......@@ -1523,19 +1519,9 @@ public class PacketOpcodes {
public static final int WorldRoutineTypeRefreshNotify = 3545;
// Unknown
public static final int UNKNOWN = 2013;
public static final int UNKNOWN_1 = 2042;
public static final int UNKNOWN_2 = 343;
public static final int UNKNOWN_3 = 4259;
public static final int UNKNOWN_4 = 4261;
public static final int UNKNOWN_5 = 4306;
public static final int UNKNOWN_6 = 4315;
public static final int UNKNOWN_7 = 4317;
public static final int UNKNOWN_8 = 4326;
public static final int UNKNOWN_9 = 4327;
public static final int UNKNOWN_10 = 4336;
public static final int UNKNOWN_11 = 4337;
public static final int UNKNOWN_12 = 4343;
public static final int UNKNOWN_13 = 5932;
public static final int UNKNOWN_14 = 5959;
public static final int UNKNOWN_15 = 67;
......
......@@ -37,7 +37,7 @@ public abstract class Plugin {
this.identifier = identifier;
this.classLoader = classLoader;
this.dataFolder = new File(PLUGINS_FOLDER, identifier.name);
this.dataFolder = new File(PLUGIN(), identifier.name);
this.logger = LoggerFactory.getLogger(identifier.name);
if(!this.dataFolder.exists() && !this.dataFolder.mkdirs()) {
......
......@@ -34,7 +34,7 @@ public final class PluginManager {
* Loads plugins from the config-specified directory.
*/
private void loadPlugins() {
File pluginsDir = new File(Utils.toFilePath(PLUGINS_FOLDER));
File pluginsDir = new File(Utils.toFilePath(PLUGIN()));
if(!pluginsDir.exists() && !pluginsDir.mkdirs()) {
Grasscutter.getLogger().error("Failed to create plugins directory: " + pluginsDir.getAbsolutePath());
return;
......
......@@ -140,7 +140,7 @@ public class GameSession extends KcpChannel {
}
public void replayPacket(int opcode, String name) {
String filePath = PACKETS_FOLDER + name;
String filePath = PACKET(name);
File p = new File(filePath);
if (!p.exists()) return;
......
......@@ -141,7 +141,7 @@ public final class HttpServer {
public static class DefaultRequestRouter implements Router {
@Override public void applyRoutes(Express express, Javalin handle) {
express.get("/", (request, response) -> {
File file = new File(HTTP_STATIC_FILES.errorFile);
File file = new File(HTTP_STATIC_FILES.indexFile);
if(!file.exists())
response.send("""
<!DOCTYPE html>
......
......@@ -3,19 +3,19 @@ package emu.grasscutter.server.packet.recv;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.VehicleSpawnReqOuterClass;
import emu.grasscutter.net.proto.CreateVehicleReqOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketVehicleSpawnRsp;
import emu.grasscutter.server.packet.send.PacketCreateVehicleRsp;
import emu.grasscutter.utils.Position;
@Opcodes(PacketOpcodes.VehicleSpawnReq)
public class HandlerVehicleSpawnReq extends PacketHandler {
@Opcodes(PacketOpcodes.CreateVehicleReq)
public class HandlerCreateVehicleReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
VehicleSpawnReqOuterClass.VehicleSpawnReq req = VehicleSpawnReqOuterClass.VehicleSpawnReq.parseFrom(payload);
session.send(new PacketVehicleSpawnRsp(session.getPlayer(), req.getVehicleId(), req.getPointId(), new Position(req.getPos()), new Position(req.getRot())));
CreateVehicleReqOuterClass.CreateVehicleReq req = CreateVehicleReqOuterClass.CreateVehicleReq.parseFrom(payload);
session.send(new PacketCreateVehicleRsp(session.getPlayer(), req.getVehicleId(), req.getPointId(), new Position(req.getPos()), new Position(req.getRot())));
}
}
......@@ -9,12 +9,12 @@ import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketHostPlayerNotify;
import emu.grasscutter.server.packet.send.PacketPlayerEnterSceneInfoNotify;
import emu.grasscutter.server.packet.send.PacketPlayerGameTimeNotify;
import emu.grasscutter.server.packet.send.PacketPlayerWorldSceneInfoListNotify;
import emu.grasscutter.server.packet.send.PacketSceneAreaWeatherNotify;
import emu.grasscutter.server.packet.send.PacketSceneInitFinishRsp;
import emu.grasscutter.server.packet.send.PacketScenePlayerInfoNotify;
import emu.grasscutter.server.packet.send.PacketSceneTeamUpdateNotify;
import emu.grasscutter.server.packet.send.PacketSceneTimeNotify;
import emu.grasscutter.server.packet.send.PacketSceneUnlockInfoNotify;
import emu.grasscutter.server.packet.send.PacketServerTimeNotify;
import emu.grasscutter.server.packet.send.PacketSyncScenePlayTeamEntityNotify;
import emu.grasscutter.server.packet.send.PacketSyncTeamEntityNotify;
......@@ -30,7 +30,7 @@ public class HandlerSceneInitFinishReq extends PacketHandler {
session.send(new PacketServerTimeNotify());
session.send(new PacketWorldPlayerInfoNotify(session.getPlayer().getWorld()));
session.send(new PacketWorldDataNotify(session.getPlayer().getWorld()));
session.send(new PacketSceneUnlockInfoNotify());
session.send(new PacketPlayerWorldSceneInfoListNotify());
session.send(new BasePacket(PacketOpcodes.SceneForceUnlockNotify));
session.send(new PacketHostPlayerNotify(session.getPlayer().getWorld()));
......
......@@ -10,7 +10,7 @@ import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.VehicleMemberOuterClass.VehicleMember;
import emu.grasscutter.net.proto.VehicleSpawnRspOuterClass.VehicleSpawnRsp;
import emu.grasscutter.net.proto.CreateVehicleRspOuterClass.CreateVehicleRsp;
import emu.grasscutter.utils.Position;
......@@ -19,11 +19,11 @@ import java.util.List;
import static emu.grasscutter.net.proto.VehicleInteractTypeOuterClass.VehicleInteractType.VEHICLE_INTERACT_OUT;
public class PacketVehicleSpawnRsp extends BasePacket {
public class PacketCreateVehicleRsp extends BasePacket {
public PacketVehicleSpawnRsp(Player player, int vehicleId, int pointId, Position pos, Position rot) {
super(PacketOpcodes.VehicleSpawnRsp);
VehicleSpawnRsp.Builder proto = VehicleSpawnRsp.newBuilder();
public PacketCreateVehicleRsp(Player player, int vehicleId, int pointId, Position pos, Position rot) {
super(PacketOpcodes.CreateVehicleRsp);
CreateVehicleRsp.Builder proto = CreateVehicleRsp.newBuilder();
// Eject vehicle members and Kill previous vehicles if there are any
List<GameEntity> previousVehicles = player.getScene().getEntities().values().stream()
......
......@@ -2,15 +2,15 @@ package emu.grasscutter.server.packet.send;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.SceneUnlockInfoNotifyOuterClass.SceneUnlockInfoNotify;
import emu.grasscutter.net.proto.PlayerWorldSceneInfoListNotifyOuterClass.PlayerWorldSceneInfoListNotify;
import emu.grasscutter.net.proto.SceneUnlockInfoOuterClass.SceneUnlockInfo;
public class PacketSceneUnlockInfoNotify extends BasePacket {
public class PacketPlayerWorldSceneInfoListNotify extends BasePacket {
public PacketSceneUnlockInfoNotify() {
super(PacketOpcodes.SceneUnlockInfoNotify); // Rename opcode later
public PacketPlayerWorldSceneInfoListNotify() {
super(PacketOpcodes.PlayerWorldSceneInfoListNotify); // Rename opcode later
SceneUnlockInfoNotify proto = SceneUnlockInfoNotify.newBuilder()
PlayerWorldSceneInfoListNotify proto = PlayerWorldSceneInfoListNotify.newBuilder()
.addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(1))
.addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(3).addSceneTagIdList(102).addSceneTagIdList(113).addSceneTagIdList(117))
.addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(4).addSceneTagIdList(106).addSceneTagIdList(109))
......
......@@ -136,8 +136,9 @@ public class ConfigContainer {
public int bindPort = 22102;
/* This is the port used in the default region. */
public int accessPort = 0;
public boolean enableScriptInBigWorld = false;
public boolean enableScriptInBigWorld = false;
public boolean enableConsole = true;
public GameOptions gameOptions = new GameOptions();
public JoinOptions joinOptions = new JoinOptions();
public ConsoleAccount serverAccount = new ConsoleAccount();
......
......@@ -20,11 +20,11 @@ public final class Crypto {
public static byte[] ENCRYPT_SEED_BUFFER = new byte[0];
public static void loadKeys() {
DISPATCH_KEY = FileUtils.read(KEYS_FOLDER + "/dispatchKey.bin");
DISPATCH_SEED = FileUtils.read(KEYS_FOLDER + "/dispatchSeed.bin");
DISPATCH_KEY = FileUtils.read(KEY("dispatchKey.bin"));
DISPATCH_SEED = FileUtils.read(KEY("dispatchSeed.bin"));
ENCRYPT_KEY = FileUtils.read(KEYS_FOLDER + "/secretKey.bin");
ENCRYPT_SEED_BUFFER = FileUtils.read(KEYS_FOLDER + "/secretKeyBuffer.bin");
ENCRYPT_KEY = FileUtils.read(KEY("secretKey.bin"));
ENCRYPT_SEED_BUFFER = FileUtils.read(KEY("secretKeyBuffer.bin"));
}
public static void xor(byte[] packet, byte[] key) {
......@@ -40,7 +40,7 @@ public final class Crypto {
public static void extractSecretKeyBuffer(byte[] data) {
try {
GetPlayerTokenRsp p = GetPlayerTokenRsp.parseFrom(data);
FileUtils.write(KEYS_FOLDER + "/secretKeyBuffer.bin", p.getSecretKeyBytes().toByteArray());
FileUtils.write(KEY("/secretKeyBuffer.bin"), p.getSecretKeyBytes().toByteArray());
Grasscutter.getLogger().info("Secret Key: " + p.getSecretKey());
} catch (Exception e) {
Grasscutter.getLogger().error("Crypto error.", e);
......@@ -50,7 +50,7 @@ public final class Crypto {
public static void extractDispatchSeed(String data) {
try {
QueryCurrRegionHttpRsp p = QueryCurrRegionHttpRsp.parseFrom(Base64.getDecoder().decode(data));
FileUtils.write(KEYS_FOLDER + "/dispatchSeed.bin", p.getRegionInfo().getSecretKey().toByteArray());
FileUtils.write(KEY("/dispatchSeed.bin"), p.getRegionInfo().getSecretKey().toByteArray());
} catch (Exception e) {
Grasscutter.getLogger().error("Crypto error.", e);
}
......
......@@ -181,10 +181,6 @@
"success": "All characters have been healed.",
"description": "Heal all characters in your current team."
},
"join": {
"usage": "Usage: join [AvatarIDs] such as\"join 10000038 10000039\"",
"description": "force join avatar into your team"
},
"kick": {
"player_kick_player": "Player [%s:%s] has kicked player [%s:%s]",
"server_kick_player": "Kicking player [%s:%s]",
......@@ -237,11 +233,6 @@
"reload_done": "Reload complete.",
"description": "Reload server config"
},
"remove": {
"usage": "Usage: remove [indexOfYourTeam] index start from 1",
"invalid_index": "The index number is illegal. It starts from 1 and the maximum value is the number of roles in the team",
"description": "force remove avatar into your team. Such as `remove 1 2`."
},
"resetConst": {
"reset_all": "Reset all avatars' constellations.",
"success": "Constellations for %s have been reset. Please relog to see changes.",
......@@ -331,6 +322,24 @@
"q_skill_id": "Q skill ID %s.",
"description": "Set talent level for your current active character"
},
"team": {
"usage": "Usage: team <add|remove|set> [avatarId,...] [index|first|last|index-index,...]",
"invalid_usage": "invalid usage",
"add_usage": "usage(add): team add <avatarId,...> [index]",
"invalid_index": "index is invalid",
"add_too_much": "server is only allow you to have at most %d avatar(s) in your team",
"failed_to_add_avatar": "failed to add avatar by id: %s",
"remove_usage": "usage(remove): team remove <index|first|last|index-index,...>",
"failed_parse_index": "failed to parse index: %s",
"remove_too_much": "you can't remove so many avatars, your team list will be empty for this",
"ignore_index": "ignored index(es): %s",
"set_usage": "usage(set): team set <index> <avatarId>",
"index_out_of_range": "index your specified is out of range",
"failed_parse_avatar_id": "failed to parse avatar id: %s",
"avatar_already_in_team": "avatar is already in team",
"avatar_not_found": "avatar not found: %d",
"description": "modify your team manually"
},
"teleportAll": {
"success": "Summoned all players to your location.",
"error": "You only can use this command in MP mode.",
......
......@@ -180,10 +180,6 @@
"success": "已治疗所有角色。",
"description": "治疗当前队伍的角色"
},
"join": {
"usage": "用法:join <角色IDs> 例如\"join 10000038 10000039\"空格分开",
"description": "强制将角色加入到当前队伍中"
},
"kick": {
"player_kick_player": "玩家 [%s:%s] 已将 [%s:%s] 踢出。",
"server_kick_player": "正在踢出玩家 [%s:%s]...",
......@@ -236,11 +232,6 @@
"reload_done": "重载完成。",
"description": "重载配置文件和数据"
},
"remove": {
"usage": "用法: remove [多个角色在队伍中的序号] 序号从1开始",
"invalid_index": "序号不合法,从1开始,最大值为队内角色数量",
"description": "强制将某个角色从当前队伍中移除。例如`remove 1 2`表示将1号和2号角色从队伍中移除"
},
"resetConst": {
"reset_all": "重置所有角色的命座。",
"success": "已重置 %s 的命座,重新登录后生效。",
......@@ -330,6 +321,24 @@
"q_skill_id": "元素爆发ID %s。",
"description": "设置当前角色的天赋等级"
},
"team": {
"usage": "用法: team <add|remove|set> [avatarId,...] [index|first|last|index-index,...]",
"invalid_usage": "无效用法",
"add_usage": "用法(add): team add <avatarId,...> [index]",
"invalid_index": "无效索引",
"add_too_much": "服务端仅允许你队伍里至多有%d名角色",
"failed_to_add_avatar": "无法根据id %s 添加角色",
"remove_usage": "用法(remove): team remove <index|first|last|index-index,...>",
"failed_parse_index": "无法解析索引: %s",
"remove_too_much": "你不能删除那么多角色,你的队伍列表将会变空",
"ignore_index": "忽略的索引列表: %s",
"set_usage": "用法(set): team set <index> <avatarId>",
"index_out_of_range": "你指定的索引超出了范围",
"failed_parse_avatar_id": "无法解析的角色id: %s",
"avatar_already_in_team": "角色已经在你的队伍中了",
"avatar_not_found": "无法找到该角色: %d",
"description": "手动修改你的队伍"
},
"teleportAll": {
"success": "已将所有玩家传送到你的位置。",
"error": "你只能在多人游戏状态下执行此命令。",
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment