This part of SAPI allows you to intercept each block harvest.
Using it to change block's drops:
dirt that drops diamonds
public class mod_Example extends BaseMod implements IInterceptHarvest {
public mod_Example() {
SAPI.interceptAdd(this);
}
public boolean canIntercept(fd world, gs player, Loc loc, int blockID, int meta) {
return blockID == uu.w.bn;
}
public void intercept(fd world, gs player, Loc loc, int blockID, int meta) {
SAPI.drop(world,loc,new iz(gm.l));
}
public String Version() {
return "1.0";
}
}
public class mod_Example extends BaseMod implements IInterceptHarvest {
public mod_Example() {
SAPI.interceptAdd(this);
}
public boolean canIntercept(World world, EntityPlayer player, Loc loc, int blockID,
int meta) {
return blockID == Block.dirt.blockID;
}
public void intercept(World world, EntityPlayer player, Loc loc, int blockID, int meta) {
SAPI.drop(world,loc,new ItemStack(Item.diamond));
}
public String Version() {
return "1.0";
}
}
This part of SAPI allows you to intercept a block placing.
Auto-changing a block into other block:
dirt -> grass
public class mod_Example extends BaseMod implements IInterceptBlockSet {
public mod_Example() {
SAPI.interceptAdd(this);
}
public boolean canIntercept(fd world, Loc loc, int blockID) {
return blockID == uu.w.bn;
}
public int intercept(fd world, Loc loc, int blockID) {
return uu.v.bn;
}
public String Version() {
return "1.0";
}
}
public class mod_Example extends BaseMod implements IInterceptBlockSet {
public mod_Example() {
SAPI.interceptAdd(this);
}
public boolean canIntercept(World world, Loc loc, int blockID) {
return blockID == Block.dirt.blockID;
}
public int intercept(World world, Loc loc, int blockID) {
return Block.grass.blockID;
}
public String Version() {
return "1.0";
}
}
This part of SAPI allows you to change the item's reach vs entities/blocks.
Greater range vs entities:
2x greater range when holding a stick
public class mod_Example extends BaseMod implements IReachEntity {
public mod_Example() {
SAPI.reachAdd(this);
}
public boolean reachEntityItemMatches(iz stack) {
if (stack == null) return false;
return stack.c == gm.B.bf;
}
public float getReachEntity(iz stack) {
return 6f; //the default is 3
}
public String Version() {
return "1.0";
}
}
public class mod_Example extends BaseMod implements IReachEntity {
public mod_Example() {
SAPI.reachAdd(this);
}
public boolean reachEntityItemMatches(ItemStack stack) {
if (stack == null) return false;
return stack.itemID == Item.stick.shiftedIndex;
}
public float getReachEntity(ItemStack stack) {
return 6f; //the default is 3
}
public String Version() {
return "1.0";
}
}
Greater range vs blocks:
2x greater range when holding a gold pickaxe
public class mod_Example extends BaseMod implements IReachBlock {
public mod_Example() {
SAPI.reachAdd(this);
}
public boolean reachBlockItemMatches(iz stack) {
if (stack == null) return false;
return stack.c == gm.G.bf;
}
public float getReachBlock(iz stack) {
return 8f //the default is 4
}
public String Version() {
return "1.0";
}
}
public class mod_Example extends BaseMod implements IReachBlock {
public mod_Example() {
SAPI.reachAdd(this);
}
public boolean reachBlockItemMatches(ItemStack stack) {
if (stack == null) return false;
return stack.itemID == Item.pickaxeGold.shiftedIndex;
}
public float getReachBlock(ItemStack stack) {
return 8f //the default is 4
}
public String Version() {
return "1.0";
}
}
This part of SAPI allows you to add new monsters to default Minecraft dungeons and new items in chests found there.
Adding new mob to a spawner:
Creeper
The same code for both obfuscated and MCP
public class mod_Example extends BaseMod {
public mod_Example() {
SAPI.dungeonAddMob("Creeper");
}
public String Version() {
return "1.0";
}
}
Adding new items to chests:
torches (1-32 in stack), diamonds (rare)
public class mod_Example extends BaseMod {
public mod_Example() {
SAPI.dungeonAddItem(new DungeonLoot(new iz(uu.ar),1,32));
SAPI.dungeonAddItem(new DungeonLoot(new iz(gm.l)),1); //default "rarity" is 100
}
public String Version() {
return "1.0";
}
}
public class mod_Example extends BaseMod {
public mod_Example() {
SAPI.dungeonAddItem(new DungeonLoot(new ItemStack(Block.torch),1,32));
SAPI.dungeonAddItem(new DungeonLoot(new ItemStack(Item.diamond)),1);
//default "rarity" is 100
}
public String Version() {
return "1.0";
}
}
Adding guaranteed items to chests:
cooked porkchop
public class mod_Example extends BaseMod {
public mod_Example() {
SAPI.dungeonAddGuaranteedItem(new DungeonLoot(new iz(gm.ap)));
}
public String Version() {
return "1.0";
}
}
public class mod_Example extends BaseMod {
public mod_Example() {
SAPI.dungeonAddGuaranteedItem(new DungeonLoot(new ItemStack(Item.porkCooked)));
}
public String Version() {
return "1.0";
}
}
Other functions:
The same code for both obfuscated and MCP
SAPI.dungeonAddMob(mob,chances); //String,int | default chances = 10
SAPI.dungeonRemoveMob(mob); //String
SAPI.dungeonRemoveAllMobs();
SAPI.dungeonRemoveItem(itemID); //int
SAPI.dungeonRemoveAllItems();
This part of SAPI allows you to add a separate page for your own achievements.
Adding a page:
public class mod_Example extends BaseMod {
public mod_Example() {
ny ac1 = new ny(12345,"acTest1",0,0,gm.bb,null).c();
ModLoader.AddAchievementDesc(ac1,"My 1st achievement","First achievement");
ny ac2 = new ny(12346,"acTest2",0,2,gm.bb,ac1).c();
ModLoader.AddAchievementDesc(ac2,"My 2nd achievement","Second achievement");
ACPage myPage = new ACPage("My Page");
myPage.addAchievements(ac1,ac2);
}
public String Version() {
return "1.0";
}
}
public class mod_Example extends BaseMod {
public mod_Example() {
Achievement ac1 = new Achievement(12345,"acTest1",0,0,Item.mapItem,null)
.registerAchievement();
ModLoader.AddAchievementDesc(ac1,"My 1st achievement","First achievement");
Achievement ac2 = new Achievement(12346,"acTest2",0,2,Item.mapItem,ac1)
.registerAchievement();
ModLoader.AddAchievementDesc(ac2,"My 2nd achievement","Second achievement");
ACPage myPage = new ACPage("My Page");
myPage.addAchievements(ac1,ac2);
}
public String Version() {
return "1.0";
}
}
Creating a page with custom background:
All sand
public class mod_Example extends BaseMod {
public mod_Example() {
ny ac = new ny(143523,"acRandom1",0,0,uu.F,null).c();
ModLoader.AddAchievementDesc(ac1,"Random achievement","An achievement");
ACPage myPage = new MyOwnACPage("My Page");
myPage.addAchievements(ac);
}
public String Version() {
return "1.0";
}
}
public class MyOwnACPage extends ACPage {
public MyOwnACPage(String title) {
super(title);
}
public int bgGetSprite(Random random, int x, int y) {
return uu.F.bm;
}
}
public class mod_Example extends BaseMod {
public mod_Example() {
Achievement ac = new Achievement(143523,"acRandom1",0,0,Block.sand,null)
.registerAchievement();
ModLoader.AddAchievementDesc(ac1,"Random achievement","An achievement");
ACPage myPage = new MyOwnACPage("My Page");
myPage.addAchievements(ac);
}
public String Version() {
return "1.0";
}
}
public class MyOwnACPage extends ACPage {
public MyOwnACPage(String title) {
super(title);
}
public int bgGetSprite(Random random, int x, int y) {
return Block.sand.blockIndexInTexture;
}
}
This part of SAPI allows you to save your own NBT files for a world.
Saving a value to a new NBT file:
public class mod_Example extends BaseMod implements INBT {
public static int value = 0;
public mod_Example() {
SAPI.interceptAdd(this);
}
public String getFnameNBT() {
return "MyNBT.dat";
}
public void saveNBT(nu nbtCompound) {
nbtCompound.a("Value",++value);
}
public void loadNBT(nu nbtCompound) {
value = nbtCompound.e("Value");
}
public String Version() {
return "1.0";
}
}
public class mod_Example extends BaseMod implements INBT {
public static int value = 0;
public mod_Example() {
SAPI.interceptAdd(this);
}
public String getFnameNBT() {
return "MyNBT.dat";
}
public void saveNBT(NBTTagCompound nbtCompound) {
nbtCompound.setInteger("Value",++value);
}
public void loadNBT(NBTTagCompound nbtCompound) {
value = nbtCompound.getInteger("Value");
}
public String Version() {
return "1.0";
}
}
PlayerAPI was originally a standalone mod made by Flan, but it was meant to be merged with SAPI, but I (Shockah) was on holidays.
This part of SAPI allows you to add your own code to methods in EntityPlayerSP class.
Making a little hack - player "always in water material", without water:
public class mod_Example extends BaseMod {
public mod_Example() {
SAPI.PAPIregisterPlayerBase(MyPlayerBase.class);
}
public String Version() {
return "1.0";
}
}
public class MyPlayerBase extends PlayerBase {
public boolean isInsideOfMaterial(ln material, boolean inMaterial) {
if (material == ln.g) return true;
return inMaterial;
}
}
public class mod_Example extends BaseMod {
public mod_Example() {
SAPI.PAPIregisterPlayerBase(MyPlayerBase.class);
}
public String Version() {
return "1.0";
}
}
public class MyPlayerBase extends PlayerBase {
public boolean isInsideOfMaterial(Material material, boolean inMaterial) {
if (material == Material.water) return true;
return inMaterial;
}
}
All the methods that can be overridden:
PlayerBase.playerInit();
PlayerBase.onLivingUpdate();
PlayerBase.handleKeyPress(i,flag); //int,boolean
PlayerBase.writeEntityToNBT(tag); //nu
PlayerBase.readEntityFromNBT(tag); //nu
PlayerBase.setEntityDead();
PlayerBase.onDeath(killer); //sn
PlayerBase.respawn();
PlayerBase.attackEntityFrom(attacker,damage); //sn,int
PlayerBase.getDistanceSq(d1,d2,d3,answer); //double,double,double,double
PlayerBase.isInWater(inWater); //boolean
PlayerBase.onExitGUI();
PlayerBase.heal(i); //int
PlayerBase.canTriggerWalking(canTrigger); //boolean
PlayerBase.getPlayerArmorValue(armor); //int
PlayerBase.getCurrentPlayerStrVsBlock(block,f); //uu,float
PlayerBase.moveFlying(x,y,z); //float,float,float
PlayerBase.moveEntity(x,y,z); //double,double,double
PlayerBase.sleepInBedAt(x,y,z,status); //int,int,int,cw
PlayerBase.getEntityBrightness(f,brightness); //float,float
PlayerBase.pushOutOfBlocks(x,y,z); //double,double,double
PlayerBase.onUpdate();
PlayerBase.afterUpdate();
PlayerBase.moveEntityWithHeading(f,f1); //float,float
PlayerBase.isOnLadder(onLadder); //boolean
PlayerBase.isInsideOfMaterial(material,inMaterial); //ln,boolean
PlayerBase.isSneaking(sneaking); //boolean
PlayerBase.dropCurrentItem();
PlayerBase.dropPlayerItem(itemstack); //iz
PlayerBase.displayGUIEditSign(sign); //yk
PlayerBase.displayGUIChest(iinventory); //lw
PlayerBase.displayWorkbenchGUI(x,y,z); //int,int,int
PlayerBase.displayGUIFurnace(furnace); //sk
PlayerBase.displayGUIDispenser(dispenser); //az
PlayerBase.playerInit();
PlayerBase.onLivingUpdate();
PlayerBase.handleKeyPress(i,flag); //int,boolean
PlayerBase.writeEntityToNBT(tag); //NBTTagCompound
PlayerBase.readEntityFromNBT(tag); //NBTTagCompound
PlayerBase.setEntityDead();
PlayerBase.onDeath(killer); //Entity
PlayerBase.respawn();
PlayerBase.attackEntityFrom(attacker,damage); //Entity,int
PlayerBase.getDistanceSq(d1,d2,d3,answer); //double,double,double,double
PlayerBase.isInWater(inWater); //boolean
PlayerBase.onExitGUI();
PlayerBase.heal(i); //int
PlayerBase.canTriggerWalking(canTrigger); //boolean
PlayerBase.getPlayerArmorValue(armor); //int
PlayerBase.getCurrentPlayerStrVsBlock(block,f); //Block,float
PlayerBase.moveFlying(x,y,z); //float,float,float
PlayerBase.moveEntity(x,y,z); //double,double,double
PlayerBase.sleepInBedAt(x,y,z,status); //int,int,int,EnumStatus
PlayerBase.getEntityBrightness(f,brightness); //float,float
PlayerBase.pushOutOfBlocks(x,y,z); //double,double,double
PlayerBase.onUpdate();
PlayerBase.afterUpdate();
PlayerBase.moveEntityWithHeading(f,f1); //float,float
PlayerBase.isOnLadder(onLadder); //boolean
PlayerBase.isInsideOfMaterial(material,inMaterial); //Material,boolean
PlayerBase.isSneaking(sneaking); //boolean
PlayerBase.dropCurrentItem();
PlayerBase.dropPlayerItem(itemstack); //ItemStack
PlayerBase.displayGUIEditSign(sign); //TileEntitySign
PlayerBase.displayGUIChest(iinventory); //IInventory
PlayerBase.displayWorkbenchGUI(x,y,z); //int,int,int
PlayerBase.displayGUIFurnace(furnace); //TileEntityFurnace
PlayerBase.displayGUIDispenser(dispenser); //TileEntityDispenser