Merge pull request #1348 from Birdulon/Weather

Add default ClimateTypes per weather
This commit is contained in:
Magix 2022-06-23 11:20:27 -04:00 committed by GitHub
commit 5b44f79f21
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 137 additions and 102 deletions

View File

@ -158,7 +158,7 @@ public final class CommandMap {
CommandHandler.sendTranslatedMessage(player, targetPlayer.isOnline() ? "commands.execution.set_target_online" : "commands.execution.set_target_offline", targetUidStr); CommandHandler.sendTranslatedMessage(player, targetPlayer.isOnline() ? "commands.execution.set_target_online" : "commands.execution.set_target_offline", targetUidStr);
} }
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
CommandHandler.sendTranslatedMessage(player, "commands.execution.uid_error"); CommandHandler.sendTranslatedMessage(player, "commands.generic.invalid.uid");
} }
} }
return; return;
@ -193,7 +193,7 @@ public final class CommandMap {
} }
break; break;
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
CommandHandler.sendTranslatedMessage(player, "commands.execution.uid_error"); CommandHandler.sendTranslatedMessage(player, "commands.generic.invalid.uid");
return; return;
} }
} }

View File

@ -31,7 +31,7 @@ public final class CoopCommand implements CommandHandler {
} }
break; break;
} catch (NumberFormatException ignored) { } catch (NumberFormatException ignored) {
CommandHandler.sendMessage(sender, translate(sender, "commands.execution.uid_error")); CommandHandler.sendMessage(sender, translate(sender, "commands.generic.invalid.uid"));
return; return;
} }
default: default:

View File

@ -1,47 +1,44 @@
package emu.grasscutter.command.commands; package emu.grasscutter.command.commands;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.Command; import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler; import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.player.Player; import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ClimateType; import emu.grasscutter.game.props.ClimateType;
import emu.grasscutter.server.packet.send.PacketSceneAreaWeatherNotify; import emu.grasscutter.game.world.Scene;
import java.util.List; import java.util.List;
import static emu.grasscutter.utils.Language.translate; @Command(label = "weather", usage = "weather [weatherId] [climateType]", aliases = {"w"}, permission = "player.weather", permissionTargeted = "player.weather.others", description = "commands.weather.description")
@Command(label = "weather", usage = "weather <climate type(weatherId)> <weather type(climateId)>", aliases = {"w"}, permission = "player.weather", permissionTargeted = "player.weather.others", description = "commands.weather.description")
public final class WeatherCommand implements CommandHandler { public final class WeatherCommand implements CommandHandler {
@Override @Override
public void execute(Player sender, Player targetPlayer, List<String> args) { public void execute(Player sender, Player targetPlayer, List<String> args) {
int weatherId = 0; int weatherId = targetPlayer.getWeatherId();
int climateId = 1; ClimateType climate = ClimateType.CLIMATE_NONE; // Sending ClimateType.CLIMATE_NONE to Scene.setWeather will use the default climate for that weather
switch (args.size()) {
case 2: if (args.isEmpty()) {
try { climate = targetPlayer.getClimate();
climateId = Integer.parseInt(args.get(1)); CommandHandler.sendTranslatedMessage(sender, "commands.weather.status", Integer.toString(weatherId), climate.getShortName());
} catch (NumberFormatException ignored) { return;
CommandHandler.sendMessage(sender, translate(sender, "commands.weather.invalid_id"));
}
case 1:
try {
weatherId = Integer.parseInt(args.get(0));
} catch (NumberFormatException ignored) {
CommandHandler.sendMessage(sender, translate(sender, "commands.weather.invalid_id"));
}
break;
default:
CommandHandler.sendMessage(sender, translate(sender, "commands.weather.usage"));
return;
} }
ClimateType climate = ClimateType.getTypeByValue(climateId); for (String arg : args) {
ClimateType c = ClimateType.getTypeByShortName(arg.toLowerCase());
if (c != ClimateType.CLIMATE_NONE) {
climate = c;
} else {
try {
weatherId = Integer.parseInt(arg);
} catch (NumberFormatException ignored) {
CommandHandler.sendTranslatedMessage(sender, "commands.generic.invalid.id");
CommandHandler.sendTranslatedMessage(sender, "commands.weather.usage");
return;
}
}
}
targetPlayer.getScene().setWeather(weatherId); targetPlayer.setWeather(weatherId, climate);
targetPlayer.getScene().setClimate(climate); climate = targetPlayer.getClimate(); // Might be different to what we set
targetPlayer.getScene().broadcastPacket(new PacketSceneAreaWeatherNotify(targetPlayer)); CommandHandler.sendTranslatedMessage(sender, "commands.weather.success", Integer.toString(weatherId), climate.getShortName());
CommandHandler.sendMessage(sender, translate(sender, "commands.weather.success", Integer.toString(weatherId), Integer.toString(climateId)));
} }
} }

