1
1
package world .bentobox .greenhouses .listeners ;
2
2
3
- import java .util .*;
3
+ import java .util .ArrayList ;
4
+ import java .util .HashMap ;
5
+ import java .util .List ;
6
+ import java .util .Map ;
7
+ import java .util .Objects ;
4
8
5
9
import org .bukkit .Bukkit ;
6
10
import org .bukkit .Material ;
9
13
import org .bukkit .block .Block ;
10
14
import org .bukkit .block .BlockFace ;
11
15
import org .bukkit .block .Hopper ;
16
+ import org .bukkit .block .data .Levelled ;
17
+ import org .bukkit .block .data .type .Snow ;
12
18
import org .bukkit .event .EventHandler ;
13
19
import org .bukkit .event .Listener ;
14
20
import org .bukkit .event .block .BlockFormEvent ;
@@ -67,10 +73,11 @@ private boolean getAirBlocks(Greenhouse gh) {
67
73
// Not water
68
74
if (Math .random () < addon .getSettings ().getSnowDensity ()
69
75
&& !b .isLiquid ()
70
- && b .getRelative (BlockFace .UP ).getType ().equals (Material .AIR )) {
71
- placeSnow ( b );
76
+ && ( b .getRelative (BlockFace .UP ).getType ().equals (Material .AIR )
77
+ || b . getRelative ( BlockFace . UP ). getType (). equals ( Material . SNOW ))) {
72
78
73
- createdSnow = true ;
79
+
80
+ createdSnow = placeSnow (b );
74
81
}
75
82
}
76
83
@@ -90,13 +97,44 @@ private boolean getAirBlocks(Greenhouse gh) {
90
97
return createdSnow ;
91
98
}
92
99
93
- private void placeSnow (Block b ) {
100
+ private boolean placeSnow (Block b ) {
94
101
Optional <Material > snowCauldron = Enums .getIfPresent (Material .class , "POWDER_SNOW_CAULDRON" );
95
- if (b .getType ().equals (Material .CAULDRON ) && snowCauldron .isPresent ()) {
96
- b .setType (snowCauldron .get ());
102
+ if (snowCauldron .isPresent ()) {
103
+ if (b .getType ().equals (Material .CAULDRON )) {
104
+ b .setType (snowCauldron .get ());
105
+ return true ;
106
+ } else if (b .getType ().equals (snowCauldron .get ())) {
107
+ // Fill up the snow cauldron some more
108
+ return incrementLevel (b );
109
+ }
110
+ }
111
+ // Pile up snow
112
+ if (b .getRelative (BlockFace .UP ).getType ().equals (Material .SNOW )) {
113
+ return incrementLevel (b .getRelative (BlockFace .UP ));
97
114
} else {
98
115
b .getRelative (BlockFace .UP ).setType (Material .SNOW );
99
116
}
117
+ return true ;
118
+ }
119
+
120
+ private boolean incrementLevel (Block b ) {
121
+ if (b .getBlockData () instanceof Levelled data ) {
122
+ int max = data .getMaximumLevel ();
123
+ if (data .getLevel () < max ) {
124
+ data .setLevel (data .getLevel () + 1 );
125
+ b .setBlockData (data );
126
+ return true ;
127
+ }
128
+ }
129
+ if (b .getBlockData () instanceof Snow data ) {
130
+ int max = data .getMaximumLayers ();
131
+ if (data .getLayers () < max ) {
132
+ data .setLayers (data .getLayers () + 1 );
133
+ b .setBlockData (data );
134
+ return true ;
135
+ }
136
+ }
137
+ return false ;
100
138
}
101
139
102
140
/**
0 commit comments