11package world .bentobox .greenhouses .listeners ;
22
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 ;
48
59import org .bukkit .Bukkit ;
610import org .bukkit .Material ;
913import org .bukkit .block .Block ;
1014import org .bukkit .block .BlockFace ;
1115import org .bukkit .block .Hopper ;
16+ import org .bukkit .block .data .Levelled ;
17+ import org .bukkit .block .data .type .Snow ;
1218import org .bukkit .event .EventHandler ;
1319import org .bukkit .event .Listener ;
1420import org .bukkit .event .block .BlockFormEvent ;
@@ -67,10 +73,11 @@ private boolean getAirBlocks(Greenhouse gh) {
6773 // Not water
6874 if (Math .random () < addon .getSettings ().getSnowDensity ()
6975 && !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 ))) {
7278
73- createdSnow = true ;
79+
80+ createdSnow = placeSnow (b );
7481 }
7582 }
7683
@@ -90,13 +97,44 @@ private boolean getAirBlocks(Greenhouse gh) {
9097 return createdSnow ;
9198 }
9299
93- private void placeSnow (Block b ) {
100+ private boolean placeSnow (Block b ) {
94101 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 ));
97114 } else {
98115 b .getRelative (BlockFace .UP ).setType (Material .SNOW );
99116 }
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 ;
100138 }
101139
102140 /**
0 commit comments