Jump to content

[1.5.2] Custom Bonemeal Support


keynah

Recommended Posts

Hello everyone,

 

I've spent the last 3 hours looking online for a Custom Bonemeal tutorial or anything similar. I found many results on how to use the Bonemeal Event for custom saplings but next to nothing on how to create your own item that works like bonemeal.

 

I looked into the ItemDye class to minic the bonemeal itself and made this class, leaving out parts that were not needed such as subitems and icontexture fromMetaData.

 

Important Info: Item's name is ghastMarrow, my main class/package is NetherCraft,

 

ghastMarrow

 

 

package netherCraft;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.BlockCloth;
import net.minecraft.block.BlockCocoa;
import net.minecraft.block.BlockCrops;
import net.minecraft.block.BlockDirectional;
import net.minecraft.block.BlockLog;
import net.minecraft.block.BlockMushroom;
import net.minecraft.block.BlockSapling;
import net.minecraft.block.BlockStem;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.passive.EntitySheep;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Icon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

import net.minecraftforge.common.FakePlayerFactory;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.Event.Result;
import net.minecraftforge.event.entity.player.BonemealEvent;

public class ghastMarrow extends Item
{
  @SideOnly(Side.CLIENT)
    private Icon[] field_94594_d;

    public ghastMarrow(int par1)
    {
        super(par1);
        this.setCreativeTab(CreativeTabs.tabMaterials);
        this.setUnlocalizedName("ghastMarrow");
        
    }


