1010import net .minecraft .util .math .BlockPos ;
1111
1212import io .netty .buffer .ByteBuf ;
13+ import it .unimi .dsi .fastutil .ints .IntArrayList ;
14+ import it .unimi .dsi .fastutil .ints .IntList ;
1315import org .jetbrains .annotations .NotNull ;
1416
1517import java .util .function .Consumer ;
2022public interface ISyncedTileEntity {
2123
2224 Consumer <PacketBuffer > NO_OP = buf -> {};
25+ IntList datacodes = new IntArrayList ();
26+ ThreadLocal <Object > tracked = ThreadLocal .withInitial (() -> null );
2327
2428 /**
2529 * Used to sync data from Server -> Client.
@@ -119,26 +123,25 @@ default void writeCustomData(int discriminator) {
119123 */
120124 void receiveCustomData (int discriminator , @ NotNull PacketBuffer buf );
121125
122- static void checkCustomData (int discriminator , @ NotNull ByteBuf buf , Object obj ) {
123- if (buf .readableBytes () == 0 ) return ;
124-
125- GTLog .logger .error (
126- "Class {} failed to finish reading receiveCustomData with discriminator {} and {} bytes remaining" ,
127- stringify (obj ), GregtechDataCodes .getNameFor (discriminator ), buf .readableBytes ());
128-
129- buf .clear (); // clear to prevent further logging
130- }
131-
132- static void checkInitialData (@ NotNull ByteBuf buf , Object obj ) {
133- if (buf .readableBytes () == 0 ) return ;
134-
135- GTLog .logger .error ("Class {} failed to finish reading initialSyncData with {} bytes remaining" ,
136- stringify (obj ), buf .readableBytes ());
126+ static void checkData (@ NotNull ByteBuf buf ) {
127+ if (buf .readableBytes () != 0 ) {
128+ if (datacodes .isEmpty ()) {
129+ GTLog .logger .error ("Class {} failed to finish reading initialSyncData with {} bytes remaining" ,
130+ stringify (tracked .get ()), buf .readableBytes ());
131+ } else {
132+ GTLog .logger .error (
133+ "Class {} failed to finish reading receiveCustomData at code path [{}] with {} bytes remaining" ,
134+ stringify (tracked .get ()), getCodePath (), buf .readableBytes ());
135+ }
136+ }
137137
138- buf . clear (); // clear to prevent further logging
138+ reset ();
139139 }
140140
141141 static String stringify (Object obj ) {
142+ if (obj instanceof IGregTechTileEntity gtte && gtte .getMetaTileEntity () != null )
143+ obj = gtte .getMetaTileEntity ();
144+
142145 StringBuilder builder = new StringBuilder (obj .getClass ().getSimpleName ());
143146
144147 BlockPos pos = null ;
@@ -158,4 +161,27 @@ static String stringify(Object obj) {
158161
159162 return builder .toString ();
160163 }
164+
165+ static void addCode (int code , Object trackedObject ) {
166+ datacodes .add (code );
167+ track (trackedObject );
168+ }
169+
170+ static void track (Object trackedObject ) {
171+ tracked .set (trackedObject );
172+ }
173+
174+ static String getCodePath () {
175+ var builder = new StringBuilder ();
176+ for (int i = 0 ; i < datacodes .size (); i ++) {
177+ builder .append (GregtechDataCodes .getNameFor (datacodes .get (i )));
178+ if (i < datacodes .size () - 1 ) builder .append (" > " );
179+ }
180+ return builder .toString ();
181+ }
182+
183+ static void reset () {
184+ datacodes .clear ();
185+ tracked .remove ();
186+ }
161187}
0 commit comments