Jump to content

Recommended Posts

Posted

As of the 1.8 update logs changed. A LOT!

How would one create a custom log in 1.8?

 

Thanks in advance,

- Busti

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted

Class for the log

package mw.blocks;

import java.util.List;

import com.google.common.base.Predicate;

import mw.core.MWTabs;
import mw.core.utils.Utils;
import net.minecraft.block.BlockLog;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockLogMW extends BlockLog
{
    public static final PropertyEnum VARIANT = PropertyEnum.create("variant", BlockPlanksMW.EnumType.class, new Predicate()
    {
        public boolean apply(BlockPlanksMW.EnumType type)
        {
            return type.getMetadata() < 4;
        }
        public boolean apply(Object p_apply_1_)
        {
            return this.apply((BlockPlanksMW.EnumType)p_apply_1_);
        }
    });

    public BlockLogMW()
    {
        this.setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, BlockPlanksMW.EnumType.APPLE).withProperty(LOG_AXIS, BlockLog.EnumAxis.Y));
        this.setCreativeTab(MWTabs.tabBlock);
	Utils.setBlockInfo(this, "log", 2.0F, 5.0F);
    }

    /**
     * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
     */
    @SideOnly(Side.CLIENT)
    public void getSubBlocks(Item itemIn, CreativeTabs tab, List list)
    {
        list.add(new ItemStack(itemIn, 1, BlockPlanksMW.EnumType.APPLE.getMetadata()));
        list.add(new ItemStack(itemIn, 1, BlockPlanksMW.EnumType.PALM.getMetadata()));
    }

    /**
     * Convert the given metadata into a BlockState for this Block
     */
    public IBlockState getStateFromMeta(int meta)
    {
        IBlockState iblockstate = this.getDefaultState().withProperty(VARIANT, BlockPlanksMW.EnumType.byMetadata((meta & 3) % 4));

        switch (meta & 12)
        {
            case 0:
                iblockstate = iblockstate.withProperty(LOG_AXIS, BlockLog.EnumAxis.Y);
                break;
            case 4:
                iblockstate = iblockstate.withProperty(LOG_AXIS, BlockLog.EnumAxis.X);
                break;
            case 8:
                iblockstate = iblockstate.withProperty(LOG_AXIS, BlockLog.EnumAxis.Z);
                break;
            default:
                iblockstate = iblockstate.withProperty(LOG_AXIS, BlockLog.EnumAxis.NONE);
        }

        return iblockstate;
    }

    /**
     * Convert the BlockState into the correct metadata value
     */
    public int getMetaFromState(IBlockState state)
    {
        byte b0 = 0;
        int i = b0 | ((BlockPlanksMW.EnumType)state.getValue(VARIANT)).getMetadata();

        switch (BlockLogMW.SwitchEnumAxis.AXIS_LOOKUP[((BlockLogMW.EnumAxis)state.getValue(LOG_AXIS)).ordinal()])
        {
            case 1:
                i |= 4;
                break;
            case 2:
                i |= 8;
                break;
            case 3:
                i |= 12;
        }

        return i;
    }

    protected BlockState createBlockState()
    {
        return new BlockState(this, new IProperty[] {VARIANT, LOG_AXIS});
    }

    protected ItemStack createStackedBlock(IBlockState state)
    {
        return new ItemStack(Item.getItemFromBlock(this), 1, ((BlockPlanksMW.EnumType)state.getValue(VARIANT)).getMetadata());
    }

    /**
     * Get the damage value that this Block should drop
     */
    public int damageDropped(IBlockState state)
    {
        return ((BlockPlanksMW.EnumType)state.getValue(VARIANT)).getMetadata();
    }

    static final class SwitchEnumAxis
        {
            static final int[] AXIS_LOOKUP = new int[blockLog.EnumAxis.values().length];

            static
            {
                try
                {
                    AXIS_LOOKUP[blockLog.EnumAxis.X.ordinal()] = 1;
                }
                catch (NoSuchFieldError var3)
                {
                    ;
                }

                try
                {
                    AXIS_LOOKUP[blockLog.EnumAxis.Z.ordinal()] = 2;
                }
                catch (NoSuchFieldError var2)
                {
                    ;
                }

                try
                {
                    AXIS_LOOKUP[blockLog.EnumAxis.NONE.ordinal()] = 3;
                }
                catch (NoSuchFieldError var1)
                {
                    ;
                }
            }
        }
}

 

