Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.15.1] Looking for a replacement for Blockstate.tick


kwpugh
 Share

Recommended Posts

Here is my 1.14.4 source code for reference:

package com.kwpugh.gobber2.items.rings;

import java.util.List;

import net.minecraft.block.BambooBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.CactusBlock;
import net.minecraft.block.ChorusFlowerBlock;
import net.minecraft.block.CocoaBlock;
import net.minecraft.block.CoralBlock;
import net.minecraft.block.CropsBlock;
import net.minecraft.block.IGrowable;
import net.minecraft.block.NetherWartBlock;
import net.minecraft.block.SaplingBlock;
import net.minecraft.block.SugarCaneBlock;
import net.minecraft.block.VineBlock;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;

public class ItemCustomRingFarmer extends Item
{

	public ItemCustomRingFarmer(Properties properties)
	{
		super(properties);
	}

	public void inventoryTick(ItemStack stack, World world, Entity entity, int par4, boolean par5)
    {
        
    	if(!(entity instanceof PlayerEntity) || world.isRemote)
        {
            return;
        }

    	PlayerEntity player = (PlayerEntity)entity;
        ItemStack equippedMain = player.getHeldItemMainhand();
        ItemStack equippedOff = player.getHeldItemOffhand();
        
        if(stack == equippedMain || stack == equippedOff)
        {
            int range = 7;
            for(int x = -range; x < range+1; x++)
            {
                for(int z = -range; z < range+1; z++)
                {
                    for(int y = -range; y < range+1; y++)
                    {
                        int theX = MathHelper.floor(player.posX+x);
                        int theY = MathHelper.floor(player.posY+y);
                        int theZ = MathHelper.floor(player.posZ+z);
                        
                        BlockPos tagetPos = new BlockPos(theX, theY, theZ);
                        
                        BlockState blockstate = world.getBlockState(tagetPos);
                                              
                        //For basic growing blocks that use tick()
                        if ((blockstate.getBlock() instanceof CropsBlock) ||
                        		(blockstate.getBlock() instanceof SaplingBlock)) 
                        {
                        	if (!world.isRemote)
                    		{
                        		if (player.ticksExisted % 12 == 0)
                        		{
                        			blockstate.tick(world, tagetPos, world.rand);
                       		 	}                                                               
                    		}
                        }
                        
                        //For slower growing blocks that use tick()
                        if ((blockstate.getBlock() instanceof VineBlock) ||                     		               
                        		(blockstate.getBlock() instanceof SugarCaneBlock) ||
                        		(blockstate.getBlock() instanceof NetherWartBlock) ||
                        		(blockstate.getBlock() instanceof CactusBlock))
                        {
                        	if (!world.isRemote)
                    		{
                        		if (player.ticksExisted % 5 == 0)
                        		{
                        			blockstate.tick(world, tagetPos, world.rand);
                       		 	}                                                               
                    		}
                        }
                        	
                        //For faster growing blocks that use tick()
                        if ((blockstate.getBlock() instanceof BambooBlock) ||                         		
                        		(blockstate.getBlock() instanceof CoralBlock) ||		
                        		(blockstate.getBlock() instanceof CocoaBlock) ||  
                        		(blockstate.getBlock() instanceof ChorusFlowerBlock) )
                        {
                        	if (!world.isRemote)
                    		{
                        		if (player.ticksExisted % 60 == 0)
                        		{
                        			blockstate.tick(world, tagetPos, world.rand);
                        			// 
                       		 	}                                                               
                    		}
                        }
                    }
                }
            }
       }
    }
	
    @Override
	public void addInformation(ItemStack stack, World world, List<ITextComponent> list, ITooltipFlag flag)
	{
		super.addInformation(stack, world, list, flag);				
		list.add(new StringTextComponent(TextFormatting.BLUE + "Works on most crops, plants, and trees"));
		list.add(new StringTextComponent(TextFormatting.GREEN + "Range: 14 blocks"));
	}  
}

 

I traced through the forge reference sources and found that it is not called but anything but the StemBlock.class.   In 1.15.1, StemBlock appears to use its own method for growing.

 

This may not be the best approach, but it is what I figured out in 1.14.4.   If there is a better approach, I would love to hear about it.

 

Regards.

Link to comment
Share on other sites

I've been keeping an eye on this thread to see if anyone else responded since I just started learning forge and have been playing around with some similar ideas on my own. I'm still focusing on 1.14 so I don't know the exact specifics of 1.15, but I think I can offer a little bit of help. In this case, it looks like the goal of your item is to speed up the growth of nearby crops. Instead of requesting a tick update on each of those crops it finds, you can skip the middle man and look for some function that will boost the age property of the crops directly.

 

