mirror of
				https://github.com/t-affeldt/climate_api.git
				synced 2025-11-04 09:55:35 +01:00 
			
		
		
		
	Compare commits
	
		
			8 Commits
		
	
	
		
			v1.0.2
			...
			a56116e8ab
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					a56116e8ab | ||
| 
						 | 
					cd98798880 | ||
| 
						 | 
					a3d4dd446d | ||
| 
						 | 
					80d661f33a | ||
| 
						 | 
					5fe30aa051 | ||
| 
						 | 
					db2c2ae001 | ||
| 
						 | 
					beb75254bf | ||
| 
						 | 
					dbce69be3b | 
							
								
								
									
										38
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
---
 | 
			
		||||
name: Bug report
 | 
			
		||||
about: Create a report to help us improve
 | 
			
		||||
title: ''
 | 
			
		||||
labels: ''
 | 
			
		||||
assignees: ''
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
**Describe the bug**
 | 
			
		||||
A clear and concise description of what the bug is.
 | 
			
		||||
 | 
			
		||||
**To Reproduce**
 | 
			
		||||
Steps to reproduce the behavior:
 | 
			
		||||
1. Go to '...'
 | 
			
		||||
2. Click on '....'
 | 
			
		||||
3. Scroll down to '....'
 | 
			
		||||
4. See error
 | 
			
		||||
 | 
			
		||||
**Expected behavior**
 | 
			
		||||
A clear and concise description of what you expected to happen.
 | 
			
		||||
 | 
			
		||||
**Screenshots**
 | 
			
		||||
If applicable, add screenshots to help explain your problem.
 | 
			
		||||
 | 
			
		||||
**Desktop (please complete the following information):**
 | 
			
		||||
 - OS: [e.g. iOS]
 | 
			
		||||
 - Browser [e.g. chrome, safari]
 | 
			
		||||
 - Version [e.g. 22]
 | 
			
		||||
 | 
			
		||||
**Smartphone (please complete the following information):**
 | 
			
		||||
 - Device: [e.g. iPhone6]
 | 
			
		||||
 - OS: [e.g. iOS8.1]
 | 
			
		||||
 - Browser [e.g. stock browser, safari]
 | 
			
		||||
 - Version [e.g. 22]
 | 
			
		||||
 | 
			
		||||
**Additional context**
 | 
			
		||||
Add any other context about the problem here.
 | 
			
		||||
							
								
								
									
										20
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
---
 | 
			
		||||
name: Feature request
 | 
			
		||||
about: Suggest an idea for this project
 | 
			
		||||
title: ''
 | 
			
		||||
labels: ''
 | 
			
		||||
assignees: ''
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
**Is your feature request related to a problem? Please describe.**
 | 
			
		||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
 | 
			
		||||
 | 
			
		||||
**Describe the solution you'd like**
 | 
			
		||||
A clear and concise description of what you want to happen.
 | 
			
		||||
 | 
			
		||||
**Describe alternatives you've considered**
 | 
			
		||||
A clear and concise description of any alternative solutions or features you've considered.
 | 
			
		||||
 | 
			
		||||
**Additional context**
 | 
			
		||||
Add any other context or screenshots about the feature request here.
 | 
			
		||||
							
								
								
									
										76
									
								
								CODE_OF_CONDUCT.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								CODE_OF_CONDUCT.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
			
		||||
# Contributor Covenant Code of Conduct
 | 
			
		||||
 | 
			
		||||
## Our Pledge
 | 
			
		||||
 | 
			
		||||
In the interest of fostering an open and welcoming environment, we as
 | 
			
		||||
contributors and maintainers pledge to making participation in our project and
 | 
			
		||||
our community a harassment-free experience for everyone, regardless of age, body
 | 
			
		||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
 | 
			
		||||
level of experience, education, socio-economic status, nationality, personal
 | 
			
		||||
appearance, race, religion, or sexual identity and orientation.
 | 
			
		||||
 | 
			
		||||
## Our Standards
 | 
			
		||||
 | 
			
		||||
Examples of behavior that contributes to creating a positive environment
 | 
			
		||||
include:
 | 
			
		||||
 | 
			
		||||
* Using welcoming and inclusive language
 | 
			
		||||
* Being respectful of differing viewpoints and experiences
 | 
			
		||||
* Gracefully accepting constructive criticism
 | 
			
		||||
* Focusing on what is best for the community
 | 
			
		||||
* Showing empathy towards other community members
 | 
			
		||||
 | 
			
		||||
Examples of unacceptable behavior by participants include:
 | 
			
		||||
 | 
			
		||||
* The use of sexualized language or imagery and unwelcome sexual attention or
 | 
			
		||||
 advances
 | 
			
		||||
* Trolling, insulting/derogatory comments, and personal or political attacks
 | 
			
		||||
* Public or private harassment
 | 
			
		||||
* Publishing others' private information, such as a physical or electronic
 | 
			
		||||
 address, without explicit permission
 | 
			
		||||
