Bug FTB Infinity Evolved Skyblock 1.3.0 (MC 1.7.10)

  • Thread starter got_bored_again
  • Start date
G

got_bored_again

Guest
Ok, so after almost a full year there is a back-port update (nice to see this old pack is still maintained) - but, sadly, and as always with major-updates, there some game-breaking bugs making it almost un-playable in the intended way.
Let me list just some of them:

1.) client menu still shows 1.2.0
2.) island_join command doesn't work anymore - it returns an error: "That player cannot be found"
3.) BC-iron/-gold gear achievement / crafting - if you put a casted gera into crafting slot - it shows the bc gear - but you can't take it - and therefore can't get the achievement - replacement with script-fix needed
4.) /help x still throws random exception cause some mods don't register help-handler correctly

I could go on as I'm sure if I'm just tryin to get all achievements I would find many more issues - maybe still not fixed bugs from 1.2.0. What really upsets me - and you banned me already 4 times for complaining this: Why your release packs with such game-breaking errors? I know it's really hard work and takes time even with creative to grind through all achievements - but at least they should be tested if all are obtainable.
Also the custom mods like the ftb-island-mod with its /island_x commands should also be tested. Why it throws an error like "player not found" when it's supposed to read the island-name from json and the linked coords and just perform a tp with current player using this command? I don't know the MC/Forge-api - but as I've seen in many java-forums (still wonder why beginners who thnik starting learning java by creating a minecraft-mod seems a good idea) there are instances of Player and Command - so on server-side there should something like Player player=Command.getPlayer() or some like this to get the Player-object for wich player used the command. Also: Throwable.printStackTrace() - at least server-console should output a meaningfull exception-stacktrace like for broken /help-handlers - or some way to enable debug mode - so that java-devs can understand what's wrong and can make good bug-reports.

Go ahead - ban me again for this complaining - but please: FIX IT! And please fix your lazy release-cycle to at least someone takes the time to grind the achievements and test every command BEFORE releasing it to public. There's something like unittests you can automate such testing. And building a testsuite one time saves lot more time against someone has to grind all again after rebuilding. Is it really that hard to follow common java development practices?
Yes - I know - you don'T feel responseable for errors made by mod-devs (when they would do such testing there would be a ton less errors) - but at least you could relay found issues to them instead of just ignoring bug-reports at all.


Do what ever you want with this report - maybe I should start by reverse-engineer FML/Forge and fix the base errors made there by cpw and player wich causes many errors in mods that have to be made just to able to compile against fml/forge api.
Oh - and what version was it again Jeb once announced official mod-api for? 1.7? FTB is one of the biggest packs - why you don't bother those guys over at where ever now the main dev is (is it really M$?). Why you don'T use your "power" and just say: Ok, we just stop supporting new versions until there is an official mod-api - cpw and player have this power - why they don't use it to make MC better in the first place?

To quote star wars: much to learn you have ...
 
B

ButterFlying

Guest
True. Actually only i have this trophey render bug?
 
G

got_bored_again

Guest
ok - it gets more wired as I digging into it

command-blocks: I expected a command block with "island_create @p" to create an island named after the player pushed the button - but: NAH! doesn't work
side note one: are the signs written wrong by intention? the commands are /island_create - with an "_" - but the signs only show "/island create" - w/o "_"
side note two: why are there multiple commands: /island_* and /islands_* - and why island_delete _setspawn _rename _create _list _save _join but only islands_rename _join _delete _create - I guess someone completly messed up here
side note three: mc-wiki say "@s - entity wich invoked this event" - but even simple "say @s" just writes "@s" in chat - I guess someone who implemented this @x system didn't had in mind that some admins want to use these blocks as "the very player wich pressed the button" instead of just "the nearest player you can find" - wich is complete crap

