Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Zaawansowane Tworzenie Modów


karol202

Rekomendowane odpowiedzi

  • Odpowiedzi 1,2 tys.
  • Dodano
  • Ostatniej odpowiedzi
Opublikowano

@up

Zajrzyj w kod plytki naciskowej, jak ona wykrywa, ze cos na niej jest. Potem zajrzyj w kod piasku, zobacz co sie dzieje ze spada, jak on spada. Spajasz te dwie rzeczy w jeden kod i gotowe.

Halo!

Opublikowano

Roślinki dodaj, a jeżeli chcesz poznać kod na drzewo (musisz znać angielski) obejrzy poradnik na youtube (youtube.com/sciguy1121) on ma bardzo dobre poradniki...

Oraz podaję kod (do forge) jak zrobić nowy generator RUD (nowe rudy dodane przez mod lub tradycyjne (np tak aby mogły spawnować sie w netherze)

//Ten kod w idzie do nowej klasy generatora
[Nazwa - nazwa twojego generatora [np. [...]NetheroweRudy;
 NazwaKlasyGłównej - nazwa głównej klasy twojego moda [np. main]
package NazwaKlasyGłównej.common;

import java.util.Random;

import net.minecraft.world.World;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.feature.WorldGenMinable;
import cpw.mods.fml.common.IWorldGenerator;

public class WorldGeneratorNazwa implements IWorldGenerator{
    
	@Override
	public void generate(Random random, int chunkX, int chunkZ, World world,IChunkProvider chunkGenerator, IChunkProvider chunkProvider){
        
		switch(world.provider.dimensionId){
            case 1:
                generateNether(world, random, chunkX * 16, chunkZ * 16);
            case 0:
                generateSurface(world, random, chunkX * 16, chunkZ * 16);
            case -1:
                generateEnd(world, random, chunkX * 16, chunkZ * 16);
		}
		
	}
    
	private void generateEnd(World world, Random random, int chunkX, int chunkZ){
		
	}
    
	private void generateSurface(World world, Random random, int chunkX,int chunkZ){
		for(int i = 0; i < [to zastąp częstotilwością pojawiania się rudy ( węgiel ma 15)]; i++){
			int xCoord = chunkX + random.nextInt(16);
			int yCoord = random.nextInt(64);
			int zCoord = chunkZ + random.nextInt(16);
			
			(new WorldGenMinable(NazwaKlasyGłównej.[blok, który generator ma spawnować].blockID, [zastąp max. ilością bloków spawnowanych razem])).generate(world, random, xCoord, yCoord, zCoord);
		}
	}
    
	private void generateNether(World world, Random random, int chunkX, int chunkZ){
		
	}
    
}

//Ten kod idzie do klasy głownej moda do funkcji load [@Init]

GameRegistry.registerWorldGenerator(new WorldGeneratorNazwa());

 

To wszystko, aby stworzyć generator bloków. @karol202 jeśli chcesz, wykorzystaj.

Opublikowano

@up

Zajrzyj w kod plytki naciskowej, jak ona wykrywa, ze cos na niej jest. Potem zajrzyj w kod piasku, zobacz co sie dzieje ze spada, jak on spada. Spajasz te dwie rzeczy w jeden kod i gotowe.

A gdzie jest ten kod?

Opublikowano

Jakie to trudne ... Liczyłem na jakieś linki do pobierania gotowych modów tylko do zmian nazwy itp... ale i tak fajny poradnik daje lajk

Opublikowano

W plikach odpowiednich blokow w net.minecraft.src

Ok jestem w net.minecraft.src i gdzie są te bloki?

@edit ok znalazłem tylko teraz mam pytanie bo jest taki kod:

package net.minecraft.block;

import java.util.Iterator;
import java.util.List;
import java.util.Random;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class BlockPressurePlate extends Block
{
    /** The mob type that can trigger this pressure plate. */
    private EnumMobType triggerMobType;

    protected BlockPressurePlate(int par1, int par2, EnumMobType par3EnumMobType, Material par4Material)
    {
        super(par1, par2, par4Material);
        this.triggerMobType = par3EnumMobType;
        this.setCreativeTab(CreativeTabs.tabRedstone);
        this.setTickRandomly(true);
        float var5 = 0.0625F;
        this.setBlockBounds(var5, 0.0F, var5, 1.0F - var5, 0.03125F, 1.0F - var5);
    }

    /**
     * How many world ticks before ticking
     */
    public int tickRate()
    {
        return 20;
    }

    /**
     * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
     * cleared to be reused)
     */
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    {
        return null;
    }

    /**
     * Is this block (a) opaque and ( a full 1m cube?  This determines whether or not to render the shared face of two
     * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
     */
    public boolean isOpaqueCube()
    {
        return false;
    }

    /**
     * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
     */
    public boolean renderAsNormalBlock()
    {
        return false;
    }

    public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    {
        return true;
    }

    /**
     * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
     */
    public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
    {
        return par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) || BlockFence.isIdAFence(par1World.getBlockId(par2, par3 - 1, par4));
    }

    /**
     * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
     * their own) Args: x, y, z, neighbor blockID
     */
    public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
    {
        boolean var6 = false;

        if (!par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) && !BlockFence.isIdAFence(par1World.getBlockId(par2, par3 - 1, par4)))
        {
            var6 = true;
        }

        if (var6)
        {
            this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0);
            par1World.setBlockWithNotify(par2, par3, par4, 0);
        }
    }

    /**
     * Ticks the block if it's been scheduled
     */
    public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
    {
        if (!par1World.isRemote)
        {
            if (par1World.getBlockMetadata(par2, par3, par4) != 0)
            {
                this.setStateIfMobInteractsWithPlate(par1World, par2, par3, par4);
            }
        }
    }

    /**
     * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity
     */
    public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
    {
        if (!par1World.isRemote)
        {
            if (par1World.getBlockMetadata(par2, par3, par4) != 1)
            {
                this.setStateIfMobInteractsWithPlate(par1World, par2, par3, par4);
            }
        }
    }

    /**
     * Checks if there are mobs on the plate. If a mob is on the plate and it is off, it turns it on, and vice versa.
     */
    private void setStateIfMobInteractsWithPlate(World par1World, int par2, int par3, int par4)
    {
        boolean var5 = par1World.getBlockMetadata(par2, par3, par4) == 1;
        boolean var6 = false;
        float var7 = 0.125F;
        List var8 = null;

        if (this.triggerMobType == EnumMobType.everything)
        {
            var8 = par1World.getEntitiesWithinAABBExcludingEntity((Entity)null, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)((float)par2 + var7), (double)par3, (double)((float)par4 + var7), (double)((float)(par2 + 1) - var7), (double)par3 + 0.25D, (double)((float)(par4 + 1) - var7)));
        }

        if (this.triggerMobType == EnumMobType.mobs)
        {
            var8 = par1World.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)((float)par2 + var7), (double)par3, (double)((float)par4 + var7), (double)((float)(par2 + 1) - var7), (double)par3 + 0.25D, (double)((float)(par4 + 1) - var7)));
        }

        if (this.triggerMobType == EnumMobType.players)
        {
            var8 = par1World.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)((float)par2 + var7), (double)par3, (double)((float)par4 + var7), (double)((float)(par2 + 1) - var7), (double)par3 + 0.25D, (double)((float)(par4 + 1) - var7)));
        }

        if (!var8.isEmpty())
        {
            Iterator var9 = var8.iterator();

            while (var9.hasNext())
            {
                Entity var10 = (Entity)var9.next();

                if (!var10.doesEntityNotTriggerPressurePlate())
                {
                    var6 = true;
                    break;
                }
            }
        }

        if (var6 && !var5)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 1);
            par1World.notifyBlocksOfNeighborChange(par2, par3, par4, this.blockID);
            par1World.notifyBlocksOfNeighborChange(par2, par3 - 1, par4, this.blockID);
            par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4);
            par1World.playSoundEffect((double)par2 + 0.5D, (double)par3 + 0.1D, (double)par4 + 0.5D, "random.click", 0.3F, 0.6F);
        }

        if (!var6 && var5)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 0);
            par1World.notifyBlocksOfNeighborChange(par2, par3, par4, this.blockID);
            par1World.notifyBlocksOfNeighborChange(par2, par3 - 1, par4, this.blockID);
            par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4);
            par1World.playSoundEffect((double)par2 + 0.5D, (double)par3 + 0.1D, (double)par4 + 0.5D, "random.click", 0.3F, 0.5F);
        }

        if (var6)
        {
            par1World.scheduleBlockUpdate(par2, par3, par4, this.blockID, this.tickRate());
        }
    }

    /**
     * ejects contained items into the world, and notifies neighbours of an update, as appropriate
     */
    public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
    {
        if (par6 > 0)
        {
            par1World.notifyBlocksOfNeighborChange(par2, par3, par4, this.blockID);
            par1World.notifyBlocksOfNeighborChange(par2, par3 - 1, par4, this.blockID);
        }

        super.breakBlock(par1World, par2, par3, par4, par5, par6);
    }

    /**
     * Updates the blocks bounds based on its current state. Args: world, x, y, z
     */
    public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    {
        boolean var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4) == 1;
        float var6 = 0.0625F;

        if (var5)
        {
            this.setBlockBounds(var6, 0.0F, var6, 1.0F - var6, 0.03125F, 1.0F - var6);
        }
        else
        {
            this.setBlockBounds(var6, 0.0F, var6, 1.0F - var6, 0.0625F, 1.0F - var6);
        }
    }

    /**
     * Returns true if the block is emitting indirect/weak redstone power on the specified side. If isBlockNormalCube
     * returns true, standard redstone propagation rules will apply instead and this will not be called. Args: World, X,
     * Y, Z, side. Note that the side is reversed - eg it is 1 (up) when checking the bottom of the block.
     */
    public boolean isProvidingWeakPower(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
    {
        return par1IBlockAccess.getBlockMetadata(par2, par3, par4) > 0;
    }

    /**
     * Returns true if the block is emitting direct/strong redstone power on the specified side. Args: World, X, Y, Z,
     * side. Note that the side is reversed - eg it is 1 (up) when checking the bottom of the block.
     */
    public boolean isProvidingStrongPower(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
    {
        return par1IBlockAccess.getBlockMetadata(par2, par3, par4) == 0 ? false : par5 == 1;
    }

    /**
     * Can this block provide power. Only wire currently seems to have this change based on its state.
     */
    public boolean canProvidePower()
    {
        return true;
    }

    /**
     * Sets the block's bounds for rendering it as an item
     */
    public void setBlockBoundsForItemRender()
    {
        float var1 = 0.5F;
        float var2 = 0.125F;
        float var3 = 0.5F;
        this.setBlockBounds(0.5F - var1, 0.5F - var2, 0.5F - var3, 0.5F + var1, 0.5F + var2, 0.5F + var3);
    }

    /**
     * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility
     * and stop pistons
     */
    public int getMobilityFlag()
    {
        return 1;
    }
}

Gdzie jest kod odp. za wykrywanie gracza?

Opublikowano

@up wklej tą funkcje do swojego bloku:

 

public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
{

}

I umieść w niej to co ma się dziać po wejściu.

Opublikowano

Witam w załączniku znajduje się kod źródłowy moda dla forge (krzysiek318k_testmod_src.zip)

 

Eclipse wywala mi błędy tych linijek:

blockMyBlock = new BlockMyBlock(idBlockMyBlock).setBlockName("blockMyBlock").setHardness(3F).setResistance(4);
GameRegistry.registerBlock(blockMyBlock);
LanguageRegistry.addName(blockMyBlock, "MyBlock");

Mój autorski plugin (bukkit) ItemShop [LINK], w sprawie pluginu pisać na PW lub na GG: 42337530

Opublikowano

Mam taki problem jest kod moda wszystko jak trzeba (tak myślę :D) i nie pokazuje mi tekstur a po dodaniu craftingu crashuje mi MC z góry dzięki za pomoc ^^

 

kod:

 

główna klasa moda ModMoreSwords

package HardcorowyOO.MoreSwords;

import HardcorowyOO.MoreSwords.blocks.BlockEmberBlock;
import HardcorowyOO.MoreSwords.items.ItemEmber;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.MinecraftForgeClient;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;

@Mod(modid="MoreSwords", name="MoreSwords", version="1.0")
@NetworkMod(clientSideRequired=true, serverSideRequired=false)

public class ModMoreSwords {
	@SidedProxy(clientSide="HardcorowyOO.MoreSwords.ClientProxy", serverSide="HardcorowyOO.MoreSwords.CommonProxy")
	public static CommonProxy proxy;
	@PreInit
	public void preInit(FMLPreInitializationEvent e){
		proxy.registerRender();
	}
	public static Block blockEmberBlock;
	public int idBlockEmberBlock=508;
	public static Item itemEmber;
	public static int idItemEmber=509;
	
	@Init
	public void init(FMLInitializationEvent e){
		blockEmberBlock=new BlockEmberBlock(idBlockEmberBlock).setBlockName("blockEmberBlock").setHardness(1F).setStepSound(Block.soundMetalFootstep);
		GameRegistry.registerBlock(blockEmberBlock);
		LanguageRegistry.addName(blockEmberBlock, "Ember Block");
		
		itemEmber=new ItemEmber(idItemEmber).setItemName("ItemEmber");
		LanguageRegistry.addName(itemEmber, "Ember");
		
		GameRegistry.addRecipe(new ItemStack(EmberBlock, 1), new Object[]{
			"XXX", "XXX", "XXX", "X", Ember
		});
	}
}

 

klasa CommonProxy

package HardcorowyOO.MoreSwords;

public class CommonProxy{
	public void registerRender(){
			
	}
}

 

klasa ClientProxy

package HardcorowyOO.MoreSwords;

import net.minecraftforge.client.MinecraftForgeClient;

public class ClientProxy extends CommonProxy{
	public static String textureBlocks="HardcorowyOO.MoreSwords/texture/blocks.png";
	public static String textureItems="HardcorowyOO.MoreSwords/texture/items.png";
	
	public void registerRender(){
		MinecraftForgeClient.preloadTexture(textureBlocks);
		MinecraftForgeClient.preloadTexture(textureItems);
	}
	
	public static String getBlocksTexture(){
		return textureBlocks;
	}
	
	public static String getItemsTexture(){
		return textureItems;
	}
}

 

klasa przedmiotu ItemEmber

package HardcorowyOO.MoreSwords.items;

import HardcorowyOO.MoreSwords.ClientProxy;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;

public class ItemEmber extends Item{
	public ItemEmber(int id){
		super(id);
		setIconIndex(this.itemID-HardcorowyOO.MoreSwords.ModMoreSwords.idItemEmber);
		maxStackSize=64;
		setCreativeTab(CreativeTabs.tabMaterials);
	}
	public String getTextureFile(){
		return ClientProxy.getItemsTexture();
	}
}

 

klasa bloku BlockEmberBlock

package HardcorowyOO.MoreSwords.blocks;

import HardcorowyOO.MoreSwords.ClientProxy;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;

public class BlockEmberBlock extends Block {
	public BlockEmberBlock(int id){
		super(id, 508, Material.iron);
		setBlockBounds(0F,0F,0F,1F,1F,1F);
		setCreativeTab(CreativeTabs.tabBlock);
	}
	
	public String getTextureFile(){
		return ClientProxy.getBlocksTexture();
	}
	
	public int getBlockTextureFromSide(int sd){
		return sd;
	}
}

c5b30c9c59fcfa99fbbdb2bd1f21661e.jpg<<<- CLICK :D

Opublikowano

@2up nie pomyślałeś że jak się robi odwołanie do jakiś zmiennych, to najpierw trzeba je zadeklarować? Przeczytaj jeszcze raz tut, bo nie ma przed funkcją init() odpowiednich zmiennych.

 

@up spróbuj zamienić

 

setIconIndex(this.itemID-HardcorowyOO.MoreSwords.ModMoreSwords.idItemEmber);

na

 

setIconIndex(this.itemID);
Opublikowano

Cześć.Poradnik naprawde świetny!Dobra robota.

karol202 nie myślałeś może by dodać tutorial(pod forgea)o roślinach(generowaniu ich w świecie) a także o roślinach sadzonych z nasionka?

Pozdrawiam serdecznie i jeszcze raz gratuluje świetnego poradnika.

Opublikowano

nie rozumiem twojej wypowiedzi w podpunkcie z forge jak go zainstalować???

11967467.jpg

Opublikowano

Siemanko mam problem a mianowicie eclipse wywala błąd w linijce:

blockPiach = new BlockPiach(idBlockPiach).setBlockName("Piach").setHardness(1000F).setResistance(123F);
	GameRegistry.registerBlock(blockPiach)

@edit

 

@up wklej tą funkcje do swojego bloku:

 

public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
{

}

I umieść w niej to co ma się dziać po wejściu.

1.Eclipse niestety wywala errora:

Multiple markers at this line
	- Syntax error on token ",", ; expected
	- Syntax error on token ")", ; expected
	- Syntax error on token ",", ; expected
	- Syntax error on token ",", ; expected
	- Entity cannot be resolved to a type
	- World cannot be resolved to a type
	- Syntax error on token "(", ; expected
	- Syntax error on token ",", ; expected
	- void is an invalid type for the variable 
	 onEntityCollidedWithBlock

 

2.A jaka jest funkcja spadania bloku?

Opublikowano

Całkiem całkiem, ale ja i tak wolę poradnik po angielsku, bo zazwyczaj tam więcej tłumaczą, ale no jak ktoś zna języka, to może być. Moim zdaniem tu nie wystarczy mała znajomość javy. Potrzeba co najmniej średnia, bo ktoś przeczyta w 30 minut poradnik i myśli, że wszystko umie, to się rozczaruje, bo będzie się pytać co chwilę, jak co zrobić.

//gif w sygnie

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...