155 lines
4.0 KiB
Java
Executable File
155 lines
4.0 KiB
Java
Executable File
/**
|
|
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
|
|
* http://www.mod-buildcraft.com
|
|
*
|
|
* BuildCraft is distributed under the terms of the Minecraft Mod Public
|
|
* License 1.0, or MMPL. Please check the contents of the license located in
|
|
* http://www.mod-buildcraft.com/MMPL-1.0.txt
|
|
*/
|
|
package buildcraft.tests.testcase;
|
|
|
|
import java.io.File;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.CompressedStreamTools;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
|
|
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
|
|
|
|
import net.minecraftforge.common.MinecraftForge;
|
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
|
|
|
import buildcraft.core.network.RPC;
|
|
import buildcraft.core.network.RPCHandler;
|
|
import buildcraft.core.network.RPCSide;
|
|
import buildcraft.tests.ItemTester;
|
|
|
|
public class TileTestCase extends TileEntity {
|
|
|
|
/**
|
|
* This way of handling the current test case means that test cases only
|
|
* work on single player, as this field needs to be share between both
|
|
* threads.
|
|
*/
|
|
public static TileTestCase currentTestCase;
|
|
|
|
Sequence sequence;
|
|
String testName = "test";
|
|
String information = "";
|
|
|
|
public TileTestCase() {
|
|
MinecraftForge.EVENT_BUS.register(this);
|
|
}
|
|
|
|
@Override
|
|
public void updateEntity() {
|
|
if (currentTestCase == null && !worldObj.isRemote) {
|
|
currentTestCase = this;
|
|
}
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void itemUsed(PlayerInteractEvent evt) {
|
|
// For some reason, this called 4 times with all combinaisons of world.
|
|
// we're only interested in one call from the server side.
|
|
if (!worldObj.isRemote && !evt.entity.worldObj.isRemote) {
|
|
if (sequence == null) {
|
|
sequence = new Sequence(worldObj);
|
|
}
|
|
|
|
if (evt.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) {
|
|
ItemStack usedItem = evt.entityPlayer.inventory.getCurrentItem();
|
|
|
|
if (usedItem != null && !(usedItem.getItem() instanceof ItemTester)) {
|
|
registerAction(new SequenceActionUseItem(worldObj, usedItem, evt.x, evt.y, evt.z, evt.face));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@RPC(RPCSide.SERVER)
|
|
public synchronized void registerAction(SequenceAction action) {
|
|
sequence.actions.add(action);
|
|
updateInformation();
|
|
}
|
|
|
|
private void updateInformation() {
|
|
long time = sequence.actions.getLast().date - sequence.initialDate;
|
|
information = sequence.actions.size() + " actions in " + time + " cycles, starting " + sequence.initialDate;
|
|
RPCHandler.rpcBroadcastPlayers(this, "setInformation", information);
|
|
}
|
|
|
|
@RPC(RPCSide.CLIENT)
|
|
private void setInformation(String info) {
|
|
information = info;
|
|
}
|
|
|
|
@RPC (RPCSide.SERVER)
|
|
public synchronized void compress() {
|
|
long date = -1;
|
|
|
|
sequence.initialDate = worldObj.getTotalWorldTime();
|
|
|
|
for (SequenceAction action : sequence.actions) {
|
|
if (date == -1) {
|
|
date = sequence.initialDate;
|
|
} else {
|
|
date = date + 1;
|
|
}
|
|
|
|
action.date = date;
|
|
}
|
|
|
|
updateInformation();
|
|
}
|
|
|
|
@Override
|
|
public void invalidate() {
|
|
super.invalidate();
|
|
MinecraftForge.EVENT_BUS.unregister(this);
|
|
|
|
if (sequence != null) {
|
|
File sequenceFile = new File(testName + ".seq");
|
|
|
|
OutputStream gzOs = null;
|
|
try {
|
|
NBTTagCompound nbt = new NBTTagCompound();
|
|
sequence.writeToNBT(nbt);
|
|
|
|
FileOutputStream f = new FileOutputStream(sequenceFile);
|
|
f.write(CompressedStreamTools.compress(nbt));
|
|
f.close();
|
|
} catch (IOException ex) {
|
|
Logger.getLogger("Buildcraft").log(Level.SEVERE,
|
|
String.format("Failed to save Sequence file: %s %s", sequenceFile, ex.getMessage()));
|
|
} finally {
|
|
try {
|
|
if (gzOs != null) {
|
|
gzOs.close();
|
|
}
|
|
} catch (IOException e) {
|
|
}
|
|
}
|
|
}
|
|
|
|
currentTestCase = null;
|
|
}
|
|
|
|
@RPC(RPCSide.SERVER)
|
|
private void setName(String name) {
|
|
testName = name;
|
|
RPCHandler.rpcBroadcastPlayers(this, "setNameClient", name);
|
|
}
|
|
|
|
@RPC(RPCSide.CLIENT)
|
|
private void setNameClient(String name) {
|
|
testName = name;
|
|
}
|
|
}
|