what's even more confusing: when I use the command "/island_create @p" - it will create an island named "@p" - instead of my username - and only then I'm able to join the island named "@p" by using "/island_join @p" - W T F?
do I really have to de-compile this crap to see how F*ed-up this is cause someone who thought "gnah - I'm da gangsta-java-skill0r - duh" made beginner-grade mistakes like "javac not found" - ok, blames goes to cpw and player by enforcing eclipse used as environment for deving mods instead of plain old source files wich could be used by any means - even notepad and command / vim and terminal


AND: not even any reply from any ftb-staff - yea - like I've complained many times: you're not just unable to at least somehow make it possible to use these crap lines of codes - you're complete unable to accept critics and potential solutions by someone who really deeply learned the language Java - let alone to even react on bug-reports


//edit - yeap - just got silenced again - made another replay wich is pending modearion - aw c'mon - screw you - I'm outta here
 
Last edited:
G

got_bored_again

Guest
ok - let us put them side by side
this is 1.3.1 from 1.2.0
Code:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) fieldsfirst 
// Source File Name:  JoinIslandCommand.java

package com.cricketcraft.ftbisland.commands;

import com.cricketcraft.ftbisland.IslandUtils;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.command.*;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.ChatComponentText;

public class JoinIslandCommand extends CommandBase
  implements ICommand
{

  private List aliases;

  public JoinIslandCommand()
  {
  aliases = new ArrayList();
  aliases.add("island_join");
  aliases.add("islands_join");
  }

  public List func_71514_a()
  {
  return aliases;
  }

  public String func_71517_b()
  {
  return (String)aliases.get(0);
  }

  public int func_82362_a()
  {
  return 2;
  }

  public String func_71518_a(ICommandSender sender)
  {
  return "island_join <IslandName>";
  }

  public void func_71515_b(ICommandSender sender, String input[])
  {
  EntityPlayerMP player = func_71521_c(sender);
  if(input.length == 0)
  sender.func_145747_a(new ChatComponentText("Invalid arguments!"));
  else
  IslandUtils.joinIsland(input[0], player);
  }

  public boolean func_71519_b(ICommandSender p_71519_1_)
  {
  return true;
  }
}
and here is 1.3.3 from 1.3.0
Code:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) fieldsfirst 
// Source File Name:  JoinIslandCommand.java

package com.cricketcraft.ftbisland.commands;

import com.cricketcraft.ftbisland.IslandUtils;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.command.*;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatComponentText;

public class JoinIslandCommand extends CommandBase
  implements ICommand
{

  private List aliases;

  public JoinIslandCommand()
  {
  aliases = new ArrayList();
  aliases.add("island_join");
  aliases.add("islands_join");
  }

  public List func_71514_a()
  {
  return aliases;
  }

  public String func_71517_b()
  {
  return (String)aliases.get(0);
  }

  public int func_82362_a()
  {
  return 2;
  }

  public String func_71518_a(ICommandSender sender)
  {
  return "island_join <IslandName>";
  }

  public List func_71516_a(ICommandSender sender, String input[])
  {
  return input.length != 1 ? null : func_71530_a(input, getPlayers());
  }

  protected String[] getPlayers()
  {
  return MinecraftServer.func_71276_C().func_71213_z();
  }

  public void func_71515_b(ICommandSender sender, String input[])
  {
  EntityPlayerMP player = func_82359_c(sender, input[0]);
  if(input.length == 0)
  sender.func_145747_a(new ChatComponentText("Invalid arguments!"));
  else
  IslandUtils.joinIsland(input[0], player);
  }

  public boolean func_71519_b(ICommandSender p_71519_1_)
  {
  return true;
  }
}
I don't know what these obfuscated methods are - but - WHAT THE F* is the name from the current player even needed for?
let's jave a look at the IslandCreator class
1.3.1
Code:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) fieldsfirst 
// Source File Name:  IslandCreator.java

package com.cricketcraft.ftbisland;

import cpw.mods.fml.common.registry.GameRegistry;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.util.ChatComponentText;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import org.apache.logging.log4j.Logger;

// Referenced classes of package com.cricketcraft.ftbisland:
//  FTBIslands