    /**
     * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
     * True if something happen and false if it don't. This is for ITEMS, not BLOCKS
     */
    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
    {
        if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack))
        {
            return false;
        }
        else
        {
            if (par1ItemStack.getItemDamage() == 15)
            {
                if (applyGhastMarrow(par1ItemStack, par3World, par4, par5, par6, par2EntityPlayer))
                {
                    if (!par3World.isRemote)
                    {
                        par3World.playAuxSFX(2005, par4, par5, par6, 0);
                    }

                    return true;
                }
            }
            else if (par1ItemStack.getItemDamage() == 3)
            {
                int i1 = par3World.getBlockId(par4, par5, par6);
                int j1 = par3World.getBlockMetadata(par4, par5, par6);

                if (i1 == Block.wood.blockID && BlockLog.limitToValidMetadata(j1) == 3)
                {
                    if (par7 == 0)
                    {
                        return false;
                    }

                    if (par7 == 1)
                    {
                        return false;
                    }

                    if (par7 == 2)
                    {
                        --par6;
                    }

                    if (par7 == 3)
                    {
                        ++par6;
                    }

                    if (par7 == 4)
                    {
                        --par4;
                    }

                    if (par7 == 5)
                    {
                        ++par4;
                    }

                    if (par3World.isAirBlock(par4, par5, par6))
                    {
                        int k1 = Block.blocksList[block.cocoaPlant.blockID].onBlockPlaced(par3World, par4, par5, par6, par7, par8, par9, par10, 0);
                        par3World.setBlock(par4, par5, par6, Block.cocoaPlant.blockID, k1, 2);

                        if (!par2EntityPlayer.capabilities.isCreativeMode)
                        {
                            --par1ItemStack.stackSize;
                        }
                    }

                    return true;
                }
            }

            return false;
        }
    }

    public static boolean func_96604_a(ItemStack par0ItemStack, World par1World, int par2, int par3, int par4)
    {
        return applyGhastMarrow(par0ItemStack, par1World, par2, par3, par4, FakePlayerFactory.getMinecraft(par1World));
    }

    public static boolean applyGhastMarrow(ItemStack par0ItemStack, World par1World, int par2, int par3, int par4, EntityPlayer player)
    {
        int l = par1World.getBlockId(par2, par3, par4);

        BonemealEvent event = new BonemealEvent(player, par1World, l, par2, par3, par4);
        if (MinecraftForge.EVENT_BUS.post(event))
        {
            return false;
        }

        if (event.getResult() == Result.ALLOW)
        {
            if (!par1World.isRemote)
            {
                par0ItemStack.stackSize--;
            }
            return true;
        }

        if (l == Block.sapling.blockID)
        {
            if (!par1World.isRemote)
            {
                if ((double)par1World.rand.nextFloat() < 0.45D)
                {
                    ((BlockSapling)Block.sapling).markOrGrowMarked(par1World, par2, par3, par4, par1World.rand);
                }

                --par0ItemStack.stackSize;
            }

            return true;
        }
        else if (l != Block.mushroomBrown.blockID && l != Block.mushroomRed.blockID)
        {
            if (l != Block.melonStem.blockID && l != Block.pumpkinStem.blockID)
            {
                if (l > 0 && Block.blocksList[l] instanceof BlockCrops)
                {
                    if (par1World.getBlockMetadata(par2, par3, par4) == 7)
                    {
                        return false;
                    }
                    else
                    {
                        if (!par1World.isRemote)
                        {
                            ((BlockCrops)Block.blocksList[l]).fertilize(par1World, par2, par3, par4);
                            --par0ItemStack.stackSize;
                        }

                        return true;
                    }
                }
                else
                {
                    int i1;
                    int j1;
                    int k1;

                    if (l == Block.cocoaPlant.blockID)
                    {
                        i1 = par1World.getBlockMetadata(par2, par3, par4);
                        j1 = BlockDirectional.getDirection(i1);
                        k1 = BlockCocoa.func_72219_c(i1);

                        if (k1 >= 2)
                        {
                            return false;
                        }
                        else
                        {
                            if (!par1World.isRemote)
                            {
                                ++k1;
                                par1World.setBlockMetadataWithNotify(par2, par3, par4, k1 << 2 | j1, 2);
                                --par0ItemStack.stackSize;
                            }

                            return true;
                        }
                    }
                    else if (l != Block.grass.blockID)
                    {
                        return false;
                    }
                    else
                    {
                        if (!par1World.isRemote)
                        {
                            --par0ItemStack.stackSize;
                            label102:

                            for (i1 = 0; i1 < 128; ++i1)
                            {
                                j1 = par2;
                                k1 = par3 + 1;
                                int l1 = par4;

                                for (int i2 = 0; i2 < i1 / 16; ++i2)
                                {
                                    j1 += itemRand.nextInt(3) - 1;
                                    k1 += (itemRand.nextInt(3) - 1) * itemRand.nextInt(3) / 2;
                                    l1 += itemRand.nextInt(3) - 1;

                                    if (par1World.getBlockId(j1, k1 - 1, l1) != Block.grass.blockID || par1World.isBlockNormalCube(j1, k1, l1))
                                    {
                                        continue label102;
                                    }
                                }

                                if (par1World.getBlockId(j1, k1, l1) == 0)
                                {
                                    if (itemRand.nextInt(10) != 0)
                                    {
                                        if (Block.tallGrass.canBlockStay(par1World, j1, k1, l1))
                                        {
                                            par1World.setBlock(j1, k1, l1, Block.tallGrass.blockID, 1, 3);
                                        }
                                    }
                                    else
                                    {
                                        ForgeHooks.plantGrass(par1World, j1, k1, l1);
                                    }
                                }
                            }
                        }

                        return true;
                    }
                }
            }
            else if (par1World.getBlockMetadata(par2, par3, par4) == 7)
            {
                return false;
            }
            else
            {
                if (!par1World.isRemote)
                {
                    ((BlockStem)Block.blocksList[l]).fertilizeStem(par1World, par2, par3, par4);
                    --par0ItemStack.stackSize;
                }

                return true;
            }
        }
        else
        {
            if (!par1World.isRemote)
            {
                if ((double)par1World.rand.nextFloat() < 0.4D)
                {
                    ((BlockMushroom)Block.blocksList[l]).fertilizeMushroom(par1World, par2, par3, par4, par1World.rand);
                }

                --par0ItemStack.stackSize;
            }

            return true;
        }
    }

    @SideOnly(Side.CLIENT)
    public static void func_96603_a(World par0World, int par1, int par2, int par3, int par4)
    {
        int i1 = par0World.getBlockId(par1, par2, par3);

        if (par4 == 0)
        {
            par4 = 15;
        }

        Block block = i1 > 0 && i1 < Block.blocksList.length ? Block.blocksList[i1] : null;

        if (block != null)
        {
            block.setBlockBoundsBasedOnState(par0World, par1, par2, par3);

            for (int j1 = 0; j1 < par4; ++j1)
            {
                double d0 = itemRand.nextGaussian() * 0.02D;
                double d1 = itemRand.nextGaussian() * 0.02D;
                double d2 = itemRand.nextGaussian() * 0.02D;
                par0World.spawnParticle("happyVillager", (double)((float)par1 + itemRand.nextFloat()), (double)par2 + (double)itemRand.nextFloat() * block.getBlockBoundsMaxY(), (double)((float)par3 + itemRand.nextFloat()), d0, d1, d2);
            }
        }
        else
        {
            for (int j1 = 0; j1 < par4; ++j1)
            {
                double d0 = itemRand.nextGaussian() * 0.02D;
                double d1 = itemRand.nextGaussian() * 0.02D;
                double d2 = itemRand.nextGaussian() * 0.02D;
                par0World.spawnParticle("happyVillager", (double)((float)par1 + itemRand.nextFloat()), (double)par2 + (double)itemRand.nextFloat() * 1.0f, (double)((float)par3 + itemRand.nextFloat()), d0, d1, d2);
            }
        }
    }

    /**
     * Called when a player right clicks an entity with an item.
     */
    public boolean itemInteractionForEntity(ItemStack par1ItemStack, EntityLiving par2EntityLiving)
    {
        if (par2EntityLiving instanceof EntitySheep)
        {
            EntitySheep entitysheep = (EntitySheep)par2EntityLiving;
            int i = BlockCloth.getBlockFromDye(par1ItemStack.getItemDamage());

            if (!entitysheep.getSheared() && entitysheep.getFleeceColor() != i)
            {
                entitysheep.setFleeceColor(i);
                --par1ItemStack.stackSize;
            }

            return true;
        }
        else
        {
            return false;
        }
    }


    @SideOnly(Side.CLIENT)
    public void registerIcons(IconRegister iconRegister)
    {
             itemIcon = iconRegister.registerIcon("NetherCraft:ghastMarrow");
    }
    
    public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
    {

    par3List.add("Works like Bonemeal");
    

    }

}

 

 

 

