Jump to content

DFined

Members
  • Posts

    18
  • Joined

  • Last visited

Converted

  • Gender
    Undisclosed
  • Personal Text
    I am new!

DFined's Achievements

Tree Puncher

Tree Puncher (2/8)

0

Reputation

  1. Thanks for the response! Well... Thats the thing, the whole point is that there should be no escape from it. It is meant to be something that actually makes the game hard by destroying most plants etc. If I do it just around the player it would be slightly pointless, as the theme is a global catastrophe. The amout of ash should, probably, be config based, but over 8 hours, say, it could be 2-3 blocks thickness (the blocks are also variable thickness like snow, so that they build up gradually). And I know that, likely, the answer is just "Its way too many blocks to update, it cant be done effectively", but then again, the chunks do get generated pretty quickly and that doesnt (*usually*) cause much lag on a decent pc, whereas this works just barely. Currently I am looking into what is different. I assume its that when the chunks are primed during worldgen it is a simpler action per-block changed.
  2. Yeah, thats pretty much what im doing, but using just the load event, sadly, doesnt cover the full situation, so I have to use tick as well. Sadly this approach seems suboptimal.
  3. Hi! My mod simulates heavy ashfall and buildup. In the areas where the player is, it is not hard. However when, say, a full block layer has fallen around the player, if they decide to move somewhere and load new chunks I need there to also be an extra layer already on top of the new chunks. If they then return somewhere they have already been I also need blocks to have built up there. I first thought of trying to somehow do this during chunk generation, but this only helps with new chunks and not ones being repeatedly visited. Currently I am updating the chunks (adding the layer of blocks to the top of the chunk) during the world tick by checking when the chunk is near the player (all chunks withtin a radius (4-5 chunks) of the player get checked, and if any are out of date they get updated). This works somewhat well for one player, but if I want to expand it to multiplayer capability the server definitely wont keep up. So my question is if there is a better way of doing such a relatively absurd thing, because the current way seems like a bodge. Any help would be appreciated. Thank you in advance
  4. So its the block updates... Thanks! And I have found a solution as well. If anyone else is looking for how to do this: instead of creating the blocks, its better to just spawn the FallingBlockEntity. That way the lag vanishes completely.
  5. Oh, my bad, I do actually have if(!world.isRemote()) in the code, I was just checking that I am not misunderstanding isRemote() when writing this post and forgot to change it back. So the lag isnt due to it being clientside (if it actually was done on the client the blocks wouldn't fall at all). As for the static field I know Ill have to change it. For now it works and this is just a quick and dirty way to check if the concept as a whole has any problems. Such as this weird lag.
  6. Hi! I have been working on a mod, that creates an ash-rain event, where ash blocks start falling from the sky. Currently I use the player tick event to spawn the blocks around the player. The only problem is, this seems to cause extreme lag, even when the block creation rate is such that only 10-20 blocks are falling at any time. I have tested much larger amounts of manually placed blocks falling at once and not causing lag. I have also tried creating sand blocks instead of the custom ash block to no difference, so the problem is not in the block itself either. Here is the code. If anyone knows what the problem might be, I would be very grateful. I assume its probably some mechanic I dont know about, and will go dig in it some more, but I'm stumped. @Mod.EventBusSubscriber(bus= Mod.EventBusSubscriber.Bus.FORGE) public static class WorldEvents{ private static final int ASHFALLRADIUS = 7*16; private static final float ASHFALLINTERVAL = 1; private static float interval = 0.f; @SubscribeEvent public static void onTick(TickEvent.PlayerTickEvent tickEvent) { PlayerEntity player = tickEvent.player; World world = tickEvent.player.world; if(world.isRemote()) { Random rand = world.getRandom(); interval += rand.nextFloat(); if(interval > 5.f) { BlockPos dropPos = new BlockPos( player.posX + rand.nextInt(ASHFALLRADIUS * 2) - ASHFALLRADIUS, 150, player.posZ + rand.nextInt(ASHFALLRADIUS * 2) - ASHFALLRADIUS); if (world.getChunkProvider().isChunkLoaded(new ChunkPos(dropPos))) { BlockState state = ashBlock.getDefaultState().with(ashBlock.LAYERS, rand.nextInt(8) + 1); world.setBlockState(dropPos, state, 6); } interval = 0; } } } }
  7. Hi, I've been trying to make passive vanilla creatures become agressive. I have managed to make them start targeting whatever I want by editing their AI tasks inside the EntityJoinWorldEvent, however after the animals run up to their target they just stand looking at (following) it. My thoughts were that they probably needed some attribute modification, for example giving them attack damage or speed. However, upon closer inspection I found, that they dont seem to have said attributes at all. So I tried adding them, but that didn't help. So my question is whether there is some simple way to make the passive mobs actually hit others and not just target them? Thank you in advance for any help
  8. Hello! I have been trying to make my first custom dimension, and I have figured out, the basics, terrain generation, etc., but I now want to change the fog color and I cant seem to figure it out, and I am also having issues with lighting. After searching for a while I have found that I should override getFogColor(...) in my WorldProvider, and generateLightingBrightnessTable() for lighting. I did that and it had no effect whatsoever. For the lighting, the code at least gets called, though it seems to have no effect, meanwhile getFogColor() is never even called. Here is my WorldProvider class: package com.DFined.mitech.world.CaveDimension; import com.DFined.mitech.core.MiTech; import com.DFined.mitech.world.MiTechDimensionGen; import net.minecraft.entity.Entity; import net.minecraft.init.Biomes; import net.minecraft.util.math.Vec3d; import net.minecraft.world.DimensionType; import net.minecraft.world.WorldProvider; import net.minecraft.world.biome.BiomeProvider; import net.minecraft.world.biome.BiomeProviderSingle; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class CaveDimensionWorldProvider extends WorldProvider { @Override public DimensionType getDimensionType() { return MiTechDimensionGen.CAVE_DIM_TYPE; } @Override public boolean hasSkyLight(){ return false; } @Override public BiomeProvider getBiomeProvider(){ return new BiomeProviderSingle(MiTechDimensionGen.CAVE_BIOME_BASE); } @Override public void init() { hasSkyLight = false; this.nether = true; } @SideOnly(Side.CLIENT) @Override public Vec3d getFogColor(float p_76562_1_, float p_76562_2_) { System.out.print("FOGCOLOR"); return new Vec3d(0.20000000298023224D, 0.029999999329447746D, 0.029999999329447746D); } @Override protected void generateLightBrightnessTable() { System.out.print("BRIGHTNESS"); float f = 0.1F; for (int i = 0; i <= 15; ++i) { float f1 = 1.0F - (float)i / 15.0F; this.lightBrightnessTable[i] = (1.0F - f1) / (f1 * 3.0F + 1.0F) * 0.9F + 0.1F; } } @Override public boolean isSurfaceWorld() { return false; } @Override public boolean canCoordinateBeSpawn(int x, int z) { return true; } @Override public float calculateCelestialAngle(long worldTime, float partialTicks) { return 0.5F; } @Override public boolean canRespawnHere() { return true; } @SideOnly(Side.CLIENT) public boolean doesXZShowFog(int x, int z) { return true; } } Also i am getting lots of black-shadow-patch type lighting issues and I have no idea why... Any help will be much appreciated, as I am only starting with custom dimensions and don't yet know too much about them. Thank you in advance.
  9. Thanks for the reply! Thats a lot of info Some of it I knew, but not all. Well, I guess I'll have to go read up about custom packets, as I know the theory but haven't ever actually used them... Oh and the change to creative thing does still work
  10. Hi, Ive been making an armour mod, where the armour needs to store some nbt data. The data is attached to it via actions in a gui. The only thing is - when the nbt is changed through the gui, the data doesnt seem to sync untill I pick the item from my inventory and put it back. If I relog, the data is gone, if I drop it by pressing 'Q' the data is gone. However if I move it to a different slot, or just drop it manually (as in pick it from the inventory and click outside the gui) the data stays. I presume its something about the nbt not getting synced until the item is interacted with, but my question is why and what do I do with it? Any help will be much appreciated
  11. Thanks for such a swift answer! Gonna try this now. As for the variable names - as I say, this is currently a copy of the arrow class, and I still haven't got to properly formatting the stuff I need and deleting the rest. And thanks again!
  12. Hello, I hate to go back to the forums for the third time in a month, but I've got a problem which I can seem to explain. I have an entity class (which currently is basically a copy of the entityArrow with some modifications) and when the entity gets created I want to set a field I added. This, however, is proving difficult, because during the onUpdate() method, the entity doesnt behave as expected, and I traced that to the variable "idle" being equal to what I set it as in server, but Equal to 0 on client. Therefore, I expected to have the entity basically do nothing for the amount of ticks specified in idle, then start updating, but It goes straight away, or at least the client part does. I know, that this may be a dumb question, but I cant seem to find much on the subject, as all the tutorials are on tileentity synchronization, so how would I go about fixing this? Here's the class in question: package com.DFined.Destructicraft.projectiles; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.List; import com.DFined.Destructicraft.DestructiCraftMod; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IProjectile; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.play.server.S2BPacketChangeGameState; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; public class GenericProjectile extends Entity implements IProjectile { private int field_145791_d = -1; private int field_145792_e = -1; private int field_145789_f = -1; private Block field_145790_g; private int inData; private int idle; private boolean inGround; /** 1 if the player can pick up the arrow */ public int canBePickedUp; /** Seems to be some sort of timer for animating an arrow. */ public int arrowShake; /** The owner of this arrow. */ public Entity shootingEntity; private int ticksInGround; private int ticksInAir; private double damage = 2.0D; /** The amount of knockback an arrow applies when it hits a mob. */ private int knockbackStrength; private boolean exploded = false; private static final String __OBFID = "CL_00001715"; public int lifetime; public int age; public GenericProjectile(World p_i1753_1_) { super(p_i1753_1_); this.renderDistanceWeight = 10.0D; this.setSize(0.5F, 0.5F); } public GenericProjectile(World theWorld, double theX, double theY, double theZ, float vx, float vy, float vz, int life, int idl) { super(theWorld); idle = idl; lifetime = life; age = 0; this.renderDistanceWeight = 10.0D; this.setSize(0.5F, 0.5F); this.setPosition(theX, theY, theZ); this.yOffset = 0.0F; motionX = vx; motionY = vy; motionZ = vz; } public GenericProjectile(World p_i1755_1_, EntityLivingBase p_i1755_2_, EntityLivingBase p_i1755_3_, float p_i1755_4_, float p_i1755_5_) { super(p_i1755_1_); this.renderDistanceWeight = 10.0D; this.shootingEntity = p_i1755_2_; if (p_i1755_2_ instanceof EntityPlayer) { this.canBePickedUp = 1; } this.posY = p_i1755_2_.posY + (double)p_i1755_2_.getEyeHeight() - 0.10000000149011612D; double d0 = p_i1755_3_.posX - p_i1755_2_.posX; double d1 = p_i1755_3_.boundingBox.minY + (double)(p_i1755_3_.height / 3.0F) - this.posY; double d2 = p_i1755_3_.posZ - p_i1755_2_.posZ; double d3 = (double)MathHelper.sqrt_double(d0 * d0 + d2 * d2); if (d3 >= 1.0E-7D) { float f2 = (float)(Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F; float f3 = (float)(-(Math.atan2(d1, d3) * 180.0D / Math.PI)); double d4 = d0 / d3; double d5 = d2 / d3; this.setLocationAndAngles(p_i1755_2_.posX + d4, this.posY, p_i1755_2_.posZ + d5, f2, f3); this.yOffset = 0.0F; float f4 = (float)d3 * 0.2F; this.setThrowableHeading(d0, d1 + (double)f4, d2, p_i1755_4_, p_i1755_5_); } } public GenericProjectile(World p_i1756_1_, EntityLivingBase p_i1756_2_, float p_i1756_3_) { super(p_i1756_1_); this.renderDistanceWeight = 10.0D; this.shootingEntity = p_i1756_2_; if (p_i1756_2_ instanceof EntityPlayer) { this.canBePickedUp = 1; } this.setSize(0.5F, 0.5F); this.setLocationAndAngles(p_i1756_2_.posX, p_i1756_2_.posY + (double)p_i1756_2_.getEyeHeight(), p_i1756_2_.posZ, p_i1756_2_.rotationYaw, p_i1756_2_.rotationPitch); this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); this.posY -= 0.10000000149011612D; this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); this.setPosition(this.posX, this.posY, this.posZ); this.yOffset = 0.0F; this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI)); this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI)); this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI)); this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, p_i1756_3_ * 1.5F, 1.0F); } protected void entityInit() { this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); } /** * Similar to setArrowHeading, it's point the throwable entity to a x, y, z direction. */ /** * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, * posY, posZ, yaw, pitch */ @SideOnly(Side.CLIENT) public void setPositionAndRotation2(double p_70056_1_, double p_70056_3_, double p_70056_5_, float p_70056_7_, float p_70056_8_, int p_70056_9_) { this.setPosition(p_70056_1_, p_70056_3_, p_70056_5_); this.setRotation(p_70056_7_, p_70056_8_); } /** * Sets the velocity to the args. Args: x, y, z */ @SideOnly(Side.CLIENT) public void setVelocity(double p_70016_1_, double p_70016_3_, double p_70016_5_) { this.motionX = p_70016_1_; this.motionY = p_70016_3_; this.motionZ = p_70016_5_; if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { float f = MathHelper.sqrt_double(p_70016_1_ * p_70016_1_ + p_70016_5_ * p_70016_5_); this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(p_70016_1_, p_70016_5_) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(p_70016_3_, (double)f) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch; this.prevRotationYaw = this.rotationYaw; this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); this.ticksInGround = 0; } } /** * Called to update the entity's position/logic. */ public void onUpdate() { if(idle>0){ idle--; // <--THE PART OF CODE IN QUESTION }else{ super.onUpdate(); Entity entity = null; List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); double d0 = 0.0D; int i; this.posX += this.motionX; this.posY += this.motionY; this.posZ += this.motionZ; this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; float f3 = 0.99F; this.motionX *= 1; this.motionY *= 1; this.motionZ *= 1; this.motionY -= 0.2; this.setPosition(this.posX, this.posY, this.posZ); if(age>lifetime&&!this.exploded&&this.worldObj.isRemote){ this.explode(); } } } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound NBT) { NBT.setShort("xTile", (short)this.field_145791_d); NBT.setShort("yTile", (short)this.field_145792_e); NBT.setShort("zTile", (short)this.field_145789_f); NBT.setInteger("life", 20); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound p_70037_1_) { this.field_145791_d = p_70037_1_.getShort("xTile"); this.field_145792_e = p_70037_1_.getShort("yTile"); this.field_145789_f = p_70037_1_.getShort("zTile"); } /** * Called by a player entity when they collide with an entity */ public void onCollideWithPlayer(EntityPlayer p_70100_1_) { if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0) { boolean flag = this.canBePickedUp == 1 || this.canBePickedUp == 2 && p_70100_1_.capabilities.isCreativeMode; if (this.canBePickedUp == 1 && !p_70100_1_.inventory.addItemStackToInventory(new ItemStack(Items.arrow, 1))) { flag = false; } if (flag) { this.playSound("random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); p_70100_1_.onItemPickup(this, 1); this.setDead(); } } } /** * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to * prevent them from trampling crops */ protected boolean canTriggerWalking() { return false; } @SideOnly(Side.CLIENT) public float getShadowSize() { return 0.0F; } public void setDamage(double p_70239_1_) { this.damage = p_70239_1_; } public double getDamage() { return this.damage; } /** * Sets the amount of knockback the arrow applies when it hits a mob. */ public void setKnockbackStrength(int p_70240_1_) { this.knockbackStrength = p_70240_1_; } /** * If returns false, the item will not inflict any damage against entities. */ public boolean canAttackWithItem() { return false; } private void explode() { exploded = true; DestructiCraftMod.proxy.spawnParticles(this.worldObj,posX,posY,posZ, 0, 0, 0, 1, 1, 0, 0, 0, 0, 600, 3, 0.2F, false); for(int i = 0; i < 150; i ++){ float dx = (float) Math.random()-0.5F; float dy = (float) Math.random()-0.5F; float dz = (float) Math.random()-0.5F; while((Math.sqrt(dz*dz+dy*dy+dx*dx)<0.45)||(Math.sqrt(dz*dz+dy*dy+dx*dx)>0.5)){ dx = (float) Math.random()-0.5F; dy = (float) Math.random()-0.5F; dz = (float) Math.random()-0.5F; } int r = 100; DestructiCraftMod.proxy.spawnParticles(this.worldObj,posX,posY,posZ, (float)(dx*Math.random()*30), (float)(dy*Math.random()*30), (float)(dz*Math.random()*30), (float)(Math.random()*0.5+0.5), (float)(Math.random()*0.5), (float)(Math.random()*0.1), (float)(1), (float)(Math.random()*2), (float)(0), 7, 65, 1F, true); } } @Override public void setThrowableHeading(double p_70186_1_, double p_70186_3_, double p_70186_5_, float p_70186_7_, float p_70186_8_) { } }
  13. Thanks for the info! But then that leads to another question - is there any accepted way to increase it, or will that require some tinkering?
×
×
  • Create New...

Important Information

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