buildcraft/tests/buildcraft/tests/testcase/TileTestCase.java
SpaceToad 9577c53313 Fixed gate extension ids synchronization, for #1895.
Added a new concept of NetworkId, allowing to transfer ids over the network
instead of strings.
RPCs are now all handled the same way (except RPC Pipes, to be completed when
actually used).
2014-06-22 11:49:59 +02:00

165 lines
4.2 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 = "test clear";
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() {
if (sequence.actions.size() > 0) {
long time = sequence.actions.getLast().date - sequence.initialDate;
information = sequence.actions.size() + " actions in " + time + " cycles, starting " + sequence.initialDate;
} else {
information = "test clear";
}
RPCHandler.rpcBroadcastWorldPlayers(worldObj, 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);
currentTestCase = null;
}
@RPC(RPCSide.SERVER)
private void save() {
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) {
}
}
}
sequence.actions.clear();
updateInformation();
}
@RPC(RPCSide.SERVER)
private void setName(String name) {
testName = name;
RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "setNameClient", name);
}
@RPC(RPCSide.CLIENT)
private void setNameClient(String name) {
testName = name;
}
}