Skip to content

Commit

Permalink
Make gregtech machines mark the chunk they're in as dirty on updates (#…
Browse files Browse the repository at this point in the history
…1001)

* Make gregtech machines mark the chunk they're in as dirty on updates

* Avoid any potential NPE in markDirty

* Mark dirty on GT tool use (screwdriver/wrench/etc)

* Fix multiblocks not marking hatches/buses as dirty too
  • Loading branch information
eigenraven committed Mar 31, 2022
1 parent bec757c commit 2ed0d16
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 27 deletions.
30 changes: 24 additions & 6 deletions src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -203,9 +203,9 @@ public void updateEntity() {
}
}
if (isServerSide() && mTickTimer > 10) {
if (!doCoverThings())
if (!doCoverThings())
return;

byte oldConnections = mConnections;
// Mask-out connection direction bits to keep only Foam related connections
mConnections = (byte) (mMetaTileEntity.mConnections | (mConnections & ~IConnectable.CONNECTED_ALL));
Expand Down Expand Up @@ -278,7 +278,7 @@ private void sendClientData() {
NW.sendPacketToAllPlayersInRange(
worldObj,
new GT_Packet_TileEntity(
xCoord, (short) yCoord, zCoord, mID, mCoverSides[0], mCoverSides[1], mCoverSides[2], mCoverSides[3], mCoverSides[4], mCoverSides[5], oTextureData = mConnections,
xCoord, (short) yCoord, zCoord, mID, mCoverSides[0], mCoverSides[1], mCoverSides[2], mCoverSides[3], mCoverSides[4], mCoverSides[5], oTextureData = mConnections,
oUpdateData = hasValidMetaTileEntity() ? mMetaTileEntity.getUpdateData() : 0,
oRedstoneData = (byte) (((mSidedRedstone[0] > 0) ? 1 : 0) | ((mSidedRedstone[1] > 0) ? 2 : 0) | ((mSidedRedstone[2] > 0) ? 4 : 0) | ((mSidedRedstone[3] > 0) ? 8 : 0) | ((mSidedRedstone[4] > 0) ? 16 : 0) | ((mSidedRedstone[5] > 0) ? 32 : 0)),
oColor = mColor
Expand Down Expand Up @@ -471,6 +471,7 @@ public ItemStack getStackInSlot(int aIndex) {

@Override
public void setInventorySlotContents(int aIndex, ItemStack aStack) {
markDirty();
mInventoryChanged = true;
if (canAccessData())
mMetaTileEntity.setInventorySlotContents(aIndex, worldObj.isRemote ? aStack : GT_OreDictUnificator.setStack(true, aStack));
Expand Down Expand Up @@ -810,13 +811,15 @@ public boolean onRightclick(EntityPlayer aPlayer, byte aSide, float aX, float aY
ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
if (tCurrentItem != null) {
if (getColorization() >= 0 && GT_Utility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) {
mMetaTileEntity.markDirty();
tCurrentItem.func_150996_a(Items.bucket);
setColorization((byte) -1);
return true;
}
byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ);
if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) {
if (mMetaTileEntity.onWrenchRightClick(aSide, tSide, aPlayer, aX, aY, aZ)) {
mMetaTileEntity.markDirty();
GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer);
GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(100), 1.0F, -1, xCoord, yCoord, zCoord);
}
Expand All @@ -827,12 +830,14 @@ public boolean onRightclick(EntityPlayer aPlayer, byte aSide, float aX, float aY
if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) {
setCoverDataAtSide(tSide, getCoverBehaviorAtSideNew(tSide).onCoverScrewdriverClick(tSide, getCoverIDAtSide(tSide), getComplexCoverDataAtSide(tSide), this, aPlayer, 0.5F, 0.5F, 0.5F));
mMetaTileEntity.onScrewdriverRightClick(tSide, aPlayer, aX, aY, aZ);
mMetaTileEntity.markDirty();
GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(100), 1.0F, -1, xCoord, yCoord, zCoord);
}
} else {
if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
setCoverDataAtSide(aSide, getCoverBehaviorAtSideNew(aSide).onCoverScrewdriverClick(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this, aPlayer, aX, aY, aZ));
mMetaTileEntity.onScrewdriverRightClick(aSide, aPlayer, aX, aY, aZ);
mMetaTileEntity.markDirty();
GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(100), 1.0F, -1, xCoord, yCoord, zCoord);
}
}
Expand All @@ -850,6 +855,7 @@ public boolean onRightclick(EntityPlayer aPlayer, byte aSide, float aX, float aY
if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
if (mWorks) disableWorking();
else enableWorking();
mMetaTileEntity.markDirty();
GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("090","Machine Processing: ") + (isAllowedToWork() ? GT_Utility.trans("088","Enabled") : GT_Utility.trans("087","Disabled")));
GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(101), 1.0F, -1, xCoord, yCoord, zCoord);
}
Expand All @@ -858,6 +864,7 @@ public boolean onRightclick(EntityPlayer aPlayer, byte aSide, float aX, float aY

if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList)) {
if (mMetaTileEntity.onWireCutterRightClick(aSide, tSide, aPlayer, aX, aY, aZ)) {
mMetaTileEntity.markDirty();
//logic handled internally
GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(100), 1.0F, -1, xCoord, yCoord, zCoord);
}
Expand All @@ -867,9 +874,11 @@ public boolean onRightclick(EntityPlayer aPlayer, byte aSide, float aX, float aY

if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) {
if (mMetaTileEntity.onSolderingToolRightClick(aSide, tSide, aPlayer, aX, aY, aZ)) {
mMetaTileEntity.markDirty();
//logic handled internally
GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(103), 1.0F, -1, xCoord, yCoord, zCoord);
} else if (GT_ModHandler.useSolderingIron(tCurrentItem, aPlayer)) {
mMetaTileEntity.markDirty();
mStrongRedstone ^= (1 << tSide);
GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("091","Redstone Output at Side ") + tSide + GT_Utility.trans("092"," set to: ") + ((mStrongRedstone & (1 << tSide)) != 0 ? GT_Utility.trans("093","Strong") : GT_Utility.trans("094","Weak")));
GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(103), 3.0F, -1, xCoord, yCoord, zCoord);
Expand All @@ -888,6 +897,7 @@ public boolean onRightclick(EntityPlayer aPlayer, byte aSide, float aX, float aY
mMetaTileEntity.allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem)))
{
setCoverItemAtSide(coverSide, tCurrentItem);
mMetaTileEntity.markDirty();
if (!aPlayer.capabilities.isCreativeMode) tCurrentItem.stackSize--;
GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(100), 1.0F, -1, xCoord, yCoord, zCoord);
}
Expand All @@ -898,6 +908,7 @@ public boolean onRightclick(EntityPlayer aPlayer, byte aSide, float aX, float aY
if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
GT_Utility.sendSoundToPlayers(worldObj, GregTech_API.sSoundList.get(0), 1.0F, -1, xCoord, yCoord, zCoord);
dropCover(coverSide, aSide, false);
mMetaTileEntity.markDirty();
}
return true;
}
Expand All @@ -916,7 +927,13 @@ else if (aPlayer.isSneaking()) { //Sneak click, no tool -> open cover config or
return false;

try {
if (!aPlayer.isSneaking() && hasValidMetaTileEntity()) return mMetaTileEntity.onRightclick(this, aPlayer, aSide, aX, aY, aZ);
if (!aPlayer.isSneaking() && hasValidMetaTileEntity()) {
boolean handled = mMetaTileEntity.onRightclick(this, aPlayer, aSide, aX, aY, aZ);
if(handled) {
mMetaTileEntity.markDirty();
}
return handled;
}
} catch (Throwable e) {
GT_Log.err.println("Encountered Exception while rightclicking TileEntity, the Game should've crashed now, but I prevented that. Please report immediately to GregTech Intergalactical!!!");
e.printStackTrace(GT_Log.err);
Expand Down Expand Up @@ -1156,7 +1173,7 @@ public boolean injectRotationalEnergy(byte aSide, long aSpeed, long aEnergy) {
if (!canAccessData() || getCoverIDAtSide(aSide) != 0) return false;
return mMetaTileEntity.injectRotationalEnergy(aSide, aSpeed, aEnergy);
}

private boolean canMoveFluidOnSide(ForgeDirection aSide, Fluid aFluid, boolean isFill) {
if (aSide == ForgeDirection.UNKNOWN)
return true;
Expand Down Expand Up @@ -1215,7 +1232,7 @@ public boolean canDrain(ForgeDirection aSide, Fluid aFluid) {
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection aSide) {
if (canAccessData()
&& (aSide == ForgeDirection.UNKNOWN
&& (aSide == ForgeDirection.UNKNOWN
|| (mMetaTileEntity.isLiquidInput((byte) aSide.ordinal())
&& getCoverBehaviorAtSideNew((byte) aSide.ordinal()).letsFluidIn((byte) aSide.ordinal(), getCoverIDAtSide((byte) aSide.ordinal()), getComplexCoverDataAtSide((byte) aSide.ordinal()), null, this))
|| (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) && getCoverBehaviorAtSideNew((byte) aSide.ordinal()).letsFluidOut((byte) aSide.ordinal(), getCoverIDAtSide((byte) aSide.ordinal()), getComplexCoverDataAtSide((byte) aSide.ordinal()), null, this))
Expand All @@ -1242,6 +1259,7 @@ public boolean addStackToSlot(int aIndex, ItemStack aStack) {
}
aStack = GT_OreDictUnificator.get(aStack);
if (GT_Utility.areStacksEqual(tStack, aStack) && tStack.stackSize + aStack.stackSize <= Math.min(aStack.getMaxStackSize(), getInventoryStackLimit())) {
markDirty();
tStack.stackSize += aStack.stackSize;
return true;
}
Expand Down
19 changes: 11 additions & 8 deletions src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public class BaseMetaTileEntity extends CoverableGregTechTileEntity implements I
private final boolean[] mActiveEUOutputs = new boolean[]{false, false, false, false, false, false};
private byte[] mSidedRedstone = new byte[]{15, 15, 15, 15, 15, 15};
private final int[] mTimeStatistics = new int[GregTech_API.TICKS_FOR_LAG_AVERAGING];
private boolean mHasEnoughEnergy = true, mRunningThroughTick = false, mInputDisabled = false, mOutputDisabled = false, mMuffler = false, mLockUpgrade = false;
private boolean mHasEnoughEnergy = true, mRunningThroughTick = false, mInputDisabled = false, mOutputDisabled = false, mMuffler = false, mLockUpgrade = false;
private boolean mActive = false, mRedstone = false, mWorkUpdate = false, mSteamConverter = false, mInventoryChanged = false, mWorks = true, mNeedsUpdate = true;
private boolean mNeedsBlockUpdate = true, mSendClientData = false, oRedstone = false;
private byte mColor = 0, oColor = 0, oStrongRedstone = 0, mStrongRedstone = 0, oRedstoneData = 63, oTextureData = 0, oUpdateData = 0, oTexturePage=0;
Expand Down Expand Up @@ -322,9 +322,9 @@ public void updateEntity() {
mAverageEUInput[mAverageEUInputIndex] = 0;
mAverageEUOutput[mAverageEUOutputIndex] = 0;
}

mMetaTileEntity.onPreTick(this, mTickTimer);

if (!hasValidMetaTileEntity()) {
mRunningThroughTick = false;
return;
Expand Down Expand Up @@ -777,7 +777,7 @@ public void setFrontFacing(byte aFacing) {

doEnetUpdate();
cableUpdateDelay = 10;

if (mMetaTileEntity.shouldTriggerBlockUpdate()) {
// If we're triggering a block update this will call onMachineBlockUpdate()
GregTech_API.causeMachineUpdate(worldObj, xCoord, yCoord, zCoord);
Expand All @@ -803,8 +803,10 @@ public ItemStack getStackInSlot(int aIndex) {
@Override
public void setInventorySlotContents(int aIndex, ItemStack aStack) {
mInventoryChanged = true;
if (canAccessData())
if (canAccessData()) {
markDirty();
mMetaTileEntity.setInventorySlotContents(aIndex, worldObj.isRemote ? aStack : GT_OreDictUnificator.setStack(true, aStack));
}
}

@Override
Expand Down Expand Up @@ -1145,7 +1147,7 @@ private boolean isEnergyOutputSide(byte aSide) {
}
return false;
}

@Override
protected boolean hasValidMetaTileEntity() {
return mMetaTileEntity != null && mMetaTileEntity.getBaseMetaTileEntity() == this;
Expand Down Expand Up @@ -1676,7 +1678,7 @@ public long getAverageElectricOutput() {
return rEU / (mAverageEUOutput.length - 1);
}


@Override
protected void updateOutputRedstoneSignal(byte aSide) {
if (mMetaTileEntity.hasSidedRedstoneOutputBehavior()) {
Expand All @@ -1685,7 +1687,7 @@ protected void updateOutputRedstoneSignal(byte aSide) {
setOutputRedstoneSignal(aSide, (byte) 15);
}
}

@Override
public String getOwnerName() {
if (GT_Utility.isStringInvalid(mOwnerName)) return "Player";
Expand Down Expand Up @@ -1983,6 +1985,7 @@ public boolean addStackToSlot(int aIndex, ItemStack aStack) {
aStack = GT_OreDictUnificator.get(aStack);
if (GT_Utility.areStacksEqual(tStack, aStack) && tStack.stackSize + aStack.stackSize <= Math.min(aStack.getMaxStackSize(), getInventoryStackLimit())) {
tStack.stackSize += aStack.stackSize;
markDirty();
return true;
}
return false;
Expand Down
13 changes: 10 additions & 3 deletions src/main/java/gregtech/api/metatileentity/BaseTileEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.IFluidHandler;
Expand Down Expand Up @@ -465,9 +466,15 @@ public final void setOnFire() {
public final void setToFire() {
worldObj.setBlock(xCoord, yCoord, zCoord, Blocks.fire);
}

@Override
public void markDirty() {/* Do not do the super Function */}

@Override
public void markDirty() {
// Avoid sending neighbor updates, just mark the chunk as dirty to make sure it gets saved
Chunk chunk = worldObj.getChunkFromBlockCoords(xCoord, zCoord);
if(chunk != null) {
chunk.setChunkModified();
}
}

@Deprecated
public String trans(String aKey, String aEnglish){
Expand Down
23 changes: 19 additions & 4 deletions src/main/java/gregtech/api/metatileentity/MetaTileEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,10 @@ public long getEUVar() {
* This is used to set the internal Energy to the given Parameter. I use this for the IDSU.
*/
public void setEUVar(long aEnergy) {
((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredEnergy = aEnergy;
if (aEnergy != ((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredEnergy) {
markDirty();
((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredEnergy = aEnergy;
}
}

/**
Expand All @@ -432,7 +435,10 @@ public long getSteamVar() {
* This is used to set the internal Steam Energy to the given Parameter.
*/
public void setSteamVar(long aSteam) {
((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredSteam = aSteam;
if(((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredSteam != aSteam){
markDirty();
((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredSteam = aSteam;
}
}

/**
Expand Down Expand Up @@ -679,6 +685,7 @@ public ItemStack getStackInSlot(int aIndex) {

@Override
public void setInventorySlotContents(int aIndex, ItemStack aStack) {
markDirty();
if (aIndex >= 0 && aIndex < mInventory.length) mInventory[aIndex] = aStack;
}

Expand All @@ -704,10 +711,14 @@ public ItemStack decrStackSize(int aIndex, int aAmount) {
ItemStack tStack = getStackInSlot(aIndex), rStack = GT_Utility.copyOrNull(tStack);
if (tStack != null) {
if (tStack.stackSize <= aAmount) {
if (setStackToZeroInsteadOfNull(aIndex)) tStack.stackSize = 0;
if (setStackToZeroInsteadOfNull(aIndex)) {
tStack.stackSize = 0;
markDirty();
}
else setInventorySlotContents(aIndex, null);
} else {
rStack = tStack.splitStack(aAmount);
markDirty();
if (tStack.stackSize == 0 && !setStackToZeroInsteadOfNull(aIndex))
setInventorySlotContents(aIndex, null);
}
Expand Down Expand Up @@ -753,6 +764,7 @@ public FluidTankInfo[] getTankInfo(ForgeDirection aSide) {
}

public int fill_default(ForgeDirection aSide, FluidStack aFluid, boolean doFill) {
markDirty();
return fill(aFluid, doFill);
}

Expand All @@ -761,6 +773,7 @@ public int fill(ForgeDirection aSide, FluidStack aFluid, boolean doFill) {
if (getBaseMetaTileEntity().hasSteamEngineUpgrade() && GT_ModHandler.isSteam(aFluid) && aFluid.amount > 1) {
int tSteam = (int) Math.min(Integer.MAX_VALUE, Math.min(aFluid.amount / 2, getBaseMetaTileEntity().getSteamCapacity() - getBaseMetaTileEntity().getStoredSteam()));
if (tSteam > 0) {
markDirty();
if (doFill) getBaseMetaTileEntity().increaseStoredSteam(tSteam, true);
return tSteam * 2;
}
Expand Down Expand Up @@ -814,7 +827,9 @@ public boolean doTickProfilingMessageDuringThisTick() {

@Override
public void markDirty() {
//
if (mBaseMetaTileEntity != null) {
mBaseMetaTileEntity.markDirty();
}
}

@Override
Expand Down
Loading

0 comments on commit 2ed0d16

Please sign in to comment.