More work on teleporters, implemented chunkloading
This commit is contained in:
parent
9c21621c06
commit
f9c10d9012
|
@ -1,6 +1,7 @@
|
||||||
package mekanism.api;
|
package mekanism.api;
|
||||||
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.world.ChunkCoordIntPair;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
|
|
||||||
|
@ -75,6 +76,15 @@ public class Chunk3D
|
||||||
return world.getChunkFromChunkCoords(xCoord, zCoord);
|
return world.getChunkFromChunkCoords(xCoord, zCoord);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns this Chunk3D in the Minecraft-based ChunkCoordIntPair format.
|
||||||
|
* @return this Chunk3D as a ChunkCoordIntPair
|
||||||
|
*/
|
||||||
|
public ChunkCoordIntPair toPair()
|
||||||
|
{
|
||||||
|
return new ChunkCoordIntPair(xCoord, zCoord);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Coord4D clone()
|
public Coord4D clone()
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,8 +5,10 @@ import java.util.List;
|
||||||
|
|
||||||
import mekanism.api.EnumColor;
|
import mekanism.api.EnumColor;
|
||||||
import mekanism.api.MekanismConfig.general;
|
import mekanism.api.MekanismConfig.general;
|
||||||
|
import mekanism.common.frequency.Frequency;
|
||||||
|
import mekanism.common.frequency.FrequencyManager;
|
||||||
|
import mekanism.common.tile.TileEntityTeleporter;
|
||||||
import mekanism.common.util.MekanismUtils;
|
import mekanism.common.util.MekanismUtils;
|
||||||
|
|
||||||
import net.minecraft.command.CommandBase;
|
import net.minecraft.command.CommandBase;
|
||||||
import net.minecraft.command.ICommandSender;
|
import net.minecraft.command.ICommandSender;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
@ -52,18 +54,32 @@ public class CommandMekanism extends CommandBase
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + " *Recent News: " + EnumColor.INDIGO + Mekanism.recentNews));
|
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + " *Recent News: " + EnumColor.INDIGO + Mekanism.recentNews));
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + "------------- " + EnumColor.DARK_BLUE + "[=======]" + EnumColor.GREY + " -------------"));
|
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + "------------- " + EnumColor.DARK_BLUE + "[=======]" + EnumColor.GREY + " -------------"));
|
||||||
}
|
}
|
||||||
else if(params.length == 1)
|
else if(params.length >= 1)
|
||||||
{
|
{
|
||||||
if(params[0].equalsIgnoreCase("help"))
|
if(params[0].equalsIgnoreCase("help"))
|
||||||
{
|
{
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + "------------- " + EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " -------------"));
|
if(params.length == 1)
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk" + EnumColor.GREY + " -- displays the main page."));
|
{
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk help" + EnumColor.GREY + " -- displays this guide."));
|
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + "------------- " + EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " -------------"));
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk version" + EnumColor.GREY + " -- displays the version number."));
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk" + EnumColor.GREY + " -- displays the main page."));
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk latest" + EnumColor.GREY + " -- displays the latest version number."));
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk help" + EnumColor.GREY + " -- displays this guide."));
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk news" + EnumColor.GREY + " -- displays most recent recent news."));
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk version" + EnumColor.GREY + " -- displays the version number."));
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk debug" + EnumColor.GREY + " -- toggles Mekanism's debug mode."));
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk latest" + EnumColor.GREY + " -- displays the latest version number."));
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + "------------- " + EnumColor.DARK_BLUE + "[=======]" + EnumColor.GREY + " -------------"));
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk news" + EnumColor.GREY + " -- displays most recent recent news."));
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk debug" + EnumColor.GREY + " -- toggles Mekanism's debug mode."));
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk teleporter" + EnumColor.GREY + " -- provides information on teleporters."));
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + "------------- " + EnumColor.DARK_BLUE + "[=======]" + EnumColor.GREY + " -------------"));
|
||||||
|
}
|
||||||
|
else if(params[1].equalsIgnoreCase("teleporter"))
|
||||||
|
{
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + "------------- " + EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " -------------"));
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk teleporter freq list" + EnumColor.GREY + " -- displays a list of the public frequencies."));
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk teleporter freq list [user]" + EnumColor.GREY + " -- displays a list of a certain user's private frequencies."));
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk teleporter freq delete [freq]" + EnumColor.GREY + " -- removes a frequency from the public list."));
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk teleporter freq delete [user] [freq]" + EnumColor.GREY + " -- removes a freqency from a certain user's private list."));
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " /mk teleporter freq deleteAll [user]" + EnumColor.GREY + " -- removes all frequencies owned by a certain user."));
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + "------------- " + EnumColor.DARK_BLUE + "[=======]" + EnumColor.GREY + " -------------"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(params[0].equalsIgnoreCase("version"))
|
else if(params[0].equalsIgnoreCase("version"))
|
||||||
{
|
{
|
||||||
|
@ -86,6 +102,96 @@ public class CommandMekanism extends CommandBase
|
||||||
{
|
{
|
||||||
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " The latest version for this mod is " + EnumColor.DARK_GREY + Mekanism.latestVersionNumber + EnumColor.GREY + "."));
|
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " The latest version for this mod is " + EnumColor.DARK_GREY + Mekanism.latestVersionNumber + EnumColor.GREY + "."));
|
||||||
}
|
}
|
||||||
|
else if(params[0].equalsIgnoreCase("teleporter"))
|
||||||
|
{
|
||||||
|
if(params.length == 2)
|
||||||
|
{
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " Invalid parameters."));
|
||||||
|
}
|
||||||
|
else if(params[1].equalsIgnoreCase("freq") || params[1].equalsIgnoreCase("frequencies"))
|
||||||
|
{
|
||||||
|
if(params[2].equalsIgnoreCase("list"))
|
||||||
|
{
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + "------------- " + EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " -------------"));
|
||||||
|
|
||||||
|
if(params.length == 3)
|
||||||
|
{
|
||||||
|
for(Frequency freq : Mekanism.publicTeleporters.getFrequencies())
|
||||||
|
{
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " - " + freq.name + EnumColor.GREY + " (" + freq.owner + ")"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
FrequencyManager manager = TileEntityTeleporter.loadManager(params[3].trim(), sender.getEntityWorld());
|
||||||
|
|
||||||
|
if(manager != null)
|
||||||
|
{
|
||||||
|
for(Frequency freq : manager.getFrequencies())
|
||||||
|
{
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.INDIGO + " - " + freq.name + EnumColor.GREY + " (" + freq.owner + ")"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " User profile doesn't exist."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.GREY + "------------- " + EnumColor.DARK_BLUE + "[=======]" + EnumColor.GREY + " -------------"));
|
||||||
|
}
|
||||||
|
else if(params[2].equalsIgnoreCase("delete"))
|
||||||
|
{
|
||||||
|
if(params.length == 4)
|
||||||
|
{
|
||||||
|
if(Mekanism.publicTeleporters.containsFrequency(params[3].trim()))
|
||||||
|
{
|
||||||
|
Mekanism.publicTeleporters.remove(params[3].trim());
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " Successfully removed frequency."));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " No such frequency found."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(params.length == 5)
|
||||||
|
{
|
||||||
|
FrequencyManager manager = TileEntityTeleporter.loadManager(params[3].trim(), sender.getEntityWorld());
|
||||||
|
|
||||||
|
if(manager != null)
|
||||||
|
{
|
||||||
|
if(manager.containsFrequency(params[4].trim()))
|
||||||
|
{
|
||||||
|
manager.remove(params[4].trim());
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " Successfully removed frequency."));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " No such frequency found."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " User profile doesn't exist."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(params[2].equalsIgnoreCase("deleteAll"))
|
||||||
|
{
|
||||||
|
if(params.length == 4)
|
||||||
|
{
|
||||||
|
String owner = params[3].trim();
|
||||||
|
FrequencyManager manager = TileEntityTeleporter.loadManager(owner, sender.getEntityWorld());
|
||||||
|
|
||||||
|
if(manager != null)
|
||||||
|
{
|
||||||
|
int amount = Mekanism.publicTeleporters.removeAll(owner);
|
||||||
|
amount += manager.removeAll(owner);
|
||||||
|
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " Successfully removed " + amount + " frequencies."));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sender.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " User profile doesn't exist."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else if(params[0].equalsIgnoreCase("debug"))
|
else if(params[0].equalsIgnoreCase("debug"))
|
||||||
{
|
{
|
||||||
Mekanism.debug = !Mekanism.debug;
|
Mekanism.debug = !Mekanism.debug;
|
||||||
|
|
|
@ -37,6 +37,7 @@ import mekanism.common.base.IChunkLoadHandler;
|
||||||
import mekanism.common.base.IFactory.RecipeType;
|
import mekanism.common.base.IFactory.RecipeType;
|
||||||
import mekanism.common.base.IModule;
|
import mekanism.common.base.IModule;
|
||||||
import mekanism.common.block.BlockMachine.MachineType;
|
import mekanism.common.block.BlockMachine.MachineType;
|
||||||
|
import mekanism.common.chunkloading.ChunkManager;
|
||||||
import mekanism.common.content.boiler.BoilerManager;
|
import mekanism.common.content.boiler.BoilerManager;
|
||||||
import mekanism.common.content.boiler.SynchronizedBoilerData;
|
import mekanism.common.content.boiler.SynchronizedBoilerData;
|
||||||
import mekanism.common.content.matrix.MatrixCache;
|
import mekanism.common.content.matrix.MatrixCache;
|
||||||
|
@ -92,6 +93,7 @@ import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.ChunkCoordIntPair;
|
import net.minecraft.world.ChunkCoordIntPair;
|
||||||
import net.minecraft.world.biome.BiomeGenBase;
|
import net.minecraft.world.biome.BiomeGenBase;
|
||||||
import net.minecraft.world.biome.WorldChunkManager;
|
import net.minecraft.world.biome.WorldChunkManager;
|
||||||
|
import net.minecraftforge.common.ForgeChunkManager;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
import net.minecraftforge.common.config.Configuration;
|
import net.minecraftforge.common.config.Configuration;
|
||||||
import net.minecraftforge.event.world.ChunkDataEvent;
|
import net.minecraftforge.event.world.ChunkDataEvent;
|
||||||
|
@ -1156,6 +1158,9 @@ public class Mekanism
|
||||||
//Get data from server.
|
//Get data from server.
|
||||||
new ThreadGetData();
|
new ThreadGetData();
|
||||||
|
|
||||||
|
//Register with ForgeChunkManager
|
||||||
|
ForgeChunkManager.setForcedChunkLoadingCallback(this, new ChunkManager());
|
||||||
|
|
||||||
//Register to receive subscribed events
|
//Register to receive subscribed events
|
||||||
FMLCommonHandler.instance().bus().register(this);
|
FMLCommonHandler.instance().bus().register(this);
|
||||||
MinecraftForge.EVENT_BUS.register(this);
|
MinecraftForge.EVENT_BUS.register(this);
|
||||||
|
|
|
@ -780,6 +780,20 @@ public class BlockBasic extends Block implements IBlockCTM, ICustomBlockIcon
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBlockAdded(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
TileEntity tileEntity = world.getTileEntity(x, y, z);
|
||||||
|
|
||||||
|
if(!world.isRemote)
|
||||||
|
{
|
||||||
|
if(tileEntity instanceof TileEntityBasicBlock)
|
||||||
|
{
|
||||||
|
((TileEntityBasicBlock)tileEntity).onAdded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileEntity createTileEntity(World world, int metadata)
|
public TileEntity createTileEntity(World world, int metadata)
|
||||||
|
|
|
@ -980,6 +980,20 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds, IPer
|
||||||
|
|
||||||
return itemStack;
|
return itemStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBlockAdded(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
TileEntity tileEntity = world.getTileEntity(x, y, z);
|
||||||
|
|
||||||
|
if(!world.isRemote)
|
||||||
|
{
|
||||||
|
if(tileEntity instanceof TileEntityBasicBlock)
|
||||||
|
{
|
||||||
|
((TileEntityBasicBlock)tileEntity).onAdded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ItemStack dismantleBlock(World world, int x, int y, int z, boolean returnBlock)
|
public ItemStack dismantleBlock(World world, int x, int y, int z, boolean returnBlock)
|
||||||
{
|
{
|
||||||
|
|
29
src/main/java/mekanism/common/chunkloading/ChunkManager.java
Normal file
29
src/main/java/mekanism/common/chunkloading/ChunkManager.java
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
package mekanism.common.chunkloading;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.common.ForgeChunkManager.LoadingCallback;
|
||||||
|
import net.minecraftforge.common.ForgeChunkManager.Ticket;
|
||||||
|
|
||||||
|
public class ChunkManager implements LoadingCallback
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void ticketsLoaded(List<Ticket> tickets, World world)
|
||||||
|
{
|
||||||
|
for(Ticket ticket : tickets)
|
||||||
|
{
|
||||||
|
int x = ticket.getModData().getInteger("xCoord");
|
||||||
|
int y = ticket.getModData().getInteger("yCoord");
|
||||||
|
int z = ticket.getModData().getInteger("zCoord");
|
||||||
|
|
||||||
|
TileEntity tileEntity = world.getTileEntity(x, y, z);
|
||||||
|
|
||||||
|
if(tileEntity instanceof IChunkLoader)
|
||||||
|
{
|
||||||
|
((IChunkLoader)tileEntity).forceChunks(ticket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package mekanism.common.chunkloading;
|
||||||
|
|
||||||
|
import net.minecraftforge.common.ForgeChunkManager.Ticket;
|
||||||
|
|
||||||
|
public interface IChunkLoader
|
||||||
|
{
|
||||||
|
public void forceChunks(Ticket ticket);
|
||||||
|
}
|
|
@ -1,117 +0,0 @@
|
||||||
package mekanism.common.classloading;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Enumeration;
|
|
||||||
import java.util.jar.JarEntry;
|
|
||||||
import java.util.jar.JarFile;
|
|
||||||
|
|
||||||
import mekanism.common.Mekanism;
|
|
||||||
|
|
||||||
public class ClassEnumerator
|
|
||||||
{
|
|
||||||
private static Class<?> loadClass(String className)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
return Class.forName(className);
|
|
||||||
} catch(ClassNotFoundException e) {
|
|
||||||
throw new RuntimeException("Unexpected ClassNotFoundException loading class '" + className + "'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void processDir(File directory, String pkgname, ArrayList<Class<?>> classes)
|
|
||||||
{
|
|
||||||
String[] files = directory.list();
|
|
||||||
|
|
||||||
for(int i = 0; i < files.length; i++)
|
|
||||||
{
|
|
||||||
String fileName = files[i];
|
|
||||||
String className = null;
|
|
||||||
|
|
||||||
if(fileName.endsWith(".class"))
|
|
||||||
{
|
|
||||||
className = pkgname + '.' + fileName.substring(0, fileName.length() - 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(className != null)
|
|
||||||
{
|
|
||||||
classes.add(loadClass(className));
|
|
||||||
}
|
|
||||||
|
|
||||||
File subdir = new File(directory, fileName);
|
|
||||||
|
|
||||||
if(subdir.isDirectory())
|
|
||||||
{
|
|
||||||
processDir(subdir, pkgname + '.' + fileName, classes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void processJar(URL resource, String pkgname, ArrayList<Class<?>> classes)
|
|
||||||
{
|
|
||||||
String relPath = pkgname.replace('.', '/');
|
|
||||||
String resPath = resource.getPath();
|
|
||||||
String jarPath = resPath.replaceFirst("[.]jar[!].*", ".jar").replaceFirst("file:", "");
|
|
||||||
|
|
||||||
JarFile jarFile;
|
|
||||||
|
|
||||||
try {
|
|
||||||
jarFile = new JarFile(jarPath);
|
|
||||||
} catch(IOException e) {
|
|
||||||
throw new RuntimeException("Unexpected IOException reading JAR File '" + jarPath + "'", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
Enumeration<JarEntry> entries = jarFile.entries();
|
|
||||||
|
|
||||||
while(entries.hasMoreElements())
|
|
||||||
{
|
|
||||||
JarEntry entry = entries.nextElement();
|
|
||||||
String entryName = entry.getName();
|
|
||||||
String className = null;
|
|
||||||
|
|
||||||
if(entryName.endsWith(".class") && entryName.startsWith(relPath) && entryName.length() > (relPath.length() + "/".length()))
|
|
||||||
{
|
|
||||||
className = entryName.replace('/', '.').replace('\\', '.').replace(".class", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(className != null)
|
|
||||||
{
|
|
||||||
classes.add(loadClass(className));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ArrayList<Class<?>> getClassesForPackage(Package pkg)
|
|
||||||
{
|
|
||||||
ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
|
|
||||||
|
|
||||||
try {
|
|
||||||
String pkgname = pkg.getName();
|
|
||||||
String relPath = pkgname.replace('.', '/');
|
|
||||||
|
|
||||||
URL resource = ClassLoader.getSystemClassLoader().getResource(relPath);
|
|
||||||
|
|
||||||
if(resource == null)
|
|
||||||
{
|
|
||||||
throw new RuntimeException("Unexpected problem: No resource for " + relPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
resource.getPath();
|
|
||||||
|
|
||||||
if(resource.toString().startsWith("jar:"))
|
|
||||||
{
|
|
||||||
processJar(resource, pkgname, classes);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
processDir(new File(resource.getPath()), pkgname, classes);
|
|
||||||
}
|
|
||||||
} catch(Exception e) {
|
|
||||||
Mekanism.logger.error("Error while loading classes in package " + pkg);
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return classes;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -82,6 +82,39 @@ public class FrequencyManager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void remove(String name)
|
||||||
|
{
|
||||||
|
for(Iterator<Frequency> iter = getFrequencies().iterator(); iter.hasNext();)
|
||||||
|
{
|
||||||
|
Frequency iterFreq = iter.next();
|
||||||
|
|
||||||
|
if(iterFreq.name.equals(name))
|
||||||
|
{
|
||||||
|
iter.remove();
|
||||||
|
dataHandler.markDirty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int removeAll(String user)
|
||||||
|
{
|
||||||
|
int amount = 0;
|
||||||
|
|
||||||
|
for(Iterator<Frequency> iter = getFrequencies().iterator(); iter.hasNext();)
|
||||||
|
{
|
||||||
|
Frequency iterFreq = iter.next();
|
||||||
|
|
||||||
|
if(iterFreq.owner.equals(user))
|
||||||
|
{
|
||||||
|
iter.remove();
|
||||||
|
dataHandler.markDirty();
|
||||||
|
amount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
|
||||||
public void deactivate(Coord4D coord)
|
public void deactivate(Coord4D coord)
|
||||||
{
|
{
|
||||||
for(Frequency freq : frequencies)
|
for(Frequency freq : frequencies)
|
||||||
|
@ -137,6 +170,25 @@ public class FrequencyManager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FrequencyManager loadOnly(World world, String owner, Class<? extends Frequency> freqClass)
|
||||||
|
{
|
||||||
|
FrequencyManager manager = new FrequencyManager(freqClass);
|
||||||
|
String name = manager.getName();
|
||||||
|
|
||||||
|
FrequencyDataHandler handler = (FrequencyDataHandler)world.perWorldStorage.loadData(FrequencyDataHandler.class, name);
|
||||||
|
|
||||||
|
if(handler == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
manager.dataHandler = handler;
|
||||||
|
manager.dataHandler.syncManager();
|
||||||
|
|
||||||
|
return manager;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Set<Frequency> getFrequencies()
|
public Set<Frequency> getFrequencies()
|
||||||
{
|
{
|
||||||
return frequencies;
|
return frequencies;
|
||||||
|
@ -148,9 +200,17 @@ public class FrequencyManager
|
||||||
dataHandler.markDirty();
|
dataHandler.markDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean containsFrequency(Frequency freq)
|
public boolean containsFrequency(String name)
|
||||||
{
|
{
|
||||||
return frequencies.contains(freq);
|
for(Frequency freq : frequencies)
|
||||||
|
{
|
||||||
|
if(freq.name.equals(name))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeFrequencies(ArrayList data)
|
public void writeFrequencies(ArrayList data)
|
||||||
|
|
|
@ -8,12 +8,13 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import mekanism.api.Chunk3D;
|
||||||
import mekanism.api.Coord4D;
|
import mekanism.api.Coord4D;
|
||||||
import mekanism.api.EnumColor;
|
|
||||||
import mekanism.common.Mekanism;
|
import mekanism.common.Mekanism;
|
||||||
import mekanism.common.MekanismBlocks;
|
import mekanism.common.MekanismBlocks;
|
||||||
import mekanism.common.PacketHandler;
|
import mekanism.common.PacketHandler;
|
||||||
import mekanism.common.block.BlockMachine.MachineType;
|
import mekanism.common.block.BlockMachine.MachineType;
|
||||||
|
import mekanism.common.chunkloading.IChunkLoader;
|
||||||
import mekanism.common.frequency.Frequency;
|
import mekanism.common.frequency.Frequency;
|
||||||
import mekanism.common.frequency.FrequencyManager;
|
import mekanism.common.frequency.FrequencyManager;
|
||||||
import mekanism.common.network.PacketPortalFX.PortalFXMessage;
|
import mekanism.common.network.PacketPortalFX.PortalFXMessage;
|
||||||
|
@ -32,6 +33,9 @@ import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.util.AxisAlignedBB;
|
import net.minecraft.util.AxisAlignedBB;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.WorldServer;
|
import net.minecraft.world.WorldServer;
|
||||||
|
import net.minecraftforge.common.ForgeChunkManager;
|
||||||
|
import net.minecraftforge.common.ForgeChunkManager.Ticket;
|
||||||
|
import net.minecraftforge.common.ForgeChunkManager.Type;
|
||||||
import cpw.mods.fml.common.FMLCommonHandler;
|
import cpw.mods.fml.common.FMLCommonHandler;
|
||||||
import cpw.mods.fml.common.Optional.Interface;
|
import cpw.mods.fml.common.Optional.Interface;
|
||||||
import cpw.mods.fml.common.Optional.Method;
|
import cpw.mods.fml.common.Optional.Method;
|
||||||
|
@ -43,7 +47,7 @@ import dan200.computercraft.api.peripheral.IComputerAccess;
|
||||||
import dan200.computercraft.api.peripheral.IPeripheral;
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
|
|
||||||
@Interface(iface = "dan200.computercraft.api.peripheral.IPeripheral", modid = "ComputerCraft")
|
@Interface(iface = "dan200.computercraft.api.peripheral.IPeripheral", modid = "ComputerCraft")
|
||||||
public class TileEntityTeleporter extends TileEntityElectricBlock implements IPeripheral
|
public class TileEntityTeleporter extends TileEntityElectricBlock implements IPeripheral, IChunkLoader
|
||||||
{
|
{
|
||||||
private MinecraftServer server = MinecraftServer.getServer();
|
private MinecraftServer server = MinecraftServer.getServer();
|
||||||
|
|
||||||
|
@ -63,6 +67,8 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements IPe
|
||||||
|
|
||||||
public List<Frequency> publicCache = new ArrayList<Frequency>();
|
public List<Frequency> publicCache = new ArrayList<Frequency>();
|
||||||
public List<Frequency> privateCache = new ArrayList<Frequency>();
|
public List<Frequency> privateCache = new ArrayList<Frequency>();
|
||||||
|
|
||||||
|
public Ticket chunkTicket;
|
||||||
|
|
||||||
/** This teleporter's current status. */
|
/** This teleporter's current status. */
|
||||||
public byte status = 0;
|
public byte status = 0;
|
||||||
|
@ -85,6 +91,20 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements IPe
|
||||||
|
|
||||||
if(!worldObj.isRemote)
|
if(!worldObj.isRemote)
|
||||||
{
|
{
|
||||||
|
if(chunkTicket == null)
|
||||||
|
{
|
||||||
|
Ticket ticket = ForgeChunkManager.requestTicket(Mekanism.instance, worldObj, Type.NORMAL);
|
||||||
|
|
||||||
|
if(ticket != null)
|
||||||
|
{
|
||||||
|
ticket.getModData().setInteger("xCoord", xCoord);
|
||||||
|
ticket.getModData().setInteger("yCoord", yCoord);
|
||||||
|
ticket.getModData().setInteger("zCoord", zCoord);
|
||||||
|
|
||||||
|
forceChunks(ticket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FrequencyManager manager = getManager(frequency);
|
FrequencyManager manager = getManager(frequency);
|
||||||
|
|
||||||
if(manager != null)
|
if(manager != null)
|
||||||
|
@ -145,6 +165,7 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements IPe
|
||||||
}
|
}
|
||||||
|
|
||||||
FrequencyManager manager = getManager(new Frequency(name, null).setPublic(publicFreq));
|
FrequencyManager manager = getManager(new Frequency(name, null).setPublic(publicFreq));
|
||||||
|
manager.deactivate(Coord4D.get(this));
|
||||||
|
|
||||||
for(Frequency freq : manager.getFrequencies())
|
for(Frequency freq : manager.getFrequencies())
|
||||||
{
|
{
|
||||||
|
@ -187,6 +208,16 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements IPe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FrequencyManager loadManager(String owner, World world)
|
||||||
|
{
|
||||||
|
if(Mekanism.privateTeleporters.containsKey(owner))
|
||||||
|
{
|
||||||
|
return Mekanism.privateTeleporters.get(owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FrequencyManager.loadOnly(world, owner, Frequency.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChunkUnload()
|
public void onChunkUnload()
|
||||||
{
|
{
|
||||||
|
@ -208,13 +239,18 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements IPe
|
||||||
{
|
{
|
||||||
super.invalidate();
|
super.invalidate();
|
||||||
|
|
||||||
if(!worldObj.isRemote && frequency != null)
|
if(!worldObj.isRemote)
|
||||||
{
|
{
|
||||||
FrequencyManager manager = getManager(frequency);
|
releaseChunks();
|
||||||
|
|
||||||
if(manager != null)
|
if(frequency != null)
|
||||||
{
|
{
|
||||||
manager.deactivate(Coord4D.get(this));
|
FrequencyManager manager = getManager(frequency);
|
||||||
|
|
||||||
|
if(manager != null)
|
||||||
|
{
|
||||||
|
manager.deactivate(Coord4D.get(this));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -679,4 +715,22 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements IPe
|
||||||
{
|
{
|
||||||
return INFINITE_EXTENT_AABB;
|
return INFINITE_EXTENT_AABB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forceChunks(Ticket ticket)
|
||||||
|
{
|
||||||
|
releaseChunks();
|
||||||
|
chunkTicket = ticket;
|
||||||
|
|
||||||
|
ForgeChunkManager.forceChunk(chunkTicket, new Chunk3D(Coord4D.get(this)).toPair());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void releaseChunks()
|
||||||
|
{
|
||||||
|
if(chunkTicket != null)
|
||||||
|
{
|
||||||
|
ForgeChunkManager.releaseTicket(chunkTicket);
|
||||||
|
chunkTicket = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -424,6 +424,20 @@ public class BlockGenerator extends BlockContainer implements ISpecialBounds, IP
|
||||||
setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
|
setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBlockAdded(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
TileEntity tileEntity = world.getTileEntity(x, y, z);
|
||||||
|
|
||||||
|
if(!world.isRemote)
|
||||||
|
{
|
||||||
|
if(tileEntity instanceof TileEntityBasicBlock)
|
||||||
|
{
|
||||||
|
((TileEntityBasicBlock)tileEntity).onAdded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest)
|
public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest)
|
||||||
|
|
Loading…
Reference in a new issue