3232import org .jetbrains .annotations .Nullable ;
3333
3434import java .util .*;
35+ import java .util .concurrent .locks .Lock ;
3536
3637import static com .ldtteam .structurize .api .constants .Constants .UPDATE_FLAG ;
3738
4546public final class PlacementHandlers
4647{
4748 public static final List <IPlacementHandler > handlers = new ArrayList <>();
49+
50+ public enum AddType {
51+ BEFORE ,
52+ AFTER ,
53+ REPLACE
54+ }
55+
4856 static
4957 {
5058 handlers .add (new AirPlacementHandler ());
@@ -78,15 +86,51 @@ public final class PlacementHandlers
7886 */
7987 public static void add (IPlacementHandler handler , Class <?> override )
8088 {
81- for (int i = 0 ; i < handlers .size (); i ++)
89+ synchronized (handlers )
90+ {
91+ for (int i = 0 ; i < handlers .size (); i ++)
92+ {
93+ if (override == handlers .get (i ).getClass ())
94+ {
95+ handlers .set (i , handler );
96+ return ;
97+ }
98+ }
99+ add (handler );
100+ }
101+ }
102+
103+ /**
104+ * Allows for Adding a Handler before, after or instead of another one.
105+ * @param handler the new handler to add
106+ * @param override the class to match.
107+ * @param addType if before/after/replace.
108+ */
109+ public static void add (IPlacementHandler handler , Class <?> override , final AddType addType )
110+ {
111+ synchronized (handlers )
82112 {
83- if ( override . isInstance ( handlers .get ( i )) )
113+ for ( int i = 0 ; i < handlers .size (); i ++ )
84114 {
85- handlers .set (i , handler );
86- return ;
115+ if (override == handlers .get (i ).getClass ())
116+ {
117+ switch (addType )
118+ {
119+ case BEFORE :
120+ handlers .add (i - 1 , handler );
121+ break ;
122+ case AFTER :
123+ handlers .add (i , handler );
124+ break ;
125+ case REPLACE :
126+ handlers .set (i , handler );
127+ break ;
128+ }
129+ return ;
130+ }
87131 }
132+ add (handler );
88133 }
89- add (handler );
90134 }
91135
92136 /**
@@ -97,8 +141,11 @@ public static void add(IPlacementHandler handler, Class<?> override)
97141 */
98142 public static void add (IPlacementHandler handler )
99143 {
100- handlers .add (1 , handler );
101- handlerCache .clear ();
144+ synchronized (handlers )
145+ {
146+ handlers .add (1 , handler );
147+ handlerCache .clear ();
148+ }
102149 }
103150
104151 /**
@@ -136,6 +183,7 @@ public static IPlacementHandler getHandler(final Level world,
136183 Log .getLogger ().error ("Unable to find any PlacementHandler for {}; this should be impossible." , newState .toString ());
137184 return new GeneralBlockPlacementHandler ();
138185 }
186+
139187 /**
140188 * Private constructor to hide implicit one.
141189 */
0 commit comments