Adding new blocks to game!!!

Discussion in 'Plugin Development' started by dominikremes, Jun 6, 2017.

Thread Status:
Not open for further replies.
  1. Hello guys, I think I found a way to add new blocks to a Bukkit/Spigot server. We can do it, if we try to think a bit. I just played a bit with it, and I successfully decompiled parts of some Blokk classes/Enums. They are extending the Material, Block or BlockCrops class (Classes) or Enum from net.minecraft.server (Enums). I tryed to do a class Extending Block, and it worked! I just don`t know how to configure it. Here is it, how far I went
    Code:
    import net.minecraft.server.v1_10_R1.Block;
    import net.minecraft.server.v1_10_R1.Material;
    import net.minecraft.server.v1_10_R1.MaterialMapColor;
    
    public class Test extends Block {
    
        public Test(Material material, MaterialMapColor materialmapcolor) {
            super(material, materialmapcolor);
           
            // TODO Auto-generated constructor stub
        }
       
    }
    
    And here are some examples of decompiled files.
    Code:
    // Mobilefish.com Online Java Class Decompiler
    package net.minecraft.server.v1_10_R1;
    
    import java.util.Random;
    
    public  class BlockPotatoes extends BlockCrops {
    
        private static final AxisAlignedBB[] a;
    
        public BlockPotatoes ()
        protected Item h()
        protected Item i()
        public void dropNaturally(World, BlockPosition, IBlockData, float, int)
        public AxisAlignedBB a(IBlockData, IBlockAccess, BlockPosition)
        static
    
    }
    
    Code:
    // Mobilefish.com Online Java Class Decompiler
    package net.minecraft.server.v1_10_R1;
    
    
    public final enum  class BlockChest$Type extends Enum {
    
        public static final enum BlockChest$Type BASIC;
        public static final enum BlockChest$Type TRAP;
        private static final BlockChest$Type[] c;
    
        public static BlockChest$Type[] values()
        public static BlockChest$Type valueOf(String)
        private BlockChest$Type (String, int)
        static
    
    }
    
    Code:
    package net.minecraft.server.v1_10_R1;
    
    
    public  class BlockAir extends Block {
    
    
        protected BlockAir ()
        public EnumRenderType a(IBlockData)
        public AxisAlignedBB a(IBlockData, World, BlockPosition)
        public boolean b(IBlockData)
        public boolean a(IBlockData, boolean)
        public void dropNaturally(World, BlockPosition, IBlockData, float, int)
        public boolean a(IBlockAccess, BlockPosition)
        public boolean c(IBlockData)
    
    }
    
    Code:
    package net.minecraft.server.v1_10_R1;
    
    
    public  class MaterialPortal extends Material {
    
    
        public MaterialPortal (MaterialMapColor)
        public boolean isBuildable()
        public boolean blocksLight()
        public boolean isSolid()
    
    }
    
    And the last thing I decompiled was that MaterialMapColor class. I do not know yet what is it, but it is NOT extending anythink so it is a class, witch is loading in somethink I think it can be maby the texture. I don`t know much about it, but it takes in 2 Integers when is called (I tried it):
    Code:
    package net.minecraft.server.v1_10_R1;
    
    
    public  class MaterialMapColor {
    
        public static final MaterialMapColor[] a;
        public static final MaterialMapColor b;
        public static final MaterialMapColor c;
        public static final MaterialMapColor d;
        public static final MaterialMapColor e;
        public static final MaterialMapColor f;
        public static final MaterialMapColor g;
        public static final MaterialMapColor h;
        public static final MaterialMapColor i;
        public static final MaterialMapColor j;
        public static final MaterialMapColor k;
        public static final MaterialMapColor l;
        public static final MaterialMapColor m;
        public static final MaterialMapColor n;
        public static final MaterialMapColor o;
        public static final MaterialMapColor p;
        public static final MaterialMapColor q;
        public static final MaterialMapColor r;
        public static final MaterialMapColor s;
        public static final MaterialMapColor t;
        public static final MaterialMapColor u;
        public static final MaterialMapColor v;
        public static final MaterialMapColor w;
        public static final MaterialMapColor x;
        public static final MaterialMapColor y;
        public static final MaterialMapColor z;
        public static final MaterialMapColor A;
        public static final MaterialMapColor B;
        public static final MaterialMapColor C;
        public static final MaterialMapColor D;
        public static final MaterialMapColor E;
        public static final MaterialMapColor F;
        public static final MaterialMapColor G;
        public static final MaterialMapColor H;
        public static final MaterialMapColor I;
        public static final MaterialMapColor J;
        public static final MaterialMapColor K;
        public final int L;
        public final int M;
    
        private MaterialMapColor (int, int)
        static
    
    }
    And now the Block class:
    Code:
    package net.minecraft.server.v1_10_R1;
    
    import com.google.common.collect.ImmutableList;
    import com.google.common.collect.Sets;
    import com.google.common.collect.UnmodifiableIterator;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Random;
    import org.spigotmc.AsyncCatcher;
    
    public  class Block {
    
        private static final MinecraftKey a;
        public static final RegistryBlocks REGISTRY = Lnet/minecraft/server/v1_10_R1/RegistryBlocks<Lnet/minecraft/server/v1_10_R1/MinecraftKey;Lnet/minecraft/server/v1_10_R1/Block;>;;
        public static final RegistryBlockID REGISTRY_ID = Lnet/minecraft/server/v1_10_R1/RegistryBlockID<Lnet/minecraft/server/v1_10_R1/IBlockData;>;;
        public static final AxisAlignedBB j;
        public static final AxisAlignedBB k;
        private CreativeModeTab creativeTab;
        protected boolean l;
        protected int m;
        protected boolean n;
        protected int o;
        protected boolean p;
        protected float strength;
        protected float durability;
        protected boolean s;
        protected boolean t;
        protected boolean isTileEntity;
        protected SoundEffectType stepSound;
        public float w;
        protected final Material material;
        protected final MaterialMapColor y;
        public float frictionFactor;
        protected final BlockStateList blockStateList;
        private IBlockData blockData;
        private String name;
    
        static
        public static int getId(Block)
        public static int getCombinedId(IBlockData)
        public static Block getById(int)
        public static IBlockData getByCombinedId(int)
        public static Block asBlock(Item)
        public static Block getByName(String)
        public boolean k(IBlockData)
        public boolean l(IBlockData)
        public boolean a(IBlockData, Entity)
        public int m(IBlockData)
        public int o(IBlockData)
        public boolean p(IBlockData)
        public Material q(IBlockData)
        public MaterialMapColor r(IBlockData)
        public IBlockData fromLegacyData(int)
        public int toLegacyData(IBlockData)
        public IBlockData updateState(IBlockData, IBlockAccess, BlockPosition)
        public IBlockData a(IBlockData, EnumBlockRotation)
        public IBlockData a(IBlockData, EnumBlockMirror)
        public Block (Material, MaterialMapColor)
        protected Block (Material)
        protected Block a(SoundEffectType)
        protected Block d(int)
        protected Block a(float)
        protected Block b(float)
        public boolean s(IBlockData)
        public boolean isOccluding(IBlockData)
        public boolean j()
        public boolean c(IBlockData)
        public boolean b(IBlockAccess, BlockPosition)
        public EnumRenderType a(IBlockData)
        public boolean a(IBlockAccess, BlockPosition)
        protected Block c(float)
        protected Block k()
        public float b(IBlockData, World, BlockPosition)
        protected Block a(boolean)
        public boolean isTicking()
        public boolean isTileEntity()
        public AxisAlignedBB a(IBlockData, IBlockAccess, BlockPosition)
        public boolean a(IBlockAccess, BlockPosition, EnumDirection)
        public void a(IBlockData, World, BlockPosition, AxisAlignedBB, List, Entity)
        protected static void a(BlockPosition, AxisAlignedBB, List, AxisAlignedBB)
        public AxisAlignedBB a(IBlockData, World, BlockPosition)
        public boolean b(IBlockData)
        public boolean a(IBlockData, boolean)
        public boolean n()
        public void a(World, BlockPosition, IBlockData, Random)
        public void b(World, BlockPosition, IBlockData, Random)
        public void postBreak(World, BlockPosition, IBlockData)
        public void a(IBlockData, World, BlockPosition, Block)
        public int a(World)
        public void onPlace(World, BlockPosition, IBlockData)
        public void remove(World, BlockPosition, IBlockData)
        public int a(Random)
        public Item getDropType(IBlockData, Random, int)
        public float getDamage(IBlockData, EntityHuman, World, BlockPosition)
        public final void b(World, BlockPosition, IBlockData, int)
        public void dropNaturally(World, BlockPosition, IBlockData, float, int)
        public static void a(World, BlockPosition, ItemStack)
        protected void dropExperience(World, BlockPosition, int)
        public int getDropData(IBlockData)
        public float a(Entity)
        public MovingObjectPosition a(IBlockData, World, BlockPosition, Vec3D, Vec3D)
        protected MovingObjectPosition a(BlockPosition, Vec3D, Vec3D, AxisAlignedBB)
        public void wasExploded(World, BlockPosition, Explosion)
        public boolean canPlace(World, BlockPosition, EnumDirection, ItemStack)
        public boolean canPlace(World, BlockPosition, EnumDirection)
        public boolean canPlace(World, BlockPosition)
        public boolean interact(World, BlockPosition, IBlockData, EntityHuman, EnumHand, ItemStack, EnumDirection, float, float, float)
        public void stepOn(World, BlockPosition, Entity)
        public IBlockData getPlacedState(World, BlockPosition, EnumDirection, float, float, float, int, EntityLiving)
        public void attack(World, BlockPosition, EntityHuman)
        public Vec3D a(World, BlockPosition, Entity, Vec3D)
        public int b(IBlockData, IBlockAccess, BlockPosition, EnumDirection)
        public boolean isPowerSource(IBlockData)
        public void a(World, BlockPosition, IBlockData, Entity)
        public int c(IBlockData, IBlockAccess, BlockPosition, EnumDirection)
        public void a(World, EntityHuman, BlockPosition, IBlockData, TileEntity, ItemStack)
        protected boolean o()
        protected ItemStack u(IBlockData)
        public int getDropCount(int, Random)
        public void postPlace(World, BlockPosition, IBlockData, EntityLiving, ItemStack)
        public boolean d()
        public Block c(String)
        public String getName()
        public String a()
        public boolean a(IBlockData, World, BlockPosition, int, int)
        public boolean p()
        protected Block q()
        public EnumPistonReaction h(IBlockData)
        public void fallOn(World, BlockPosition, Entity, float)
        public void a(World, Entity)
        public ItemStack a(World, BlockPosition, IBlockData)
        public Block a(CreativeModeTab)
        public void a(World, BlockPosition, IBlockData, EntityHuman)
        public void h(World, BlockPosition)
        public boolean s()
        public boolean a(Explosion)
        public boolean b(Block)
        public static boolean a(Block, Block)
        public boolean isComplexRedstone(IBlockData)
        public int d(IBlockData, World, BlockPosition)
        protected BlockStateList getStateList()
        public BlockStateList t()
        protected final void w(IBlockData)
        public final IBlockData getBlockData()
        public SoundEffectType w()
        public String toString()
        public static void x()
        public int getExpDrop(World, IBlockData, int)
        private static void a(int, MinecraftKey, Block)
        private static void a(int, String, Block)
        public static float range(float, float, float)
    }
    
    We just need to try everythink and it will be possible to add new blocks and items, I`m sure. Please write in the comment if you find somethink interesting about this
     
  2. @dominikremes
    I hate to say it, but you're not going to succeed. I'm decently familiar with the minecraft internals and I can tell you for sure that this is not possible. All textures are loaded clientside, none are sent from the server. The only way to make this work is to use a resource pack, but that won't allow for a completely new block, just a reskin of one (I know there are some tricks you can do, but it's still the basic principle).

    Still though, it's very good to familiarize yourself with how minecraft works. You really do improve in your plugin making if you know how the underlying code works.
     
  3. Offline

    timtower Administrator Administrator Moderator

    @dominikremes I personally say impossible till proven otherwise.
    Server needs to know about it, client needs to know about it, protocol doesn't have that support.
     
  4. Offline

    Zombie_Striker

    @dominikremes
    Although @AlvinB and @timtower 'hinted' that is may be possible, Adding blocks to minecraft cannot be done without mods. Minecraft can only load assets that it knows of; trying to tell the client to load a block that does not exist will cause the client to crash. The client needs to know what the block looks like, which would mean it must be added using a mod since resoucepacks modify existing blocks.
     
  5. I`ve nearly got the solution. You told, that we can only change the textures. But there are free spaces in the pack like in this one:[​IMG]
    So I maby know what MaterialMapColor is. It can be the row and the column of the picture. If someone tell me how to fix this error:
    Code:
    [19:28:41 ERROR]: Could not pass event PlayerJoinEvent to MC_Craft v11.0
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot.jar:git-Spigot-c3e4052-1953f52]
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-c3e4052-1953f52]
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at net.minecraft.server.v1_10_R1.PlayerList.onPlayerJoin(PlayerList.java:333) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at net.minecraft.server.v1_10_R1.PlayerList.a(PlayerList.java:159) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at net.minecraft.server.v1_10_R1.LoginListener.b(LoginListener.java:144) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at net.minecraft.server.v1_10_R1.LoginListener.E_(LoginListener.java:54) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at net.minecraft.server.v1_10_R1.NetworkManager.a(NetworkManager.java:233) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at net.minecraft.server.v1_10_R1.ServerConnection.c(ServerConnection.java:140) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:832) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:399) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:672) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:571) [spigot.jar:git-Spigot-c3e4052-1953f52]
            at java.lang.Thread.run(Unknown Source) [?:1.8.0_131]
    Caused by: java.lang.ClassCastException: Cannot cast java.lang.Class to java.lang.reflect.Constructor
            at java.lang.Class.cast(Unknown Source) ~[?:1.8.0_131]
            at server.mccraft.customs.AcessableMapColor.mapColor(AcessableMapColor.java:29) ~[?:?]
            at server.mccraft.customs.NewMaterial.<init>(NewMaterial.java:8) ~[?:?]
            at server.mccraft.Main.PlayerJoin(Main.java:233) ~[?:?]
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_131]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_131]
            at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_131]
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot.jar:git-Spigot-c3e4052-1953f52]
            ... 14 more
    
    Maby it will work.
    Here is the code that I`ve now:
    AcessableMapColor:
    Code:
    package server.mccraft.customs;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    import net.minecraft.server.v1_10_R1.MaterialMapColor;
    
    public class AcessableMapColor {
    
        public MaterialMapColor mp;
       
       
        @SuppressWarnings("rawtypes")
        private Constructor c = MaterialMapColor.class.getDeclaredConstructors()[0];
       
        public AcessableMapColor() {
            c.setAccessible(true);
        }
       
        @SuppressWarnings("rawtypes")
        public MaterialMapColor mapColor(int column, int row) {
            try {
                c.newInstance(column, row);
            } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
                    | InvocationTargetException e) {
                e.printStackTrace();
            }
            Class clss = c.getClass();
            MaterialMapColor m = (MaterialMapColor) clss.cast(MaterialMapColor.class/*.getClass()*/);
            return m;
        }
    }
    
    Code:
    package server.mccraft.customs;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack;
    import org.bukkit.inventory.ItemStack;
    
    import net.minecraft.server.v1_10_R1.Material;
    import net.minecraft.server.v1_10_R1.MaterialMapColor;
    
    public class NewItemStack {
    
        private Material mat;
       
        @SuppressWarnings("rawtypes")
        private Constructor c = MaterialMapColor.class.getDeclaredConstructors()[0];
       
        public NewItemStack(Material mat) {
            c.setAccessible(true);
            this.mat = mat;
        }
       
        public org.bukkit.inventory.ItemStack toItem() {
            net.minecraft.server.v1_10_R1.ItemStack ci = net.minecraft.server.v1_10_R1.ItemStack.class.cast(mat);
            ItemStack i = new ItemStack(craftItem(ci));
            return i;
        }
       
        @SuppressWarnings("rawtypes")
        private CraftItemStack craftItem(net.minecraft.server.v1_10_R1.ItemStack ci) {
            try {
                c.newInstance(ci);
            } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
                    | InvocationTargetException e) {
                e.printStackTrace();
            }
            Class clss = c.getClass();
            CraftItemStack m = (CraftItemStack) clss.cast(CraftItemStack.class.getClass());
            return m;
        }
    }
    Code:
    package server.mccraft.customs;
    
    import net.minecraft.server.v1_10_R1.Material;
    
    public class NewMaterial extends Material {
    
        public NewMaterial() {
            super(new AcessableMapColor().mapColor(6, 6));
        }
    }
    Code:
    package server.mccraft.customs;
    
    import net.minecraft.server.v1_10_R1.Block;
    import net.minecraft.server.v1_10_R1.Material;
    
    public class NewBlock extends Block {
    
        public NewBlock(Material material) {
            super(material, new AcessableMapColor().mapColor(5, 5));   
        }
    }
    
     
  6. @dominikremes
    It's not. MaterialMapColor is only a class detailing which colour on a map item every block should have, so the server knows which colour to make each block of a map it sends to the client.

    I know you say there are extra spots in the textures, but there is no way you can add anything there serverside. Trust us on this.

    And might I add, that picture you posted is ancient. Nowdays the textures are stored in individual png files for each block.
     
  7. @AlvinB @Zombie_Striker @timtower
    Ok. And 3 more questions I've got. Can we add custom achievements or just display the AchevementCompleted think with custom picture and text?. Can we create an extra display slot (I want it somwhere there, where the tablist is) witch contains. And the 3rd question is Can we create a plugin like TooManyItems? I mean a block list next to the inv and optionaly the craftings?
     
  8. Offline

    timtower Administrator Administrator Moderator

Thread Status:
Not open for further replies.

Share This Page