auracore/src/main/java/dev/tilera/auracore/mixins/MixinTileCrystal.java
Timo Ley 3900b28745
All checks were successful
continuous-integration/drone/push Build is passing
fix: crystal count in canHarvest
2023-05-25 22:02:14 +02:00

129 lines
4.3 KiB
Java

package dev.tilera.auracore.mixins;
import java.util.Random;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import dev.tilera.auracore.api.ICrystal;
import dev.tilera.auracore.aura.AuraManager;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChunkCoordinates;
import thaumcraft.api.TileThaumcraft;
import thaumcraft.common.config.ConfigItems;
import thaumcraft.common.tiles.TileCrystal;
@Mixin(TileCrystal.class)
public abstract class MixinTileCrystal extends TileThaumcraft implements ICrystal {
private long count = System.currentTimeMillis() + (long)new Random().nextInt(300000);
@Shadow(remap = false)
public short orientation;
public int crystals = 6;
public int ticks = 0;
public boolean isLoaded = false;
@Override
public boolean canUpdate() {
return true;
}
@Override
public void updateEntity() {
super.updateEntity();
if (this.worldObj.isRemote) {
return;
}
if (!isLoaded) {
isLoaded = true;
ICrystal.crystalCounts.put(new ChunkCoordinates(xCoord, yCoord, zCoord), crystals);
}
ticks++;
int md = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord);
if (md == 6) {
crystals = 6;
} else if (md == 9) {
crystals = 5;
}
if (md == 7 || md == 10 || crystals < 6) {
return;
}
if (this.count <= System.currentTimeMillis()) {
try {
this.count = System.currentTimeMillis() + 300000L;
AuraManager.increaseLowestAuraWithLimit(this.worldObj, (float)this.xCoord + 0.5f, (float)this.yCoord + 0.5f, (float)this.zCoord + 0.5f, 1, 1.1f);
}
catch (Exception exception) {
}
}
}
/**
* @author tilera
* @reason Crystal count
*/
@Overwrite(remap = false)
public void readCustomNBT(NBTTagCompound nbttagcompound) {
super.readCustomNBT(nbttagcompound);
this.orientation = nbttagcompound.getShort("orientation");
if (nbttagcompound.hasKey("crystals"));
this.crystals = nbttagcompound.getInteger("crystals");
ICrystal.crystalCounts.put(new ChunkCoordinates(xCoord, yCoord, zCoord), crystals);
}
/**
* @author tilera
* @reason Crystal count
*/
@Overwrite(remap = false)
public void writeCustomNBT(NBTTagCompound nbttagcompound) {
super.writeCustomNBT(nbttagcompound);
nbttagcompound.setShort("orientation", this.orientation);
nbttagcompound.setInteger("crystals", this.crystals);
}
@Override
public int getCrystalCount(int meta) {
if (meta == 6) return 6;
if (meta == 9) return 5;
return crystals;
}
@Override
public boolean setCrystalCount(int count) {
int md = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord);
if(md == 6 || md == 9 || count > 6 || count < 1) return false;
crystals = count;
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
ICrystal.crystalCounts.put(new ChunkCoordinates(xCoord, yCoord, zCoord), crystals);
return true;
}
@Override
public void harvestShard(EntityPlayer player) {
if(worldObj.isRemote || !setCrystalCount(crystals - 1)) return;
int meta = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord);
if (meta > 7) {
meta--;
}
ItemStack stack = new ItemStack(ConfigItems.itemShard, 1, meta);
EntityItem entity = new EntityItem(worldObj, xCoord, yCoord, zCoord, stack);
entity.motionX = (player.posX - entity.posX) * 0.1;
entity.motionY = (player.posY - entity.posY) * 0.1;
entity.motionZ = (player.posZ - entity.posZ) * 0.1;
worldObj.spawnEntityInWorld(entity);
}
@Override
public boolean canHarvest(EntityPlayer player) {
int md = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord);
return md != 6 && md != 9 && crystals > 1;
}
}