Jump to content

[1.6.4]Needs help with spawnd wall direction


demand12

Recommended Posts

i have an item when right clicked it spawns a wall. but the wall was only facing  one direction. i would like some help to figure out how to turn the wall when the player turns.

 

i have tried to turn it with player and block coords. but the coord system is a bit wired and i dont get it. here is what i have at the momment:

 

package Talimagics.items;

 

import net.minecraft.block.Block;

import net.minecraft.creativetab.CreativeTabs;

import net.minecraft.entity.player.EntityPlayer;

import net.minecraft.item.Item;

import net.minecraft.item.ItemStack;

import net.minecraft.world.World;

 

public class taliswall extends Item {

 

public taliswall(int par1) {

super(par1);

this.setCreativeTab(CreativeTabs.tabMisc);

this.setMaxStackSize(1);

this.setMaxDamage(16);

 

}

int dirx;

int dirz;

int playx;

int playz;

float fplayx;

float fplayz;

 

public boolean onItemUse(ItemStack used, EntityPlayer player, World world, int bx, int by, int bz, int side, float px, float py, float pz)

    {

        //clicked bottom of the block

        if (side == 0 && player.isSneaking())

        {

            //decreases the y position to get the actual clicked block

            --by;

           

        }else if (side == 0){

        --by;

        --by;

        }

 

        //clicked top of the block

        if (side == 1 && player.isSneaking())

        {

            //increases the y position to get the actual clicked block

            ++by;

         

        }else if (side == 1){

        ++by;

        ++by;

        }

 

        //and so on...

        if (side == 2 && player.isSneaking())

        {

            --bz;

           

        }else if (side == 2){

        --bz;

        --bz;

        }

 

        if (side == 3 && player.isSneaking())

        {

            ++bz;

           

        }else if (side == 3){

        ++bz;

        ++bz;

        }

 

        if (side == 4 && player.isSneaking())

        {

            --bx;

           

        }else if (side == 4){

        --bx;

        --bx;

        }

 

        if (side == 5 && player.isSneaking())

        {

            ++bx;

           

        }else if (side == 5){

        ++bx;

        ++bx;

        }

 

        //check if player can edit the block.

        if (!player.canPlayerEdit(bx, by, bz, side, used))

        {

            //Item didnt used.

            return false;

        }

        else

        {

            //When the block is air,

            if (world.isAirBlock(bx, by, bz))

            {

                //play Sound at the center of the block.

                world.playSoundEffect((double)bx+ 0.5D, (double)by+ 0.5D, (double)bz+ 0.5D, "dig.stone", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F);

               

                dirx = bx;

                dirz = bz;

                fplayx = px;

                fplayz = pz;

               

                Math.round(fplayx);

                Math.round(fplayz);

               

                playx = (int)fplayx;

                playz = (int)fplayz;

               

                dirx = dirx - playx;

                dirz = dirz - playz;

               

                if(player.isSneaking()){

               

                //Sets the Block!

                    world.setBlock(bx, by, bz, Block.glass.blockID);

                }else{

                if(dirx > dirz){

                world.setBlock(bx, by, bz, Block.glass.blockID);//mid block

                world.setBlock(bx, --by, bz, Block.glass.blockID);

                world.setBlock(bx, by, --bz, Block.glass.blockID);

                world.setBlock(bx, ++by, bz, Block.glass.blockID);

                world.setBlock(bx, ++by, bz, Block.glass.blockID);

                world.setBlock(bx, by, ++bz, Block.glass.blockID);

                world.setBlock(bx, by, ++bz, Block.glass.blockID);

                world.setBlock(bx, --by, bz, Block.glass.blockID);

                world.setBlock(bx, --by, bz, Block.glass.blockID);

                }else if(dirz > dirx){

                world.setBlock(bx, by, bz, Block.glass.blockID);//mid block

                world.setBlock(bx, --by, bz, Block.glass.blockID);

               

               

               

                }

                }

               

            }

 

            //Damages the Item.

            used.damageItem(1, player);

 

            //Item used.

            return true;

        }

    }

 

}

 

 

 

thanks in advance :)

Link to comment
Share on other sites

Hi

 

This link shows the coordinate system (you seem to have it right already?)

http://greyminecraftcoder.blogspot.com.au/2013/07/blocks.html

 

I don't understand what you mean "the wall was only facing one direction", and I'm not sure what you intend those ++bx etc to do?

 

Perhaps you could show some screenshots of what it actually looks like, compared with what you want?

 

-TGG

 

Link to comment
Share on other sites

what happends in the code is that the x and z coords are added together so when i am at x100 z700 the code says z and x is 800.

 

the bx...etc stuff is block x y z and the px...etc is player x y z

 

here is what i want from my item.

 

when i right click a block on the ground like this one.

 

 

i will spawn a wall(testing with glass)

 

 

but when i turn the player and right clicks the wall still faces the same direction.

 

 

 

that is whats going on.

 

Link to comment
Share on other sites

what happends in the code is that the x and z coords are added together so when i am at x100 z700 the code says z and x is 800.

after further testing. it seems i was wrong. the block coords are right but the player coord are another story.

 

it seems that it returns a 0.######## number. that does not go as well in my maths equation. so if anyone know how to fix this. that would be apriciated

Link to comment
Share on other sites

Hi

 