public class IslandCreator
{
  public static class IslandPos
  implements Serializable
  {

  private int x;
  private int y;
  private int z;

  public int getX()
  {
  return x;
  }

  public int getY()
  {
  return y;
  }

  public int getZ()
  {
  return z;
  }

  public IslandPos(int x, int y, int z)
  {
  this.x = x;
  this.y = y;
  this.z = z;
  }
  }


  public static HashMap islandLocations = new HashMap();
  private static final Item chickenStick = GameRegistry.findItem("excompressum", "chickenStick");
  public final String playerName;
  public final IslandPos pos;

  public IslandCreator()
  {
  playerName = null;
  pos = null;
  }

  public IslandCreator(String playerName, IslandPos pos)
  {
  this.playerName = playerName;
  this.pos = pos;
  }

  public static boolean spawnIslandAt(World world, int x, int y, int z, String playerName, EntityPlayer player)
  {
  reloadIslands();
  if(!islandLocations.containsKey(playerName))
  {
  if(FTBIslands.skyFactory)
  {
  world.func_147449_b(x, y, z, Blocks.field_150346_d);
  for(int c = -3; c < 2; c++)
  {
  for(int d = -3; d < 2; d++)
  {
  for(int e = 3; e < 5; e++)
  world.func_147449_b(x + c + 1, y + e, d + z + 1, Blocks.field_150362_t);

  }

  }

  for(int c = -2; c < 1; c++)
  {
  for(int d = -2; d < 1; d++)
  world.func_147449_b(x + c + 1, y + 5, d + z + 1, Blocks.field_150362_t);

  }

  world.func_147449_b(x, y + 6, z, Blocks.field_150362_t);
  world.func_147449_b(x + 1, y + 6, z, Blocks.field_150362_t);
  world.func_147449_b(x, y + 6, z + 1, Blocks.field_150362_t);
  world.func_147449_b(x - 1, y + 6, z, Blocks.field_150362_t);
  world.func_147449_b(x, y + 6, z - 1, Blocks.field_150362_t);
  world.func_147468_f(x + 2, y + 4, z + 2);
  for(int c = 0; c < 5; c++)
  world.func_147449_b(x, y + c + 1, z, Blocks.field_150364_r);

  } else
  {
  for(int c = 0; c < 3; c++)
  {
  for(int d = 0; d < 3; d++)
  world.func_147449_b(x + c, y, z + d, Blocks.field_150346_d);

  }

  world.func_147449_b(x + 2, y + 1, z + 1, Blocks.field_150486_ae);
  world.func_147439_a(x + 2, y + 1, z + 1).rotateBlock(world, x + 2, y + 1, z + 1, ForgeDirection.WEST);
  TileEntityChest chest = (TileEntityChest)world.func_147438_o(x + 2, y + 1, z + 1);
  chest.func_70299_a(0, new ItemStack(Blocks.field_150358_i, 1));
  chest.func_70299_a(1, new ItemStack(Blocks.field_150356_k, 1));
  chest.func_70299_a(2, new ItemStack(Items.field_151100_aR, 64, 15));
  chest.func_70299_a(3, new ItemStack(Items.field_151100_aR, 64, 15));
  chest.func_70299_a(4, new ItemStack(Items.field_151034_e, 16));
  chest.func_70299_a(5, new ItemStack(Blocks.field_150345_g, 8, 0));
  chest.func_70299_a(6, new ItemStack(Items.field_151063_bx, 2, 90));
  chest.func_70299_a(7, new ItemStack(Items.field_151063_bx, 2, 91));
  chest.func_70299_a(8, new ItemStack(Items.field_151063_bx, 2, 92));
  chest.func_70299_a(9, new ItemStack(Items.field_151063_bx, 2, 93));
  if(chickenStick != null)
  chest.func_70299_a(10, new ItemStack(chickenStick, 1));
  }
  if(islandLocations.size() != 0)
  islandLocations.put(playerName, FTBIslands.islandLoc.get(islandLocations.size() + 1));
  else
  islandLocations.put(playerName, FTBIslands.islandLoc.get(1));
  islandLocations.put(playerName, new IslandPos(x, y, z));
  try
  {
  FTBIslands.saveIslands(islandLocations);
  }
  catch(IOException e)
  {
  e.printStackTrace();
  }
  if(player != null)
  player.func_145747_a(new ChatComponentText(String.format("Created island named %s at %d, %d, %d", new Object[] {
  playerName, Integer.valueOf(x), Integer.valueOf(y), Integer.valueOf(z)
  })));
  else
  FTBIslands.logger.info(String.format("Created island named %s at %d %d %d", new Object[] {
  playerName, Integer.valueOf(x), Integer.valueOf(y), Integer.valueOf(z)
  }));
  return true;
  } else
  {
  return false;
  }
  }