Class for the planks (where it takes the variants, you could also do this in the log file)

package mw.blocks;

import java.util.List;

import mw.core.MWTabs;
import mw.core.utils.Utils;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IStringSerializable;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockPlanksMW extends Block
{
    public static final PropertyEnum VARIANT = PropertyEnum.create("variant", BlockPlanksMW.EnumType.class);

    public BlockPlanksMW()
    {
        super(Material.wood);
        this.setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, BlockPlanksMW.EnumType.APPLE));
        this.setCreativeTab(MWTabs.tabBlock);
        Utils.setBlockInfo(this, "planks", 1.5F, 10.0F);
    }

    /**
     * Get the damage value that this Block should drop
     */
    public int damageDropped(IBlockState state)
    {
        return ((BlockPlanksMW.EnumType)state.getValue(VARIANT)).getMetadata();
    }

    /**
     * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
     */
    @SideOnly(Side.CLIENT)
    public void getSubBlocks(Item itemIn, CreativeTabs tab, List list)
    {
        BlockPlanksMW.EnumType[] aenumtype = BlockPlanksMW.EnumType.values();
        int i = aenumtype.length;

        for (int j = 0; j < i; ++j)
        {
            BlockPlanksMW.EnumType enumtype = aenumtype[j];
            list.add(new ItemStack(itemIn, 1, enumtype.getMetadata()));
        }
    }

    /**
     * Convert the given metadata into a BlockState for this Block
     */
    public IBlockState getStateFromMeta(int meta)
    {
        return this.getDefaultState().withProperty(VARIANT, BlockPlanksMW.EnumType.byMetadata(meta));
    }

    /**
     * Convert the BlockState into the correct metadata value
     */
    public int getMetaFromState(IBlockState state)
    {
        return ((BlockPlanksMW.EnumType)state.getValue(VARIANT)).getMetadata();
    }

    protected BlockState createBlockState()
    {
        return new BlockState(this, new IProperty[] {VARIANT});
    }

    public static enum EnumType implements IStringSerializable
    {
        APPLE(0, "apple"),
        PALM(1, "palm");
        private static final BlockPlanksMW.EnumType[] META_LOOKUP = new BlockPlanksMW.EnumType[values().length];
        private final int meta;
        private final String name;
        private final String unlocalizedName;


        private EnumType(int meta, String name)
        {
            this(meta, name, name);
        }

        private EnumType(int meta, String name, String unlocalizedName)
        {
            this.meta = meta;
            this.name = name;
            this.unlocalizedName = unlocalizedName;
        }

        public int getMetadata()
        {
            return this.meta;
        }

        public String toString()
        {
            return this.name;
        }

        public static BlockPlanksMW.EnumType byMetadata(int meta)
        {
            if (meta < 0 || meta >= META_LOOKUP.length)
            {
                meta = 0;
            }

            return META_LOOKUP[meta];
        }

        public String getName()
        {
            return this.name;
        }

        public String getUnlocalizedName()
        {
            return this.unlocalizedName;
        }

        static
        {
            BlockPlanksMW.EnumType[] var0 = values();
            int var1 = var0.length;

            for (int var2 = 0; var2 < var1; ++var2)
            {
                BlockPlanksMW.EnumType var3 = var0[var2];
                META_LOOKUP[var3.getMetadata()] = var3;
            }
        }
    }
}

 

Creating the block

public static Block log;
log = new BlockLogMW();
RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
GameRegistry.registerBlock(log, ItemLog.class, renderItem);
ModelBakery.addVariantName(Item.getItemFromBlock(block), new String[]{MW.MODID + ":" + "log_apple", MW.MODID + ":" + "log_palm"});
		renderItem.getItemModelMesher().register(Item.getItemFromBlock(block), 0, new ModelResourceLocation(MW.MODID + ":" + "log_apple", "inventory"));
		renderItem.getItemModelMesher().register(Item.getItemFromBlock(block), 1, new ModelResourceLocation(MW.MODID + ":" + "log_palm", "inventory"));

And the last class you need, the ItemLog class

package mw.blocks.itemblocks;

import net.minecraft.block.Block;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;

public class ItemLog extends ItemBlock {

private final static String[] subNames = {
	"apple", "palm"
};

public ItemLog(Block id) {
	super(id);
	setHasSubtypes(true);
}

@Override
public int getMetadata (int damageValue) {
	return damageValue;
}

@Override
public String getUnlocalizedName(ItemStack itemstack) {
	return "tile.log_" + subNames[itemstack.getItemDamage()] ;
}
}

 