* Other conduct which could reasonably be considered inappropriate in a
 | 
			
		||||
 professional setting
 | 
			
		||||
 | 
			
		||||
## Our Responsibilities
 | 
			
		||||
 | 
			
		||||
Project maintainers are responsible for clarifying the standards of acceptable
 | 
			
		||||
behavior and are expected to take appropriate and fair corrective action in
 | 
			
		||||
response to any instances of unacceptable behavior.
 | 
			
		||||
 | 
			
		||||
Project maintainers have the right and responsibility to remove, edit, or
 | 
			
		||||
reject comments, commits, code, wiki edits, issues, and other contributions
 | 
			
		||||
that are not aligned to this Code of Conduct, or to ban temporarily or
 | 
			
		||||
permanently any contributor for other behaviors that they deem inappropriate,
 | 
			
		||||
threatening, offensive, or harmful.
 | 
			
		||||
 | 
			
		||||
## Scope
 | 
			
		||||
 | 
			
		||||
This Code of Conduct applies both within project spaces and in public spaces
 | 
			
		||||
when an individual is representing the project or its community. Examples of
 | 
			
		||||
representing a project or community include using an official project e-mail
 | 
			
		||||
address, posting via an official social media account, or acting as an appointed
 | 
			
		||||
representative at an online or offline event. Representation of a project may be
 | 
			
		||||
further defined and clarified by project maintainers.
 | 
			
		||||
 | 
			
		||||
## Enforcement
 | 
			
		||||
 | 
			
		||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
 | 
			
		||||
reported by contacting the project team at t.affeldt@tu-braunschweig.de. All
 | 
			
		||||
complaints will be reviewed and investigated and will result in a response that
 | 
			
		||||
is deemed necessary and appropriate to the circumstances. The project team is
 | 
			
		||||
obligated to maintain confidentiality with regard to the reporter of an incident.
 | 
			
		||||
Further details of specific enforcement policies may be posted separately.
 | 
			
		||||
 | 
			
		||||
Project maintainers who do not follow or enforce the Code of Conduct in good
 | 
			
		||||
faith may face temporary or permanent repercussions as determined by other
 | 
			
		||||
members of the project's leadership.
 | 
			
		||||
 | 
			
		||||
## Attribution
 | 
			
		||||
 | 
			
		||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
 | 
			
		||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
 | 
			
		||||
 | 
			
		||||
[homepage]: https://www.contributor-covenant.org
 | 
			
		||||
 | 
			
		||||
For answers to common questions about this code of conduct, see
 | 
			
		||||
https://www.contributor-covenant.org/faq
 | 
			
		||||
@@ -40,4 +40,5 @@ local function remove_effect(player_data)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
climate_api.register_effect(EFFECT_NAME, handle_effect, "tick")
 | 
			
		||||
climate_api.register_effect(EFFECT_NAME, remove_effect, "stop")
 | 
			
		||||
climate_api.register_effect(EFFECT_NAME, remove_effect, "stop")
 | 
			
		||||
