@@ -76,48 +76,66 @@ public void on(PlayerQuitEvent e) {
7676 totalMap .remove (p );
7777 }
7878
79- @ EventHandler (priority = EventPriority .HIGHEST )
79+ @ EventHandler (priority = EventPriority .HIGHEST , ignoreCancelled = true )
8080 public void on (BlockPlaceEvent e ) {
81- if (e .isCancelled ()) {
82- return ;
83- }
8481 Player p = e .getPlayer ();
8582 SoundPlayer sp = SoundPlayer .of (p );
83+ if (!hasAdaptation (p ) || !p .isSneaking ())
84+ return ;
8685
87- if (hasAdaptation (p ) && !totalMap .isEmpty () && totalMap .get (p ) != null && totalMap .get (p ).size () > 0 ) {
88- ItemStack is = p .getInventory ().getItemInMainHand ().clone ();
89- ItemStack hand = p .getInventory ().getItemInMainHand ();
90- if (p .isSneaking () && is .getType ().isBlock ()) {
91- double v = getValue (e .getBlock ());
92- int handSizeAfter = is .getAmount () - totalMap .get (p ).size ();
93- if (handSizeAfter >= 0 ) {
94- for (Block b : totalMap .get (p ).keySet ()) { // Block Placer
95- if (!canBlockPlace (p , b .getLocation ())) {
96- Adapt .verbose ("Player " + p .getName () + " doesn't have permission." );
97- continue ;
98- }
99- BlockFace face = totalMap .get (p ).get (b );
100- if (b .getWorld ().getBlockAt (b .getRelative (face ).getLocation ()).getType () == Material .AIR ) {
101- if (b .getRelative (face ).getLocation () != e .getBlock ().getLocation ()) {
102- b .getWorld ().setBlockData (b .getRelative (face ).getLocation (), b .getBlockData ());
103- getPlayer (p ).getData ().addStat ("blocks.placed" , 1 );
104- getPlayer (p ).getData ().addStat ("blocks.placed.value" , v );
105- sp .play (b .getLocation (), Sound .BLOCK_AZALEA_BREAK , 0.4f , 0.25f );
106- xp (p , 2 );
107- }
108- }
109- is .setAmount (is .getAmount () - 1 );
110- hand .setAmount (is .getAmount ());
111- }
112- totalMap .remove (p );
113- if (hand .getAmount () > 0 ) {
114- runPlayerViewport (getBlockFace (p ), p .getTargetBlock (null , 5 ), p .getInventory ().getItemInMainHand ().getType (), p );
115- }
116- e .setCancelled (true );
117- } else {
118- Adapt .messagePlayer (p , C .RED + Localizer .dLocalize ("architect" , "placement" , "lore1" ) + " " + C .GREEN + totalMap .get (p ).size () + C .RED + " " + Localizer .dLocalize ("architect" , "placement" , "lore2" ));
119- }
86+ var blocks = totalMap .get (p );
87+ if (blocks == null || blocks .isEmpty ())
88+ return ;
89+
90+ ItemStack hand = e .getItemInHand ();
91+ if (!hand .getType ().isBlock () || blocks .keySet ().getFirst ().getType () != hand .getType ())
92+ return ;
93+
94+ double v = getValue (e .getBlock ());
95+ Block ignored = blocks .keySet ()
96+ .stream ()
97+ .filter (b -> b .getRelative (blocks .get (b )).equals (e .getBlock ()))
98+ .findFirst ()
99+ .orElse (null );
100+
101+ if (hand .getAmount () < blocks .size ()) {
102+ Adapt .messagePlayer (p , C .RED + Localizer .dLocalize ("architect" , "placement" , "lore1" ) + " " + C .GREEN + blocks .size () + C .RED + " " + Localizer .dLocalize ("architect" , "placement" , "lore2" ));
103+ return ;
104+ }
105+
106+ blocks .remove (ignored );
107+ for (Block b : blocks .keySet ()) { // Block Placer
108+ Block relative = b .getRelative (blocks .get (b ));
109+ if (!relative .getType ().isAir ())
110+ continue ;
111+
112+ if (!canBlockPlace (p , relative .getLocation ())) {
113+ Adapt .verbose ("Player " + p .getName () + " doesn't have permission." );
114+ continue ;
120115 }
116+
117+ relative .setBlockData (b .getBlockData ());
118+ getPlayer (p ).getData ().addStat ("blocks.placed" , 1 );
119+ getPlayer (p ).getData ().addStat ("blocks.placed.value" , v );
120+ sp .play (b .getLocation (), Sound .BLOCK_AZALEA_BREAK , 0.4f , 0.25f );
121+ xp (p , 2 );
122+
123+ hand .setAmount (hand .getAmount () - 1 );
124+ }
125+
126+ if (ignored != null ) {
127+ e .getBlock ().setBlockData (ignored .getBlockData ());
128+ getPlayer (p ).getData ().addStat ("blocks.placed" , 1 );
129+ getPlayer (p ).getData ().addStat ("blocks.placed.value" , v );
130+ sp .play (ignored .getLocation (), Sound .BLOCK_AZALEA_BREAK , 0.4f , 0.25f );
131+ xp (p , 2 );
132+
133+ hand .setAmount (hand .getAmount () - 1 );
134+ } else e .setCancelled (true );
135+
136+ totalMap .remove (p );
137+ if (hand .getAmount () > 0 ) {
138+ runPlayerViewport (getBlockFace (p ), p .getTargetBlock (null , 5 ), p .getInventory ().getItemInMainHand ().getType (), p );
121139 }
122140 }
123141
0 commit comments