  protected static void reloadIslands()
  {
  try
  {
  islandLocations = FTBIslands.getIslands();
  }
  catch(EOFException e) { }
  catch(IOException e)
  {
  e.printStackTrace();
  }
  }

  protected static void save()
  {
  try
  {
  FTBIslands.saveIslands(islandLocations);
  }
  catch(IOException e)
  {
  e.printStackTrace();
  }
  }

}
1.3.3
Code:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) fieldsfirst 
// Source File Name:  IslandCreator.java

package com.cricketcraft.ftbisland;

import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.registry.GameRegistry;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.tileentity.TileEntitySign;
import net.minecraft.util.ChatComponentText;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import org.apache.logging.log4j.Logger;

// Referenced classes of package com.cricketcraft.ftbisland:
//  FTBIslands

public class IslandCreator
{
  public static class IslandPos
  implements Serializable
  {

  private int x;
  private int y;
  private int z;

  public int getX()
  {
  return x;
  }

  public int getY()
  {
  return y;
  }

  public int getZ()
  {
  return z;
  }

  public IslandPos(int x, int y, int z)
  {
  this.x = x;
  this.y = y;
  this.z = z;
  }
  }


  public static HashMap islandLocations = new HashMap();
  private static final Item chickenStick = GameRegistry.findItem("excompressum", "chickenStick");
  public final String playerName;
  public final IslandPos pos;

  public IslandCreator()
  {
  playerName = null;
  pos = null;
  }

  public IslandCreator(String playerName, IslandPos pos)
  {
  this.playerName = playerName;
  this.pos = pos;
  }