climate_api.set_effect_cycle(EFFECT_NAME, climate_api.LONG_CYCLE)
 | 
			
		||||
							
								
								
									
										5
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								init.lua
									
									
									
									
									
								
							@@ -40,9 +40,12 @@ climate_mod.settings = {
 | 
			
		||||
	time_spread			= get_setting_number("time_spread", 1),
 | 
			
		||||
	particle_count	= get_setting_number("particle_count", 1),
 | 
			
		||||
	tick_speed			= get_setting_number("tick_speed", 1),
 | 
			
		||||
	volume					= get_setting_number("volume", 1)
 | 
			
		||||
	volume					= get_setting_number("volume", 1),
 | 
			
		||||
	ceiling_checks	= get_setting_number("ceiling_checks", 10),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
climate_mod.i18n = minetest.get_translator("climate_api")
 | 
			
		||||
 | 
			
		||||
-- initialize empty registers
 | 
			
		||||
climate_mod.weathers = {}
 | 
			
		||||
climate_mod.effects = {}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
local S = climate_mod.i18n
 | 
			
		||||
 | 
			
		||||
-- parse heat values into readable format
 | 
			
		||||
-- also convert to Celsius if configured
 | 
			
		||||
local function parse_heat(heat)
 | 
			
		||||
@@ -13,13 +15,13 @@ end
 | 
			
		||||
 | 
			
		||||
-- register weather privilege in order to modify the weather status
 | 
			
		||||
minetest.register_privilege("weather", {
 | 
			
		||||
	description = "Make changes to the current weather",
 | 
			
		||||
	description = S("Make changes to the current weather"),
 | 
			
		||||
	give_to_singleplayer = false
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- display general information on current weather
 | 
			
		||||
minetest.register_chatcommand("weather", {
 | 
			
		||||
	description ="Display weather information",
 | 
			
		||||
	description = S("Display weather information"),
 | 
			
		||||
	func = function(playername)
 | 
			
		||||
		local player = minetest.get_player_by_name(playername)
 | 
			
		||||
		local ppos = player:get_pos()
 | 
			
		||||
@@ -29,27 +31,26 @@ minetest.register_chatcommand("weather", {
 | 
			
		||||
		local humidity = math.floor(climate_api.environment.get_humidity(ppos) * 100) / 100
 | 
			
		||||
		local msg = ""
 | 
			
		||||
		if #weathers > 0 then
 | 
			
		||||
			msg = msg .. "The following weather presets are active for you: "
 | 
			
		||||
			msg = msg .. S("The following weather presets are active for you:") .. " "
 | 
			
		||||
			for _, weather in ipairs(weathers) do
 | 
			
		||||
				msg = msg .. weather .. ", "
 | 
			
		||||
			end
 | 
			
		||||
			msg = msg:sub(1, #msg-2) .. "\n"
 | 
			
		||||
		else
 | 
			
		||||
			msg = msg .. "Your sky is clear. No weather presets are currently active.\n"
 | 
			
		||||
			msg = msg .. S("Your sky is clear. No weather presets are currently active.") .. "\n"
 | 
			
		||||
		end
 | 
			
		||||
		if #effects > 0 then
 | 
			
		||||
			msg = msg .. "As a result, the following environment effects are applied: "
 | 
			
		||||
			msg = msg .. S("As a result, the following environment effects are applied:") .. " "
 | 
			
		||||
			for _, effect in ipairs(effects) do
 | 
			
		||||
				msg = msg .. effect .. ", "
 | 
			
		||||
			end
 | 
			
		||||
			msg = msg:sub(1, #msg-2) .. "\n"
 | 
			
		||||
		end
 | 
			
		||||
		local heat_desc
 | 
			
		||||
		if heat > 80 then heat_desc = "scorching"
 | 
			
		||||
		elseif heat > 50 then heat_desc = "pleasant"
 | 
			
		||||
		else heat_desc = "chilly" end
 | 
			
		||||
		msg = msg .. "It is a " .. heat_desc .. " " .. parse_heat(heat) .. " right now and "
 | 
			
		||||
		msg = msg .. "humidity is at " .. humidity .. "%.\n"
 | 
			
		||||
		if heat > 80 then heat_desc = S("scorching")
 | 
			
		||||
		elseif heat > 50 then heat_desc = S("pleasant")
 | 
			
		||||
		else heat_desc = S("chilly") end
 | 
			
		||||
		msg = msg .. S("It is a @1 @2 right now and humidity is at @3%.", heat_desc, parse_heat(heat), humidity) .. "\n"
 | 
			
		||||
		minetest.chat_send_player(playername, msg)
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
@@ -57,35 +58,35 @@ minetest.register_chatcommand("weather", {
 | 
			
		||||
-- set base heat to increase or decrease global climate temperatures
 | 
			
		||||
minetest.register_chatcommand("set_base_heat", {
 | 
			
		||||
	params = "<heat>",
 | 
			
		||||
	description = "Override the weather algorithm's base heat",
 | 
			
		||||
	description = S("Override the weather algorithm's base heat"),
 | 
			
		||||
	privs = { weather = true },
 | 
			
		||||
	func = function(playername, param)
 | 
			
		||||
		if param == nil or param == "" then
 | 
			
		||||
			minetest.chat_send_player(playername, "Provide a number to modify the base heat")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Provide a number to modify the base heat"))
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		if param == "auto" then param = 0 end
 | 
			
		||||
		climate_mod.settings.heat = tonumber(param) or 0
 | 
			
		||||
		minetest.chat_send_player(playername, "Base heat changed")
 | 
			
		||||
		minetest.chat_send_player(playername, S("Base heat changed"))
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- override global heat levels with given value
 | 
			
		||||
minetest.register_chatcommand("set_heat", {
 | 
			
		||||
	params = "<heat>",
 | 
			
		||||
	description = "Override the weather algorithm's base heat",
 | 
			
		||||
	description = S("Override the weather algorithm's heat"),
 | 
			
		||||
	privs = { weather = true },
 | 
			
		||||
	func = function(playername, param)
 | 
			
		||||
		if param == nil or param == "" then
 | 
			
		||||
			minetest.chat_send_player(playername, "Provide a number to modify the base heat")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Provide a number to modify the heat"))
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		if param == "auto" then
 | 
			
		||||
			climate_mod.forced_enviroment.heat = nil
 | 
			
		||||
			minetest.chat_send_player(playername, "Heat value reset")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Heat value reset"))
 | 
			
		||||
		else
 | 
			
		||||
			climate_mod.forced_enviroment.heat = tonumber(param) or 0
 | 
			
		||||
			minetest.chat_send_player(playername, "Heat value changed")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Heat value changed"))
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
@@ -93,35 +94,35 @@ minetest.register_chatcommand("set_heat", {
 | 
			
		||||
-- set base heat to increase or decrease global climate humidity
 | 
			
		||||
minetest.register_chatcommand("set_base_humidity", {
 | 
			
		||||
	params = "<humidity>",
 | 
			
		||||
	description = "Override the weather algorithm's base humidity",
 | 
			
		||||
	description = S("Override the weather algorithm's base humidity"),
 | 
			
		||||
	privs = { weather = true },
 | 
			
		||||
	func = function(playername, param)
 | 
			
		||||
		if param == "auto" then param = 0 end
 | 
			
		||||
		if param == nil or param == "" then
 | 
			
		||||
			minetest.chat_send_player(playername, "Provide a number to modify the base humidity")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Provide a number to modify the base humidity"))
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		climate_mod.settings.humidity = tonumber(param) or 0
 | 
			
		||||
		minetest.chat_send_player(playername, "Base humidity changed")
 | 
			
		||||
		minetest.chat_send_player(playername, S("Base humidity changed"))
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- override global humidity with given value
 | 
			
		||||
minetest.register_chatcommand("set_humidity", {
 | 
			
		||||
	params = "<humidity>",
 | 
			
		||||
	description = "Override the weather algorithm's base humidity",
 | 
			
		||||
	description = S("Override the weather algorithm's humidity"),
 | 
			
		||||
	privs = { weather = true },
 | 
			
		||||
	func = function(playername, param)
 | 
			
		||||
		if param == nil or param == "" then
 | 
			
		||||
			minetest.chat_send_player(playername, "Provide a number to modify the base humidity")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Provide a number to modify the humidity"))
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		if param == "auto" then
 | 
			
		||||
			climate_mod.forced_enviroment.humidity = nil
 | 
			
		||||
			minetest.chat_send_player(playername, "Humidity value reset")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Humidity value reset"))
 | 
			
		||||
		else
 | 
			
		||||
			climate_mod.forced_enviroment.humidity = tonumber(param) or 0
 | 
			
		||||
			minetest.chat_send_player(playername, "Humidity value changed")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Humidity value changed"))
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
@@ -129,11 +130,11 @@ minetest.register_chatcommand("set_humidity", {
 | 
			
		||||
-- override wind direction and speed with given values
 | 
			
		||||
minetest.register_chatcommand("set_wind", {
 | 
			
		||||
	params = "<wind>",
 | 
			
		||||
	description = "Override the weather algorithm's windspeed",
 | 
			
		||||
	description = S("Override the weather algorithm's windspeed"),
 | 
			
		||||
	privs = { weather = true },
 | 
			
		||||
	func = function(playername, param)
 | 
			
		||||
		if param == nil or param == "" then
 | 
			
		||||
			minetest.chat_send_player(playername, "Provide a number to modify the base humidity")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Provide a vector of two numbers to modify the wind"))
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		local arguments = {}
 | 
			
		||||
@@ -143,25 +144,25 @@ minetest.register_chatcommand("set_wind", {
 | 
			
		||||
		local wind_z = tonumber(arguments[2])
 | 
			
		||||
		if arg1 == "auto" then
 | 
			
		||||
			climate_mod.forced_enviroment.wind = nil
 | 
			
		||||
			minetest.chat_send_player(playername, "Wind reset")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Wind reset"))
 | 
			
		||||
		elseif wind_x == nil or wind_z == nil then
 | 
			
		||||
			minetest.chat_send_player(playername, "Invalid wind configuration")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Invalid wind configuration"))
 | 
			
		||||
		else
 | 
			
		||||
			climate_mod.forced_enviroment.wind = vector.new({
 | 
			
		||||
				x = wind_x,
 | 
			
		||||
				y = 0,
 | 
			
		||||
				z = wind_z
 | 
			
		||||
			})
 | 
			
		||||
			minetest.chat_send_player(playername, "Wind changed")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Wind changed"))
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- display current mod config
 | 
			
		||||
minetest.register_chatcommand("weather_settings", {
 | 
			
		||||
	description = "Print the active Climate API configuration",
 | 
			
		||||
	description = S("Print the active Climate API configuration"),
 | 
			
		||||
	func = function(playername)
 | 
			
		||||
		minetest.chat_send_player(playername, "Current Settings\n================")
 | 
			
		||||
		minetest.chat_send_player(playername, S("Current Settings") .. "\n================")
 | 
			
		||||
		for setting, value in pairs(climate_mod.settings) do
 | 
			
		||||
			minetest.chat_send_player(playername, dump2(value, setting))
 | 
			
		||||
		end
 | 
			
		||||
@@ -171,14 +172,14 @@ minetest.register_chatcommand("weather_settings", {
 | 
			
		||||
-- force a weather preset or disable it
 | 
			
		||||
minetest.register_chatcommand("set_weather", {
 | 
			
		||||
	params ="<weather> <status>",
 | 
			
		||||
	description ="Turn the specified weather preset on or off for all players or reset it to automatic",
 | 
			
		||||
	description = S("Turn the specified weather preset on or off for all players or reset it to automatic"),
 | 
			
		||||
	privs = { weather = true },
 | 
			
		||||
	func = function(playername, param)
 | 
			
		||||
		local arguments = {}
 | 
			
		||||
		for w in param:gmatch("%S+") do table.insert(arguments, w) end
 | 
			
		||||
		local weather = arguments[1]
 | 
			
		||||
		if weather == nil or climate_mod.weathers[weather] == nil then
 | 
			
		||||
			minetest.chat_send_player(playername, "Unknown weather preset")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Unknown weather preset"))
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		local status
 | 
			
		||||
@@ -192,19 +193,19 @@ minetest.register_chatcommand("set_weather", {
 | 
			
		||||
		elseif arguments[2] == "auto" then
 | 
			
		||||
			status = nil
 | 
			
		||||
		else
 | 
			
		||||
			minetest.chat_send_player(playername, "Invalid weather status. Set the preset to either on, off or auto.")
 | 
			
		||||
			minetest.chat_send_player(playername, S("Invalid weather status. Set the preset to either on, off or auto."))
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		climate_mod.forced_weather[weather] = status
 | 
			
		||||
		minetest.chat_send_player(playername, "Weather " .. weather .. " successfully set to " .. arguments[2])
 | 
			
		||||
		minetest.chat_send_player(playername, S("Weather @1 successfully set to @2", weather, arguments[2]))
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
-- list all weather presets and whether they have been forced or disabled
 | 
			
		||||
minetest.register_chatcommand("weather_status", {
 | 
			
		||||
	description = "Prints which weather presets are enforced or disabled",
 | 
			
		||||
	description = S("Prints which weather presets are enforced or disabled"),
 | 
			
		||||
	func = function(playername)
 | 
			
		||||
		minetest.chat_send_player(playername, "Current activation rules:\n================")
 | 
			
		||||
		minetest.chat_send_player(playername, S("Current activation rules:") .. "\n================")
 | 
			
		||||
		for weather, _ in pairs(climate_mod.weathers) do
 | 
			
		||||
			local status = "auto"
 | 
			
		||||
			if climate_mod.forced_weather[weather] == true then
 | 
			
		||||
@@ -219,9 +220,9 @@ minetest.register_chatcommand("weather_status", {
 | 
			
		||||
 | 
			
		||||
-- show all environment influences and their values for the executing player
 | 
			
		||||
minetest.register_chatcommand("weather_influences", {
 | 
			
		||||
	description = "Prints which weather influences cause your current weather",
 | 
			
		||||
	description = S("Prints which weather influences cause your current weather"),
 | 
			
		||||
	func = function(playername)
 | 
			
		||||
		minetest.chat_send_player(playername, "Current influences rules:\n================")
 | 
			
		||||
		minetest.chat_send_player(playername, S("Current influences rules:") .. "\n================")
 | 
			
		||||
		local player = minetest.get_player_by_name(playername)
 | 
			
		||||
		local influences = climate_mod.trigger.get_player_environment(player)
 | 
			
		||||
		for influence, value in pairs(influences) do
 | 
			
		||||
 
 | 
			
		||||
@@ -50,12 +50,27 @@ end)
 | 
			
		||||
 | 
			
		||||
climate_api.register_influence("light", function(pos)
 | 
			
		||||
	pos = vector.add(pos, {x = 0, y = 1, z = 0})
 | 
			
		||||
	return minetest.env:get_node_light(pos) or 0
 | 
			
		||||
	return minetest.get_node_light(pos) or 0
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
climate_api.register_influence("daylight", function(pos)
 | 
			
		||||
	pos = vector.add(pos, {x = 0, y = 1, z = 0})
 | 
			
		||||
	return minetest.env:get_node_light(pos, 0.5) or 0
 | 
			
		||||
	return minetest.get_node_light(pos, 0.5) or 0
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
climate_api.register_influence("indoors", function(pos)
 | 
			
		||||
	pos = vector.add(pos, {x = 0, y = 1, z = 0})
 | 
			
		||||
	local daylight = minetest.get_node_light(pos, 0.5) or 0
 | 
			
		||||
	if daylight < 15 then return true end
 | 
			
		||||
 | 
			
		||||
	for i = 1, climate_mod.settings.ceiling_checks do
 | 
			
		||||
		local lpos = vector.add(pos, {x = 0, y = i, z = 0})
 | 
			
		||||
		local node = minetest.get_node_or_nil(lpos)
 | 
			
		||||
		if node ~= nil and node.name ~= "air" and node.name ~= "ignore" then
 | 
			
		||||
			return true
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	return false
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
climate_api.register_global_influence("time",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
local GSCYCLE			=  0.03	* climate_mod.settings.tick_speed	-- only process event loop after this amount of time
 | 
			
		||||
local WORLD_CYCLE = 15.00	* climate_mod.settings.tick_speed	-- only update global environment influences after this amount of time
 | 
			
		||||
local WORLD_CYCLE = 30.00	* climate_mod.settings.tick_speed	-- only update global environment influences after this amount of time
 | 
			
		||||
 | 
			
		||||
local function is_connected(playername)
 | 
			
		||||
	local connected = minetest.get_connected_players()
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ end
 | 
			
		||||
 | 
			
		||||
function trigger.get_player_environment(player)
 | 
			
		||||
	local ppos = player:get_pos()
 | 
			
		||||
	if ppos == nil then return end
 | 
			
		||||
	local env = trigger.get_position_environment(ppos)
 | 
			
		||||
	env.player = player
 | 
			
		||||
	return env
 | 
			
		||||
@@ -26,15 +27,24 @@ end
 | 
			
		||||
function trigger.test_condition(condition, env, goal)
 | 
			
		||||
	local value = env[condition:sub(5)]
 | 
			
		||||
	if condition:sub(1, 4) == "min_" then
 | 
			
		||||
		return type(value) ~= "nil" and goal <= value
 | 
			
		||||
		return value ~= nil and goal <= value
 | 
			
		||||
	elseif condition:sub(1, 4) == "max_" then
 | 
			
		||||
		return type(value) ~= "nil" and goal > value
 | 
			
		||||
		return value ~= nil and goal > value
 | 
			
		||||
	elseif condition:sub(1, 4) == "has_" then
 | 
			
		||||
		if type(value) == "nil" then return false end
 | 
			
		||||
		if value == nil then return false end
 | 
			
		||||
		for _, g in ipairs(goal) do
 | 
			
		||||
			if value == g then return true end
 | 
			
		||||
		end
 | 
			
		||||
		return false
 | 
			
		||||
	elseif condition:sub(1, 4) == "not_" then
 | 
			
		||||
		if value == nil then return true end
 | 
			
		||||
		if type(goal) ~= "table" then
 | 
			
		||||
			return value ~= goal
 | 
			
		||||
		end
 | 
			
		||||
		for _, g in ipairs(goal) do
 | 
			
		||||
			if value == g then return false end
 | 
			
		||||
		end
 | 
			
		||||
		return true
 | 
			
		||||
	else
 | 
			
		||||
		value = env[condition]
 | 
			
		||||
		return type(value) == "nil" or goal == value
 | 
			
		||||
@@ -66,7 +76,7 @@ local function get_weather_effects(player, weather_config, env)
 | 
			
		||||
		config = weather_config.effects
 | 
			
		||||
	end
 | 
			
		||||
	for effect, value in pairs(config) do
 | 
			
		||||
		if type(climate_mod.effects[effect]) ~= "nil" then
 | 
			
		||||
		if climate_mod.effects[effect] ~= nil then
 | 
			
		||||
			effects[effect] = value
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
@@ -92,7 +102,7 @@ function trigger.get_active_effects()
 | 
			
		||||
			local env = environments[pname]
 | 
			
		||||
			if env ~= nil then
 | 
			
		||||
				if is_weather_active(player, wname, env) then
 | 
			
		||||
					if type(climate_mod.current_weather[pname]) == "nil" then
 | 
			
		||||
					if climate_mod.current_weather[pname] == nil then
 | 
			
		||||
						climate_mod.current_weather[pname] = {}
 | 
			
		||||
					end
 | 
			
		||||
					table.insert(climate_mod.current_weather[pname], wname)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,5 @@
 | 
			
		||||
local world = {}
 | 
			
		||||
local BASE_TIME = 0.2 * climate_mod.settings.time_spread
 | 
			
		||||
 | 
			
		||||
local WIND_SPREAD = 600
 | 
			
		||||
local WIND_SCALE = 2
 | 
			
		||||
@@ -17,7 +18,7 @@ local nobj_humidity_base
 | 
			
		||||
 | 
			
		||||
local pn_wind_speed_x = {
 | 
			
		||||
	offset = 0,
 | 
			
		||||
	scale = WIND_SCALE * climate_mod.settings.time_spread,
 | 
			
		||||
	scale = WIND_SCALE,
 | 
			
		||||
	spread = {x = WIND_SPREAD, y = WIND_SPREAD, z = WIND_SPREAD},
 | 
			
		||||
	seed = 31441,
 | 
			
		||||
	octaves = 2,
 | 
			
		||||
@@ -27,7 +28,7 @@ local pn_wind_speed_x = {
 | 
			
		||||
 | 
			
		||||
local pn_wind_speed_z = {
 | 
			
		||||
	offset = 0,
 | 
			
		||||
	scale = WIND_SCALE * climate_mod.settings.time_spread,
 | 
			
		||||
	scale = WIND_SCALE,
 | 
			
		||||
	spread = {x = WIND_SPREAD, y = WIND_SPREAD, z = WIND_SPREAD},
 | 
			
		||||
	seed = 938402,
 | 
			
		||||
	octaves = 2,
 | 
			
		||||
@@ -37,27 +38,27 @@ local pn_wind_speed_z = {
 | 
			
		||||
 | 
			
		||||
local pn_heat = {
 | 
			
		||||
	offset = 1,
 | 
			
		||||
	scale = HEAT_SCALE * climate_mod.settings.time_spread,
 | 
			
		||||
	scale = HEAT_SCALE,
 | 
			
		||||
	spread = {x = HEAT_SPREAD, y = HEAT_SPREAD, z = HEAT_SPREAD},
 | 
			
		||||
	seed = 24,
 | 
			
		||||
	seed = 235896,
 | 
			
		||||
	octaves = 2,
 | 
			
		||||
	persist = 0.5,
 | 
			
		||||
	lacunarity = 2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local pn_humidity = {
 | 
			
		||||
	offset = 1,
 | 
			
		||||
	scale = HUMIDITY_SCALE * climate_mod.settings.time_spread,
 | 
			
		||||
	offset = 0,
 | 
			
		||||
	scale = HUMIDITY_SCALE,
 | 
			
		||||
	spread = {x = HUMIDITY_SPREAD, y = HUMIDITY_SPREAD, z = HUMIDITY_SPREAD},
 | 
			
		||||
	seed = 8374061,
 | 
			
		||||
	octaves = 3,
 | 
			
		||||
	octaves = 2,
 | 
			
		||||
	persist = 0.5,
 | 
			
		||||
	lacunarity = 2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local pn_humidity_base = {
 | 
			
		||||
	offset = 50,
 | 
			
		||||
	scale = HUMIDITY_BASE_SCALE * climate_mod.settings.time_spread,
 | 
			
		||||
	scale = HUMIDITY_BASE_SCALE,
 | 
			
		||||
	spread = {x = HUMIDITY_BASE_SPREAD, y = HUMIDITY_BASE_SPREAD, z = HUMIDITY_BASE_SPREAD},
 | 
			
		||||
	seed = 3803465,
 | 
			
		||||
	octaves = 2,
 | 
			
		||||
@@ -90,6 +91,7 @@ local function update_humidity(timer)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function world.update_status(timer)
 | 
			
		||||
	timer = math.floor(timer * BASE_TIME)
 | 
			
		||||
	update_wind(timer)
 | 
			
		||||
	update_heat(timer)
 | 
			
		||||
	update_humidity(timer)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								locale/climate_api.de.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								locale/climate_api.de.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
# textdomain:climate_api
 | 
			
		||||
Make changes to the current weather=Ändere das aktuelle Wetter
 | 
			
		||||
Display weather information=Betrachte Informationen zum Wetter
 | 
			
		||||
The following weather presets are active for you:=Die folgenden Wetterklassen sind gerade aktiv
 | 
			
		||||
Your sky is clear. No weather presets are currently active.=Der Himmel ist klar. Es sind keine Wetterklassen aktiv.
 | 
			
		||||
As a result, the following environment effects are applied:=Deshalb werden die folgenden Umwelt-Effekte dargestellt:
 | 
			
		||||
scorching=stechend heiße
 | 
			
		||||
pleasant=angenehme
 | 
			
		||||
chilly=kühle
 | 
			
		||||
It is a @1 @2 right now and humidity is at @3%.=Es sind gerade @1 @2 und die Luftfeuchtigkeit liegt bei @3%.
 | 
			
		||||
Override the weather algorithm's base heat=Überschreibe die Standard-Temperatur
 | 
			
		||||
Provide a number to modify the base heat=Gebe eine Zahl an, um die Standard-Temperatur anzupassen
 | 
			
		||||
Base heat changed=Die Standard-Temperatur wurde geändert
 | 
			
		||||
Override the weather algorithm's heat=Überschreibe die tatsächliche Temperatur
 | 
			
		||||
Provide a number to modify the heat=Gebe eine Zahl an, um die Temperatur anzupassen
 | 
			
		||||
Heat value reset=Die Temperatur wurde zurückgesetzt
 | 
			
		||||
Heat value changed=Die Temperatur wurde geändert
 | 
			
		||||
Override the weather algorithm's base humidity=Überschreibe die Standard-Luftfeuchtigkeit
 | 
			
		||||
Provide a number to modify the base humidity=Gebe eine Zahl an, um die Standard-Temperatur anzupassen
 | 
			
		||||
Base humidity changed=Die Standard-Luftfeuchtigkeit wurde geändert
 | 
			
		||||
Override the weather algorithm's humidity=Überschreibe die tatsächliche Luftfeuchtigkeit
 | 
			
		||||
Provide a number to modify the humidity=Gebe eine Zahl an, um die Luftfeuchtigkeit anzupassen
 | 
			
		||||
Humidity value reset=Die Luftfeuchtigkeit wurde zurückgesetzt
 | 
			
		||||
Humidity value changed=Die Luftfeuchtigkeit wurde geändert
 | 
			
		||||
Override the weather algorithm's windspeed=Überschreibe die Windgeschwindigkeit
 | 
			
		||||
Provide a vector of two numbers to modify the wind=Gebe einen Vektor aus zwei Zahlen an, um die Windgeschwindigkeit anzupassen
 | 
			
		||||
Wind reset=Der Wind wurde zurückgesetzt
 | 
			
		||||
Invalid wind configuration=Fehlerhafte Windkonfiguration
 | 
			
		||||
Wind changed=Der Wind wurde geändert
 | 
			
		||||
Print the active Climate API configuration=Betrachte die Einstellungen für Climate API
 | 
			
		||||
Current Settings=Aktuelle Einstellungen
 | 
			
		||||
Turn the specified weather preset on or off for all players or reset it to automatic=Schalte für alle Spieler die angegebene Wetterklasse an, aus oder schalte sie auf automatisch
 | 
			
		||||
Unknown weather preset=Unbekannte Wetterklasse
 | 
			
		||||
Invalid weather status. Set the preset to either on, off or auto.=Unbekannter Status. Setze die Wetterklasse entweder auf on, off oder auto
 | 
			
		||||
Weather @1 successfully set to @2=Wetter @1 wurde erfolgreich auf @2 gesetzt
 | 
			
		||||
Prints which weather presets are enforced or disabled=Betrachte, welche Wetterklassen erzwungen oder deaktiviert sind
 | 
			
		||||
Current activation rules:=Aktuelle Aktivierungsregeln
 | 
			
		||||
Prints which weather influences cause your current weather=Betrachte, welche Umwelteinflüsse das aktuelle Wetter hervorrufen
 | 
			
		||||
Current influences rules:=Aktuelle Einflussfaktoren
 | 
			
		||||
							
								
								
									
										39
									
								
								locale/template.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								locale/template.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
# textdomain:climate_api
 | 
			
		||||
Make changes to the current weather=
 | 
			
		||||
Display weather information=
 | 
			
		||||
The following weather presets are active for you:=
 | 
			
		||||
Your sky is clear. No weather presets are currently active.=
 | 
			
		||||
As a result, the following environment effects are applied:=
 | 
			
		||||
scorching=
 | 
			
		||||
pleasant=
 | 
			
		||||
chilly=
 | 
			
		||||
It is a @1 @2 right now and humidity is at @3%.=
 | 
			
		||||
Override the weather algorithm's base heat=
 | 
			
		||||
Provide a number to modify the base heat=
 | 
			
		||||
Base heat changed=
 | 
			
		||||
Override the weather algorithm's heat=
 | 
			
		||||
Provide a number to modify the heat=
 | 
			
		||||
Heat value reset=
 | 
			
		||||
Heat value changed=
 | 
			
		||||
Override the weather algorithm's base humidity=
 | 
			
		||||
Provide a number to modify the base humidity=
 | 
			
		||||
Base humidity changed=
 | 
			
		||||
Override the weather algorithm's humidity=
 | 
			
		||||
Provide a number to modify the humidity=
 | 
			
		||||
Humidity value reset=
 | 
			
		||||
Humidity value changed=
 | 
			
		||||
Override the weather algorithm's windspeed=
 | 
			
		||||
Provide a vector of two numbers to modify the wind=
 | 
			
		||||
Wind reset=
 | 
			
		||||
Invalid wind configuration=
 | 
			
		||||
Wind changed=
 | 
			
		||||
Print the active Climate API configuration=
 | 
			
		||||
Current Settings=
 | 
			
		||||
Turn the specified weather preset on or off for all players or reset it to automatic=
 | 
			
		||||
Unknown weather preset=
 | 
			
		||||
Invalid weather status. Set the preset to either on, off or auto.=
 | 
			
		||||
Weather @1 successfully set to @2=
 | 
			
		||||
Prints which weather presets are enforced or disabled=
 | 
			
		||||
Current activation rules:=
 | 
			
		||||
Prints which weather influences cause your current weather=
 | 
			
		||||
Current influences rules:=
 | 
			
		||||
							
								
								
									
										2
									
								
								mod.conf
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mod.conf
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
name = climate_api
 | 
			
		||||
title = Climate API
 | 
			
		||||
author = TestificateMods
 | 
			
		||||
release = 10000
 | 
			
		||||
release = 10001
 | 
			
		||||
optional_depends = player_monoids, playerphysics, pova
 | 
			
		||||
description = """
 | 
			
		||||
A powerful engine for weather presets and visual effects.
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,10 @@ climate_api_block_updates (Dynamically modify nodes) bool true
 | 
			
		||||
# Only applied if climate_api_damage is also set to true.
 | 
			
		||||
climate_api_raycast (Include wind speed in damage checks) bool true
 | 
			
		||||
 | 
			
		||||
# Increase this number if you notice snow or rain inside large glass domes.
 | 
			
		||||
# Decrease this number if you notice lag spikes or overall reduced game performance.
 | 
			
		||||
ceiling_checks (Check x nodes on outdoor test) int 10 0 50
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[Weather Effects]
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user