Jump to content

Recommended Posts

Posted

I was wondering how I'd detect if a player is using a pickaxe or something of the like.  I know how to do it (getItemInUse()) but how would I go about detecting it.  Like some kind of listener? Also I know how to use the player interact event, but how do I have it detect that?

Posted

Right now my code is more or less:

 

class {
    playerInteractEvent {
        if item is this {
            do this;
        }
   }
}

 

but how do I call it?  I have an instance made in my main mod class.

 

Posted

I was just about to say I had figured that out, thanks!

 

Edit: I seem to get a nullpointer

 

	if (event.entityPlayer.getItemInUse().getItem() instanceof ItemPickaxe ) {
		//ItemPickaxe itemInUsePickaxe = (ItemPickaxe)itemInUse.getItem();
		((ItemPickaxe)event.entityPlayer.getItemInUse().getItem()).efficiencyOnProperMaterial = (float) (((ItemPickaxe)event.entityPlayer.getItemInUse().getItem()).efficiencyOnProperMaterial * 3.0);
		System.out.printf("RUNNING");
	}

Posted
  On 1/9/2014 at 12:34 AM, XVicarious said:

I was just about to say I had figured that out, thanks!

 

Edit: I seem to get a nullpointer

 

 

Yes.  What happens if you have nothing in your hand?  Wouldn't "event.entityPlayer.getItemInUse()" return null?

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Thanks, I ended up figuring that out.

 

One last problem that is holding me up.  I know it has something to with either sync, or nbt (or both i suppose).

When I get an item out of my custom block/tileentity it does not save that item in my inventory, nor does it save the experience I take from the player (also it always seems to set it to 11 no matter how much you have).

 

edit: also nbt does not seem to be saving

 

LevelUpStationGUI.java

package us.xvicario.rpglevel;

import org.lwjgl.opengl.GL11;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;

public class LevelUpStationGUI extends GuiContainer {

public static final ResourceLocation textureGUI = new ResourceLocation("rpglevel", "textures/gui/levelUpGui.png");
public TileEntityLevelUpStation levelUpStation;
public static EntityPlayer player;

public LevelUpStationGUI(EntityPlayer player,InventoryPlayer inventoryPlayer, TileEntityLevelUpStation entity) {
	super(new LevelUpStationContainer(player, inventoryPlayer,entity));
	this.levelUpStation = entity;
	this.player = player;
	this.xSize = 176;
	this.ySize = 166;
}

public void drawGuiContainerForegroundLayer(int par1, int par2) {
	String name = this.levelUpStation.isInvNameLocalized() ? this.levelUpStation.getInvName() : I18n.getString(this.levelUpStation.getInvName());
	this.fontRenderer.drawString(name, this.xSize / 2 - this.fontRenderer.getStringWidth(name) / 2, 6, 4210752);
	this.fontRenderer.drawString(I18n.getString("container.inventory"), 8, this.ySize-96+2, 4210752);
}

@Override
public void drawGuiContainerBackgroundLayer(float f, int i, int j) {
	GL11.glColor4f(1f, 1f, 1f, 1f);
	//int texture = mc.renderEngine.getTexture("/gui/levelUpGui.png");
	//this.mc.renderEngine.bindTexture(texture);
	this.mc.renderEngine.bindTexture(textureGUI);
	this.buttonList.add(new GuiButton(0,guiLeft+8,this.ySize-112,20,20, "Mining"));
	this.buttonList.add(new GuiButton(1,guiLeft+8,this.ySize-90,20,20, "Attack"));
	this.buttonList.add(new GuiButton(2,guiLeft+30,this.ySize-112,20,20, "Defense"));
	this.buttonList.add(new GuiButton(3,guiLeft+30,this.ySize-90,20,20, "Archery"));
	//new GuiButton()
	drawTexturedModalRect((width-xSize)/2,(height-ySize)/2,0,0,xSize,ySize);
}

public void actionPerformed(GuiButton button) {
	if (this.player.experienceLevel >= 20) {
		ItemStack levelUpBook;
		switch(button.id) {
		case 0:
			levelUpBook = new ItemStack(RPGLevel.itemLevelUpBook,1,0);
			this.levelUpStation.setInventorySlotContents(0, levelUpBook);
			break;
		case 1:
			levelUpBook = new ItemStack(RPGLevel.itemLevelUpBook,1,1);
			this.levelUpStation.setInventorySlotContents(0, levelUpBook);
			break;
		case 2:
			levelUpBook = new ItemStack(RPGLevel.itemLevelUpBook,1,2);
			this.levelUpStation.setInventorySlotContents(0,levelUpBook);
			break;
		case 3:
			levelUpBook = new ItemStack(RPGLevel.itemLevelUpBook,1,3);
			this.levelUpStation.setInventorySlotContents(0, levelUpBook);
			break;
		}
		this.player.addExperienceLevel(-10);
	}
}

}

 

