Typo FlipableIcon
This commit is contained in:
parent
697d96fa54
commit
13e1bc772d
8 changed files with 192 additions and 192 deletions
block
client
parts/networking
|
@ -4,6 +4,7 @@ import java.util.ArrayList;
|
|||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
|
||||
import appeng.client.texture.FlippableIcon;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockContainer;
|
||||
import net.minecraft.block.material.Material;
|
||||
|
@ -36,7 +37,6 @@ import appeng.block.networking.BlockCableBus;
|
|||
import appeng.client.render.BaseBlockRender;
|
||||
import appeng.client.render.BlockRenderInfo;
|
||||
import appeng.client.render.WorldRender;
|
||||
import appeng.client.texture.FlipableIcon;
|
||||
import appeng.client.texture.MissingIcon;
|
||||
import appeng.core.features.AEFeature;
|
||||
import appeng.core.features.AEFeatureHandler;
|
||||
|
@ -94,11 +94,11 @@ public class AEBaseBlock extends BlockContainer implements IAEFeature
|
|||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private FlipableIcon optionaIcon(IIconRegister ir, String Name, IIcon substitute)
|
||||
private FlippableIcon optionaIcon(IIconRegister ir, String Name, IIcon substitute)
|
||||
{
|
||||
// if the input is an flippable IIcon find the original.
|
||||
while (substitute instanceof FlipableIcon)
|
||||
substitute = ((FlipableIcon) substitute).getOriginal();
|
||||
while (substitute instanceof FlippableIcon)
|
||||
substitute = ((FlippableIcon) substitute).getOriginal();
|
||||
|
||||
if ( substitute != null )
|
||||
{
|
||||
|
@ -110,15 +110,15 @@ public class AEBaseBlock extends BlockContainer implements IAEFeature
|
|||
|
||||
IResource res = Minecraft.getMinecraft().getResourceManager().getResource( resLoc );
|
||||
if ( res != null )
|
||||
return new FlipableIcon( ir.registerIcon( Name ) );
|
||||
return new FlippableIcon( ir.registerIcon( Name ) );
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
return new FlipableIcon( substitute );
|
||||
return new FlippableIcon( substitute );
|
||||
}
|
||||
}
|
||||
|
||||
return new FlipableIcon( ir.registerIcon( Name ) );
|
||||
return new FlippableIcon( ir.registerIcon( Name ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -126,13 +126,13 @@ public class AEBaseBlock extends BlockContainer implements IAEFeature
|
|||
public void registerBlockIcons(IIconRegister iconRegistry)
|
||||
{
|
||||
BlockRenderInfo info = getRendererInstance();
|
||||
FlipableIcon topIcon;
|
||||
FlipableIcon bottomIcon;
|
||||
FlipableIcon sideIcon;
|
||||
FlipableIcon eastIcon;
|
||||
FlipableIcon westIcon;
|
||||
FlipableIcon southIcon;
|
||||
FlipableIcon northIcon;
|
||||
FlippableIcon topIcon;
|
||||
FlippableIcon bottomIcon;
|
||||
FlippableIcon sideIcon;
|
||||
FlippableIcon eastIcon;
|
||||
FlippableIcon westIcon;
|
||||
FlippableIcon southIcon;
|
||||
FlippableIcon northIcon;
|
||||
|
||||
this.blockIcon = topIcon = optionaIcon( iconRegistry, this.getTextureName(), null );
|
||||
bottomIcon = optionaIcon( iconRegistry, this.getTextureName() + "Bottom", topIcon );
|
||||
|
@ -148,7 +148,7 @@ public class AEBaseBlock extends BlockContainer implements IAEFeature
|
|||
public void registerNoIcons()
|
||||
{
|
||||
BlockRenderInfo info = getRendererInstance();
|
||||
FlipableIcon i = new FlipableIcon( new MissingIcon( this ) );
|
||||
FlippableIcon i = new FlippableIcon( new MissingIcon( this ) );
|
||||
info.updateIcons( i, i, i, i, i, i );
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package appeng.client.render;
|
||||
|
||||
import appeng.client.texture.FlippableIcon;
|
||||
import appeng.client.texture.TmpFlippableIcon;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import appeng.client.texture.FlipableIcon;
|
||||
import appeng.client.texture.TmpFlipableIcon;
|
||||
|
||||
public class BlockRenderInfo
|
||||
{
|
||||
|
@ -15,21 +15,21 @@ public class BlockRenderInfo
|
|||
final public BaseBlockRender rendererInstance;
|
||||
|
||||
private boolean useTmp = false;
|
||||
private TmpFlipableIcon tmpTopIcon = new TmpFlipableIcon();
|
||||
private TmpFlipableIcon tmpBottomIcon = new TmpFlipableIcon();
|
||||
private TmpFlipableIcon tmpSouthIcon = new TmpFlipableIcon();
|
||||
private TmpFlipableIcon tmpNorthIcon = new TmpFlipableIcon();
|
||||
private TmpFlipableIcon tmpEastIcon = new TmpFlipableIcon();
|
||||
private TmpFlipableIcon tmpWestIcon = new TmpFlipableIcon();
|
||||
private TmpFlippableIcon tmpTopIcon = new TmpFlippableIcon();
|
||||
private TmpFlippableIcon tmpBottomIcon = new TmpFlippableIcon();
|
||||
private TmpFlippableIcon tmpSouthIcon = new TmpFlippableIcon();
|
||||
private TmpFlippableIcon tmpNorthIcon = new TmpFlippableIcon();
|
||||
private TmpFlippableIcon tmpEastIcon = new TmpFlippableIcon();
|
||||
private TmpFlippableIcon tmpWestIcon = new TmpFlippableIcon();
|
||||
|
||||
private FlipableIcon topIcon = null;
|
||||
private FlipableIcon bottomIcon = null;
|
||||
private FlipableIcon southIcon = null;
|
||||
private FlipableIcon northIcon = null;
|
||||
private FlipableIcon eastIcon = null;
|
||||
private FlipableIcon westIcon = null;
|
||||
private FlippableIcon topIcon = null;
|
||||
private FlippableIcon bottomIcon = null;
|
||||
private FlippableIcon southIcon = null;
|
||||
private FlippableIcon northIcon = null;
|
||||
private FlippableIcon eastIcon = null;
|
||||
private FlippableIcon westIcon = null;
|
||||
|
||||
public void updateIcons(FlipableIcon Bottom, FlipableIcon Top, FlipableIcon North, FlipableIcon South, FlipableIcon East, FlipableIcon West)
|
||||
public void updateIcons(FlippableIcon Bottom, FlippableIcon Top, FlippableIcon North, FlippableIcon South, FlippableIcon East, FlippableIcon West)
|
||||
{
|
||||
topIcon = Top;
|
||||
bottomIcon = Bottom;
|
||||
|
@ -67,7 +67,7 @@ public class BlockRenderInfo
|
|||
useTmp = true;
|
||||
}
|
||||
|
||||
public FlipableIcon getTexture(ForgeDirection dir)
|
||||
public FlippableIcon getTexture(ForgeDirection dir)
|
||||
{
|
||||
if ( useTmp )
|
||||
{
|
||||
|
|
|
@ -2,6 +2,7 @@ package appeng.client.render.blocks;
|
|||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import appeng.client.texture.FlippableIcon;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
@ -15,7 +16,6 @@ import appeng.api.util.AEColor;
|
|||
import appeng.block.AEBaseBlock;
|
||||
import appeng.client.render.BaseBlockRender;
|
||||
import appeng.client.texture.ExtraBlockTextures;
|
||||
import appeng.client.texture.FlipableIcon;
|
||||
import appeng.client.texture.OffsetIcon;
|
||||
import appeng.tile.storage.TileChest;
|
||||
import appeng.util.Platform;
|
||||
|
@ -68,7 +68,7 @@ public class RenderMEChest extends BaseBlockRender
|
|||
Tessellator.instance.setBrightness( b );
|
||||
Tessellator.instance.setColorOpaque_I( 0xffffff );
|
||||
|
||||
FlipableIcon fico = new FlipableIcon( new OffsetIcon( ExtraBlockTextures.MEStorageCellTextures.getIcon(), offsetU, offsetV ) );
|
||||
FlippableIcon fico = new FlippableIcon( new OffsetIcon( ExtraBlockTextures.MEStorageCellTextures.getIcon(), offsetU, offsetV ) );
|
||||
if ( forward == ForgeDirection.EAST && (up == ForgeDirection.NORTH || up == ForgeDirection.SOUTH) )
|
||||
fico.setFlip( true, false );
|
||||
else if ( forward == ForgeDirection.NORTH && up == ForgeDirection.EAST )
|
||||
|
|
|
@ -1,106 +1,106 @@
|
|||
package appeng.client.texture;
|
||||
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
public class FlipableIcon implements IIcon
|
||||
{
|
||||
|
||||
protected IIcon original;
|
||||
boolean flip_u;
|
||||
boolean flip_v;
|
||||
|
||||
public FlipableIcon(IIcon o) {
|
||||
|
||||
if ( o == null )
|
||||
throw new RuntimeException( "Cannot create a wrapper icon with a null icon." );
|
||||
|
||||
original = o;
|
||||
flip_u = false;
|
||||
flip_v = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconWidth()
|
||||
{
|
||||
return original.getIconWidth();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconHeight()
|
||||
{
|
||||
return original.getIconHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getMinU()
|
||||
{
|
||||
if ( flip_u )
|
||||
return original.getMaxU();
|
||||
return original.getMinU();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getMaxU()
|
||||
{
|
||||
if ( flip_u )
|
||||
return original.getMinU();
|
||||
return original.getMaxU();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getInterpolatedU(double px)
|
||||
{
|
||||
if ( flip_u )
|
||||
return original.getInterpolatedU( 16 - px );
|
||||
return original.getInterpolatedU( px );
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getMinV()
|
||||
{
|
||||
if ( flip_v )
|
||||
return original.getMaxV();
|
||||
return original.getMinV();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getMaxV()
|
||||
{
|
||||
if ( flip_v )
|
||||
return original.getMinV();
|
||||
return original.getMaxV();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getInterpolatedV(double px)
|
||||
{
|
||||
if ( flip_v )
|
||||
return original.getInterpolatedV( 16 - px );
|
||||
return original.getInterpolatedV( px );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIconName()
|
||||
{
|
||||
return original.getIconName();
|
||||
}
|
||||
|
||||
public IIcon getOriginal()
|
||||
{
|
||||
return original;
|
||||
}
|
||||
|
||||
public void setFlip(boolean u, boolean v)
|
||||
{
|
||||
flip_u = u;
|
||||
flip_v = v;
|
||||
}
|
||||
|
||||
public int setFlip(int orientation)
|
||||
{
|
||||
flip_u = (orientation & 8) == 8;
|
||||
flip_v = (orientation & 16) == 16;
|
||||
return orientation & 7;
|
||||
}
|
||||
|
||||
}
|
||||
package appeng.client.texture;
|
||||
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
public class FlippableIcon implements IIcon
|
||||
{
|
||||
|
||||
protected IIcon original;
|
||||
boolean flip_u;
|
||||
boolean flip_v;
|
||||
|
||||
public FlippableIcon(IIcon o) {
|
||||
|
||||
if ( o == null )
|
||||
throw new RuntimeException( "Cannot create a wrapper icon with a null icon." );
|
||||
|
||||
original = o;
|
||||
flip_u = false;
|
||||
flip_v = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconWidth()
|
||||
{
|
||||
return original.getIconWidth();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconHeight()
|
||||
{
|
||||
return original.getIconHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getMinU()
|
||||
{
|
||||
if ( flip_u )
|
||||
return original.getMaxU();
|
||||
return original.getMinU();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getMaxU()
|
||||
{
|
||||
if ( flip_u )
|
||||
return original.getMinU();
|
||||
return original.getMaxU();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getInterpolatedU(double px)
|
||||
{
|
||||
if ( flip_u )
|
||||
return original.getInterpolatedU( 16 - px );
|
||||
return original.getInterpolatedU( px );
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getMinV()
|
||||
{
|
||||
if ( flip_v )
|
||||
return original.getMaxV();
|
||||
return original.getMinV();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getMaxV()
|
||||
{
|
||||
if ( flip_v )
|
||||
return original.getMinV();
|
||||
return original.getMaxV();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getInterpolatedV(double px)
|
||||
{
|
||||
if ( flip_v )
|
||||
return original.getInterpolatedV( 16 - px );
|
||||
return original.getInterpolatedV( px );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIconName()
|
||||
{
|
||||
return original.getIconName();
|
||||
}
|
||||
|
||||
public IIcon getOriginal()
|
||||
{
|
||||
return original;
|
||||
}
|
||||
|
||||
public void setFlip(boolean u, boolean v)
|
||||
{
|
||||
flip_u = u;
|
||||
flip_v = v;
|
||||
}
|
||||
|
||||
public int setFlip(int orientation)
|
||||
{
|
||||
flip_u = (orientation & 8) == 8;
|
||||
flip_v = (orientation & 16) == 16;
|
||||
return orientation & 7;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,37 +1,37 @@
|
|||
package appeng.client.texture;
|
||||
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
public class TmpFlipableIcon extends FlipableIcon
|
||||
{
|
||||
|
||||
private static final IIcon nullIcon = new MissingIcon( Blocks.diamond_block );
|
||||
|
||||
public TmpFlipableIcon() {
|
||||
super( nullIcon );
|
||||
}
|
||||
|
||||
public void setOriginal(IIcon i)
|
||||
{
|
||||
setFlip( false, false );
|
||||
|
||||
while (i instanceof FlipableIcon)
|
||||
{
|
||||
FlipableIcon fi = (FlipableIcon) i;
|
||||
if ( fi.flip_u )
|
||||
this.flip_u = !this.flip_u;
|
||||
|
||||
if ( fi.flip_v )
|
||||
this.flip_v = !this.flip_v;
|
||||
|
||||
i = fi.getOriginal();
|
||||
}
|
||||
|
||||
if ( i == null )
|
||||
original = nullIcon;
|
||||
else
|
||||
original = i;
|
||||
}
|
||||
|
||||
}
|
||||
package appeng.client.texture;
|
||||
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
public class TmpFlippableIcon extends FlippableIcon
|
||||
{
|
||||
|
||||
private static final IIcon nullIcon = new MissingIcon( Blocks.diamond_block );
|
||||
|
||||
public TmpFlippableIcon() {
|
||||
super( nullIcon );
|
||||
}
|
||||
|
||||
public void setOriginal(IIcon i)
|
||||
{
|
||||
setFlip( false, false );
|
||||
|
||||
while (i instanceof FlippableIcon)
|
||||
{
|
||||
FlippableIcon fi = (FlippableIcon) i;
|
||||
if ( fi.flip_u )
|
||||
this.flip_u = !this.flip_u;
|
||||
|
||||
if ( fi.flip_v )
|
||||
this.flip_v = !this.flip_v;
|
||||
|
||||
i = fi.getOriginal();
|
||||
}
|
||||
|
||||
if ( i == null )
|
||||
original = nullIcon;
|
||||
else
|
||||
original = i;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package appeng.parts.networking;
|
||||
|
||||
import appeng.client.texture.FlippableIcon;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -33,7 +34,6 @@ import appeng.api.util.AEColor;
|
|||
import appeng.api.util.IReadOnlyCollection;
|
||||
import appeng.block.AEBaseBlock;
|
||||
import appeng.client.texture.CableBusTextures;
|
||||
import appeng.client.texture.FlipableIcon;
|
||||
import appeng.client.texture.TaughtIcon;
|
||||
import appeng.items.parts.ItemMultiPart;
|
||||
import appeng.me.GridAccessException;
|
||||
|
@ -648,7 +648,7 @@ public class PartCable extends AEBasePart implements IPartCable
|
|||
if ( of == ForgeDirection.EAST || of == ForgeDirection.WEST )
|
||||
{
|
||||
AEBaseBlock blk = (AEBaseBlock) rh.getBlock();
|
||||
FlipableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST );
|
||||
FlippableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST );
|
||||
ico.setFlip( false, true );
|
||||
}
|
||||
|
||||
|
@ -721,7 +721,7 @@ public class PartCable extends AEBasePart implements IPartCable
|
|||
if ( of == ForgeDirection.EAST || of == ForgeDirection.WEST )
|
||||
{
|
||||
AEBaseBlock blk = (AEBaseBlock) rh.getBlock();
|
||||
FlipableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST );
|
||||
FlippableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST );
|
||||
ico.setFlip( false, true );
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ package appeng.parts.networking;
|
|||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import appeng.client.texture.FlippableIcon;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
@ -22,7 +23,6 @@ import appeng.api.parts.IPartRenderHelper;
|
|||
import appeng.api.util.AECableType;
|
||||
import appeng.api.util.AEColor;
|
||||
import appeng.block.AEBaseBlock;
|
||||
import appeng.client.texture.FlipableIcon;
|
||||
import appeng.client.texture.OffsetIcon;
|
||||
import appeng.client.texture.TaughtIcon;
|
||||
import appeng.util.Platform;
|
||||
|
@ -213,7 +213,7 @@ public class PartCableSmart extends PartCable
|
|||
if ( of == ForgeDirection.EAST || of == ForgeDirection.WEST )
|
||||
{
|
||||
AEBaseBlock blk = (AEBaseBlock) rh.getBlock();
|
||||
FlipableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST );
|
||||
FlippableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST );
|
||||
ico.setFlip( false, true );
|
||||
}
|
||||
|
||||
|
@ -298,7 +298,7 @@ public class PartCableSmart extends PartCable
|
|||
renderer.uvRotateNorth = 0;
|
||||
|
||||
AEBaseBlock blk = (AEBaseBlock) rh.getBlock();
|
||||
FlipableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST );
|
||||
FlippableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST );
|
||||
ico.setFlip( false, true );
|
||||
|
||||
renderer.setRenderBounds( 0, 5 / 16.0, 5 / 16.0, 16 / 16.0, 11 / 16.0, 11 / 16.0 );
|
||||
|
@ -306,11 +306,11 @@ public class PartCableSmart extends PartCable
|
|||
|
||||
Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 );
|
||||
|
||||
FlipableIcon fpA = new FlipableIcon( defa );
|
||||
FlipableIcon fpB = new FlipableIcon( defb );
|
||||
FlippableIcon fpA = new FlippableIcon( defa );
|
||||
FlippableIcon fpB = new FlippableIcon( defb );
|
||||
|
||||
fpA = new FlipableIcon( defa );
|
||||
fpB = new FlipableIcon( defb );
|
||||
fpA = new FlippableIcon( defa );
|
||||
fpB = new FlippableIcon( defb );
|
||||
|
||||
fpA.setFlip( true, false );
|
||||
fpB.setFlip( true, false );
|
||||
|
|
|
@ -2,6 +2,7 @@ package appeng.parts.networking;
|
|||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import appeng.client.texture.FlippableIcon;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
@ -26,7 +27,6 @@ import appeng.api.util.AECableType;
|
|||
import appeng.api.util.AEColor;
|
||||
import appeng.block.AEBaseBlock;
|
||||
import appeng.client.texture.CableBusTextures;
|
||||
import appeng.client.texture.FlipableIcon;
|
||||
import appeng.client.texture.OffsetIcon;
|
||||
import appeng.client.texture.TaughtIcon;
|
||||
import appeng.util.Platform;
|
||||
|
@ -402,7 +402,7 @@ public class PartDenseCable extends PartCable
|
|||
renderer.uvRotateNorth = 0;
|
||||
|
||||
AEBaseBlock blk = (AEBaseBlock) rh.getBlock();
|
||||
FlipableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST );
|
||||
FlippableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST );
|
||||
ico.setFlip( false, true );
|
||||
|
||||
renderer.setRenderBounds( 0, 3 / 16.0, 3 / 16.0, 16 / 16.0, 13 / 16.0, 13 / 16.0 );
|
||||
|
@ -410,11 +410,11 @@ public class PartDenseCable extends PartCable
|
|||
|
||||
Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 );
|
||||
|
||||
FlipableIcon fpA = new FlipableIcon( defa );
|
||||
FlipableIcon fpB = new FlipableIcon( defb );
|
||||
FlippableIcon fpA = new FlippableIcon( defa );
|
||||
FlippableIcon fpB = new FlippableIcon( defb );
|
||||
|
||||
fpA = new FlipableIcon( defa );
|
||||
fpB = new FlipableIcon( defb );
|
||||
fpA = new FlippableIcon( defa );
|
||||
fpB = new FlippableIcon( defb );
|
||||
|
||||
fpA.setFlip( true, false );
|
||||
fpB.setFlip( true, false );
|
||||
|
|
Loading…
Add table
Reference in a new issue