Jump to content

Catfish55

Members
  • Posts

    13
  • Joined

  • Last visited

Posts posted by Catfish55

  1. How would I go about making a projectile ignore the moment when a mob turns red and goes invulnerable after being hit? This way my projectiles could hit them at a more rapid speed and still deal damage.

     

    edit: If there is a way to remove the period on my mobs, that would work too.

  2. How would I go about doing the following:

     

    If X on client, do Z on server.

     

    So basically, check something on the client, and do it on the server if it is right. Afaik I can't use the world.isremote idea because as soon as I check client it won't be able to check server again within the if statement.

  3. When they are swimming, they call a method called moveFlying() ("flying" is used for both swimming and flying because it means gravity is active on entity) which is called by moveEntityWithHeading().  In that method it also checks for the isAIEnabled() so you have to override that one as well.  This is what the current class looks like:

     

        public void moveEntityWithHeading(float par1, float par2)

        {

            double d0;

     

            if (this.isInWater() && (!(this instanceof EntityPlayer) || !((EntityPlayer)this).capabilities.isFlying))

            {

                d0 = this.posY;

                this.moveFlying(par1, par2, this.isAIEnabled() ? 0.04F : 0.02F);

                this.moveEntity(this.motionX, this.motionY, this.motionZ);

                this.motionX *= 0.800000011920929D;

                this.motionY *= 0.800000011920929D;

                this.motionZ *= 0.800000011920929D;

                this.motionY -= 0.02D;

     

                if (this.isCollidedHorizontally && this.isOffsetPositionInLiquid(this.motionX, this.motionY + 0.6000000238418579D - this.posY + d0, this.motionZ))

                {

                    this.motionY = 0.30000001192092896D;

                }

            }

            else if (this.handleLavaMovement() && (!(this instanceof EntityPlayer) || !((EntityPlayer)this).capabilities.isFlying))

            {

                d0 = this.posY;

                this.moveFlying(par1, par2, 0.02F);

                this.moveEntity(this.motionX, this.motionY, this.motionZ);

                this.motionX *= 0.5D;

                this.motionY *= 0.5D;

                this.motionZ *= 0.5D;

                this.motionY -= 0.02D;

     

                if (this.isCollidedHorizontally && this.isOffsetPositionInLiquid(this.motionX, this.motionY + 0.6000000238418579D - this.posY + d0, this.motionZ))

                {

                    this.motionY = 0.30000001192092896D;

                }

            }

            else

            {

                float f2 = 0.91F;

     

                if (this.onGround)

                {

                    f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)).slipperiness * 0.91F;

                }

     

                float f3 = 0.16277136F / (f2 * f2 * f2);

                float f4;

     

                if (this.onGround)

                {

                    f4 = this.getAIMoveSpeed() * f3;

                }

                else

                {

                    f4 = this.jumpMovementFactor;

                }

     

                this.moveFlying(par1, par2, f4);

                f2 = 0.91F;

     

                if (this.onGround)

                {

                    f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)).slipperiness * 0.91F;

                }

     

                if (this.isOnLadder())

                {

                    float f5 = 0.15F;

     

                    if (this.motionX < (double)(-f5))

                    {

                        this.motionX = (double)(-f5);

                    }

     

                    if (this.motionX > (double)f5)

                    {

                        this.motionX = (double)f5;

                    }

     

                    if (this.motionZ < (double)(-f5))

                    {

                        this.motionZ = (double)(-f5);

                    }

     

                    if (this.motionZ > (double)f5)

                    {

                        this.motionZ = (double)f5;

                    }

     

                    this.fallDistance = 0.0F;

     

                    if (this.motionY < -0.15D)

                    {

                        this.motionY = -0.15D;

                    }

     

                    boolean flag = this.isSneaking() && this instanceof EntityPlayer;

     

                    if (flag && this.motionY < 0.0D)

                    {

                        this.motionY = 0.0D;

                    }

                }

     

                this.moveEntity(this.motionX, this.motionY, this.motionZ);

     

                if (this.isCollidedHorizontally && this.isOnLadder())

                {

                    this.motionY = 0.2D;

                }

     

                if (this.worldObj.isRemote && (!this.worldObj.blockExists((int)this.posX, 0, (int)this.posZ) || !this.worldObj.getChunkFromBlockCoords((int)this.posX, (int)this.posZ).isChunkLoaded))

                {

                    if (this.posY > 0.0D)

                    {

                        this.motionY = -0.1D;

                    }

                    else

                    {

                        this.motionY = 0.0D;

                    }

                }

                else

                {

                    this.motionY -= 0.08D;

                }

     

                this.motionY *= 0.9800000190734863D;

                this.motionX *= (double)f2;

                this.motionZ *= (double)f2;

            }

     

            this.prevLimbSwingAmount = this.limbSwingAmount;

            d0 = this.posX - this.prevPosX;

            double d1 = this.posZ - this.prevPosZ;

            float f6 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F;

     

            if (f6 > 1.0F)

            {

                f6 = 1.0F;

            }

     

            this.limbSwingAmount += (f6 - this.limbSwingAmount) * 0.4F;

            this.limbSwing += this.limbSwingAmount;

        }

     

     

    So you need to override the whole method and change the line near the top where it checks if isAIEnabled().

     

    Regarding the rest of your comments about AI, I'm in the process of writing a tutorial on it.  There are a couple of tricks related to how you disable AI when other AI is running (the setMutexBits() method is used but it is a little tricky without explanation) as well as the priority order you have the task list.

    How do you adjust the priorities on the task list? Also, it worked, thanks!

  4. I've always used the new AI so never really looked at this before.  However, looking at it quickly it seems that you probably need to look at overriding at the following:

     

    In your entity class, maybe Override the getAISpeed() method.  In the EntityLivingBase class, the method is defined as:

        public float getAIMoveSpeed()
        {
            return this.isAIEnabled() ? this.landMovementFactor : 0.1F;
        }
    

     

    So just change that 0.1F to what you want.  Not sure but that might do it.

    Modified what you suggested a little bit and it work now, except when they go in water. I removed the this.landMovementFactor because it wasn't a variable that was recognized.

     

    Also, the problem with new AI is it seems to cause my mobs to randomly lose aggro on the player, and when I adjust the movement speed they don't face the way they are running.

  5. So, the line:

    this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(value);

    doesn't seem to change anything unless the new AI is enabled. However, with new AI enabled, it really messes with some of the things I've added. Is there a good way to make it move faster otherwise

     

     

    I've tried doing all sorts of adjustments of movement speed in the onLivingUpdate tick.

  6. So when I look at the block in my inventory, it doesn't appear as a cube from a 45 degree angle like Vanilla blocks, I just see the straight up texture.

     

    My block class:

     

     

    public class BarColors extends Block {

    private String name;

    private static Material BCLR = Material.iron;

     

    public BarColors () {

    super(BCLR );

    this.setCreativeTab(mineandbash.CageTab);

    this.setHardness(5f);

    this.setResistance(0.5F);

    this.setLightLevel(0.0F);

     

    }

     

     

     

    public Block setTextureName(String name){

    return setBlockTextureName("mineandbash:" + name);

    }

     

    public Block setName(String name){

    this.name = name;

    setBlockName(name);

    setTextureName(name);

            GameRegistry.registerBlock(this, name);

    return this;

    }

     

     

     

    }

     

     

     

  7. To load textures:

    @SideOnly(Side.CLIENT)
    @Override
    public void registerIcons(IconRegister iconRegister) {
    	iconBuffer = new Icon[MetaCount];
                    iconBuffer[0] = iconRegister.registerIcon("MODID:" + TextureName1);
                    iconBuffer[1] = iconRegister.registerIcon("MODID:" + TextureName2);
    
            blockIcon = iconBuffer[0];
    }
    

    To get textures based on meta:

    @SideOnly(Side.CLIENT)
        public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
        {
              return iconBuffer[par1IBlockAccess.getBlockMetadata(par2, par3, par4)];
        }
    

    Is this for 1.7 (I'm asking about 1.7)? Cause I get errors galore (of unimportable things, such as IconRegister -- Did you mean IIConRegister?).

     

     

    edit:

    So I found a way to have more than 16 versions (infinite really) of the block in one file, as I just make it a new type of block.

  8. Write this in your class, that's the simple way

     

    public void setMeta(World world, int x, int y, int z, int meta)
        {
            world.setBlockMetadataWithNotify(x, y, z, MathHelper.clamp_int(meta, 0, 3), 2);
            world.func_147453_f(x, y, z, this);
        }
    

    Okay, thank you, but how do I change the texture of the block depending on the meta data, as well as use metadeta in a recipe? (I assume registering the block is the same as normal too)

  9. I've tried looking around Vanilla code for how to do this, but all the func_x everywhere started to get annoying. How does one add metadata to a block?

     

    Edit:

     

    So I found a way to have more than 16 versions (infinite really) of the block in one file, as I just make it a new type of block.

  10. You always pass

    null

    to the container as the villager.

    You need to send the entityId with openGui (x, y, z are just integers, you dont have to use a location!) and then use world.getEntityById.

    Where exactly do I use this world.getEntityById?

  11. Hi,

     

    I made my own GUI for a custom villager NPC I have. When I use the default GUI (same as Villager) the trader works perfectly. Whenever I put my own GUI in it's place, interacting crashes with this crash.

     

    In my Entity class, if I move the drawing of the GUI outside of the !isRemote (which is no longer like Villager code) and into an isRemote, then I get to see the GUI except when I close it I get this crash (I don't see any of the GUI besides the main background part, there are no buttons, things he is selling, etc):

     

     

     

    java.lang.NullPointerException: Updating screen events

    at com.mashmod.container.ContainerMiner.onContainerClosed(ContainerMiner.java:162)

    at net.minecraft.client.gui.inventory.GuiContainer.onGuiClosed(GuiContainer.java:746)

    at net.minecraft.client.Minecraft.displayGuiScreen(Minecraft.java:838)

    at net.minecraft.client.entity.EntityPlayerSP.closeScreen(EntityPlayerSP.java:362)

    at net.minecraft.client.entity.EntityClientPlayerMP.closeScreenNoPacket(EntityClientPlayerMP.java:271)

    at net.minecraft.client.entity.EntityClientPlayerMP.closeScreen(EntityClientPlayerMP.java:262)

    at net.minecraft.client.gui.inventory.GuiContainer.keyTyped(GuiContainer.java:701)

    at net.minecraft.client.gui.GuiScreen.handleKeyboardInput(GuiScreen.java:388)

    at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:325)

    at net.minecraft.client.Minecraft.runTick(Minecraft.java:1727)

    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1036)

    at net.minecraft.client.Minecraft.run(Minecraft.java:951)

    at net.minecraft.client.main.Main.main(Main.java:112)

    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:134)

    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)

     

     

     

     

    Normal crash w/out moving out of !isRemote

     

     

    Encountered an unexpected exception

    net.minecraft.util.ReportedException: Ticking player

    at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:206) ~[NetworkSystem.class:?]

    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:762) ~[MinecraftServer.class:?]

    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:650) ~[MinecraftServer.class:?]

    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120) ~[integratedServer.class:?]

    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:528) [MinecraftServer.class:?]

    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:787) [MinecraftServer$2.class:?]

    Caused by: java.lang.NullPointerException

    at com.mashmod.container.ContainerMiner.canInteractWith(ContainerMiner.java:92) ~[ContainerMiner.class:?]

    at net.minecraftforge.event.entity.player.PlayerOpenContainerEvent.<init>(PlayerOpenContainerEvent.java:27) ~[PlayerOpenContainerEvent.class:?]

    at net.minecraftforge.common.ForgeHooks.canInteractWith(ForgeHooks.java:373) ~[ForgeHooks.class:?]

    at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:362) ~[EntityPlayer.class:?]

    at net.minecraft.entity.player.EntityPlayerMP.onUpdateEntity(EntityPlayerMP.java:363) ~[EntityPlayerMP.class:?]

    at net.minecraft.network.NetHandlerPlayServer.processPlayer(NetHandlerPlayServer.java:334) ~[NetHandlerPlayServer.class:?]

    at net.minecraft.network.play.client.C03PacketPlayer.processPacket(C03PacketPlayer.java:37) ~[C03PacketPlayer.class:?]

    at net.minecraft.network.play.client.C03PacketPlayer$C06PacketPlayerPosLook.processPacket(C03PacketPlayer.java:218) ~[C03PacketPlayer$C06PacketPlayerPosLook.class:?]

    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:242) ~[NetworkManager.class:?]

    at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:190) ~[NetworkSystem.class:?]

    ... 5 more

     

     

     

    I have the code for my trader and gui here:

     

    Trader Entity Interact:

     

     

    @Override

        public boolean interact(EntityPlayer var1)

        {

            if (this.isEntityAlive() && !this.isTrading() && !this.isChild())

            {

                if (!this.worldObj.isRemote)

                {

                    this.setCustomer(var1);

                   

                    var1.openGui(mineandbash.instance, GuiHandler.miner, this.worldObj, this.getEntityId(), 0, 0);

                }

     

                return true;

            }

            else

            {

                return super.interact(var1);

            }

        }

     

     

    Container:

     

     

     

    public class ContainerMiner extends Container

    {

        /**

        * Instance of Merchant.

        */

        private IMerchant theMerchant;

        private InventoryMerchant merchantInventory;

        /**

        * Instance of World.

        */

        private final World theWorld;

        private static final String __OBFID = "CL_00001757";

     

        public ContainerMiner (InventoryPlayer par1InventoryPlayer, IMerchant par2IMerchant, World par3World)

        {

            this.theMerchant = par2IMerchant;

            this.theWorld = par3World;

            this.merchantInventory = new InventoryMerchant(par1InventoryPlayer.player, par2IMerchant);

            this.addSlotToContainer(new Slot(this.merchantInventory, 0, 36, 53));

            this.addSlotToContainer(new Slot(this.merchantInventory, 1, 62, 53));

            this.addSlotToContainer(new SlotMerchantResult(par1InventoryPlayer.player, par2IMerchant, this.merchantInventory, 2, 120, 53));

            int i;

     

            for (i = 0; i < 3; ++i)

            {

                for (int j = 0; j < 9; ++j)

                {

                    this.addSlotToContainer(new Slot(par1InventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));

                }

            }

     

            for (i = 0; i < 9; ++i)

            {

                this.addSlotToContainer(new Slot(par1InventoryPlayer, i, 8 + i * 18, 142));

            }

        }

     

        public InventoryMerchant getMerchantInventory()

        {

            return this.merchantInventory;

        }

     

        public void addCraftingToCrafters(ICrafting par1ICrafting)

        {

            super.addCraftingToCrafters(par1ICrafting);

        }

     

        /**

        * Looks for changes made in the container, sends them to every listener.

        */

        public void detectAndSendChanges()

        {

            super.detectAndSendChanges();

        }

     

        /**

        * Callback for when the crafting matrix is changed.

        */

        public void onCraftMatrixChanged(IInventory par1IInventory)

        {

            this.merchantInventory.resetRecipeAndSlots();

            super.onCraftMatrixChanged(par1IInventory);

        }

     

        public void setCurrentRecipeIndex(int par1)

        {

            this.merchantInventory.setCurrentRecipeIndex(par1);

        }

     

        @SideOnly(Side.CLIENT)

        public void updateProgressBar(int par1, int par2) {}

     

        public boolean canInteractWith(EntityPlayer par1EntityPlayer)

        {

            return this.theMerchant.getCustomer() == par1EntityPlayer;

        }

     

        /**

        * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.

        */

        public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)

        {

            ItemStack itemstack = null;

            Slot slot = (Slot)this.inventorySlots.get(par2);

     

            if (slot != null && slot.getHasStack())

            {

                ItemStack itemstack1 = slot.getStack();

                itemstack = itemstack1.copy();

     

                if (par2 == 2)

                {

                    if (!this.mergeItemStack(itemstack1, 3, 39, true))

                    {

                        return null;

                    }

     

                    slot.onSlotChange(itemstack1, itemstack);

                }

                else if (par2 != 0 && par2 != 1)

                {

                    if (par2 >= 3 && par2 < 30)

                    {

                        if (!this.mergeItemStack(itemstack1, 30, 39, false))

                        {

                            return null;

                        }

                    }

                    else if (par2 >= 30 && par2 < 39 && !this.mergeItemStack(itemstack1, 3, 30, false))

                    {

                        return null;

                    }

                }

                else if (!this.mergeItemStack(itemstack1, 3, 39, false))

                {

                    return null;

                }

     

                if (itemstack1.stackSize == 0)

                {

                    slot.putStack((ItemStack)null);

                }

                else

                {

                    slot.onSlotChanged();

                }

     

                if (itemstack1.stackSize == itemstack.stackSize)

                {

                    return null;

                }

     

                slot.onPickupFromSlot(par1EntityPlayer, itemstack1);

            }

     

            return itemstack;

        }

     

        /**

        * Called when the container is closed.

        */

        public void onContainerClosed(EntityPlayer par1EntityPlayer)

        {

            super.onContainerClosed(par1EntityPlayer);

            this.theMerchant.setCustomer((EntityPlayer)null);

            super.onContainerClosed(par1EntityPlayer);

     

            if (!this.theWorld.isRemote)

            {

                ItemStack itemstack = this.merchantInventory.getStackInSlotOnClosing(0);

     

                if (itemstack != null)

                {

                    par1EntityPlayer.dropPlayerItemWithRandomChoice(itemstack, false);

                }

     

                itemstack = this.merchantInventory.getStackInSlotOnClosing(1);

     

                if (itemstack != null)

                {

                    par1EntityPlayer.dropPlayerItemWithRandomChoice(itemstack, false);

                }

            }

        }

    }

     

     

    GUI-Handler:

     

     

    public class GuiHandler implements IGuiHandler{

     

    public static int guiID = 0;

    public static int entMiner= guiID++;

    EntityMiner miner;

     

    @Override

    public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {

    TileEntity entity = world.getTileEntity(x, y, z);

     

    if(ID == entMiner)

    return new ContainerMerchant(player.inventory, miner, world);

     

     

    return null;

    }

     

    @Override

    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {

    TileEntity entity = world.getTileEntity(x, y, z);

     

    if(ID == entMiner)

    return new GUIMiner(player.inventory, world, x, y, z);

     

    return null;

    }

     

    }

     

     

     

    Specific GUI:

     

     

    public class GUIMiner extends GuiContainer {

    static EntityMiner miner;

     

    public GUIMiner(InventoryPlayer par1InventoryPlayer, World par2World, int par3, int par4, int par5) {

    super(new ContainerMerchant(par1InventoryPlayer, miner, par2World));

    }

     

    @Override

    protected void drawGuiContainerForegroundLayer(int par1, int par2) {

    this.fontRendererObj.drawString("Miner", 40 + 5, - 10 - 10, 4210752);

    this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 50 + 14, this.ySize - 96 - 10 - 19, 4210752);

    }

     

    @Override

    protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) {

            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

    this.mc.getTextureManager().bindTexture(new ResourceLocation("mineandbash:textures/guis/minergui.png"));

    this.xSize = 176;

    this.ySize = 231;

    int k = (this.width - this.xSize) / 2;

    int l = (this.height - this.ySize) / 2;

    this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize);

    }

    }

     

     

×
×
  • Create New...

Important Information

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