BlockLevelUpStation.java

package us.xvicario.rpglevel;

import cpw.mods.fml.common.network.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Icon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class BlockLevelUpStation extends BlockContainer {

protected BlockLevelUpStation(int par1, Material par2Material, boolean active) {
	super(par1, par2Material);
	setCreativeTab(CreativeTabs.tabDecorations);
}

@Override
public TileEntity createNewTileEntity(World world) {
	return new TileEntityLevelUpStation();
}

public void onBlockAdded(World par1World,int x, int y, int z) {
	super.onBlockAdded(par1World, x, y, z);
	setDefaultDirection(par1World,x,y,z);
	par1World.markBlockForUpdate(x, y, z);
}

private void setDefaultDirection(World par1World, int x, int y, int z) {
	TileEntity blockEntity = par1World.getBlockTileEntity(x, y, z);
	if (par1World.isRemote) {
		return;
	}
	int i = par1World.getBlockId(x, y, z-1);
	int j = par1World.getBlockId(x,y,z+1);
	int k = par1World.getBlockId(x-1, y, z);
	int l = par1World.getBlockId(x+1, y, z);
	byte byte0 = 3;
	if (Block.opaqueCubeLookup[i] && !Block.opaqueCubeLookup[j]) {
	byte0 = 3;
	}
	if (Block.opaqueCubeLookup[j] && !Block.opaqueCubeLookup[i]) {
	byte0 = 2;
	}
	if (Block.opaqueCubeLookup[k] && !Block.opaqueCubeLookup[l]) {
	byte0 = 5;
	}
	if (Block.opaqueCubeLookup[l] && !Block.opaqueCubeLookup[k]) {
	byte0 = 4;
	}
	((TileEntityLevelUpStation)blockEntity).setFrontDirection(byte0);
}

public boolean renderAsNormalBlock() {
	return true;
}

@SideOnly(Side.CLIENT) public void registerIcons(IconRegister icon) {
	this.blockIcon = icon.registerIcon("rpglevel:levelup");
}

@SideOnly(Side.CLIENT) public Icon getIcon(int side, int metadata) {
	return this.blockIcon;
}

@Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
	if (!world.isRemote) {
		TileEntityLevelUpStation levelUpStation = (TileEntityLevelUpStation)world.getBlockTileEntity(x, z, z);
		FMLNetworkHandler.openGui(player, RPGLevel.instance, RPGLevel.guiID, world, x, y, z);
	}
	return true;
}

}

 

LevelUpGUIHandler.java

package us.xvicario.rpglevel;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;
import cpw.mods.fml.common.network.NetworkRegistry;

public class LevelUpGUIHandler implements IGuiHandler {

@Override
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
	TileEntity entity = world.getBlockTileEntity(x, y, z);
	if (entity != null) {
		switch(ID) {
			case RPGLevel.guiID:
				if (entity instanceof TileEntityLevelUpStation) {
					return new LevelUpStationContainer(player, player.inventory,(TileEntityLevelUpStation) entity);
				}

		}
	}
	return null;
}

@Override
public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
	TileEntity entity = world.getBlockTileEntity(x, y, z);
	if (entity != null) {
		switch(ID) {
			case RPGLevel.guiID:
				if (entity instanceof TileEntityLevelUpStation) {
					return new LevelUpStationGUI(player ,player.inventory,(TileEntityLevelUpStation) entity);
				}

		}
	}
	return null;
}

}

ClientProxy.java

package us.xvicario.rpglevel.proxy;

import us.xvicario.rpglevel.LevelUpStationContainer;
import us.xvicario.rpglevel.TileEntityLevelUpStation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class ClientProxy extends CommonProxy {

@Override public void registerRenderers() {

}

public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
	TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
	if (tileEntity != null) {
		switch(ID) {
		case 0: return new LevelUpStationContainer(player, player.inventory, (TileEntityLevelUpStation)tileEntity);
		}
	}
	return null;

}

}

LevelUpStationContainer.java

package us.xvicario.rpglevel;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;

