1

I am working on a datapack and I want to check if the weather is rain, thunder , or clear. Is it possible to check the weather using only commands?

4
  • 1
    Apparently there's a weather query command in Bedrock Edition, but the same doesn't seem to be true for Java Edition.
    – MBraedley
    Commented Nov 8, 2019 at 2:00
  • Correct. And the return value is the time that is used for the weather you set. But there are workarounds, for example detecting if fire gets extinguished or cauldrons fill (for rain). Thunder is more difficult. Commented Nov 8, 2019 at 7:42
  • But for these workarounds, how can I make them inaccessible from players and mobs?
    – Robomike
    Commented Nov 8, 2019 at 11:36
  • What do you mean with that? Players can run commands, mobs of course can't. Commented Nov 8, 2019 at 19:43

2 Answers 2

3

You can detect if it's raining or clear by using armorstands. However, there is no way to precisly check if a storm is happening. The closest i've seen is using redstone in which it won't detect in a certain time of the day.

Either way, the way you want to detect it is to ,firstly, create a scoreboard, in this case, called rain:

/scoreboard objectives add rain dummy

and then summon an armorstand, in this case, called rain with his fire nbt tag set to the max and invisible and with "NoGravity" set to true:

/summon minecraft:armor_stand ~ ~1 ~ {Invisible:1b,CustomName:"\"rain\"",Marker:0b,Fire:32766s,NoGravity:1v}

Here is the whole chain in action:

/execute as @e[limit=1,name=rain,nbt={Fire:-1s}] at @s run scoreboard players set @s rain 3
/execute as @e[limit=1,name=rain,nbt={Fire:-1s}] at @s run data modify entity @s Fire set value 30000
/execute as @e[name=rain,scores={rain=1..}] run scoreboard players remove @s rain 1

Basically, whenever it is raning, the armorstand's Fire: nbt tag will be set to -1, and so we will set his score to 3 if he matches the specification and we have a command block removing 1 from his scoreboard at all times. The reason I used score instead of tags were because I needed to have an constant output.

To use the raining output, simply refer to the entity as @e[name=rain,scores={rain=1..}].Also, a 0 output will be refered as clear. I will explain further if you need, but it seems you know enough.

2

I have found a way to detect thunderstorms. But it has to depend on a block, the daylight detector, and it only works if the power level of the daylight detector is above two.

It only works between sunrise to sunset

Start by creating a scoreboard called time and thunder:

/scoreboard objectives add time dummy
/scoreboard objectives add thunder dummy

Then, summon an armor stand with a tag time and thunder. Surely you can summon two different armor stands but then you have to change some commands as well.

/summon minecraft:armor_stand ~ ~ ~ {Tags:["time","thunder"]}

This armor stand will store the in-game time (and the score later on if thunder is true). In a repeating command block:

/execute as @e[tag=time] store result score @s time run time query daytime

Now place a daylight detector. This block would detect the thunderstorm.

Note: The daylight sensor should not be blocked from the sunlight.

Note: The daylight detector should not be inverted.

Placing it on y = 254 and surrounding it with barrier blocks should keep it inaccessible from players.

Here's the chain of command for thunder detection:

execute as @e[tag=thunder] run scoreboard players set @s thunder 0
execute as @e[tag=thunder] if entity @s[scores={time=23074..23297}] if block x y z minecraft:daylight_detector[power=2] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=23298..23532}] if block x y z minecraft:daylight_detector[power=2] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=23298..23532}] if block x y z minecraft:daylight_detector[power=3] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=23533..23768}] if block x y z minecraft:daylight_detector[power=3] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=23533..23768}] if block x y z minecraft:daylight_detector[power=4] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=23769..23963}] if block x y z minecraft:daylight_detector[power=4] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=23964..23999}] if block x y z minecraft:daylight_detector[power=4] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=23964..23999}] if block x y z minecraft:daylight_detector[power=5] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=0..170}] if block x y z minecraft:daylight_detector[power=4] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=0..170}] if block x y z minecraft:daylight_detector[power=5] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=171..537}] if block x y z minecraft:daylight_detector[power=5] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=171..537}] if block x y z minecraft:daylight_detector[power=6] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=538..940}] if block x y z minecraft:daylight_detector[power=6] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=941..1375}] if block x y z minecraft:daylight_detector[power=6] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=941..1375}] if block x y z minecraft:daylight_detector[power=7] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=1376..1867}] if block x y z minecraft:daylight_detector[power=7] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=1376..1867}] if block x y z minecraft:daylight_detector[power=8] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=1868..2450}] if block x y z minecraft:daylight_detector[power=8] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=2451..3175}] if block x y z minecraft:daylight_detector[power=8] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=2451..3175}] if block x y z minecraft:daylight_detector[power=9] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=3176..4301}] if block x y z minecraft:daylight_detector[power=9] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=3176..4301}] if block x y z minecraft:daylight_detector[power=10] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=4302..7707}] if block x y z minecraft:daylight_detector[power=10] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=7708..8833}] if block x y z minecraft:daylight_detector[power=10] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=7708..8833}] if block x y z minecraft:daylight_detector[power=9] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=8834..9957}] if block x y z minecraft:daylight_detector[power=9] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=8834..9957}] if block x y z minecraft:daylight_detector[power=8] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=9958..10139}] if block x y z minecraft:daylight_detector[power=8] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=10140..10632}] if block x y z minecraft:daylight_detector[power=8] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=10140..10632}] if block x y z minecraft:daylight_detector[power=7] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=10633..11067}] if block x y z minecraft:daylight_detector[power=7] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=10633..11067}] if block x y z minecraft:daylight_detector[power=6] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=11068..11469}] if block x y z minecraft:daylight_detector[power=6] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=11470..11836}] if block x y z minecraft:daylight_detector[power=6] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=11470..11836}] if block x y z minecraft:daylight_detector[power=5] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=11837..12041}] if block x y z minecraft:daylight_detector[power=5] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=11837..12041}] if block x y z minecraft:daylight_detector[power=4] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=12042..12238}] if block x y z minecraft:daylight_detector[power=4] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=12239..12474}] if block x y z minecraft:daylight_detector[power=4] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=12239..12474}] if block x y z minecraft:daylight_detector[power=3] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=12475..12708}] if block x y z minecraft:daylight_detector[power=3] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=12475..12708}] if block x y z minecraft:daylight_detector[power=2] run scoreboard players set @s thunder 1
execute as @e[tag=thunder] if entity @s[scores={time=12709..12933}] if block x y z minecraft:daylight_detector[power=2] run scoreboard players set @s thunder 1

Change x y z with the coordinates of your daylight detector.

The first line of command sets the score of thunder to 0 which is false but it is overcome by another command that detects the power level of the daylight detector during a certain time of the game. For example, the weather is clear and the time is between 4302 and 7707. The power of the daylight detector during that time is 15 but the change of weather also changes the power level of the daylight detector and is set to 10.

And to use the output:

execute if entity @e[tag=thunder,scores={thunder=1}] run <command>
2
  • Wouldn't it be the same idea as this one but with commands? (aside from the daylight sensor, obviously)
    – BunnyMerz
    Commented Nov 9, 2019 at 23:14
  • Yes. But this is for datapacks that depends entirely on commands.
    – Robomike
    Commented Nov 10, 2019 at 11:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.