Skip to content

Commit

Permalink
allow basic expression calulation in craft amount gui (#141)
Browse files Browse the repository at this point in the history
* cal expression in cca bar

* crap

* use big decimal as return when paras are string

* remove double

* all string
  • Loading branch information
GlodBlock authored Jun 5, 2022
1 parent 6d238c5 commit 053bf33
Show file tree
Hide file tree
Showing 3 changed files with 328 additions and 73 deletions.
119 changes: 46 additions & 73 deletions src/main/java/appeng/client/gui/implementations/GuiCraftAmount.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import appeng.api.definitions.IParts;
import appeng.api.storage.ITerminalHost;
import appeng.client.gui.AEBaseGui;
import appeng.client.gui.widgets.GuiNumberBox;
import appeng.client.gui.widgets.GuiTabButton;
import appeng.container.AEBaseContainer;
import appeng.container.implementations.ContainerCraftAmount;
Expand All @@ -40,14 +39,17 @@
import appeng.parts.reporting.PartPatternTerminal;
import appeng.parts.reporting.PartPatternTerminalEx;
import appeng.parts.reporting.PartTerminal;
import appeng.util.calculators.ArithHelper;
import appeng.util.calculators.Calculator;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;


public class GuiCraftAmount extends AEBaseGui
{
private GuiNumberBox amountToCraft;
private GuiTextField amountToCraft;
private GuiTabButton originalGuiBtn;

private GuiButton next;
Expand All @@ -70,6 +72,7 @@ public GuiCraftAmount( final InventoryPlayer inventoryPlayer, final ITerminalHos
}

@Override
@SuppressWarnings( "unchecked" )
public void initGui()
{
super.initGui();
Expand Down Expand Up @@ -147,7 +150,7 @@ public void initGui()
this.buttonList.add( this.originalGuiBtn = new GuiTabButton( this.guiLeft + 154, this.guiTop, myIcon, myIcon.getDisplayName(), itemRender ) );
}

this.amountToCraft = new GuiNumberBox( this.fontRendererObj, this.guiLeft + 62, this.guiTop + 57, 59, this.fontRendererObj.FONT_HEIGHT, Integer.class );
this.amountToCraft = new GuiTextField( this.fontRendererObj, this.guiLeft + 62, this.guiTop + 57, 59, this.fontRendererObj.FONT_HEIGHT);
this.amountToCraft.setEnableBackgroundDrawing( false );
this.amountToCraft.setMaxStringLength( 16 );
this.amountToCraft.setTextColor( 0xFFFFFF );
Expand All @@ -173,8 +176,19 @@ public void drawBG( final int offsetX, final int offsetY, final int mouseX, fina

try
{
Long.parseLong( this.amountToCraft.getText() );
this.next.enabled = this.amountToCraft.getText().length() > 0;
String out = this.amountToCraft.getText();

double resultD = Calculator.conversion( out );
int resultI;

if( resultD <= 0 || Double.isNaN( resultD ) ) {
resultI = 0;
}
else {
resultI = (int) ArithHelper.round(resultD, 0);
}

this.next.enabled = resultI > 0;
}
catch( final NumberFormatException e )
{
Expand All @@ -193,44 +207,8 @@ protected void keyTyped( final char character, final int key )
{
this.actionPerformed( this.next );
}
if( ( key == 211 || key == 205 || key == 203 || key == 14 || character == '-' || Character.isDigit( character ) ) && this.amountToCraft.textboxKeyTyped( character, key ) )
{
try
{
String out = this.amountToCraft.getText();

boolean fixed = false;
while( out.startsWith( "0" ) && out.length() > 1 )
{
out = out.substring( 1 );
fixed = true;
}

if( fixed )
{
this.amountToCraft.setText( out );
}

if( out.isEmpty() )
{
out = "0";
}

final long result = Long.parseLong( out );
if( result < 0 )
{
this.amountToCraft.setText( "1" );
}
}
catch( final NumberFormatException e )
{
// :P
}
}
else
{
super.keyTyped( character, key );
}
this.amountToCraft.textboxKeyTyped( character, key );
super.keyTyped( character, key );
}
}

Expand All @@ -247,9 +225,19 @@ protected void actionPerformed( final GuiButton btn )
NetworkHandler.instance.sendToServer( new PacketSwitchGuis( this.originalGui ) );
}

if( btn == this.next )
if( btn == this.next && btn.enabled )
{
NetworkHandler.instance.sendToServer( new PacketCraftRequest( Integer.parseInt( this.amountToCraft.getText() ), isShiftKeyDown() ) );
double resultD = Calculator.conversion( this.amountToCraft.getText() );
int resultI;

if( resultD <= 0 || Double.isNaN( resultD ) ) {
resultI = 1;
}
else {
resultI = (int) ArithHelper.round(resultD, 0);
}

NetworkHandler.instance.sendToServer( new PacketCraftRequest( resultI, isShiftKeyDown() ) );
}
}
catch( final NumberFormatException e )
Expand All @@ -273,38 +261,23 @@ private void addQty( final int i )
{
String out = this.amountToCraft.getText();

boolean fixed = false;
while( out.startsWith( "0" ) && out.length() > 1 )
{
out = out.substring( 1 );
fixed = true;
}
double resultD = Calculator.conversion( out );
int resultI;

if( fixed )
{
this.amountToCraft.setText( out );
}

if( out.isEmpty() )
{
out = "0";
}
if( resultD <= 0 || Double.isNaN( resultD ) ) {
resultI = 1;
}
else {
resultI = (int) ArithHelper.round(resultD, 0);
}

long result = Integer.parseInt( out );
resultI += i;
if( resultI < 1 ) {
resultI = 1;
}

if( result == 1 && i > 1 )
{
result = 0;
}

result += i;
if( result < 1 )
{
result = 1;
}
out = Integer.toString( resultI );

out = Long.toString( result );
Integer.parseInt( out );
this.amountToCraft.setText( out );
}
catch( final NumberFormatException e )
Expand Down
91 changes: 91 additions & 0 deletions src/main/java/appeng/util/calculators/ArithHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package appeng.util.calculators;