In 1.14, I accomplished that by calling the function grow() which is built into descendants of growable things in vanilla (seeds, carrots, etc.). It's possible that function changed in 1.15 (I don't know), so I would look into the BonemealItem class to see what vanilla does to grow crops and that should point you in the right direction. The basic idea in 1.14 at least is that function updates the age property of the crop, so to grow crops you just need to update the block state with an incremented age. Different crop types (as you've identified already) have different age values (stuff like wheat go from like 0 -> 7 for example), so you'll need to keep that in mind. You'll probably need to add on a little randomness of your own to make it not just instantly grow all the crops around you (the bonemeal effect is pretty strong), but that shouldn't be too difficult to accomplish.

 

As for more general code quality stuff, I can spot a few places where you might take advantage of some refactoring in your port. You have some pretty deeply nested conditionals that can make things difficult to understand at a glance, and a lot of them have some pretty repetitive checks. For one, you check !isRemote() inside of every condition instead of once outside them all. This can be pulled out front and you'll save some lines and clear things up. For my own coding style at least, I see several opportunities to break up some repetitive code into its own functions to help improve the readability and ease of debugging. That's all subjective though, so take that with a grain of salt.

 

As a side note: I've only been on these forums for a short time and didn't realize it at first but when you're adding code examples to a post there's actually a drop down menu in the bottom right where you can change the language from HTML to Java --> it'll automatically put some syntax highlighting to make it much nicer to read.

 

Hope this helps.

Link to comment
Share on other sites

Thank you for the feedback.  I'm still new to coding Java and still getting the hang of things.   

 

An earlier version of the class relied on the grow() to affect CropsBlock and SaplingsBlock instances.   I will need to study some of the other block types (Vines, Stems, etc) to see how those can work.  

 

The general nature of the block state.tick() was convenient, but does not seem to have a replacement.

 

Here is were things landed.

package com.kwpugh.ring_of_growth;

import java.util.List;

import net.minecraft.block.BambooBlock;
import net.minecraft.block.BambooSaplingBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.CropsBlock;
import net.minecraft.block.IGrowable;
import net.minecraft.block.SaplingBlock;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;


/**
 * 
 * Only effective on Crops, Saplings, and Bamboo until I find an alternative to blockstate.tick() 
 * 
 */

public class ItemRingGrowth extends Item
{

	public ItemRingGrowth(Properties properties)
	{
		super(properties);
	}
 
	public void inventoryTick(ItemStack stack, World world, Entity entity, int par4, boolean par5)
    {      
    	if(!(entity instanceof PlayerEntity) || world.isRemote)
        {
            return;
        }

    	PlayerEntity player = (PlayerEntity)entity;
        ItemStack equippedMain = player.getHeldItemMainhand();
        ItemStack equippedOff = player.getHeldItemOffhand();
        
        if(stack == equippedMain || stack == equippedOff)
        {
            int range = 7;
            for(int x = -range; x < range+1; x++)
            {
                for(int z = -range; z < range+1; z++)
                {
                    for(int y = -range; y < range+1; y++)
                    {
                        int theX = MathHelper.floor(player.func_226277_ct_()+x);
                        int theY = MathHelper.floor(player.func_226278_cu_()+y);
                        int theZ = MathHelper.floor(player.func_226281_cx_()+z);
                        
                        BlockPos targetPos = new BlockPos(theX, theY, theZ);                       
                        BlockState blockstate = world.getBlockState(targetPos);

                        if ((blockstate.getBlock() instanceof CropsBlock) ||
                        		(blockstate.getBlock() instanceof SaplingBlock) ||
                        		(blockstate.getBlock() instanceof BambooBlock) ||
                        		(blockstate.getBlock() instanceof BambooSaplingBlock)) 
                        {
                            IGrowable igrowable = (IGrowable)blockstate.getBlock();
                            if ((igrowable.canGrow(world, targetPos, blockstate, world.isRemote)) && (player.ticksExisted % 120 == 0))
                            {
                               if (world instanceof ServerWorld)
                               {
                                  if (igrowable.canUseBonemeal(world, world.rand, targetPos, blockstate))
                                  {
                                     igrowable.func_225535_a_((ServerWorld)world, world.rand, targetPos, blockstate);
                                  }
                               }
                            }
                         }
                    }
                }
            }
       }
    }
	
    @Override
	public void addInformation(ItemStack stack, World world, List<ITextComponent> list, ITooltipFlag flag)
	{
		super.addInformation(stack, world, list, flag);				
		list.add(new StringTextComponent(TextFormatting.BLUE + "Works on many crops, plants, and trees"));
		list.add(new StringTextComponent(TextFormatting.GREEN + "Range: 14 blocks"));
	}  
}

 

That you for the feedback.

Link to comment
Share on other sites

  • 4 weeks later...

BlockState#tick still exists in 1.15...

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Link to comment
Share on other sites

Thanks everyone, I appreciate the help.

 

I found the ticking function, which does not have a regular name in the mappings I have installed.

 

blockstate.func_227033_a_((ServerWorld) world, targetPos, world.rand);

 

 

Ojb: the grow() is limited to a few type of growables, so that was only a partial solution.  I decided to go with a functions that ticks blockstates as a generalized solution.

 

Thanks for the guidance.

 

Regards

Link to comment
Share on other sites

13 hours ago, kwpugh said:

which does not have a regular name in the mappings I have installed.

Update your mappings?

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

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
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.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • check if your event is getting fired, first (and you must be in 3rd person on singleplayer for it to work). second, modifying those values doesn't do anything. It is already rendered (in post) or the values will be overwritten for rendering (in pre). You need to cancel the rendering and do it yourself. I do it with the field model#visible = false in pre, then in post, set it to true, then modify the rotation points and angles, then render it using the render method that takes the buffer, vertex builder, ... it would be much easier to use rightArmPose = ... in PRE. 
    • Have you registered your class as EventBusSubscriber on the correct bus?
    • Nope, 1.16 is going to stay as LTS and 1.17 is getting a 1 month grace period.
    • I downloaded ATM7 on the curseforge launcher and installed it, I can launch it and play it just fine the first time. I can play for as long as I want; when I close the game and exit I can re-launch the game just fine. I turn my PC off and back on again in the morning and try to launch it, that's when it errors out and can't "complete the mod scan". The only way around it I've found is making a new profile for it in curseforge, basically re-downloading it and playing it for "the first time" again. I have a RTX 2080 Ti Strix, an i5 8600K and 32 GB of ram with 8 GB allocated to Minecraft. The crash report as follows:  ---- Minecraft Crash Report ---- // Shall we play a game? Time: 11/30/21, 12:09 PM Description: Initializing game java.lang.IllegalStateException: Failed to complete mod scan     at net.minecraftforge.fml.loading.moddiscovery.BackgroundScanHandler.waitForScanToComplete(BackgroundScanHandler.java:103) ~[fmlloader-1.17.1-37.0.109.jar%2322!:?] {}     at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:153) ~[fmlcore-1.17.1-37.0.109.jar%23218!:?] {}     at net.minecraftforge.fmlclient.ClientModLoader.lambda$begin$1(ClientModLoader.java:108) ~[forge-1.17.1-37.0.109-universal.jar%23221!:?] {re:classloading,pl:runtimedistcleaner:A}     at net.minecraftforge.fmlclient.ClientModLoader.lambda$createRunnableWithCatch$4(ClientModLoader.java:129) ~[forge-1.17.1-37.0.109-universal.jar%23221!:?] {re:classloading,pl:runtimedistcleaner:A}     at net.minecraftforge.fmlclient.ClientModLoader.begin(ClientModLoader.java:108) ~[forge-1.17.1-37.0.109-universal.jar%23221!:?] {re:classloading,pl:runtimedistcleaner:A}     at net.minecraft.client.Minecraft.<init>(Minecraft.java:460) ~[client-1.17.1-20210706.113038-srg.jar%23217!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at net.minecraft.client.main.Main.main(Main.java:151) ~[client-1.17.1-20210706.113038-srg.jar%23217!:?] {re:classloading,pl:runtimedistcleaner:A}     at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] {}     at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[?:?] {}     at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] {}     at java.lang.reflect.Method.invoke(Method.java:567) ~[?:?] {}     at net.minecraftforge.fml.loading.targets.CommonClientLaunchHandler.lambda$launchService$0(CommonClientLaunchHandler.java:45) ~[fmlloader-1.17.1-37.0.109.jar%2322!:?] {}     at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.Launcher.run(Launcher.java:106) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.Launcher.main(Launcher.java:77) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:90) [bootstraplauncher-0.1.17.jar:?] {} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Render thread Stacktrace:     at net.minecraftforge.fml.loading.moddiscovery.BackgroundScanHandler.waitForScanToComplete(BackgroundScanHandler.java:103) ~[fmlloader-1.17.1-37.0.109.jar%2322!:?] {}     at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:153) ~[fmlcore-1.17.1-37.0.109.jar%23218!:?] {}     at net.minecraftforge.fmlclient.ClientModLoader.lambda$begin$1(ClientModLoader.java:108) ~[forge-1.17.1-37.0.109-universal.jar%23221!:?] {re:classloading,pl:runtimedistcleaner:A}     at net.minecraftforge.fmlclient.ClientModLoader.lambda$createRunnableWithCatch$4(ClientModLoader.java:129) ~[forge-1.17.1-37.0.109-universal.jar%23221!:?] {re:classloading,pl:runtimedistcleaner:A}     at net.minecraftforge.fmlclient.ClientModLoader.begin(ClientModLoader.java:108) ~[forge-1.17.1-37.0.109-universal.jar%23221!:?] {re:classloading,pl:runtimedistcleaner:A}     at net.minecraft.client.Minecraft.<init>(Minecraft.java:460) ~[client-1.17.1-20210706.113038-srg.jar%23217!:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A,re:mixin,pl:accesstransformer:B,pl:runtimedistcleaner:A} -- Initialization -- Details: Stacktrace:     at net.minecraft.client.main.Main.main(Main.java:151) ~[client-1.17.1-20210706.113038-srg.jar%23217!:?] {re:classloading,pl:runtimedistcleaner:A}     at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] {}     at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[?:?] {}     at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] {}     at java.lang.reflect.Method.invoke(Method.java:567) ~[?:?] {}     at net.minecraftforge.fml.loading.targets.CommonClientLaunchHandler.lambda$launchService$0(CommonClientLaunchHandler.java:45) ~[fmlloader-1.17.1-37.0.109.jar%2322!:?] {}     at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.Launcher.run(Launcher.java:106) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.Launcher.main(Launcher.java:77) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) [modlauncher-9.0.7.jar%235!:?] {}     at cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:90) [bootstraplauncher-0.1.17.jar:?] {} -- System Details -- Details:     Minecraft Version: 1.17.1     Minecraft Version ID: 1.17.1     Operating System: Windows 10 (amd64) version 10.0     Java Version: 16.0.1, Microsoft     Java VM Version: OpenJDK 64-Bit Server VM (mixed mode), Microsoft     Memory: 1436850640 bytes (1370 MiB) / 2885681152 bytes (2752 MiB) up to 9663676416 bytes (9216 MiB)     CPUs: 6     Processor Vendor: GenuineIntel     Processor Name: Intel(R) Core(TM) i5-8600K CPU @ 3.60GHz     Identifier: Intel64 Family 6 Model 158 Stepping 10     Microarchitecture: Coffee Lake     Frequency (GHz): 3.60     Number of physical packages: 1     Number of physical CPUs: 6     Number of logical CPUs: 6     Graphics card #0 name: NVIDIA GeForce RTX 2080 Ti     Graphics card #0 vendor: NVIDIA (0x10de)     Graphics card #0 VRAM (MB): 4095.00     Graphics card #0 deviceId: 0x1e07     Graphics card #0 versionInfo: DriverVersion=30.0.14.9649     Memory slot #0 capacity (MB): 16384.00     Memory slot #0 clockSpeed (GHz): 2.13     Memory slot #0 type: DDR4     Memory slot #1 capacity (MB): 16384.00     Memory slot #1 clockSpeed (GHz): 2.13     Memory slot #1 type: DDR4     Virtual memory max (MB): 34740.69     Virtual memory used (MB): 18387.16     Swap memory total (MB): 2048.00     Swap memory used (MB): 81.51     JVM Flags: 5 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xss1M -Xmx9216m -Xms256m -XX:PermSize=256m     Launched Version: forge-37.0.109     Backend library: LWJGL version 3.2.2 SNAPSHOT     Backend API: NVIDIA GeForce RTX 2080 Ti/PCIe/SSE2 GL version 3.2.0 NVIDIA 496.49, NVIDIA Corporation     Window size: <not initialized>     GL Caps: Using framebuffer using OpenGL 3.2     GL debug messages:      Using VBOs: Yes     Is Modded: Definitely; Client brand changed to 'forge'     Type: Client (map_client.txt)     CPU: 6x Intel(R) Core(TM) i5-8600K CPU @ 3.60GHz     ModLauncher: 9.0.7+91+master.8569cdf     ModLauncher launch target: forgeclient     ModLauncher naming: srg     ModLauncher services:           mixin PLUGINSERVICE           eventbus PLUGINSERVICE           object_holder_definalize PLUGINSERVICE           runtime_enum_extender PLUGINSERVICE           capability_token_subclass PLUGINSERVICE           capability_inject_definalize PLUGINSERVICE           accesstransformer PLUGINSERVICE           runtimedistcleaner PLUGINSERVICE           mixin TRANSFORMATIONSERVICE           fml TRANSFORMATIONSERVICE      FML Language Providers:          minecraft@1.0         kotori_scala@2.13.6-build-4         javafml@null
    • I still can't figure what's happening. Apparently ShapedRecipeBuilder.save() tries to run this.result.getItemCategory(), but this.result is null, but shoudn't this.result already be defined by ShapedRecipeBuilder.shaped()?
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.