generated from tilera/1710mod
129 lines
4.3 KiB
Java
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;
|
|
}
|
|
|
|
}
|