Source: Thing.UE/Environment/UWeather.js

const UE4 = require('../../Framework/Framework');
const blueprint = require('../BlueprintLoad');

/**
 * @description 天气系统 包含晴、雨、雪等
 * @class UWeather
 * @example
 * app.weather = new THING.UE.Weather();
 * // 切换至雨天
 * app.weather.toRain();
 */
class UWeather {

	#dtn = null;
	#onWeather = null;

	constructor() {

		this.#onWeather = null;
		this.#dtn = new UE4.DTNObject();
		this.#dtn.bindWeather((weatherType, progress) => {
			if (this.#onWeather) {
				this.#onWeather(weatherType, progress);
			}
		});
	}

	bind(callback) {
		this.#onWeather = callback;
	}

	unbind(callback) {
		this.#dtn.clearWeather();
	}

	dispoe() {
		if (this.#dtn && !this.#dtn.IsPendingKill()) {
			this.#dtn.ConditionalBeginDestroy();
		}
	}

	static getSky() {
		return blueprint.getByTag('SkyControl_BP');
	}

	static getState(state) {
		switch (state) {
			case 0:
				return 'sun';
			case '晴天':
				return 'sun';
			case 1:
				return 'rain';
			case '雨天':
				return 'rain';
			case 2:
				return 'largeRain';
			case '大雨天':
				return 'largeRain';
			case 3:
				return 'snow';
			case '雪天':
				return 'snow';
			case 4:
				return 'largeSnow';
			case '大雪天':
				return 'largeSnow';
		}
	}

	static getStateInt(state) {
		switch (state) {
			case 'sun':
				return 0;
			case 'rain':
				return 1;
			case 'largeRain':
				return 2;
			case 'snow':
				return 3;
			case 'largeSnow':
				return 4;
		}
	}

	static GetWeather() {
		var dtn = UWeather.getSky();
		if (dtn) {
			var state = dtn.GetInt('WeatherControl');
			return this.getState(state);
		}
	}

	static ChangeWeather(state) {
		var dtn = UWeather.getSky();
		if (dtn) {
			var newState = this.getState(state);
			dtn.SetInt('WeatherControl', this.getStateInt(newState));
			dtn.CallFunction('ThingJsWeather');
			return newState;
		}
	}

	static ChangeFog(enable) {
		let dtn = UWeather.getSky();
		if (dtn) {
			dtn.FogACloud(enable);
		}
	}

	static ChangeToSun() {
		return this.ChangeWeather(0);
	}

	static ChangeToRain() {
		return this.ChangeWeather(1);
	}

	static ChangeToLargeRain() {
		return this.ChangeWeather(2);
	}

	static ChangeToSnow() {
		return this.ChangeWeather(3);
	}

	static ChangeToLargeSnow() {
		return this.ChangeWeather(4);
	}

	static dispose() {
		this.ChangeWeather(0);
	}

	static getWeather() {
		return UWeather.GetWeather();
	}

	static setWeather(weather) {
		UWeather.ChangeWeather(weather);
	}

	/**
	 * 切换至晴天
	 */
	static toSun() {
		UWeather.ChangeToSun();
	}

	/**
	 * 切换至雨天
	 */
	static toRain() {
		UWeather.ChangeToRain();
	}

	/**
	 * 切换至大雨
	 */
	static toLargeRain() {
		UWeather.ChangeToLargeRain();
	}

	/**
	 * 切换至雪天
	 */
	static toSnow() {
		UWeather.ChangeToSnow();
	}

	/**
	 * 切换至大雪
	 */
	static toLargeSnow() {
		UWeather.ChangeToLargeSnow();
	}
};

module.exports = UWeather;