View File

@ -94,6 +94,7 @@ public class GameData {
private static final Int2ObjectMap<FurnitureMakeConfigData> furnitureMakeConfigDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap<FurnitureMakeConfigData> furnitureMakeConfigDataMap = new Int2ObjectOpenHashMap<>();
private static final Int2ObjectMap<InvestigationMonsterData> investigationMonsterDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap<InvestigationMonsterData> investigationMonsterDataMap = new Int2ObjectOpenHashMap<>();
private static final Int2ObjectMap<CityData> cityDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap<CityData> cityDataMap = new Int2ObjectOpenHashMap<>();
private static final Int2ObjectMap<WeatherData> weatherDataMap = new Int2ObjectOpenHashMap<>();
private static final Int2ObjectMap<BattlePassMissionExcelConfigData> battlePassMissionExcelConfigDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap<BattlePassMissionExcelConfigData> battlePassMissionExcelConfigDataMap = new Int2ObjectOpenHashMap<>();
private static final Int2ObjectMap<BattlePassRewardExcelConfigData> battlePassRewardExcelConfigDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap<BattlePassRewardExcelConfigData> battlePassRewardExcelConfigDataMap = new Int2ObjectOpenHashMap<>();
@ -414,10 +415,15 @@ public class GameData {
public static Int2ObjectMap<InvestigationMonsterData> getInvestigationMonsterDataMap() { public static Int2ObjectMap<InvestigationMonsterData> getInvestigationMonsterDataMap() {
return investigationMonsterDataMap; return investigationMonsterDataMap;
} }
public static Int2ObjectMap<CityData> getCityDataMap() { public static Int2ObjectMap<CityData> getCityDataMap() {
return cityDataMap; return cityDataMap;
} }
public static Int2ObjectMap<WeatherData> getWeatherDataMap() {
return weatherDataMap;
}
public static Int2ObjectMap<BattlePassMissionExcelConfigData> getBattlePassMissionExcelConfigDataMap() { public static Int2ObjectMap<BattlePassMissionExcelConfigData> getBattlePassMissionExcelConfigDataMap() {
return battlePassMissionExcelConfigDataMap; return battlePassMissionExcelConfigDataMap;
} }

View File

@ -0,0 +1,26 @@
package emu.grasscutter.data.excels;
import emu.grasscutter.data.GameResource;
import emu.grasscutter.data.ResourceType;
import emu.grasscutter.game.props.ClimateType;
import lombok.Getter;
@ResourceType(name = "WeatherExcelConfigData.json")
public class WeatherData extends GameResource {
@Getter private int areaID;
@Getter private int weatherAreaId;
@Getter private String maxHeightStr;
@Getter private int gadgetID;
@Getter private boolean isDefaultValid;
@Getter private String templateName;
@Getter private int priority;
@Getter private String profileName;
@Getter private ClimateType defaultClimate;
@Getter private boolean isUseDefault;
@Getter private int sceneID;
@Override
public int getId() {
return this.areaID;
}
}

View File

@ -5,6 +5,7 @@ import emu.grasscutter.GameConstants;
import emu.grasscutter.Grasscutter; import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData; import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.PlayerLevelData; import emu.grasscutter.data.excels.PlayerLevelData;
import emu.grasscutter.data.excels.WeatherData;
import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.Account; import emu.grasscutter.game.Account;
import emu.grasscutter.game.CoopRequest; import emu.grasscutter.game.CoopRequest;
@ -38,6 +39,7 @@ import emu.grasscutter.game.managers.mapmark.*;
import emu.grasscutter.game.managers.stamina.StaminaManager; import emu.grasscutter.game.managers.stamina.StaminaManager;
import emu.grasscutter.game.managers.SotSManager; import emu.grasscutter.game.managers.SotSManager;
import emu.grasscutter.game.props.ActionReason; import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.game.props.ClimateType;
import emu.grasscutter.game.props.PlayerProperty; import emu.grasscutter.game.props.PlayerProperty;
import emu.grasscutter.game.props.SceneType; import emu.grasscutter.game.props.SceneType;
import emu.grasscutter.game.quest.QuestManager; import emu.grasscutter.game.quest.QuestManager;
@ -71,6 +73,7 @@ import emu.grasscutter.utils.MessageHandler;
import emu.grasscutter.utils.Utils; import emu.grasscutter.utils.Utils;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import lombok.Getter;
import java.util.*; import java.util.*;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
@ -112,6 +115,8 @@ public class Player {
@Transient private int peerId; @Transient private int peerId;
@Transient private World world; @Transient private World world;
@Transient private Scene scene; @Transient private Scene scene;
@Transient @Getter private int weatherId = 0;
@Transient @Getter private ClimateType climate = ClimateType.CLIMATE_SUNNY;
@Transient private GameSession session; @Transient private GameSession session;
@Transient private AvatarStorage avatars; @Transient private AvatarStorage avatars;
@Transient private Inventory inventory; @Transient private Inventory inventory;
@ -140,8 +145,8 @@ public class Player {
private int regionId; private int regionId;
private int mainCharacterId; private int mainCharacterId;
private boolean godmode; private boolean godmode;
private boolean stamina; private boolean stamina;
private boolean moonCard; private boolean moonCard;
private Date moonCardStartTime; private Date moonCardStartTime;
private int moonCardDuration; private int moonCardDuration;
@ -324,6 +329,28 @@ public class Player {
this.scene = scene; this.scene = scene;
} }
synchronized public void setClimate(ClimateType climate) {
this.climate = climate;
this.session.send(new PacketSceneAreaWeatherNotify(this));
}
synchronized public void setWeather(int weather) {
this.setWeather(weather, ClimateType.CLIMATE_NONE);
}
synchronized public void setWeather(int weatherId, ClimateType climate) {
// Lookup default climate for this weather
if (climate == ClimateType.CLIMATE_NONE) {
WeatherData w = GameData.getWeatherDataMap().get(weatherId);
if (w != null) {
climate = w.getDefaultClimate();
}
}
this.weatherId = weatherId;
this.climate = climate;
this.session.send(new PacketSceneAreaWeatherNotify(this));
}
public int getGmLevel() { public int getGmLevel() {
return 1; return 1;
} }

View File

@ -32,7 +32,11 @@ public enum ClimateType {
} }
public int getValue() { public int getValue() {
return value; return this.value;
}
public String getShortName() {
return this.name().substring(8).toLowerCase();
} }
public static ClimateType getTypeByValue(int value) { public static ClimateType getTypeByValue(int value) {
@ -42,4 +46,9 @@ public enum ClimateType {
public static ClimateType getTypeByName(String name) { public static ClimateType getTypeByName(String name) {
return stringMap.getOrDefault(name, CLIMATE_NONE); return stringMap.getOrDefault(name, CLIMATE_NONE);
} }
public static ClimateType getTypeByShortName(String shortName) {
String name = "CLIMATE_" + shortName.toUpperCase();
return stringMap.getOrDefault(name, CLIMATE_NONE);
}
} }

View File

@ -46,8 +46,6 @@ public class Scene {
private int autoCloseTime; private int autoCloseTime;
private int time; private int time;
private ClimateType climate;
private int weather;
private SceneScriptManager scriptManager; private SceneScriptManager scriptManager;
private WorldChallenge challenge; private WorldChallenge challenge;
@ -62,7 +60,6 @@ public class Scene {
this.entities = new ConcurrentHashMap<>(); this.entities = new ConcurrentHashMap<>();
this.time = 8 * 60; this.time = 8 * 60;
this.climate = ClimateType.CLIMATE_SUNNY;
this.prevScene = 3; this.prevScene = 3;
this.spawnedEntities = ConcurrentHashMap.newKeySet(); this.spawnedEntities = ConcurrentHashMap.newKeySet();
@ -131,22 +128,6 @@ public class Scene {
this.time = time % 1440; this.time = time % 1440;
} }
public ClimateType getClimate() {
return climate;
}
public int getWeather() {
return weather;
}
public void setClimate(ClimateType climate) {
this.climate = climate;
}
public void setWeather(int weather) {
this.weather = weather;
}
public int getPrevScene() { public int getPrevScene() {
return prevScene; return prevScene;
} }

View File

@ -12,8 +12,8 @@ public class PacketSceneAreaWeatherNotify extends BasePacket {
super(PacketOpcodes.SceneAreaWeatherNotify); super(PacketOpcodes.SceneAreaWeatherNotify);
SceneAreaWeatherNotify proto = SceneAreaWeatherNotify.newBuilder() SceneAreaWeatherNotify proto = SceneAreaWeatherNotify.newBuilder()
.setWeatherAreaId(player.getScene().getWeather()) .setWeatherAreaId(player.getWeatherId())
.setClimateType(player.getScene().getClimate().getValue()) .setClimateType(player.getClimate().getValue())
.build(); .build();
this.setData(proto); this.setData(proto);

View File

@ -76,16 +76,14 @@
"itemLevel": "Invalid itemLevel.", "itemLevel": "Invalid itemLevel.",
"itemRefinement": "Invalid itemRefinement.", "itemRefinement": "Invalid itemRefinement.",
"playerId": "Invalid player ID.", "playerId": "Invalid player ID.",
"uid": "Invalid UID." "uid": "Invalid UID.",
"id": "Invalid ID."
} }
}, },
"execution": { "execution": {
"uid_error": "Invalid UID.",
"player_exist_error": "Player not found.", "player_exist_error": "Player not found.",
"player_offline_error": "Player is not online.", "player_offline_error": "Player is not online.",
"item_id_error": "Invalid item ID.",
"item_player_exist_error": "Invalid item or UID.", "item_player_exist_error": "Invalid item or UID.",
"entity_id_error": "Invalid entity ID.",
"player_exist_offline_error": "Player not found or is not online.", "player_exist_offline_error": "Player not found or is not online.",
"argument_error": "Invalid arguments.", "argument_error": "Invalid arguments.",
"clear_target": "Target cleared.", "clear_target": "Target cleared.",
@ -387,10 +385,10 @@
"description": "Unlock all levels of tower" "description": "Unlock all levels of tower"
}, },
"weather": { "weather": {
"usage": "Usage: weather <climate type(weatherId)> <weather type(climateId)>\nWeather types 0: None, 1: Sunny, 2: Cloudy, 3: Rain, 4: Thunderstorm, 5: Snow, 6: Mist", "description": "Changes weather ID and climate type. Weather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny, cloudy, rain, thunderstorm, snow, mist",
"success": "Changed climate type to %s with weather type %s.", "usage": "Usage: weather [weatherId] [climateType]\nWeather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny, cloudy, rain, thunderstorm, snow, mist.",
"invalid_id": "Invalid ID.", "success": "Set weather ID to %s with climate type %s.",
"description": "Changes the weather" "status": "Current weather ID is %s with climate type %s."
}, },
"ban": { "ban": {
"description": "Ban a player", "description": "Ban a player",

View File

@ -76,16 +76,14 @@
"itemLevel": "Niveau de l'objet invalide.", "itemLevel": "Niveau de l'objet invalide.",
"itemRefinement": "Raffinement de l'objet invalide.", "itemRefinement": "Raffinement de l'objet invalide.",
"playerId": "ID du joueur invalide.", "playerId": "ID du joueur invalide.",
"uid": "UID invalide." "uid": "UID invalide.",
"id": "ID invalide."
} }
}, },
"execution": { "execution": {
"uid_error": "UID invalide.",
"player_exist_error": "Joueur introuvable.", "player_exist_error": "Joueur introuvable.",
"player_offline_error": "Le joueur n'est pas connecté.", "player_offline_error": "Le joueur n'est pas connecté.",
"item_id_error": "ID de l'objet invalide.",
"item_player_exist_error": "UID ou objet invalide.", "item_player_exist_error": "UID ou objet invalide.",
"entity_id_error": "ID de l'entité invalide.",
"player_exist_offline_error": "Le joueur est introuvable ou n'est pas connecté.", "player_exist_offline_error": "Le joueur est introuvable ou n'est pas connecté.",
"argument_error": "Arguments invalides.", "argument_error": "Arguments invalides.",
"clear_target": "Cible réinitialisée.", "clear_target": "Cible réinitialisée.",
@ -387,10 +385,10 @@
"description": "Débloque tous les couloirs de l'abysse" "description": "Débloque tous les couloirs de l'abysse"
}, },
"weather": { "weather": {
"usage": "Usage: weather <climate type(weatherId)> <weather type(climateId)>\nTypes de météo 0: Aucun, 1: Ensoleillé, 2: Nuageux, 3: Pluvieux, 4: Orageux, 5: Neige, 6: Brouillard", "description": "Change la météo. Weather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny, cloudy, rain, thunderstorm, snow, mist.",
"success": "Le type de climat a été changé à %s avec le type de météo %s.", "usage": "Utilisation: weather [weatherId] [climateType]\nWeather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny, cloudy, rain, thunderstorm, snow, mist.",
"invalid_id": "ID invalide.", "success": "Set weather ID to %s with climate type %s.",
"description": "Change la météo" "status": "Current weather ID is %s with climate type %s."
}, },
"ban": { "ban": {
"description": "Bannis un joueur", "description": "Bannis un joueur",

View File

@ -70,16 +70,14 @@
"itemLevel": "Błędny poziom przedmiotu.", "itemLevel": "Błędny poziom przedmiotu.",
"itemRefinement": "Błędne ulepszenie.", "itemRefinement": "Błędne ulepszenie.",
"playerId": "Błędne playerId.", "playerId": "Błędne playerId.",
"uid": "Błędne UID." "uid": "Błędne UID.",
"id": "Błędne ID."
} }
}, },
"execution": { "execution": {
"uid_error": "Błędne UID.",
"player_exist_error": "Gracz nie znaleziony.", "player_exist_error": "Gracz nie znaleziony.",
"player_offline_error": "Gracz nie jest online.", "player_offline_error": "Gracz nie jest online.",
"item_id_error": "Błędne ID przedmiotu.",
"item_player_exist_error": "Błędny przedmiot lub UID.", "item_player_exist_error": "Błędny przedmiot lub UID.",
"entity_id_error": "Błędne ID obiektu.",
"player_exist_offline_error": "Gracz nie znaleziony lub jest offline.", "player_exist_offline_error": "Gracz nie znaleziony lub jest offline.",
"argument_error": "Błędne argumenty.", "argument_error": "Błędne argumenty.",
"clear_target": "Cel wyczyszczony.", "clear_target": "Cel wyczyszczony.",
@ -291,9 +289,10 @@
"success": "Przeteleportowano %s do %s, %s, %s w scenie %s" "success": "Przeteleportowano %s do %s, %s, %s w scenie %s"
}, },
"weather": { "weather": {
"usage": "Użycie: weather <climate type(weatherId)> <weather type(climateId)>\nWeather types 0: None, 1: Sunny, 2: Cloudy, 3: Rain, 4: Thunderstorm, 5: Snow, 6: Mist", "description": "Changes the weather.Weather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny, cloudy, rain, thunderstorm, snow, mist.",
"success": "Changed climate type to %s with weather type %s.", "usage": "Usage: weather [weatherId] [climateType]\nWeather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny, cloudy, rain, thunderstorm, snow, mist.",
"invalid_id": "Błędne ID." "success": "Set weather ID to %s with climate type %s.",
"status": "Current weather ID is %s with climate type %s."
}, },
"drop": { "drop": {
"command_usage": "Użycie: drop <ID przedmiotu|nazwa przedmiotu> [ilość]", "command_usage": "Użycie: drop <ID przedmiotu|nazwa przedmiotu> [ilość]",

View File

@ -76,16 +76,14 @@
"itemLevel": "Некорректный уровень предмета (itemLevel).", "itemLevel": "Некорректный уровень предмета (itemLevel).",
"itemRefinement": "Некорректный уровень пробуждения предмета (itemRefinement).", "itemRefinement": "Некорректный уровень пробуждения предмета (itemRefinement).",
"playerId": "Некорректный ID игрока.", "playerId": "Некорректный ID игрока.",
"uid": "Некорректный UID." "uid": "Некорректный UID.",
"id": "Некорректный ID."
} }
}, },
"execution": { "execution": {
"uid_error": "Некорректный UID.",
"player_exist_error": "Игрок не найден.", "player_exist_error": "Игрок не найден.",
"player_offline_error": "Игрок не в сети.", "player_offline_error": "Игрок не в сети.",
"item_id_error": "Некорректный ID предмета.",
"item_player_exist_error": "Некорректный предмет или UID.", "item_player_exist_error": "Некорректный предмет или UID.",
"entity_id_error": "Некорректный ID сущности.",
"player_exist_offline_error": "Игрок не был найден или не в сети.", "player_exist_offline_error": "Игрок не был найден или не в сети.",
"argument_error": "Некорректные аргументы.", "argument_error": "Некорректные аргументы.",
"clear_target": "Цель была удалена.", "clear_target": "Цель была удалена.",
@ -387,10 +385,10 @@
"description": "Открывает все уровни башни" "description": "Открывает все уровни башни"
}, },
"weather": { "weather": {
"usage": "Применение: weather <тип_климата(Id погоды)> <тип_погоды(Id климата)>\nТипы погоды 0: Отсутствует, 1: Солнечная, 2: Пасмурная, 3: Дождливая, 4: Грозовая, 5: Снежная, 6: Туманная", "description": "Изменяет погоду.Weather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny, cloudy, rain, thunderstorm, snow, mist.",
"success": "Тип климата был изменен на %s, тип погоды: %s.", "usage": "Usage: weather [weatherId] [climateType]\nWeather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny, cloudy, rain, thunderstorm, snow, mist.",
"invalid_id": "Некорректный ID.", "success": "Set weather ID to %s with climate type %s.",
"description": "Изменяет погоду" "status": "Current weather ID is %s with climate type %s."
}, },
"ban": { "ban": {
"description": "Банит игрока", "description": "Банит игрока",

View File

@ -76,16 +76,14 @@
"itemLevel": "无效的物品等级。", "itemLevel": "无效的物品等级。",
"itemRefinement": "无效的物品精炼等级。", "itemRefinement": "无效的物品精炼等级。",
"playerId": "无效的玩家ID。", "playerId": "无效的玩家ID。",
"uid": "无效的UID。" "uid": "无效的UID。",
"id": "无效的ID。"
} }
}, },
"execution": { "execution": {
"uid_error": "无效的UID。",
"player_exist_error": "玩家不存在。", "player_exist_error": "玩家不存在。",
"player_offline_error": "玩家已离线。", "player_offline_error": "玩家已离线。",
"item_id_error": "无效的物品ID。",
"item_player_exist_error": "无效的物品/玩家UID。", "item_player_exist_error": "无效的物品/玩家UID。",
"entity_id_error": "无效的实体ID。",
"player_exist_offline_error": "玩家不存在或已离线。", "player_exist_offline_error": "玩家不存在或已离线。",
"argument_error": "无效的参数。", "argument_error": "无效的参数。",
"clear_target": "目标已清除。", "clear_target": "目标已清除。",
@ -387,10 +385,10 @@
"description": "解锁深境螺旋" "description": "解锁深境螺旋"
}, },
"weather": { "weather": {
"usage": "用法weather <气候类型(天气ID)> <天气类型(气候ID)>\n天气类型 0: 无, 1: 晴天, 2: 多云, 3: 雨, 4: 雷雨, 5: 雪, 6: 雾", "description": "更改天气. Weather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny, cloudy, rain, thunderstorm, snow, mist.",
"success": "已更改气候类型为 %s天气类型为 %s。", "usage": "用法weather [weatherId] [climateType]\nWeather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny (晴天), cloudy (多云), rain (雨), thunderstorm (雷雨), snow (雪), mist (雾).",
"invalid_id": "无效的ID。", "success": "Set weather ID to %s with climate type %s.",
"description": "更改天气" "status": "Current weather ID is %s with climate type %s."
}, },
"ban": { "ban": {
"description": "封禁玩家", "description": "封禁玩家",

View File

@ -75,16 +75,14 @@
"itemLevel": "無效的物品等級。", "itemLevel": "無效的物品等級。",
"itemRefinement": "無效的物品精煉度。", "itemRefinement": "無效的物品精煉度。",
"playerId": "無效的玩家ID。", "playerId": "無效的玩家ID。",
"uid": "無效的UID。" "uid": "無效的UID。",
"id": "無效的ID。"
} }
}, },
"execution": { "execution": {
"uid_error": "無效的UID。",
"player_exist_error": "用戶不存在。", "player_exist_error": "用戶不存在。",
"player_offline_error": "玩家已離線。", "player_offline_error": "玩家已離線。",
"item_id_error": "無效的物品ID。.",
"item_player_exist_error": "無效的物品/玩家UID。", "item_player_exist_error": "無效的物品/玩家UID。",
"entity_id_error": "無效的實體ID。",
"player_exist_offline_error": "玩家不存在或已離線。", "player_exist_offline_error": "玩家不存在或已離線。",
"argument_error": "無效的參數。", "argument_error": "無效的參數。",
"clear_target": "目標已清除.", "clear_target": "目標已清除.",
@ -390,10 +388,10 @@
"description": "解鎖所有級別的深境螺旋。" "description": "解鎖所有級別的深境螺旋。"
}, },
"weather": { "weather": {
"usage": "用法weather <氣候型別(weatherId)> <天氣型別(climateId)>\n天氣類型 '0無、 1晴天、 2多雲、 3雨、 4::雷雨、 5雪、 6霧'", "description": "更改目前的天氣。Weather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny, cloudy, rain, thunderstorm, snow, mist.",
"success": "已將當前氣候設定為 %s ,天氣則為 %s 。", "usage": "用法weather [weatherId] [climateType]\nWeather IDs can be found in WeatherExcelConfigData.json.\nClimate types: sunny (晴天), cloudy (多雲), rain (雨), thunderstorm (雷雨), snow (雪), mist (霧).",
"invalid_id": "無效的ID。", "success": "Set weather ID to %s with climate type %s.",
"description": "更改目前的天氣。" "status": "Current weather ID is %s with climate type %s."
}, },
"ban": { "ban": {
"description": "停權指定玩家。", "description": "停權指定玩家。",