package micdoodle8.mods.galacticraft.core.util;
import micdoodle8.mods.galacticraft.core.Constants;
import micdoodle8.mods.galacticraft.core.GalacticraftCore;
import micdoodle8.mods.galacticraft.core.entities.EntityLanderBase;
import micdoodle8.mods.galacticraft.core.inventory.ContainerBuggy;
import micdoodle8.mods.galacticraft.core.inventory.ContainerParaChest;
import micdoodle8.mods.galacticraft.core.network.PacketSimple;
import micdoodle8.mods.galacticraft.core.network.PacketSimple.EnumSimplePacket;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.resources.Language;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.launchwrapper.Launch;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockPos;
import net.minecraft.util.MathHelper;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.WorldServer;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.registry.EntityRegistry;
import net.minecraftforge.fml.common.registry.LanguageRegistry;
import net.minecraftforge.fml.relauncher.Side;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
public class GCCoreUtil
{
public static int nextID = 0;
private static boolean deobfuscated;
static
{
try
{
deobfuscated = Launch.classLoader.getClassBytes("net.minecraft.world.World") != null;
}
catch (final Exception e)
{
e.printStackTrace();
}
}
public static boolean isDeobfuscated()
{
return deobfuscated;
}
public static void openBuggyInv(EntityPlayerMP player, IInventory buggyInv, int type)
{
player.getNextWindowId();
player.closeContainer();
int id = player.currentWindowId;
GalacticraftCore.packetPipeline.sendTo(new PacketSimple(EnumSimplePacket.C_OPEN_PARACHEST_GUI, GCCoreUtil.getDimensionID(player.worldObj), new Object[] { id, 0, 0 }), player);
player.openContainer = new ContainerBuggy(player.inventory, buggyInv, type, player);
player.openContainer.windowId = id;
player.openContainer.onCraftGuiOpened(player);
}
public static void openParachestInv(EntityPlayerMP player, EntityLanderBase landerInv)
{
player.getNextWindowId();
player.closeContainer();
int windowId = player.currentWindowId;
GalacticraftCore.packetPipeline.sendTo(new PacketSimple(EnumSimplePacket.C_OPEN_PARACHEST_GUI, GCCoreUtil.getDimensionID(player.worldObj), new Object[] { windowId, 1, landerInv.getEntityId() }), player);
player.openContainer = new ContainerParaChest(player.inventory, landerInv, player);
player.openContainer.windowId = windowId;
player.openContainer.onCraftGuiOpened(player);
}
public static int nextInternalID()
{
GCCoreUtil.nextID++;
return GCCoreUtil.nextID - 1;
}
public static void registerGalacticraftCreature(Class<? extends Entity> var0, String var1, int back, int fore)
{
registerGalacticraftNonMobEntity(var0, var1, 80, 3, true);
int nextEggID = getNextValidEggID();
if (nextEggID < 65536)
{
EntityList.idToClassMapping.put(nextEggID, var0);
EntityList.classToIDMapping.put(var0, nextEggID);
EntityList.entityEggs.put(nextEggID, new EntityList.EntityEggInfo(nextEggID, back, fore));
}
}
public static int getNextValidEggID()
{
int eggID = 255;
//Non-global entity IDs - for egg ID purposes - can be greater than 255
//The spawn egg will have this metadata. Metadata up to 65535 is acceptable (see potions).
do
{
eggID++;
}
while (EntityList.getClassFromID(eggID) != null);
return eggID;
}
public static void registerGalacticraftNonMobEntity(Class<? extends Entity> var0, String var1, int trackingDistance, int updateFreq, boolean sendVel)
{
if (GCCoreUtil.getEffectiveSide() == Side.CLIENT)
{
LanguageRegistry.instance().addStringLocalization("entity.galacticraftcore." + var1 + ".name", "en_US", GCCoreUtil.translate("entity." + var1 + ".name"));
LanguageRegistry.instance().addStringLocalization("entity.GalacticraftCore." + var1 + ".name", GCCoreUtil.translate("entity." + var1 + ".name"));
}
EntityRegistry.registerModEntity(var0, var1, nextInternalID(), GalacticraftCore.instance, trackingDistance, updateFreq, sendVel);
}
public static void registerGalacticraftItem(String key, Item item)
{
GalacticraftCore.itemList.put(key, new ItemStack(item));
}
public static void registerGalacticraftItem(String key, Item item, int metadata)
{
GalacticraftCore.itemList.put(key, new ItemStack(item, 1, metadata));
}
public static void registerGalacticraftItem(String key, ItemStack stack)
{
GalacticraftCore.itemList.put(key, stack);
}
public static void registerGalacticraftBlock(String key, Block block)
{
GalacticraftCore.blocksList.put(key, new ItemStack(block));
}
public static void registerGalacticraftBlock(String key, Block block, int metadata)
{
GalacticraftCore.blocksList.put(key, new ItemStack(block, 1, metadata));
}
public static void registerGalacticraftBlock(String key, ItemStack stack)
{
GalacticraftCore.blocksList.put(key, stack);
}
public static String translate(String key)
{
String result = StatCollector.translateToLocal(key);
int comment = result.indexOf('#');
String ret = (comment > 0) ? result.substring(0, comment).trim() : result;
for (int i = 0; i < key.length(); ++i)
{
Character c = key.charAt(i);
if (Character.isUpperCase(c))
{
System.err.println(ret);
}
}
return ret;
}
public static List<String> translateWithSplit(String key)
{
String translated = translate(key);
int comment = translated.indexOf('#');
translated = (comment > 0) ? translated.substring(0, comment).trim() : translated;
return Arrays.asList(translated.split("\\$"));
}
public static String translateWithFormat(String key, Object... values)
{
String result = StatCollector.translateToLocalFormatted(key, values);
int comment = result.indexOf('#');
String ret = (comment > 0) ? result.substring(0, comment).trim() : result;
for (int i = 0; i < key.length(); ++i)
{
Character c = key.charAt(i);
if (Character.isUpperCase(c))
{
System.err.println(ret);
}
}
return ret;
}
public static void drawStringRightAligned(String string, int x, int y, int color, FontRenderer fontRendererObj)
{
fontRendererObj.drawString(string, x - fontRendererObj.getStringWidth(string), y, color);
}
public static void drawStringCentered(String string, int x, int y, int color, FontRenderer fontRendererObj)
{
fontRendererObj.drawString(string, x - fontRendererObj.getStringWidth(string) / 2, y, color);
}
public static String lowerCaseNoun(String string)
{
Language l = Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage();
if (l.getLanguageCode().equals("de_DE"))
{
return string;
}
return GCCoreUtil.translate(string).toLowerCase();
}
public static int getDimensionID(World world)
{
return world.provider.getDimensionId();
}
public static int getDimensionID(WorldProvider provider)
{
return provider.getDimensionId();
}
public static int getDimensionID(TileEntity tileEntity)
{
return tileEntity.getWorld().provider.getDimensionId();
}
public static void sendToAllDimensions(EnumSimplePacket packetType, Object[] data)
{
for (WorldServer world : MinecraftServer.getServer().worldServers)
{
int id = getDimensionID(world);
GalacticraftCore.packetPipeline.sendToDimension(new PacketSimple(packetType, id, data), id);
}
}
public static void sendToAllAround(PacketSimple packet, World world, int dimID, BlockPos pos, double radius)
{
double x = pos.getX() + 0.5D;
double y = pos.getY() + 0.5D;
double z = pos.getZ() + 0.5D;
double r2 = radius * radius;
for (EntityPlayer playerMP : world.playerEntities)
{
if (playerMP.dimension == dimID)
{
final double dx = x - playerMP.posX;
final double dy = y - playerMP.posY;
final double dz = z - playerMP.posZ;
if (dx * dx + dy * dy + dz * dz < r2)
{
GalacticraftCore.packetPipeline.sendTo(packet, (EntityPlayerMP) playerMP);
}
}
}
}
// public static void sortBlock(Block block, int meta, StackSorted beforeStack)
// {
// StackSorted newStack = new StackSorted(Item.getItemFromBlock(block), meta);
//
// // Remove duplicates
// for (Iterator<StackSorted> it = GalacticraftCore.itemOrderListBlocks.iterator(); it.hasNext();)
// {
// StackSorted stack = it.next();
// if (stack.equals(newStack))
// {
// it.remove();
// }
// }
//
// if (beforeStack == null)
// {
// GalacticraftCore.itemOrderListBlocks.add(newStack);
// }
// else
// {
// for (int i = 0; i < GalacticraftCore.itemOrderListBlocks.size(); ++i)
// {
// if (GalacticraftCore.itemOrderListBlocks.get(i).equals(beforeStack))
// {
// GalacticraftCore.itemOrderListBlocks.add(i + 1, newStack);
// return;
// }
// }
//
// throw new RuntimeException("Could not find block to insert before: " + beforeStack);
// }
// }
//
// public static void sortItem(Item item, int meta, StackSorted beforeStack)
// {
// StackSorted newStack = new StackSorted(item, meta);
//
// // Remove duplicates
// for (Iterator<StackSorted> it = GalacticraftCore.itemOrderListBlocks.iterator(); it.hasNext();)
// {
// StackSorted stack = it.next();
// if (stack.equals(newStack))
// {
// it.remove();
// }
// }
//
// if (beforeStack == null)
// {
// GalacticraftCore.itemOrderListItems.add(newStack);
// }
// else
// {
// for (int i = 0; i < GalacticraftCore.itemOrderListItems.size(); ++i)
// {
// if (GalacticraftCore.itemOrderListItems.get(i).equals(beforeStack))
// {
// GalacticraftCore.itemOrderListItems.add(i + 1, newStack);
// break;
// }
// }
// }
// }
/**
* Call this to obtain a seeded random which will be the SAME on
* client and server. This means EntityItems won't jump position, for example.
*/
public static Random getRandom(BlockPos pos)
{
long blockSeed = ((pos.getY() << 28) + pos.getX() + 30000000 << 28) + pos.getZ() + 30000000;
return new Random(blockSeed);
}
/**
* Returns the angle of the compass (0 - 360 degrees) needed to reach the given position offset
*/
public static float getAngleForRelativePosition(double nearestX, double nearestZ)
{
return ((float) MathHelper.atan2(nearestX, -nearestZ) * Constants.RADIANS_TO_DEGREES + 360F) % 360F;
}
/**
* Custom getEffectiveSide method, covering more cases than FMLCommonHandler
*/
public static Side getEffectiveSide()
{
if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER || Thread.currentThread().getName().startsWith("Netty Epoll Server IO"))
{
return Side.SERVER;
}
return Side.CLIENT;
}
public static List<BlockPos> getPositionsAdjoining(BlockPos pos)
{
LinkedList<BlockPos> result = new LinkedList<>();
int x = pos.getX();
int y = pos.getY();
int z = pos.getZ();
if (y > 0) result.add(new BlockPos(x, y - 1, z));
if (y < 255) result.add(new BlockPos(x, y + 1, z));
result.add(new BlockPos(x, y, z - 1));
result.add(new BlockPos(x, y, z + 1));
result.add(new BlockPos(x - 1, y, z));
result.add(new BlockPos(x + 1, y, z));
return result;
}
public static void getPositionsAdjoining(int x, int y, int z, List<BlockPos> result)
{
result.clear();
if (y > 0) result.add(new BlockPos(x, y - 1, z));
if (y < 255) result.add(new BlockPos(x, y + 1, z));
result.add(new BlockPos(x, y, z - 1));
result.add(new BlockPos(x, y, z + 1));
result.add(new BlockPos(x - 1, y, z));
result.add(new BlockPos(x + 1, y, z));
}
public static void getPositionsAdjoiningLoaded(int x, int y, int z, List<BlockPos> result, World world)
{
result.clear();
if (y > 0) result.add(new BlockPos(x, y - 1, z));
if (y < 255) result.add(new BlockPos(x, y + 1, z));
if ((z - 1) % 16 < 15 || isChunkLoaded(world, x >> 4, (z - 1) >> 4, false)) result.add(new BlockPos(x, y, z - 1));
if ((z + 1) % 16 > 0 || isChunkLoaded(world, x >> 4, (z + 1) >> 4, false)) result.add(new BlockPos(x, y, z + 1));
if ((x - 1) % 16 < 15 || isChunkLoaded(world, (x - 1) >> 4, z >> 4, false)) result.add(new BlockPos(x - 1, y, z));
if ((x + 1) % 16 > 0 || isChunkLoaded(world, (x + 1) >> 4, z >> 4, false)) result.add(new BlockPos(x + 1, y, z));
}
public static boolean isChunkLoaded(World world, int cx, int cz, boolean allowEmpty)
{
return world.getChunkProvider().chunkExists(cx, cz) && (allowEmpty || !world.getChunkProvider().provideChunk(cx, cz).isEmpty());
}
public static void getPositionsAdjoining(BlockPos pos, List<BlockPos> result)
{
result.clear();
int x = pos.getX();
int y = pos.getY();
int z = pos.getZ();
if (y > 0) result.add(new BlockPos(x, y - 1, z));
if (y < 255) result.add(new BlockPos(x, y + 1, z));
result.add(new BlockPos(x, y, z - 1));
result.add(new BlockPos(x, y, z + 1));
result.add(new BlockPos(x - 1, y, z));
result.add(new BlockPos(x + 1, y, z));
}
}