Then the .json files

Blockstate file

{
    "variants": {
        "axis=y,variant=apple":  { "model": "mw:apple_log" },
        "axis=z,variant=apple":   { "model": "mw:apple_log_side" },
        "axis=x,variant=apple":   { "model": "mw:apple_log_side", "y": 90 },
        "axis=none,variant=apple": { "model": "mw:apple_bark" },
	"axis=y,variant=palm":  { "model": "mw:palm_log" },
        "axis=z,variant=palm":   { "model": "mw:palm_log_side" },
        "axis=x,variant=palm":   { "model": "mw:palm_log_side", "y": 90 },
        "axis=none,variant=palm": { "model": "mw:palm_bark" }
    }
}

 

Item model file (you need to do ONE for every variant, in this case one for the apple variant and one for the palm variant)

{
    "parent": "mw:block/apple_log",
    "display": {
        "thirdperson": {
            "rotation": [ 10, -45, 170 ],
            "translation": [ 0, 1.5, -2.75 ],
            "scale": [ 0.375, 0.375, 0.375 ]
        }
    }
}

 

Block model file (You need to do 3 models file for each variant, so if you have like in this case 2 variants you need to do 3 files for the apple variant and 3 for the palm variant)

Normal file (example: apple_log)

{
    "parent": "block/cube_column",
    "textures": {
        "end": "mw:blocks/log_apple_top",
        "side": "mw:blocks/log_apple"
    }
}

Block model side file (example: apple_log_side)

{
    "parent": "block/column_side",
    "textures": {
        "end": "mw:blocks/log_apple_top",
        "side": "mw:blocks/log_apple"
    }
}

Block model bark side (the log without the top) (example: apple_log_bark)

{
    "parent": "block/cube_all",
    "textures": {
        "all": "mw:blocks/log_apple"
    }
}

If you have doubts about this 3 files just look the blockstate file and you will understand :)