  public static boolean spawnIslandAt(World world, int x, int y, int z, String playerName, EntityPlayer player)
  {
  reloadIslands();
  if(!islandLocations.containsKey(playerName))
  {
  if(FTBIslands.islandType.equalsIgnoreCase("tree"))
  {
  world.func_147449_b(x, y, z, Blocks.field_150349_c);
  for(int c = -3; c < 2; c++)
  {
  for(int d = -3; d < 2; d++)
  {
  for(int e = 3; e < 5; e++)
  world.func_147449_b(x + c + 1, y + e, d + z + 1, Blocks.field_150362_t);

  }

  }

  for(int c = -2; c < 1; c++)
  {
  for(int d = -2; d < 1; d++)
  world.func_147449_b(x + c + 1, y + 5, d + z + 1, Blocks.field_150362_t);

  }

  world.func_147449_b(x, y + 6, z, Blocks.field_150362_t);
  world.func_147449_b(x + 1, y + 6, z, Blocks.field_150362_t);
  world.func_147449_b(x, y + 6, z + 1, Blocks.field_150362_t);
  world.func_147449_b(x - 1, y + 6, z, Blocks.field_150362_t);
  world.func_147449_b(x, y + 6, z - 1, Blocks.field_150362_t);
  world.func_147468_f(x + 2, y + 4, z + 2);
  for(int c = 0; c < 5; c++)
  world.func_147449_b(x, y + c + 1, z, Blocks.field_150364_r);

  } else
  if(FTBIslands.islandType.equalsIgnoreCase("grass"))
  {
  world.func_147449_b(x, y, z, Blocks.field_150349_c);
  world.func_147465_d(x, y + 1, z, Blocks.field_150472_an, 6, 3);
  ((TileEntitySign)world.func_147438_o(x, y + 1, z)).field_145915_a[0] = "You get it yet?";
  } else
  if(FTBIslands.islandType.equalsIgnoreCase("GoG"))
  {
  for(int i = 0; i < 3; i++)
  {
  for(int j = 0; j < 4; j++)
  {
  for(int k = 0; k < 3; k++)
  world.func_147449_b((x - 1) + i, y - j, (z - 1) + k, ((Block) (j != 0 ? Blocks.field_150346_d : ((Block) (Blocks.field_150349_c)))));

  }

  }

  world.func_147449_b(x - 1, y - 1, z, Blocks.field_150358_i);
  int roots[][] = {
  {
  -1, -2, -1
  }, {
  -1, -4, -2
  }, {
  -2, -3, -1
  }, {
  -2, -3, -2
  }, {
  1, -3, -1
  }, {
  1, -4, -1
  }, {
  2, -4, -1
  }, {
  2, -4, 0
  }, {
  3, -5, 0
  }, {
  0, -2, 1
  }, {
  0, -3, 2
  }, {
  0, -4, 3
  }, {
  1, -4, 3
  }, {
  1, -5, 2
  }, {
  1, -2, 0
  }
  };
  if(Loader.isModLoaded("Botania"))
  {
  world.func_147449_b(x + 1, y + 3, z + 1, GameRegistry.findBlock("Botania", "manaFlame"));
  world.func_147449_b(x, y - 3, z, Blocks.field_150357_h);
  int ai[][] = roots;
  int l = ai.length;
  for(int j1 = 0; j1 < l; j1++)
  {
  int pos[] = ai[j1];
  world.func_147449_b(x + pos[0], y + pos[1], z + pos[2], GameRegistry.findBlock("Botania", "root"));
  }

  } else
  {
  int ai1[][] = roots;
  int i1 = ai1.length;
  for(int k1 = 0; k1 < i1; k1++)
  {
  int pos[] = ai1[k1];
  world.func_147465_d(x + pos[0], y + pos[1], z + pos[2], Blocks.field_150364_r, 12, 3);
  }

  }
  } else
  {
  for(int c = 0; c < 3; c++)
  {
  for(int d = 0; d < 3; d++)
  world.func_147449_b(x + c, y, z + d, Blocks.field_150346_d);

  }

  world.func_147449_b(x + 2, y + 1, z + 1, Blocks.field_150486_ae);
  world.func_147439_a(x + 2, y + 1, z + 1).rotateBlock(world, x + 2, y + 1, z + 1, ForgeDirection.WEST);
  TileEntityChest chest = (TileEntityChest)world.func_147438_o(x + 2, y + 1, z + 1);
  chest.func_70299_a(0, new ItemStack(Blocks.field_150358_i, 1));
  chest.func_70299_a(1, new ItemStack(Blocks.field_150356_k, 1));
  chest.func_70299_a(2, new ItemStack(Items.field_151100_aR, 64, 15));
  chest.func_70299_a(3, new ItemStack(Items.field_151100_aR, 64, 15));
  chest.func_70299_a(4, new ItemStack(Items.field_151034_e, 16));
  chest.func_70299_a(5, new ItemStack(Blocks.field_150345_g, 8, 0));
  chest.func_70299_a(6, new ItemStack(Items.field_151063_bx, 2, 90));
  chest.func_70299_a(7, new ItemStack(Items.field_151063_bx, 2, 91));
  chest.func_70299_a(8, new ItemStack(Items.field_151063_bx, 2, 92));
  chest.func_70299_a(9, new ItemStack(Items.field_151063_bx, 2, 93));
  if(chickenStick != null)
  chest.func_70299_a(10, new ItemStack(chickenStick, 1));
  }
  if(islandLocations.size() != 0)
  islandLocations.put(playerName, FTBIslands.islandLoc.get(islandLocations.size() + 1));
  else
  islandLocations.put(playerName, FTBIslands.islandLoc.get(1));
  islandLocations.put(playerName, new IslandPos(x, y, z));
  try
  {
  FTBIslands.saveIslands(islandLocations);
  }
  catch(IOException e)
  {
  e.printStackTrace();
  }
  if(player != null)
  player.func_145747_a(new ChatComponentText(String.format("Created island named %s at %d, %d, %d", new Object[] {
  playerName, Integer.valueOf(x), Integer.valueOf(y), Integer.valueOf(z)
  })));
  else
  FTBIslands.logger.info(String.format("Created island named %s at %d %d %d", new Object[] {
  playerName, Integer.valueOf(x), Integer.valueOf(y), Integer.valueOf(z)
  }));
  return true;
  } else
  {
  return false;
  }
  }