Next I tried using this class I thought, oh maybe the BonemealEvent was holding me back as it is meant only for bonemeal, here is my own version.

 

NBonemealEvent

 

 

package netherCraft;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
import net.minecraftforge.event.Cancelable;
import net.minecraftforge.event.Event;
import net.minecraftforge.event.entity.player.PlayerEvent;

@Cancelable
@Event.HasResult
public class NBonemealEvent extends PlayerEvent
{
    /**
     * This event is called when a player attempts to use Bonemeal on a block.
     * It can be canceled to completely prevent any further processing.
     * 
     * You can also set the result to ALLOW to mark the event as processed 
     * and use up a bonemeal from the stack but do no further processing.
     * 
     * setResult(ALLOW) is the same as the old setHandeled()
     */

    public final World world;
    public final int ID;
    public final int X;
    public final int Y;
    public final int Z;
    
    public NBonemealEvent(EntityPlayer player, World world, int id, int x, int y, int z)
    {
        super(player);
        this.world = world;
        this.ID = id;
        this.X = x;
        this.Y = y;
        this.Z = z;
    }
}

 

 

 

Following making that I remembered to create another class so my custom tree (GloWood Tree) would grow along with regular saplings

 

netherCraft_NEventBonemeal

 

 

package netherCraft;

import net.minecraft.block.Block;
import net.minecraft.block.BlockSapling;
import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.Event.Result;
import net.minecraftforge.event.entity.player.BonemealEvent;