Don't blame me if i always ask for your help. I just want to learn to be better :)

Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • If you are using AMD/ATI, update your drivers - get the drivers from their website - do not update via system
    • Not sure why this is happening, but I would love some help. The reason I restarted the server was because I was getting an error while trying to join regarding this "Internal Exception: io.netty.handler.codec.DecoderException: io.netty.handler.codec.EncoderException: java.io.IOException: Root tag must be a named compound tag" Im using ServerMiner if thats any help
    • [13-05-2025 02:20:01]    |-- fabric-renderer-registries-v1 3.2.25+df3654b390 [13-05-2025 02:20:01]    |-- fabric-rendering-data-attachment-v1 0.3.19+6e0787e690 [13-05-2025 02:20:01]    |-- fabric-rendering-fluids-v1 3.0.11+4d0d570390 [13-05-2025 02:20:01]    |-- fabric-rendering-v0 1.1.28+df3654b390 [13-05-2025 02:20:01]    |-- fabric-rendering-v1 1.13.0+526f2c6790 [13-05-2025 02:20:01]    |-- fabric-resource-conditions-api-v1 2.1.2+aae9039d90 [13-05-2025 02:20:01]    |-- fabric-resource-loader-v0 0.8.4+edbdcddb90 [13-05-2025 02:20:01]    |-- fabric-screen-api-v1 1.0.32+4d0d570390 [13-05-2025 02:20:01]    |-- fabric-screen-handler-api-v1 1.3.8+1cc24b1b90 [13-05-2025 02:20:01]    |-- fabric-sound-api-v1 1.0.2+c4f28df590 [13-05-2025 02:20:01]    |-- fabric-textures-v0 1.0.24+aeb40ebe90 [13-05-2025 02:20:01]    |-- fabric-transfer-api-v1 2.1.6+413cbbc790 [13-05-2025 02:20:01]    \-- fabric-transitive-access-wideners-v1 1.3.3+08b73de490 [13-05-2025 02:20:01] - fabricloader 0.16.14 [13-05-2025 02:20:01]    \-- mixinextras 0.4.1 [13-05-2025 02:20:01] - geckolib3 3.1.40 [13-05-2025 02:20:01]    \-- com_eliotlash_mclib_mclib 20 [13-05-2025 02:20:01] - genesis 1.19.2-1.0.2 [13-05-2025 02:20:01] - grounded_origins 1.2.3 [13-05-2025 02:20:01]    \-- apugli 1.9.3+1.19-fabric [13-05-2025 02:20:01] - icarus 1.14.1 [13-05-2025 02:20:01] - identity 2.6.1-1.19.1 [13-05-2025 02:20:01]    \-- omega-config 1.2.3-1.18.1 [13-05-2025 02:20:01] - impaled 1.1.4 [13-05-2025 02:20:01] - itemfig 1.19.2-0.2.7-fabric [13-05-2025 02:20:01] - java 17 [13-05-2025 02:20:01] - journeymap 5.9.8 [13-05-2025 02:20:01]    \-- journeymap-api-fabric 1.19.1-1.9-fabric-SNAPSHOT [13-05-2025 02:20:01] - landchidori 1.0.3 [13-05-2025 02:20:01] - latoorigins 1.19.2-1.1.0 [13-05-2025 02:20:01] - lithium 0.11.1 [13-05-2025 02:20:01] - magic_origins v0.3.5 [13-05-2025 02:20:01] - medievalorigins 5.1.9.2+1.19.2 [13-05-2025 02:20:01]    |-- additionalentityattributes 1.4.0+1.19.2 [13-05-2025 02:20:01]    |-- common-protection-api 1.0.0 [13-05-2025 02:20:01]    \-- reach-entity-attributes 2.3.0 [13-05-2025 02:20:01] - midnightlib 1.0.0 [13-05-2025 02:20:01] - minecraft 1.19.2 [13-05-2025 02:20:01] - moborigins 1.10.0 [13-05-2025 02:20:01] - mrplaguewarper 1.0.8 [13-05-2025 02:20:01] - mythic 1.0.2 [13-05-2025 02:20:01] - mythorigins 1.19-0.2.0 [13-05-2025 02:20:01] - omnitrix_origins 1.0.0 [13-05-2025 02:20:01] - oneporigins 1.0 [13-05-2025 02:20:01] - origins 1.7.1 [13-05-2025 02:20:01]    |-- apoli 2.6.1 [13-05-2025 02:20:01]    |    |-- calio 1.7.0 [13-05-2025 02:20:01]    |    |-- cardinal-components-base 5.0.1 [13-05-2025 02:20:01]    |    |-- cardinal-components-entity 5.0.1 [13-05-2025 02:20:01]    |    |-- cloth-config 8.0.75 [13-05-2025 02:20:01]    |    |    \-- cloth-basic-math 0.6.1 [13-05-2025 02:20:01]    |    \-- playerabilitylib 1.6.0 [13-05-2025 02:20:01]    \-- reach-entity-attributes 2.3.0 [13-05-2025 02:20:01] - origins-plus-plus 2.3.1 [13-05-2025 02:20:01] - origins_4d_being 1.0.0 [13-05-2025 02:20:01] - origins_vampire_mr 1-v2.1.0 [13-05-2025 02:20:01] - originsumbrellas 1.5.4 [13-05-2025 02:20:01] - pehkui 3.8.3+1.14.4-1.21 [13-05-2025 02:20:01]    \-- kanos_config 0.4.1+1.14.4-1.19.4 [13-05-2025 02:20:01] - promans_origins 1.0.0 [13-05-2025 02:20:01] - rpg_origins 1.4.3 [13-05-2025 02:20:01] - sculkling 1.0.0 [13-05-2025 02:20:01] - seleni 0.2.5+1.19.2 [13-05-2025 02:20:01] - slimeorigin 2.0.2-1.19.2 [13-05-2025 02:20:01] - spilaioorigins 1.19-0.3.0 [13-05-2025 02:20:01] - thiccpackets 1.17-1.19+ [13-05-2025 02:20:01] - thorigins 4.2.0 [13-05-2025 02:20:01] - trinkets 3.4.2 [13-05-2025 02:20:01] - voidwalker 1.0.0 [13-05-2025 02:20:01] - yee 3.0.3 [13-05-2025 02:20:01] Found 1 non-fabric mod: [13-05-2025 02:20:01] - better_weapons-1.jar [13-05-2025 02:20:01] SpongePowered MIXIN Subsystem Version=0.8.7 Source=file:/home/smpicnic/server/data/libraries/net/fabricmc/sponge-mixin/0.15.5+mixin.0.8.7/sponge-mixin-0.15.5+mixin.0.8.7.jar Service=Knot/Fabric Env=SERVER [13-05-2025 02:20:01] Compatibility level set to JAVA_17 [13-05-2025 02:20:02] Loaded configuration file for Lithium: 114 options available, 0 override(s) found [13-05-2025 02:20:02] Error loading class: net/minecraft/class_998 (java.lang.ClassNotFoundException: net/minecraft/class_998) [13-05-2025 02:20:02] @Mixin target net.minecraft.class_998 was not found impaled.mixins.json:TridentRiptideFeatureRendererMixin from mod impaled [13-05-2025 02:20:02] Initializing MixinExtras via com.llamalad7.mixinextras.service.MixinExtrasServiceImpl(version=0.4.1). [13-05-2025 02:20:03] Method overwrite conflict for revertScale in slimeorigin.mixins.json:MixinLivingEntity from mod slimeorigin, previously written by latokike.mythorigins.mixin.LivingEntityMixin. Skipping method. [13-05-2025 02:20:03] Added Config bclib.generator to auto sync (file hash) [13-05-2025 02:20:03] Added Config bclib.main to auto sync (content diff) [13-05-2025 02:20:03] Added Config bclib.recipes to auto sync (file hash) [13-05-2025 02:20:03] Added Config bclib.biomes to auto sync (file hash) [13-05-2025 02:20:04] Method overwrite conflict for damage in spilaioorigins.mixins.json:ItemStackMixin from mod spilaioorigins, previously written by latokike.latoorigins.mixin.ItemStackMixin. Skipping method. [13-05-2025 02:20:05] Building unoptimized datafixer [13-05-2025 02:20:05] Method overwrite conflict for method_6091 in moborigins.mixins.json:RavagerEntityMixin from mod moborigins, previously written by draylar.identity.mixin.RavagerEntityMixin. Skipping method. [13-05-2025 02:20:05] Minecraft has crashed! [13-05-2025 02:20:05] net.fabricmc.loader.impl.FormattedException: java.lang.NoSuchFieldError: ATTACK_DAMAGE_MODIFIER [13-05-2025 02:20:05] at net.fabricmc.loader.impl.FormattedException.ofLocalized(FormattedException.java:63) ~[fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:482) ~[fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:74) [fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] at net.fabricmc.loader.impl.launch.knot.KnotServer.main(KnotServer.java:23) [fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] at net.fabricmc.loader.impl.launch.server.FabricServerLauncher.main(FabricServerLauncher.java:69) [fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] Caused by: java.lang.NoSuchFieldError: ATTACK_DAMAGE_MODIFIER [13-05-2025 02:20:05] at net.minecraft.class_1799.<clinit>(class_1799.java:126) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1761.<init>(class_1761.java:114) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1761$1.<init>(class_1761.java:15) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1761.<clinit>(class_1761.java:15) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1802.<clinit>(class_1802.java:22) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1308$Anonymous$dedb2ce0fc304852b6ae6ea54fec0e73.<init>(DropSkullsMixins.java:23) ~[?:?] [13-05-2025 02:20:05] at net.minecraft.class_1308.<clinit>(class_1308.java:87) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_1299.<clinit>(class_1299.java:260) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_3103.<clinit>(class_3103.java:28) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_3031.<clinit>(class_3031.java:84) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_6800.<clinit>(class_6800.java:20) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_6803.method_39702(class_6803.java:24) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_5458.method_44104(class_5458.java:98) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_5458.method_30566(class_5458.java:105) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at java.util.LinkedHashMap.forEach(LinkedHashMap.java:721) ~[?:?] [13-05-2025 02:20:05] at net.minecraft.class_5458.<clinit>(class_5458.java:104) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_2378.<clinit>(class_2378.java:326) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.class_2966.method_12851(class_2966.java:50) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.minecraft.server.Main.main(Main.java:98) ~[server-intermediary.jar:?] [13-05-2025 02:20:05] at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:480) ~[fabric-loader-0.16.14.jar:?] [13-05-2025 02:20:05] ... 3 more
    • Every time I try to run a modpack I am using, I get a crash error saying that it was caused by an invalid Java Runtime configuration. I have tried everything I can think of to try and debug it but nothing has worked. https://pastebin.com/ddxQTLh4
    • ok i tried to disable the last mod's i installed and it is some of then, so now im going to do the classic enable and disable trick to find out which mod cause the crash. thanks for the help  
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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