public class LevelUpStationContainer extends Container {

private TileEntityLevelUpStation levelUpStation;

public LevelUpStationContainer(EntityPlayer player, InventoryPlayer inventory, TileEntityLevelUpStation entity) {
	this.levelUpStation = entity;
	this.addSlotToContainer(new Slot(entity,0,145,35));
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 9; j++) {
			this.addSlotToContainer(new Slot(inventory,j+i*9+9,8+j*18,84+i*18));
		}
	}
	for (int i = 0; i < 9; i++) {
		this.addSlotToContainer(new Slot(inventory,i,8+(i*18),142));
	}
}

@Override
public boolean canInteractWith(EntityPlayer entityplayer) {
	return this.levelUpStation.isUseableByPlayer(entityplayer);
}

public void detectAndSendChanges() {
	super.detectAndSendChanges();
	for (int i = 0; i < this.crafters.size(); i++) {
		ICrafting icrafting = (ICrafting) this.crafters.get(i);
	}
}

public ItemStack slotClick(int par1, int par2, int par3, EntityPlayer par4EntityPlayer) {
	super.slotClick(par1, par2, par3, par4EntityPlayer);
	return new ItemStack(Item.wheat);
}


    @Override
    public ItemStack transferStackInSlot(EntityPlayer player, int slot) {
            ItemStack stack = null;
            Slot slotObject = (Slot) inventorySlots.get(slot);

            //null checks and checks if the item can be stacked (maxStackSize > 1)
            if (slotObject != null && slotObject.getHasStack()) {
                    ItemStack stackInSlot = slotObject.getStack();
                    stack = stackInSlot.copy();

                    //merges the item into player inventory since its in the tileEntity
                    if (slot < 9) {
                            if (!this.mergeItemStack(stackInSlot, 0, 35, true)) {
                                    return null;
                            }
                    }
                    //places it into the tileEntity is possible since its in the player inventory
                    else if (!this.mergeItemStack(stackInSlot, 0, 9, false)) {
                            return null;
                    }

                    if (stackInSlot.stackSize == 0) {
                            slotObject.putStack(null);
                    } else {
                            slotObject.onSlotChanged();
                    }

                    if (stackInSlot.stackSize == stack.stackSize) {
                            return null;
                    }
                    slotObject.onPickupFromSlot(player, stackInSlot);
            }
            return stack;
    }


}

TileEntityLevelUpStation.java

package us.xvicario.rpglevel;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;

public class TileEntityLevelUpStation extends TileEntity implements IInventory {

public int front;
private ItemStack[] levelUpItemStacks;

public TileEntityLevelUpStation() {
	levelUpItemStacks = new ItemStack[1];
}

public void setFrontDirection(int f) {
	this.front = f;
}

public int getFrontDirection() {
	return this.front;
}

@Override public int getSizeInventory() {
	return levelUpItemStacks.length;
}

@Override
public void closeChest() {}

@Override
public ItemStack decrStackSize(int i, int j) {
	if (levelUpItemStacks[i] != null) {
		if (levelUpItemStacks[i].stackSize <= j) {
			ItemStack itemstack = levelUpItemStacks[i];
			levelUpItemStacks[i] = null;
			return itemstack;
		}
		ItemStack itemstack1 = levelUpItemStacks[i].splitStack(j);
		if (levelUpItemStacks[i].stackSize == 0) {
			levelUpItemStacks[i] = null;
		}
		return itemstack1;
	} else {
		return null;
	}
}

@Override
public String getInvName() {
	return "container.levelUp";
}

@Override
public int getInventoryStackLimit() {
	return 1;
}


@Override
public ItemStack getStackInSlot(int i) {
	return levelUpItemStacks[i];
}

@Override
public ItemStack getStackInSlotOnClosing(int i) {
	if (levelUpItemStacks[i] != null) {
		ItemStack itemstack = levelUpItemStacks[i];
		levelUpItemStacks[i] = null;
		return itemstack;
	} else {
		return null;
	}
}

@Override
public boolean isInvNameLocalized() {
	// TODO Auto-generated method stub
	return false;
}

@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack) {
	// TODO Auto-generated method stub
	return false;
}

@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer) {
	if (worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) != this) {
		return false;
	}
	return entityplayer.getDistanceSq((double)xCoord+0.5D,(double)yCoord+0.5D,(double)zCoord+0.5D) <= 64D;
}

@Override
public void openChest() {}

@Override
public void setInventorySlotContents(int i, ItemStack itemstack) {
	levelUpItemStacks[0] = itemstack;
}