public class ArithHelper {

private static final int DEF_DIV_SCALE = 16;

private ArithHelper() {
}

/**
* addition
*
* @param v1 p1
* @param v2 p2
* @return sum
*/
public static String add(String v1, String v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
return String.valueOf(b1.add(b2));
}

/**
* subtraction
*
* @param v1 p1
* @param v2 p2
* @return sub
*/
public static String sub(String v1, String v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
return String.valueOf(b1.subtract(b2));
}

/**
* multiplication
*
* @param v1
* p1
* @param v2
* p2
* @return mul
*/
public static String mul(String v1, String v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
return String.valueOf(b1.multiply(b2));
}

/**
* division. e = 10^-10
*
* @param v1
* p1
* @param v2
* p2
* @return div
*/
public static String div(String v1, String v2) {
java.math.BigDecimal b1 = new java.math.BigDecimal(v1);
java.math.BigDecimal b2 = new java.math.BigDecimal(v2);
return String.valueOf(b1.divide(b2, DEF_DIV_SCALE, java.math.BigDecimal.ROUND_HALF_UP));
}

/**
* rounding
*
* @param v p
* @param scale scale
* @return result
*/
public static double round(double v, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
java.math.BigDecimal b = new java.math.BigDecimal(Double.toString(v));
java.math.BigDecimal one = new java.math.BigDecimal("1");
return b.divide(one, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
}

public static String round(String v, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
java.math.BigDecimal b = new java.math.BigDecimal(v);
java.math.BigDecimal one = new java.math.BigDecimal("1");
return String.valueOf(b.divide(one, scale, java.math.BigDecimal.ROUND_HALF_UP));
}

}
Loading

0 comments on commit 053bf33

Please sign in to comment.