public class netherCraft_NEventBonemeal {

    @ForgeSubscribe
    public void onUseBonemeal(NBonemealEvent event)
    {
    if (event.ID == netherCraftCore.glowWoodSapling.blockID)
    {
        if (!event.world.isRemote)
        {
                ((netherCraft.glowWoodSapling)netherCraftCore.glowWoodSapling).growTree(event.world, event.X, event.Y, event.Z, event.world.rand);
                event.setResult(Result.ALLOW);
        }
    }   
}
    @ForgeSubscribe
    public void onUseBonemeal2(NBonemealEvent event)
    {
    if (event.ID == Block.sapling.blockID)
    {
        if (!event.world.isRemote)
        {
                ((BlockSapling)Block.sapling).growTree(event.world, event.X, event.Y, event.Z, event.world.rand);
                event.setResult(Result.ALLOW);
        }
    }   
}
    
    
    

}

 

 

 

Then I registered the event in my main class

 

NetherCraftCore

 

 

        @PreInit
        public void preInit(FMLPreInitializationEvent event) {
                // Stub Method       	
        	
        	
        	MinecraftForge.EVENT_BUS.register(new netherCraft_NEventBonemeal());

 

 

 

Finally I went back to my ghastMarrow Class and changed the code there

 

ghastMarrow

 

 

Previously

public static boolean applyGhastMarrow(ItemStack par0ItemStack, World par1World, int par2, int par3, int par4, EntityPlayer player)
    {
        int l = par1World.getBlockId(par2, par3, par4);

        BonemealEvent event = new BonemealEvent(player, par1World, l, par2, par3, par4);
        if (MinecraftForge.EVENT_BUS.post(event))
        {
            return false;
        }

        if (event.getResult() == Result.ALLOW)
        {
            if (!par1World.isRemote)
            {
                par0ItemStack.stackSize--;
            }

Now it is

public static boolean applyGhastMarrow(ItemStack par0ItemStack, World par1World, int par2, int par3, int par4, EntityPlayer player)
    {
        int l = par1World.getBlockId(par2, par3, par4);

        NBonemealEvent event = new NBonemealEvent(player, par1World, l, par2, par3, par4);
        if (MinecraftForge.EVENT_BUS.post(event))
        {
            return false;
        }

        if (event.getResult() == Result.ALLOW)
        {
            if (!par1World.isRemote)
            {
                par0ItemStack.stackSize--;
            }

 

 

 

After All my hard work, I went in-game to test out my new bonemeal on my Custom Tree(gloWood) and on the regular tree (I added the part in the netherCraft_NEventBonemeal)

 

 

NONE OF THIS WORKED.

Any suggestions, ideas, problem solving, or anything. I have tried most things.

 

Thanks for reading this, it took me a while to type out.

Link to comment
Share on other sites

  • 4 months later...

I'm having the exact opposite problem as you. I've made a working custom bonemeal but I don't know how to make my custom sapling grow into my custom tree. If you are still looking for an answer here is all I needed to make my custom bonemeal.

 

 

public class EarthRune extends Item

{

 

    public EarthRune(int par1)

    {

        super(par1);

        this.setHasSubtypes(false);

        this.setMaxDamage(0);

        this.setCreativeTab(CreativeTabs.tabMaterials);

    }

 

    /**

    * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return

    * True if something happen and false if it don't. This is for ITEMS, not BLOCKS

    */

    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)

    {

        if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack))

        {

            return false;

        }

        else

        {

         

                if (applyBonemeal(par1ItemStack, par3World, par4, par5, par6, par2EntityPlayer))

                {

                    if (!par3World.isRemote)

                    {

                        par3World.playAuxSFX(2005, par4, par5, par6, 0);

                    }

 

                    return true;

                }

           

            else if (par1ItemStack.getItemDamage() == 3)

            {

                int i1 = par3World.getBlockId(par4, par5, par6);

                int j1 = par3World.getBlockMetadata(par4, par5, par6);

 

                if (i1 == Block.wood.blockID && BlockLog.limitToValidMetadata(j1) == 3)

                {

                    if (par7 == 0)

                    {

                        return false;

                    }

 

                    if (par7 == 1)

                    {

                        return false;

                    }

 

                    if (par7 == 2)

                    {

                        --par6;

                    }

 

                    if (par7 == 3)

                    {

                        ++par6;

                    }

 

                    if (par7 == 4)

                    {

                        --par4;

                    }

 

                    if (par7 == 5)

                    {

                        ++par4;

                    }

 

                    if (par3World.isAirBlock(par4, par5, par6))

                    {

                        int k1 = Block.blocksList[block.cocoaPlant.blockID].onBlockPlaced(par3World, par4, par5, par6, par7, par8, par9, par10, 0);

                        par3World.setBlock(par4, par5, par6, Block.cocoaPlant.blockID, k1, 2);

 

                        if (!par2EntityPlayer.capabilities.isCreativeMode)

                        {

                            --par1ItemStack.stackSize;

                        }

                    }

 

                    return true;

                }

            }

 

            return false;

        }

    }

 

    public static boolean func_96604_a(ItemStack par0ItemStack, World par1World, int par2, int par3, int par4)

    {

        return applyBonemeal(par0ItemStack, par1World, par2, par3, par4, FakePlayerFactory.getMinecraft(par1World));

    }

 

    public static boolean applyBonemeal(ItemStack par0ItemStack, World par1World, int par2, int par3, int par4, EntityPlayer player)

    {

        int l = par1World.getBlockId(par2, par3, par4);

 

        BonemealEvent event = new BonemealEvent(player, par1World, l, par2, par3, par4);

        if (MinecraftForge.EVENT_BUS.post(event))

        {

            return false;

        }

 

        if (event.getResult() == Result.ALLOW)

        {

            if (!par1World.isRemote)

            {

                par0ItemStack.stackSize--;

            }

            return true;

        }

 

        if (l == Block.sapling.blockID)

        {

            if (!par1World.isRemote)

            {

                if ((double)par1World.rand.nextFloat() < 0.45D)

                {

                    ((BlockSapling)Block.sapling).markOrGrowMarked(par1World, par2, par3, par4, par1World.rand);

                   

                }

 

                --par0ItemStack.stackSize;

            }

 

            return true;

        }

       

        if (l == TutorialMod.SilverSapling.blockID)

        {

            if (!par1World.isRemote)

            {

                if ((double)par1World.rand.nextFloat() < 0.45D)

                {

                    ((SilverSapling)TutorialMod.SilverSapling).markOrGrowMarked(par1World, par2, par3, par4, par1World.rand);

                   

                }

 

                --par0ItemStack.stackSize;

            }

 

            return true;

        }

        else if (l != Block.mushroomBrown.blockID && l != Block.mushroomRed.blockID)

        {

            if (l != Block.melonStem.blockID && l != Block.pumpkinStem.blockID)

            {

                if (l > 0 && Block.blocksList[l] instanceof BlockCrops)

                {

                    if (par1World.getBlockMetadata(par2, par3, par4) == 7)

                    {

                        return false;

                    }

                    else

                    {

                        if (!par1World.isRemote)

                        {

                            ((BlockCrops)Block.blocksList[l]).fertilize(par1World, par2, par3, par4);

                            --par0ItemStack.stackSize;

                        }

 

                        return true;

                    }

                }

                else

                {

                    int i1;

                    int j1;

                    int k1;

 

                    if (l == Block.cocoaPlant.blockID)

                    {

                        i1 = par1World.getBlockMetadata(par2, par3, par4);

                        j1 = BlockDirectional.getDirection(i1);

                        k1 = BlockCocoa.func_72219_c(i1);

 

                        if (k1 >= 2)

                        {

                            return false;

                        }

                        else

                        {

                            if (!par1World.isRemote)

                            {

                                ++k1;

                                par1World.setBlockMetadataWithNotify(par2, par3, par4, k1 << 2 | j1, 2);

                                --par0ItemStack.stackSize;

                            }

 

                            return true;

                        }

                    }

                    else if (l != Block.grass.blockID)

                    {

                        return false;

                    }

                    else

                    {

                        if (!par1World.isRemote)

                        {

                            --par0ItemStack.stackSize;

                            label102:

 

                            for (i1 = 0; i1 < 128; ++i1)

                            {

                                j1 = par2;

                                k1 = par3 + 1;

                                int l1 = par4;

 

                                for (int i2 = 0; i2 < i1 / 16; ++i2)

                                {

                                    j1 += itemRand.nextInt(3) - 1;

                                    k1 += (itemRand.nextInt(3) - 1) * itemRand.nextInt(3) / 2;

                                    l1 += itemRand.nextInt(3) - 1;

 

                                    if (par1World.getBlockId(j1, k1 - 1, l1) != Block.grass.blockID || par1World.isBlockNormalCube(j1, k1, l1))

                                    {

                                        continue label102;

                                    }

                                }

 

                                if (par1World.getBlockId(j1, k1, l1) == 0)

                                {

                                    if (itemRand.nextInt(10) != 0)

                                    {

                                        if (Block.tallGrass.canBlockStay(par1World, j1, k1, l1))

                                        {

                                            par1World.setBlock(j1, k1, l1, Block.tallGrass.blockID, 1, 3);

                                        }

                                    }

                                    else

                                    {

                                        ForgeHooks.plantGrass(par1World, j1, k1, l1);

                                    }

                                }

                            }

                        }

 

                        return true;

                    }

                }

            }

            else if (par1World.getBlockMetadata(par2, par3, par4) == 7)

            {

                return false;

            }

            else

            {

                if (!par1World.isRemote)

                {

                    ((BlockStem)Block.blocksList[l]).fertilizeStem(par1World, par2, par3, par4);

                    --par0ItemStack.stackSize;

                }

 

                return true;

            }

        }

        else

        {

            if (!par1World.isRemote)

            {

             

                    if ((double)par1World.rand.nextFloat() < 0.45D)

                    {

                        ((SilverSapling)TutorialMod.SilverSapling).markOrGrowMarked(par1World, par2, par3, par4, par1World.rand);

                    }

 

                --par0ItemStack.stackSize;

            }

 

            return true;

        }

    }

 

    @SideOnly(Side.CLIENT)

    public static void func_96603_a(World par0World, int par1, int par2, int par3, int par4)

    {

        int i1 = par0World.getBlockId(par1, par2, par3);

 

        if (par4 == 0)

        {

            par4 = 15;

        }

 

        Block block = i1 > 0 && i1 < Block.blocksList.length ? Block.blocksList[i1] : null;

 

        if (block != null)

        {

            block.setBlockBoundsBasedOnState(par0World, par1, par2, par3);

 

            for (int j1 = 0; j1 < par4; ++j1)

            {

                double d0 = itemRand.nextGaussian() * 0.02D;

                double d1 = itemRand.nextGaussian() * 0.02D;

                double d2 = itemRand.nextGaussian() * 0.02D;

                par0World.spawnParticle("happyVillager", (double)((float)par1 + itemRand.nextFloat()), (double)par2 + (double)itemRand.nextFloat() * block.getBlockBoundsMaxY(), (double)((float)par3 + itemRand.nextFloat()), d0, d1, d2);

            }

        }

        else

        {

            for (int j1 = 0; j1 < par4; ++j1)

            {

                double d0 = itemRand.nextGaussian() * 0.02D;

                double d1 = itemRand.nextGaussian() * 0.02D;

                double d2 = itemRand.nextGaussian() * 0.02D;

                par0World.spawnParticle("happyVillager", (double)((float)par1 + itemRand.nextFloat()), (double)par2 + (double)itemRand.nextFloat() * 1.0f, (double)((float)par3 + itemRand.nextFloat()), d0, d1, d2);

            }

        }

    }

 

 

 

}

 

 

If you ever read this could you post about how you made your custom sapling work? Thanks!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.