public void readFromNBT(NBTTagCompound par1NBTTagCompound) {
	super.readFromNBT(par1NBTTagCompound);
	NBTTagList nbttaglist = par1NBTTagCompound.getTagList("Items");
	levelUpItemStacks = new ItemStack[getSizeInventory()];
	for (int i = 0; i < nbttaglist.tagCount(); i++) {
		NBTTagCompound nbttagcompound = (NBTTagCompound)nbttaglist.tagAt(i);
		byte byte0 = nbttagcompound.getByte("Slot");
		if (byte0 >= 0 && byte0 < levelUpItemStacks.length) {
			levelUpItemStacks[byte0] = ItemStack.loadItemStackFromNBT(nbttagcompound);
		}
	}
	front = par1NBTTagCompound.getInteger("FrontDirection");
}

public void writeToNBT(NBTTagCompound par1NBTTagCompound) {
	super.writeToNBT(par1NBTTagCompound);
	par1NBTTagCompound.setInteger("FrontDirection", (int)front);
	NBTTagList nbttaglist = new NBTTagList();
	for (int i = 0; i < levelUpItemStacks.length; i++) {
		if (levelUpItemStacks[i] != null) { 
			NBTTagCompound nbttagcompound = new NBTTagCompound();
			nbttagcompound.setByte("Slot", (byte)i);
			levelUpItemStacks[i].writeToNBT(nbttagcompound);
			nbttaglist.appendTag(nbttagcompound);
		}
	}
	par1NBTTagCompound.setTag("Items", nbttaglist);
}

}

Posted

Okay, it is still more or less happening.

I even scrapped it all and followed the tutorial from the wiki to the tee.

 