Thanks for the pics, that makes it much clearer.

 

A few thoughts

1) I don't think that parameter is actually the player [x,y,z].  I think it's actually the coordinates of the point on the block face where the player's line of sight intersects.

2) I think you will need to retrieve the player's coordinates using player.posX, .posY etc.  This is not ideal but it should work I think.

3) when comparing dirx with dirz, in order to see whether the wall is east-west or north-south, you should take Math.abs(), because they can be negative or positive.

4) what happens if dirx == dirz?

5) I understand how you want it to work for clicking on the top or bottom of block; but I'm not sure your east, west, north, south will do something reasonable

 

    /**
     * Handles a players right click. Args: player, world, x, y, z, side, hitVec
     */
    public boolean onPlayerRightClick(EntityPlayer par1EntityPlayer, World par2World, ItemStack par3ItemStack, int par4, int par5, int par6, int par7, Vec3 par8Vec3)
    {
        this.syncCurrentPlayItem();
        float f = (float)par8Vec3.xCoord - (float)par4;
        float f1 = (float)par8Vec3.yCoord - (float)par5;
        float f2 = (float)par8Vec3.zCoord - (float)par6;

(f, f1, f2 are eventually passed to onItemUse().  re hitVec - see class MovingObjectPosition)

 

-TGG

Link to comment
Share on other sites

Join the conversation

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

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

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

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

×   Your previous content has been restored.   Clear editor

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

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Add crash-reports with sites like https://paste.ee/ Maybe an issue with blur, essentials or cumulus_menus
    • Add the crash-report or latest.log (logs-folder) with sites like https://paste.ee/ and paste the link to it here  
    • I have a problem, I am trying to put two different effects to two different armors but when I run it only the emerald armor effect works. This is the code public class ModArmorItem extends ArmorItem{ private static final Map<ArmorMaterial, MobEffectInstance> MATERIAL_TO_EFFECT_MAP = (new ImmutableMap.Builder<ArmorMaterial, MobEffectInstance>()) .put(ModArmorMaterials.EMERALD, new MobEffectInstance(MobEffects.HERO_OF_THE_VILLAGE,200, 1,false,false, true)) .put(ModArmorMaterials.OBSIDIAN, new MobEffectInstance(MobEffects.FIRE_RESISTANCE,200, 1,false,false, true)).build(); public ModArmorItem(ArmorMaterial pMaterial, Type pType, Properties pProperties) { super(pMaterial, pType, pProperties); } @Override public void onArmorTick(ItemStack stack, Level world, Player player){ if (!world.isClientSide()) { if (hasFullSuitOfArmorOn(player)) { evaluateArmorEffects(player); } } } private void evaluateArmorEffects(Player player) { for (Map.Entry<ArmorMaterial,MobEffectInstance> entry : MATERIAL_TO_EFFECT_MAP.entrySet()){ ArmorMaterial mapArmorMaterial = entry.getKey(); MobEffectInstance mapStatusEffect = entry.getValue(); if (hasCorrectArmorOn(mapArmorMaterial, player)) { addStatusEffectForMaterial(player, mapArmorMaterial, mapStatusEffect); } } } private void addStatusEffectForMaterial(Player player, ArmorMaterial mapArmorMaterial, MobEffectInstance mapStatusEffect) { boolean hasPlayerEffect = player.hasEffect(mapStatusEffect.getEffect()); if (hasCorrectArmorOn(mapArmorMaterial, player) && !hasPlayerEffect) { player.addEffect(new MobEffectInstance(mapStatusEffect)); } } private boolean hasCorrectArmorOn(ArmorMaterial material, Player player) { for (ItemStack armorStack : player.getInventory().armor){ if (!(armorStack.getItem() instanceof ArmorItem)) { return false; } } ArmorItem helmet = ((ArmorItem)player.getInventory().getArmor(3).getItem()); ArmorItem breastplace = ((ArmorItem)player.getInventory().getArmor(2).getItem()); ArmorItem leggins = ((ArmorItem)player.getInventory().getArmor(1).getItem()); ArmorItem boots = ((ArmorItem)player.getInventory().getArmor(0).getItem()); return helmet.getMaterial() == material && breastplace.getMaterial() == material && leggins.getMaterial() == material && boots.getMaterial() == material; } private boolean hasFullSuitOfArmorOn(Player player){ ItemStack helmet = player.getInventory().getArmor(3); ItemStack breastplace = player.getInventory().getArmor(2); ItemStack leggins = player.getInventory().getArmor(1); ItemStack boots = player.getInventory().getArmor(0); return !helmet.isEmpty() && !breastplace.isEmpty() && !leggins.isEmpty() && !boots.isEmpty(); } } Also when I place two effects on the same armor, the game crashes. Here is the crash file. The code is the same, only this part is different   private static final Map<ArmorMaterial, MobEffectInstance> MATERIAL_TO_EFFECT_MAP = (new ImmutableMap.Builder<ArmorMaterial, MobEffectInstance>()) .put(ModArmorMaterials.EMERALD, new MobEffectInstance(MobEffects.HERO_OF_THE_VILLAGE,200, 1,false,false, true)) .put(ModArmorMaterials.EMERALD, new MobEffectInstance(MobEffects.FIRE_RESISTANCE,200, 1,false,false, true)).build(); I hope you guys can help me. Thanks.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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