Jump to content

Noah_Beech

Members
  • Posts

    121
  • Joined

  • Last visited

Everything posted by Noah_Beech

  1. 1. When modifying speed, it modifies your players field of view, which can get annoying... 2. I've only gotten it to work in a very crude way, that glitches up, and could cause incompatibilities with other mods. Aside from that, Can anyone help me with my issue? :l
  2. As far as we know, custom horse armor, as of now, is a no-go without either a crapload of ASM or base edits, either way, things would get ugly really fast
  3. So I found a way to work around the already-terrible attribute system using reflection and player capabilities. Using this, I was able to modify player speed quite nicely, and it worked, and using ObfuscationReflectionHelper I made it so it SHOULD work in normal minecraft. However, it does not . The crash log ---- Minecraft Crash Report ---- // Ouch. That hurt Time: 9/25/13 7:20 PM Description: Ticking entity cpw.mods.fml.relauncher.ReflectionHelper$UnableToAccessFieldException: cpw.mods.fml.relauncher.ReflectionHelper$UnableToFindFieldException: java.lang.NoSuchFieldException: field_73357_f at cpw.mods.fml.relauncher.ReflectionHelper.setPrivateValue(ReflectionHelper.java:140) at cpw.mods.fml.common.ObfuscationReflectionHelper.setPrivateValue(ObfuscationReflectionHelper.java:104) at rareores.Common.PlayerTickHandler.onPlayerTick(PlayerTickHandler.java:135) at rareores.Common.PlayerTickHandler.tickStart(PlayerTickHandler.java:164) at cpw.mods.fml.common.SingleIntervalHandler.tickStart(SingleIntervalHandler.java:28) at cpw.mods.fml.common.FMLCommonHandler.tickStart(FMLCommonHandler.java:122) at cpw.mods.fml.common.FMLCommonHandler.onPlayerPreTick(FMLCommonHandler.java:383) at net.minecraft.entity.player.EntityPlayer.func_70071_h_(EntityPlayer.java:282) at net.minecraft.client.entity.EntityClientPlayerMP.func_70071_h_(SourceFile:46) at net.minecraft.world.World.func_72866_a(World.java:2350) at net.minecraft.world.World.func_72870_g(World.java:2311) at net.minecraft.world.World.func_72939_s(World.java:2157) at net.minecraft.client.Minecraft.func_71407_l(Minecraft.java:1919) at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:908) at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:836) at net.minecraft.client.main.Main.main(SourceFile:101) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:131) at net.minecraft.launchwrapper.Launch.main(Launch.java:27) Caused by: cpw.mods.fml.relauncher.ReflectionHelper$UnableToFindFieldException: java.lang.NoSuchFieldException: field_73357_f at cpw.mods.fml.relauncher.ReflectionHelper.findField(ReflectionHelper.java:87) at cpw.mods.fml.relauncher.ReflectionHelper.setPrivateValue(ReflectionHelper.java:136) ... 21 more Caused by: java.lang.NoSuchFieldException: field_73357_f at java.lang.Class.getDeclaredField(Unknown Source) at cpw.mods.fml.relauncher.ReflectionHelper.findField(ReflectionHelper.java:78) ... 22 more My code PlayerCapabilities cap = player.capabilities; float speed = cap.getWalkSpeed(); speed *=1.5; ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, cap, speed ,"walkSpeed","field_73357_f"); walkSpeed is a private value in playercapabilities, and I got the field_73357_f from fields.csv in /mcp/conf Help appreciated Thanks.
  4. Yeah, for now I was able to find something that worked, but one day when they document the attribute system and finish it up it will be alot nicer to work with.
  5. found a much better way (At least IMHO) if(player.inventory.hasItem(mod_rareores.ItemEmblemFlight.itemID) && useMap2.get(player.username) == 0){ PlayerCapabilities cap = ObfuscationReflectionHelper.getPrivateValue(EntityPlayer.class, player, "capabilities", "field_71075_bZ"); float speed = player.capabilities.getWalkSpeed(); speed *=1.5; ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, cap, speed ,"walkSpeed", "field_73357_f"); useMap2.put(player.username,1 ); } if(!player.inventory.hasItem(mod_rareores.ItemEmblemFlight.itemID) && useMap2.get(player.username) == 1){ PlayerCapabilities cap = ObfuscationReflectionHelper.getPrivateValue(EntityPlayer.class, player, "capabilities", "field_71075_bZ"); float speed = player.capabilities.getWalkSpeed(); speed /=1.5; ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, cap, speed ,"walkSpeed", "field_73357_f"); useMap2.put(player.username,0 ); }
  6. Okay I understand that, but how Am I going to modify player speed then, I just can't remove the item, and IM not going to use potioneffects.
  7. So essentially the attribute system sucks balls? Back in 1.5 I just needed ONE LINE OF CODE do do what I wanted, and now 60 lines only does it crudely. Would there be ANY way to modify player speed dynamically? Like if a different mod has the player speed at 1.5 times and I want to multiply it by 1.3 lets say, it will go upto 1.5 * 1.3 = 1.95. But doing it my previous way makes it so it removes the old modifier and replaces it with my new one so say 1.5 (/) to 1.3. Would it be possible if I could make my own specific mod attribute and not use vanilla ones, or is there some code elsewhere that modifies player speed? Because What Im doing now and what I was doing earlier is NOT going to work!
  8. Read the OP, I want the players speed to be modified when a player has an item, but if the player already has a speed attribute then I want to modify the existing attribute instead of over-writing it.
  9. Okay so I pushed this aside for awhile to get other things done, but this is the last thing I need to do. Can anyone help?
  10. If you use it on the server, even with an instance of entityplayer, you get a java.lang.NoSuchMethodError , AKA it's not serverside
  11. Anyone please? Im SOO close to figuring it out and it is the last thing I need to do.
  12. Okay, so after tinkering around with the above mentioned function, I found out that it does modify an attribute. After this I quickly got started on using it. But ran into a weird error that I can't seem to figure out. The conditionals determine if a new one should be added, or if it should be modified. But for some reason the player start going about 50x faster than he should and I don;t know why. I use a hashmap to keep data for each player if he should loose the attribute or not. My code PlayerTickhandler ________________________________________________________________ public HashMap<String, Integer> useMap = new HashMap<String, Integer>(); if(useMap.get(player.username) == null){ useMap.put(player.username, 0); } if(player.inventory.hasItem(mod_rareores.ItemEmblemSpeed.itemID) && useMap.get(player.username) == 0){ AttributeInstance attributeinstance = player.func_110148_a(SharedMonsterAttributes.field_111263_d); if(attributeinstance.func_111127_a(speed1.func_111167_a())!= null){ attributeinstance.func_111128_a(1.25); useMap.put(player.username,1 ); System.out.println("Part1works 1"); } else if(attributeinstance.func_111127_a(speed1.func_111167_a())== null){ attributeinstance.func_111121_a(speed1); useMap.put(player.username,1 ); System.out.println("Part1works 2"); } player.jumpMovementFactor *=1.25; } if(!player.inventory.hasItem(mod_rareores.ItemEmblemSpeed.itemID) && useMap.get(player.username) == 1){ AttributeInstance attributeinstance = player.func_110148_a(SharedMonsterAttributes.field_111263_d); attributeinstance.func_111128_a(0.; useMap.put(player.username,0 ); System.out.println("Part2works"); }
  13. You can use Ispecialarmor to make unbreakable armor.
  14. Can anyone help me out? I don't have much time on my hands to mod recently and this is the only thing keeping me from releasing my final version of my mod.
  15. If you are wondering the reflction was working, but the attribute system is giving me a few crude issues that I want to iron out.
  16. (Look at bottom for solution) I have been using attributes to modify player health / speed. But I have ran into an issue, if the player already has the same attribute instance with a modifier, and I try to apply mine, it will crash. I have been able to dig into the code to figure out if an attribute has already been applied. If it isn't applied, I apply my own new attribute, if not I need to modify the existing one, the problem is I don't know how to do this last part even after looking at the attribute classes / code for the longest time. Hopefully someone here is more knowledgeable than me in this subject and would be willing to help me. here is a segment of code that I am working with. final AttributeModifier speed1 = new AttributeModifier(player.getPersistentID(), "Emblem Speed Boost", 0.25D, 1); AttributeInstance attributeinstance = player.func_110148_a(SharedMonsterAttributes.field_111263_d); if(attributeinstance.func_111127_a(speed1.func_111167_a())!= null){ //The modifier for the modifier needs to be in this clause! System.out.println("Conditions are true"); } else{ System.out.println("Conditions are NOT true"); attributeinstance.func_111121_a(speed1); } Thanks in advance. ~Noah
  17. Thanks, after a little research I know a bit more about hashmaps now, along with the code you provided, was able to get it to work, thanks!
  18. Sorry to bug ya again but could you just go a little more in depth to how Im exactly going to use this hashmap? I know a little bit about it but I'm not sure exactly how a hashmap would be the solution. I could see grabing an insance of the player for one part but how would I get that player to have their own :count" variables?
  19. Hello, recently I came across a bug where if a player is using my flight item with 2 or more players on a lan/mltiplayer server, it won't work. Here is the code. package rareores.Common; import java.util.EnumSet; import mod_Rareores.Events; import mod_Rareores.mod_rareores; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeInstance; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import cpw.mods.fml.common.ITickHandler; import cpw.mods.fml.common.TickType; public class PlayerTickHandler implements ITickHandler { int count = 0; int delay = 0; float landMovementFactor = 0.0F; boolean check1 = true; boolean check2= true; private void onPlayerTick(EntityPlayer player) { final AttributeModifier speed1 = new AttributeModifier(player.getPersistentID(), "Emblem Speed Boost", 0.25D, 1); final AttributeModifier speed2 = new AttributeModifier(player.getPersistentID(), "Freedom Speed Boost", 0.5D, 1); if(player.inventory.hasItem(mod_rareores.ItemEmblemFlight.itemID) && player.capabilities.isCreativeMode == false && this.count < 100 && this.delay == 0) { player.capabilities.allowFlying = true; if(player.capabilities.isFlying){ this.count++; Events.Fly = true; } if(this.count > 0 && !player.capabilities.isFlying){ count = 100; } } else { this.count = 0; this.delay++; if (this.delay >= 60) { Events.Fly = false; } if (this.delay >= 1200) { this.delay = 0; } if(!player.capabilities.isCreativeMode){ player.capabilities.allowFlying = false; player.capabilities.isFlying = false; } } I have it registers on the client and the server in both client and commonproxy classes. Not sure why I can't get it to work.
  20. Anyone know how to deal with a reflection problem as such? I haven't been able to figure much out and this is the only thing preventing me from updating to 1.6.2. And NO, no speed potion effect, I MUST use landMovementFactor solely because the code is ran each tick and other variables would be multiplied exponentially high because they are not reset every tick, however landmovementfactor does and it makes for a perfect variable to work with since it increases speed exactly the way you need it.
  21. Just a pet peeve, but I really hate it when people have problems with a method they say" this.blahblah isn't working!". For one thing we have no idea half the time what "this" is and it would be better if you stated the class that the method originated from.
  22. Okay figured out how to fix it! First this is your starting class. package mod_Rareores; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; public class RenderBow implements IItemRenderer { private RenderManager renderManager; private Minecraft mc; public static final ResourceLocation RESOURCELOCATION = new ResourceLocation("/terrain.png"); public static final ResourceLocation RESOURCELOCATION2 = new ResourceLocation("/gui/items.png"); public static final ResourceLocation RESOURCELOCATION3 = new ResourceLocation("%blur%/misc/glint.png"); public RenderBow() { this.renderManager = RenderManager.instance; this.mc = Minecraft.getMinecraft(); } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON; } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return false; } @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { EntityLiving entity = (EntityLiving) data[1]; ItemRenderer irInstance = this.mc.entityRenderer.itemRenderer; GL11.glPopMatrix(); if(type == ItemRenderType.EQUIPPED_FIRST_PERSON) { this.renderItem(entity, item, 0); } else { GL11.glPushMatrix(); float f2 = 3F - (1F/3F); GL11.glRotatef(-20.0F, 0.0F, 0.0F, 1.0F); GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(-60.0F, 0.0F, 0.0F, 1.0F); GL11.glScalef(f2, f2, f2); GL11.glTranslatef(-0.25F, -0.1875F, 0.1875F); float f3 = 0.625F; GL11.glTranslatef(0.0F, 0.125F, 0.3125F); GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); GL11.glScalef(f3, -f3, f3); GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); this.renderItem(entity, item, 0); GL11.glPopMatrix(); } GL11.glPushMatrix(); private void renderItem(EntityLiving par1EntityLiving, ItemStack par2ItemStack, int par3) { Icon icon = par1EntityLiving.getItemIcon(par2ItemStack, par3); if (icon == null) { return; } if (par2ItemStack.getItemSpriteNumber() == 0) { this.mc.renderEngine.func_110577_a(RESOURCELOCATION); } else { this.mc.renderEngine.func_110577_a(RESOURCELOCATION2); } Tessellator tessellator = Tessellator.instance; float f = icon.getMinU(); float f1 = icon.getMaxU(); float f2 = icon.getMinV(); float f3 = icon.getMaxV(); float f4 = 0.0F; float f5 = 0.3F; GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glTranslatef(-f4, -f5, 0.0F); float f6 = 1.5F; GL11.glScalef(f6, f6, f6); GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, icon.getSheetWidth(), icon.getSheetHeight(), 0.0625F); if (par2ItemStack != null && par2ItemStack.hasEffect() && par3 == 0) { GL11.glDepthFunc(GL11.GL_EQUAL); GL11.glDisable(GL11.GL_LIGHTING); this.mc.renderEngine.func_110577_a(RESOURCELOCATION3); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); float f7 = 0.76F; GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); GL11.glMatrixMode(GL11.GL_TEXTURE); GL11.glPushMatrix(); float f8 = 0.125F; GL11.glScalef(f8, f8, f8); float f9 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; GL11.glTranslatef(f9, 0.0F, 0.0F); GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); GL11.glPopMatrix(); GL11.glPushMatrix(); GL11.glScalef(f8, f8, f8); f9 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; GL11.glTranslatef(-f9, 0.0F, 0.0F); GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); GL11.glPopMatrix(); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_LIGHTING); GL11.glDepthFunc(GL11.GL_LEQUAL); } GL11.glDisable(GL12.GL_RESCALE_NORMAL); } } First change this line of code so that An EntityLivingBase Parameter is taken from data, like this. EntityLiving entity = (EntityLiving) data[1]; to EntityLivingBase entity = (EntityLivingBase) data[1]; Then change the renderItem method below so it uses EntityLivingBase private void renderItem(EntityLiving par1EntityLiving, ItemStack par2ItemStack, int par3) to private void renderItem(EntityLivingBase par1EntityLiving, ItemStack par2ItemStack, int par3) Now the castclassException is gone,but there are still a few problems. First, change icon.getSheetWidth() & icon.getSheetHeight() in the renderIN2D line to icon.getOriginX(), icon.getOriginY() Then make a new resource like the one below public static final ResourceLocation RESOURCELOCATION = new ResourceLocation("textures/misc/enchanted_item_glint.png"); and replace the following line bindTexture("%blur%/misc/glint.png") with this.mc.renderEngine.func_110577_a(RESOURCELOCATION); Finally, delete the entire chunk of code that looks like this if (par2ItemStack.getItemSpriteNumber() == 0) { this.mc.renderEngine.func_110577_a(RESOURCELOCATION); } else { this.mc.renderEngine.func_110577_a(RESOURCELOCATION2); } Your done! I double checked and it works with enchantments and other monsters/players! Your final class should look like this package mod_Rareores; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; public class RenderBow implements IItemRenderer { private RenderManager renderManager; private Minecraft mc; public static final ResourceLocation RESOURCELOCATION = new ResourceLocation("textures/misc/enchanted_item_glint.png"); public RenderBow() { this.renderManager = RenderManager.instance; this.mc = Minecraft.getMinecraft(); } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON; } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return false; } @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { EntityLivingBase entity = (EntityLivingBase) data[1]; ItemRenderer irInstance = this.mc.entityRenderer.itemRenderer; GL11.glPopMatrix(); if(type == ItemRenderType.EQUIPPED_FIRST_PERSON) { this.renderItem(entity, item, 0); } else { GL11.glPushMatrix(); float f2 = 3F - (1F/3F); GL11.glRotatef(-20.0F, 0.0F, 0.0F, 1.0F); GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(-60.0F, 0.0F, 0.0F, 1.0F); GL11.glScalef(f2, f2, f2); GL11.glTranslatef(-0.25F, -0.1875F, 0.1875F); // render the item as 'real' bow float f3 = 0.625F; GL11.glTranslatef(0.0F, 0.125F, 0.3125F); GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); GL11.glScalef(f3, -f3, f3); GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); this.renderItem(entity, item, 0); GL11.glPopMatrix(); } GL11.glPushMatrix(); } private void renderItem(EntityLivingBase par1EntityLiving, ItemStack par2ItemStack, int par3) { Icon icon = par1EntityLiving.getItemIcon(par2ItemStack, par3); if (icon == null) { return; } Tessellator tessellator = Tessellator.instance; float f = icon.getMinU(); float f1 = icon.getMaxU(); float f2 = icon.getMinV(); float f3 = icon.getMaxV(); float f4 = 0.0F; float f5 = 0.3F; GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glTranslatef(-f4, -f5, 0.0F); float f6 = 1.5F; GL11.glScalef(f6, f6, f6); GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, icon.getOriginX(), icon.getOriginY(), 0.0625F); if (par2ItemStack != null && par2ItemStack.hasEffect() && par3 == 0) { GL11.glDepthFunc(GL11.GL_EQUAL); GL11.glDisable(GL11.GL_LIGHTING); this.mc.renderEngine.func_110577_a(RESOURCELOCATION); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); float f7 = 0.76F; GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); GL11.glMatrixMode(GL11.GL_TEXTURE); GL11.glPushMatrix(); float f8 = 0.125F; GL11.glScalef(f8, f8, f8); float f9 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; GL11.glTranslatef(f9, 0.0F, 0.0F); GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); GL11.glPopMatrix(); GL11.glPushMatrix(); GL11.glScalef(f8, f8, f8); f9 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; GL11.glTranslatef(-f9, 0.0F, 0.0F); GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); GL11.glPopMatrix(); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_LIGHTING); GL11.glDepthFunc(GL11.GL_LEQUAL); } GL11.glDisable(GL12.GL_RESCALE_NORMAL); } }
  23. MY main question is... am I in the wrong or is this a problem with IItemRenderer?
  24. What? I don't get what you are saying, please explain?
×
×
  • Create New...

Important Information

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