EDIT: I know what it is. My buttons need to send the changes to the server, but how do I do that?

Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Ready to unlock unbeatable savings on Temu? Our exclusive Temu code [ald244107] is your ultimate secret weapon for a $100 OFF discount, plus so much more this year! Whether you're making your first purchase or returning for another shopping spree, this verified promo code gives you an instant boost, with up to 50% off your next order and even deeper discounts on clearance items. With Temu coupon code [ald244107], you're not just getting a flat $100 discount; you're stacking it on top of already fantastic sales! New users can grab an extra 100% off selected products, while loyal customers automatically qualify for that sweet $100 OFF when they apply the code at checkout. Imagine slashing prices by up to 90% on everything from trending electronics and stylish fashion to essential home goods and top-rated beauty products, all available across the USA, Canada, UK, and countless other countries! 🔥 Top Temu Code [ald244107] Benefits:  * For New Users: Use ald244107 for 50% off your first order + an additional $100 OFF.  * For Existing Customers: Apply ald244107 to get an instant $100 OFF on your next purchase.  * Global Reach: Valid across the USA, UK, Canada, Germany, France, Japan, Chile, Colombia, Malaysia, Mexico, South Korea, Philippines, Saudi Arabia, Qatar, Pakistan, and many more.  * Best of 2025: Secure up to $200 OFF plus incredible bonus discounts with ald244107. Maximize Your Savings: Featured Temu Deals for 2025 (Code: ald244107)  * ✅ Temu Flash Sales: Don't miss out! Score $100 off during limited-time offers with ald244107.  * ✅ Temu First Order Bonanza: Use ald244107 for a powerful 50% + $100 OFF on your initial purchase.  * ✅ Temu US Shopper Advantage: Instantly save $100 on your orders with ald244107.  * ✅ International Temu Discounts: ald244107 works seamlessly to give you savings in Japan, Germany, Chile, and beyond.  * ✅ Temu Community Favorite: Enjoy $100 OFF for both new and old users, a widely praised deal!  * ✅ Temu Coupon Bundles 2025: Combine $100 OFF with up to 50% slash deals for ultimate savings.  * ✅ 100% OFF Free Gift Code: Use ald244107 to claim a free gift – no invitation or referral needed!  * ✅ Temu Welcome Bonus: Get a delightful $100 OFF instantly upon signing up for an account.  * ✅ Free Temu Code for New Accounts: Apply ald244107 for immediate, hassle-free savings.  * ✅ Temu Clearance Blowout 2025: Use ald244107 for jaw-dropping 85–100% discounts on clearance items. This Temu code [ald244107] is more than just a discount; it's your all-access pass to complimentary shipping, exclusive first-order perks, and stackable coupon bundles across an immense selection of electronics, trendy fashion, essential home goods, and premium beauty products. Truly unlock up to 90% OFF plus an additional $100 OFF on eligible orders! 💡 Pro Tip: Always remember to apply ald244107 during checkout on the Temu app or website. Your instant $100 discount activates automatically, even if you're a returning customer! Where Does Temu Code [ald244107] Work? (Global Availability)  * 🇺🇸 Temu USA – ald244107  * 🇯🇵 Temu Japan – ald244107  * 🇲🇽 Temu Mexico – ald244107  * 🇨🇱 Temu Chile – ald244107  * 🇨🇴 Temu Colombia – ald244107  * 🇲🇾 Temu Malaysia – ald244107  * 🇵🇭 Temu Philippines – ald244107  * 🇰🇷 Temu Korea – ald244107  * 🇵🇰 Temu Pakistan – ald244107  * 🇫🇮 Temu Finland – ald244107  * 🇸🇦 Temu Saudi Arabia – ald244107  * 🇶🇦 Temu Qatar – ald244107  * 🇫🇷 Temu France – ald244107  * 🇩🇪 Temu Germany – ald244107 Hear From Happy Shoppers: User Reviews We love hearing about your experiences! Here's what some satisfied customers are saying about using the Temu code [ald244107]:  * Alice W., USA ⭐️⭐️⭐️⭐️⭐️ (5/5) "Great experience! Temu's promo code {ald244107} saved me a lot on my first order. Highly recommend this offer!"  * James T., UK ⭐️⭐️⭐️⭐️ (4/5) "Very happy with the quality and prices on Temu. The $100 credits offer was a nice bonus using {ald244107}. Will shop again."  * Sara M., Canada ⭐️⭐️⭐️ (3/5) "Got some decent deals with the {ald244107} code, though shipping took a bit longer than expected. Overall satisfied with the credits." Trending Verified Temu Deals for 2025 Stay ahead of the curve with the most popular and verified Temu deals for 2025. Our community consistently confirms the effectiveness of Temu code [ald244107] for maximum savings across a wide range of products. Don't miss out on these trending opportunities to save big! FAQs: Everything You Need to Know About Temu Code [ald244107] Q: What is Temu code [ald244107] and what does it offer? A: Temu code [ald244107] is a verified promo code that provides users with a $100 discount, plus additional savings of up to 50% or even 90% on various items. It's valid for both new and existing customers on the Temu platform. Q: How do I apply Temu code [ald244107]? A: Simply enter [ald244107] in the coupon or promo code field during checkout on the Temu app or website to apply your discounts automatically. Q: Does Temu code [ald244107] benefit new users specifically? A: Yes, ald244107 offers fantastic benefits for new users, including an exclusive 50% off their very first order in addition to the $100 discount. Q: Is Temu code [ald244107] also valid for existing customers? A: Absolutely! Loyal Temu customers can also enjoy a flat $100 OFF discount by seamlessly applying ald244107 at checkout. Q: In which countries can I use Temu code [ald244107]? A: This code boasts widespread global availability, working in numerous countries including the USA, UK, Canada, Germany, France, Japan, Saudi Arabia, Qatar, and many more listed above. Q: Can Temu code [ald244107] be combined with other offers? A: Temu code [ald244107] is strategically designed to provide savings on top of existing deals, making it often stackable with other promotions for truly maximizing your discounts. Unlock Huge Savings with Temu Code [ald244107] – Your Best Bet for 2025! Don't let these incredible savings slip away! Whether you're exploring Temu for the first time or returning for more great finds, the Temu code [ald244107] is your ultimate tool for significant discounts, exciting free gifts, and unbeatable deals. Apply it today and see how much you can save! Happy shopping! [ald244107]  
    • I've tried the java version you linked to and got a new exit code of 127 Here is the new console log I also tried making sure that I had Java 8 selected with the version of Java 8 I already had installed and got the same exit code Here is the console log with that installation in case it has any differences I do notice both say 'Java checker returned some invalid data we don't understand:' followed by 'Minecraft might not start properly.' which could be some issues.  
    • Thank you so much! I didnt see it in the log😭😭  
    • So im completely new to modding in general, i have some experience in Behavior packs in minecraft bedrock and i would like to modify entities stats and attributes like in a behavior pack (health, damage, speed, xp drop...). The problem is that i cant find any information online on how to do that, and I have no clue on what to do and where to start. I am currently modding in 1.20.4 with IntelliJ if that helps. My final objective is to buff mobs health and damage (double it for exemple), but since there is no entity file anywhere i don't know how to change it... 😢
    • Hey there, nothing to do with the code, I am just suggesting you use Intelij IDEA. Trust me, it is the best.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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