mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-01-10 04:32:53 +08:00
Add default Climates per weather
This commit is contained in:
parent
4df068bba0
commit
dcd3c696ea
@ -1,47 +1,45 @@
|
||||
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.game.props.ClimateType;
|
||||
import emu.grasscutter.server.packet.send.PacketSceneAreaWeatherNotify;
|
||||
import emu.grasscutter.game.world.Scene;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static emu.grasscutter.utils.Language.translate;
|
||||
|
||||
@Command(label = "weather", usage = "weather <climate type(weatherId)> <weather type(climateId)>", aliases = {"w"}, permission = "player.weather", permissionTargeted = "player.weather.others", description = "commands.weather.description")
|
||||
@Command(label = "weather", usage = "weather [weatherId] [climateType]", aliases = {"w"}, permission = "player.weather", permissionTargeted = "player.weather.others", description = "commands.weather.description")
|
||||
public final class WeatherCommand implements CommandHandler {
|
||||
|
||||
@Override
|
||||
public void execute(Player sender, Player targetPlayer, List<String> args) {
|
||||
int weatherId = 0;
|
||||
int climateId = 1;
|
||||
switch (args.size()) {
|
||||
case 2:
|
||||
try {
|
||||
climateId = Integer.parseInt(args.get(1));
|
||||
} catch (NumberFormatException ignored) {
|
||||
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;
|
||||
Scene scene = targetPlayer.getScene();
|
||||
int weatherId = scene.getWeather();
|
||||
ClimateType climate = ClimateType.CLIMATE_NONE; // Sending ClimateType.CLIMATE_NONE to Scene.setWeather will use the default climate for that weather
|
||||
|
||||
if (args.isEmpty()) {
|
||||
climate = scene.getClimate();
|
||||
CommandHandler.sendTranslatedMessage(sender, "commands.weather.status", Integer.toString(weatherId), climate.getShortName());
|
||||
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.getScene().setClimate(climate);
|
||||
targetPlayer.getScene().broadcastPacket(new PacketSceneAreaWeatherNotify(targetPlayer));
|
||||
CommandHandler.sendMessage(sender, translate(sender, "commands.weather.success", Integer.toString(weatherId), Integer.toString(climateId)));
|
||||
scene.setWeather(weatherId, climate);
|
||||
climate = scene.getClimate(); // Might be different to what we set
|
||||
CommandHandler.sendTranslatedMessage(sender, "commands.weather.success", Integer.toString(weatherId), climate.getShortName());
|
||||
}
|
||||
}
|
||||
|
@ -94,6 +94,7 @@ public class GameData {
|
||||
private static final Int2ObjectMap<FurnitureMakeConfigData> furnitureMakeConfigDataMap = new Int2ObjectOpenHashMap<>();
|
||||
private static final Int2ObjectMap<InvestigationMonsterData> investigationMonsterDataMap = 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<BattlePassRewardExcelConfigData> battlePassRewardExcelConfigDataMap = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
@ -414,10 +415,15 @@ public class GameData {
|
||||
public static Int2ObjectMap<InvestigationMonsterData> getInvestigationMonsterDataMap() {
|
||||
return investigationMonsterDataMap;
|
||||
}
|
||||
|
||||
public static Int2ObjectMap<CityData> getCityDataMap() {
|
||||
return cityDataMap;
|
||||
}
|
||||
|
||||
public static Int2ObjectMap<WeatherData> getWeatherDataMap() {
|
||||
return weatherDataMap;
|
||||
}
|
||||
|
||||
public static Int2ObjectMap<BattlePassMissionExcelConfigData> getBattlePassMissionExcelConfigDataMap() {
|
||||
return battlePassMissionExcelConfigDataMap;
|
||||
}
|
||||
|
26
src/main/java/emu/grasscutter/data/excels/WeatherData.java
Normal file
26
src/main/java/emu/grasscutter/data/excels/WeatherData.java
Normal 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;
|
||||
}
|
||||
}
|
@ -32,7 +32,11 @@ public enum ClimateType {
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
return this.value;
|
||||
}
|
||||
|
||||
public String getShortName() {
|
||||
return this.name().substring(8).toLowerCase();
|
||||
}
|
||||
|
||||
public static ClimateType getTypeByValue(int value) {
|
||||
@ -42,4 +46,9 @@ public enum ClimateType {
|
||||
public static ClimateType getTypeByName(String name) {
|
||||
return stringMap.getOrDefault(name, CLIMATE_NONE);
|
||||
}
|
||||
|
||||
public static ClimateType getTypeByShortName(String shortName) {
|
||||
String name = "CLIMATE_" + shortName.toUpperCase();
|
||||
return stringMap.getOrDefault(name, CLIMATE_NONE);
|
||||
}
|
||||
}
|
||||
|
@ -138,12 +138,30 @@ public class Scene {
|
||||
return weather;
|
||||
}
|
||||
|
||||
public void setClimate(ClimateType climate) {
|
||||
synchronized public void setClimate(ClimateType climate) {
|
||||
this.climate = climate;
|
||||
for (Player player : this.players) {
|
||||
this.broadcastPacket(new PacketSceneAreaWeatherNotify(player));
|
||||
}
|
||||
}
|
||||
|
||||
public void setWeather(int weather) {
|
||||
synchronized public void setWeather(int weather) {
|
||||
this.setWeather(weather, ClimateType.CLIMATE_NONE);
|
||||
}
|
||||
|
||||
synchronized public void setWeather(int weather, ClimateType climate) {
|
||||
// Lookup default climate for this weather
|
||||
if (climate == ClimateType.CLIMATE_NONE) {
|
||||
WeatherData w = GameData.getWeatherDataMap().get(weather);
|
||||
if (w != null) {
|
||||
climate = w.getDefaultClimate();
|
||||
}
|
||||
}
|
||||
this.weather = weather;
|
||||
this.climate = climate;
|
||||
for (Player player : this.players) {
|
||||
this.broadcastPacket(new PacketSceneAreaWeatherNotify(player));
|
||||
}
|
||||
}
|
||||
|
||||
public int getPrevScene() {
|
||||
|
@ -76,7 +76,8 @@
|
||||
"itemLevel": "Invalid itemLevel.",
|
||||
"itemRefinement": "Invalid itemRefinement.",
|
||||
"playerId": "Invalid player ID.",
|
||||
"uid": "Invalid UID."
|
||||
"uid": "Invalid UID.",
|
||||
"id": "Invalid ID."
|
||||
}
|
||||
},
|
||||
"execution": {
|
||||
@ -387,10 +388,10 @@
|
||||
"description": "Unlock all levels of tower"
|
||||
},
|
||||
"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",
|
||||
"success": "Changed climate type to %s with weather type %s.",
|
||||
"invalid_id": "Invalid ID.",
|
||||
"description": "Changes the weather"
|
||||
"description": "Changes the weather. Climate types sunny, cloudy, rain, thunderstorm, snow, mist.",
|
||||
"usage": "Usage: weather [weatherId] [climateType]\nClimate types sunny, cloudy, rain, thunderstorm, snow, mist.",
|
||||
"success": "Set weather ID to %s with climate type %s.",
|
||||
"status": "Current weather ID is %s with climate type %s."
|
||||
},
|
||||
"ban": {
|
||||
"description": "Ban a player",
|
||||
|
@ -76,7 +76,8 @@
|
||||
"itemLevel": "Niveau de l'objet invalide.",
|
||||
"itemRefinement": "Raffinement de l'objet invalide.",
|
||||
"playerId": "ID du joueur invalide.",
|
||||
"uid": "UID invalide."
|
||||
"uid": "UID invalide.",
|
||||
"id": "ID invalide."
|
||||
}
|
||||
},
|
||||
"execution": {
|
||||
@ -387,10 +388,10 @@
|
||||
"description": "Débloque tous les couloirs de l'abysse"
|
||||
},
|
||||
"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",
|
||||
"success": "Le type de climat a été changé à %s avec le type de météo %s.",
|
||||
"invalid_id": "ID invalide.",
|
||||
"description": "Change la météo"
|
||||
"description": "Change la météo. Climate types sunny, cloudy, rain, thunderstorm, snow, mist.",
|
||||
"usage": "Utilisation: weather [weatherId] [climateType]\nClimate types sunny, cloudy, rain, thunderstorm, snow, mist.",
|
||||
"success": "Set weather ID to %s with climate type %s.",
|
||||
"status": "Current weather ID is %s with climate type %s."
|
||||
},
|
||||
"ban": {
|
||||
"description": "Bannis un joueur",
|
||||
|
@ -70,7 +70,8 @@
|
||||
"itemLevel": "Błędny poziom przedmiotu.",
|
||||
"itemRefinement": "Błędne ulepszenie.",
|
||||
"playerId": "Błędne playerId.",
|
||||
"uid": "Błędne UID."
|
||||
"uid": "Błędne UID.",
|
||||
"id": "Błędne ID."
|
||||
}
|
||||
},
|
||||
"execution": {
|
||||
@ -291,9 +292,10 @@
|
||||
"success": "Przeteleportowano %s do %s, %s, %s w scenie %s"
|
||||
},
|
||||
"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",
|
||||
"success": "Changed climate type to %s with weather type %s.",
|
||||
"invalid_id": "Błędne ID."
|
||||
"description": "Changes the weather. Climate types sunny, cloudy, rain, thunderstorm, snow, mist.",
|
||||
"usage": "Usage: weather [weatherId] [climateType]\nClimate types sunny, cloudy, rain, thunderstorm, snow, mist.",
|
||||
"success": "Set weather ID to %s with climate type %s.",
|
||||
"status": "Current weather ID is %s with climate type %s."
|
||||
},
|
||||
"drop": {
|
||||
"command_usage": "Użycie: drop <ID przedmiotu|nazwa przedmiotu> [ilość]",
|
||||
|
@ -76,7 +76,8 @@
|
||||
"itemLevel": "Некорректный уровень предмета (itemLevel).",
|
||||
"itemRefinement": "Некорректный уровень пробуждения предмета (itemRefinement).",
|
||||
"playerId": "Некорректный ID игрока.",
|
||||
"uid": "Некорректный UID."
|
||||
"uid": "Некорректный UID.",
|
||||
"id": "Некорректный ID."
|
||||
}
|
||||
},
|
||||
"execution": {
|
||||
@ -387,10 +388,10 @@
|
||||
"description": "Открывает все уровни башни"
|
||||
},
|
||||
"weather": {
|
||||
"usage": "Применение: weather <тип_климата(Id погоды)> <тип_погоды(Id климата)>\nТипы погоды 0: Отсутствует, 1: Солнечная, 2: Пасмурная, 3: Дождливая, 4: Грозовая, 5: Снежная, 6: Туманная",
|
||||
"success": "Тип климата был изменен на %s, тип погоды: %s.",
|
||||
"invalid_id": "Некорректный ID.",
|
||||
"description": "Изменяет погоду"
|
||||
"description": "Изменяет погоду. Climate types sunny, cloudy, rain, thunderstorm, snow, mist.",
|
||||
"usage": "Usage: weather [weatherId] [climateType]\nClimate types sunny, cloudy, rain, thunderstorm, snow, mist.",
|
||||
"success": "Set weather ID to %s with climate type %s.",
|
||||
"status": "Current weather ID is %s with climate type %s."
|
||||
},
|
||||
"ban": {
|
||||
"description": "Банит игрока",
|
||||
|
@ -76,7 +76,8 @@
|
||||
"itemLevel": "无效的物品等级。",
|
||||
"itemRefinement": "无效的物品精炼等级。",
|
||||
"playerId": "无效的玩家ID。",
|
||||
"uid": "无效的UID。"
|
||||
"uid": "无效的UID。",
|
||||
"id": "无效的ID。"
|
||||
}
|
||||
},
|
||||
"execution": {
|
||||
@ -387,10 +388,10 @@
|
||||
"description": "解锁深境螺旋"
|
||||
},
|
||||
"weather": {
|
||||
"usage": "用法:weather <气候类型(天气ID)> <天气类型(气候ID)>\n天气类型 0: 无, 1: 晴天, 2: 多云, 3: 雨, 4: 雷雨, 5: 雪, 6: 雾",
|
||||
"success": "已更改气候类型为 %s,天气类型为 %s。",
|
||||
"invalid_id": "无效的ID。",
|
||||
"description": "更改天气"
|
||||
"description": "更改天气. Climate types sunny, cloudy, rain, thunderstorm, snow, mist.",
|
||||
"usage": "用法:weather [weatherId] [climateType]\nClimate types sunny (晴天), cloudy (多云), rain (雨), thunderstorm (雷雨), snow (雪), mist (雾).",
|
||||
"success": "Set weather ID to %s with climate type %s.",
|
||||
"status": "Current weather ID is %s with climate type %s."
|
||||
},
|
||||
"ban": {
|
||||
"description": "封禁玩家",
|
||||
|
@ -75,7 +75,8 @@
|
||||
"itemLevel": "無效的物品等級。",
|
||||
"itemRefinement": "無效的物品精煉度。",
|
||||
"playerId": "無效的玩家ID。",
|
||||
"uid": "無效的UID。"
|
||||
"uid": "無效的UID。",
|
||||
"id": "無效的ID。"
|
||||
}
|
||||
},
|
||||
"execution": {
|
||||
@ -390,10 +391,10 @@
|
||||
"description": "解鎖所有級別的深境螺旋。"
|
||||
},
|
||||
"weather": {
|
||||
"usage": "用法:weather <氣候型別(weatherId)> <天氣型別(climateId)>\n天氣類型: '0:無、 1:晴天、 2:多雲、 3:雨、 4::雷雨、 5:雪、 6:霧'",
|
||||
"success": "已將當前氣候設定為 %s ,天氣則為 %s 。",
|
||||
"invalid_id": "無效的ID。",
|
||||
"description": "更改目前的天氣。"
|
||||
"description": "更改目前的天氣。. Climate types sunny, cloudy, rain, thunderstorm, snow, mist.",
|
||||
"usage": "用法:weather [weatherId] [climateType]\nClimate types sunny (晴天), cloudy (多雲), rain (雨), thunderstorm (雷雨), snow (雪), mist (霧).",
|
||||
"success": "Set weather ID to %s with climate type %s.",
|
||||
"status": "Current weather ID is %s with climate type %s."
|
||||
},
|
||||
"ban": {
|
||||
"description": "停權指定玩家。",
|
||||
|
Loading…
Reference in New Issue
Block a user