@@ -74,9 +74,15 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov
7474 CoverRegistry .NO_COVER , CoverRegistry .NO_COVER , CoverRegistry .NO_COVER , CoverRegistry .NO_COVER };
7575 private byte validCoversMask ;
7676
77+ // Whether block update is needed because of redstone changes.
78+ protected boolean mNeedsBlockUpdate = true ;
79+ // The actual redstone signal per side, direct modifiers of this are required to issue block update for change.
80+ // Use `setOutputRedstoneSignal` to modify the redstone output and issue block update on the server if changed.
7781 protected final byte [] mSidedRedstone = new byte [] { 0 , 0 , 0 , 0 , 0 , 0 };
78- protected byte mStrongRedstone = 0 ;
79- protected byte oldStrongRedstone = 0 ;
82+ // Use `setStrongRedstone` to automatically send block update on change
83+ private byte mStrongRedstone = 0 ;
84+ // To only issue update to sides that has strong redstone set either previously or currently
85+ private byte oldStrongRedstone = 0 ;
8086
8187 protected short mID = 0 ;
8288 public long mTickTimer = 0 ;
@@ -330,6 +336,9 @@ protected void onBaseTEDestroyed() {
330336 }
331337 }
332338
339+ /**
340+ * Used on client side, no need to issue block update
341+ */
333342 protected void setRedstoneOutput (int packedRedstoneValue ) {
334343 mSidedRedstone [0 ] = (byte ) ((packedRedstoneValue & 1 ) == 1 ? 15 : 0 );
335344 mSidedRedstone [1 ] = (byte ) ((packedRedstoneValue & 2 ) == 2 ? 15 : 0 );
@@ -349,13 +358,54 @@ public final byte getSidedRedstoneMask() {
349358 return redstone ;
350359 }
351360
361+ public final byte getStrongRedstone () {
362+ return mStrongRedstone ;
363+ }
364+
365+ /**
366+ * Sets a new value for strong redstone. If the value is changed, block update is issued automatically.
367+ */
368+ public final void setStrongRedstone (byte newStrongRedstone ) {
369+ if (newStrongRedstone != mStrongRedstone ) {
370+ mStrongRedstone = newStrongRedstone ;
371+ markDirty ();
372+ issueBlockUpdate ();
373+ }
374+ }
375+
376+ /**
377+ * Toggles the specified side for strong redstone
378+ *
379+ * @return whether the side is emitting strong redstone
380+ */
381+ public final boolean toggleStrongRedstone (ForgeDirection side ) {
382+ mStrongRedstone ^= (byte ) side .flag ;
383+ markDirty ();
384+ issueBlockUpdate ();
385+ return (mStrongRedstone & side .flag ) != 0 ;
386+ }
387+
388+ @ Override
389+ public void issueBlockUpdate () {
390+ mNeedsBlockUpdate = true ;
391+ if (isTickDisabled ()) {
392+ doBlockUpdateServer ();
393+ }
394+ }
395+
396+ public final void doBlockUpdateServer () {
397+ updateNeighbours (mStrongRedstone , oldStrongRedstone );
398+ oldStrongRedstone = mStrongRedstone ;
399+ mNeedsBlockUpdate = false ;
400+ }
401+
352402 @ Override
353403 public void setOutputRedstoneSignal (ForgeDirection side , byte strength ) {
354404 final byte cappedStrength = (byte ) Math .min (Math .max (0 , strength ), 15 );
355405 if (side == ForgeDirection .UNKNOWN ) return ;
356406
357407 final int ordinalSide = side .ordinal ();
358- if (mSidedRedstone [ordinalSide ] != cappedStrength || ( mStrongRedstone & ( 1 << ordinalSide )) > 0 ) {
408+ if (mSidedRedstone [ordinalSide ] != cappedStrength ) {
359409 mSidedRedstone [ordinalSide ] = cappedStrength ;
360410 issueBlockUpdate ();
361411 scheduleTexturePacket ();
@@ -364,16 +414,16 @@ public void setOutputRedstoneSignal(ForgeDirection side, byte strength) {
364414
365415 @ Override
366416 public void setStrongOutputRedstoneSignal (ForgeDirection side , byte strength ) {
367- mStrongRedstone |= ( byte ) side .flag ;
417+ setStrongRedstone (( byte ) ( mStrongRedstone | side .flag )) ;
368418 setOutputRedstoneSignal (side , strength );
369419 }
370420
371421 @ Override
372422 public void setRedstoneOutputStrength (ForgeDirection side , boolean isStrong ) {
373423 if (isStrong ) {
374- mStrongRedstone |= ( byte ) side .flag ;
424+ setStrongRedstone (( byte ) ( mStrongRedstone | side .flag )) ;
375425 } else {
376- mStrongRedstone &= ~( byte ) side .flag ;
426+ setStrongRedstone (( byte ) ( mStrongRedstone & (~ side .flag ))) ;
377427 }
378428 setOutputRedstoneSignal (side , mSidedRedstone [side .ordinal ()]);
379429 }
0 commit comments