  protected static void reloadIslands()
  {
  try
  {
  islandLocations = FTBIslands.getIslands();
  }
  catch(EOFException eofexception) { }
  catch(IOException e)
  {
  e.printStackTrace();
  }
  }

  protected static void save()
  {
  try
  {
  FTBIslands.saveIslands(islandLocations);
  }
  catch(IOException e)
  {
  e.printStackTrace();
  }
  }

}
WHY the hell even parameters playerName and player for? for what ever reason does this method need to know about the name of the player of even the entity object wich called it? this is FLAWED BY DESIGN !
also: IslandPos implements Serializable
or:
1.3.1
Code:
private static void convert()
  throws IOException, ClassNotFoundException
  {
  if(!oldIslands.exists())
  {
  return;
  } else
  {
  logger.info("Old islands file found! Trying to convert to new format!");
  FileInputStream fileIn = new FileInputStream(oldIslands);
  ObjectInputStream in = new ObjectInputStream(fileIn);
  HashMap map = (HashMap)in.readObject();
  in.close();
  fileIn.close();
  String s = (new GsonBuilder()).create().toJson(map);
  File newFile = new File(directory, "islands.json");
  FileOutputStream outputStream = new FileOutputStream(newFile);
  FileUtils.writeStringToFile(newFile, s);
  outputStream.close();
  oldIslands.delete();
  logger.info("Conversion completed.");
  return;
  }
  }
wich idiot thought it's a good idea to use Serialization in the first place - where you can read IN EVERY F*ing beginner book: DON'T USE IT - lke: AT ALL !

it's even complete waste of time even look at this crap and try to figure out the differences and what goes wrong in there - but from point of view from someone who use good libs: the API has to be server-instance > a-sync issue command > execute w/o any concern of who fired the event in wich way
what we have here? it's down to a destinct value - the name of the "Player" as a String - an information wich 1) doesn't belong there in the first place (IF you want to log - you log at least two level higher - where the command get's received and permissions are checked - wich should be inside the original MC-command-handler-code (or the patched crap from mcp) - but surely NOT down at the level where the block replacement takes place) 2) is not needed at all (it simply was one of the ops or someone who has access to the server console - there is no need for specific name - and users who try to execute op-level commands should logged long before)
and what do we learn: not even the one who cracked and reverse engineered the original mc-code (and did a pretty bad job at it) had the effort to fix what those noob idiots at mojang messed up in the first place - like -completely re-writing the crap API and provide a standard interface for additional (sub-)mods - and so all the noob-kiddos who start learning java by "programming" a mc-mod (NO : you DON'T use "I" as a prefix in java to mark Interfaces - PLEASE look at the java conventions how to name classes) has to live with it and bring this way down many steps further


it would be as simple as such: look for some really good java programmers (there are a few out there) - team up and knock on the dev-doors at M$ - and complete re-write this crap with a good mod-api from ground up to fix what the inventor of the original concept of "Infiniminer" came up with - just use your power once - or stop deving mods once and for all to show M$ - YOU are the power behind MC and the whole modding community - w/o any big servers can't even exists