Résolu Mob volant
-
Bonjour, j’ai un problème avec openGL. Mon but est de faire un oiseau donc un mob volant de façon normale. J’ai donc trouvé le code faisant voler la chauve-souris mais je n’arrive pas à le modifier de façon à ce que le vol soit moins archaïque. Donc si quelqu’un ici sait comment modifier cette portion de code ou connais un tuto pour ça ça serait cool
Le code permettant de voler :
if (this.spawnPosition != null && (!this.worldObj.isAirBlock(this.spawnPosition.posX, this.spawnPosition.posY, this.spawnPosition.posZ) || this.spawnPosition.posY < 1)) { this.spawnPosition = null; } if (this.spawnPosition == null || this.rand.nextInt(30) == 0 || this.spawnPosition.getDistanceSquared((int)this.posX, (int)this.posY, (int)this.posZ) < 4.0F) { this.spawnPosition = new ChunkCoordinates((int)this.posX + this.rand.nextInt(7) - this.rand.nextInt(7), (int)this.posY + this.rand.nextInt(6) - 2, (int)this.posZ + this.rand.nextInt(7) - this.rand.nextInt(7)); } double d0 = (double)this.spawnPosition.posX + 0.5D - this.posX; double d1 = (double)this.spawnPosition.posY + 0.1D - this.posY; double d2 = (double)this.spawnPosition.posZ + 0.5D - this.posZ; this.motionX += (Math.signum(d0) * 0.5D - this.motionX) * 0.10000000149011612D; this.motionY += (Math.signum(d1) * 0.699999988079071D - this.motionY) * 0.10000000149011612D; this.motionZ += (Math.signum(d2) * 0.5D - this.motionZ) * 0.10000000149011612D; float f = (float)(Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) - 90.0F; float f1 = MathHelper.wrapAngleTo180_float(f - this.rotationYaw); this.moveForward = 0.5F; this.rotationYaw += f1;
Merci d’avance.
-
openGL -> rendu du jeu.
çà c’est du java pur. Si tu n’arrives pas à comprendre le code, çà ne sert à rien d’essayer de le modifier.
-
Ben mon but c’est de le comprendre pour ensuite le modifier donc c’est pour ça que je m’en remet à vous.
-
Commençons par le commencement : d’où provient ce code ?
-
Pour faire simple c’est un code copié collé de l’EntityBat et c’est celui qui gère son déplacement dans l’espace lorsqu’elle n’est pas suspendue à un block.
Et voila la classe en entier:
package net.minecraft.entity.passive; import java.util.Calendar; import net.minecraft.entity.Entity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class EntityBat extends EntityAmbientCreature { /** Coordinates of where the bat spawned. */ private ChunkCoordinates spawnPosition; private static final String __OBFID = "CL_00001637"; public EntityBat(World p_i1680_1_) { super(p_i1680_1_); this.setSize(0.5F, 0.9F); this.setIsBatHanging(true); } protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(16, new Byte((byte)0)); } /** * Returns the volume for the sounds this mob makes. */ protected float getSoundVolume() { return 0.1F; } /** * Gets the pitch of living sounds in living entities. */ protected float getSoundPitch() { return super.getSoundPitch() * 0.95F; } /** * Returns the sound this mob makes while it's alive. */ protected String getLivingSound() { return this.getIsBatHanging() && this.rand.nextInt(4) != 0 ? null : "mob.bat.idle"; } /** * Returns the sound this mob makes when it is hurt. */ protected String getHurtSound() { return "mob.bat.hurt"; } /** * Returns the sound this mob makes on death. */ protected String getDeathSound() { return "mob.bat.death"; } /** * Returns true if this entity should push and be pushed by other entities when colliding. */ public boolean canBePushed() { return false; } protected void collideWithEntity(Entity p_82167_1_) {} protected void collideWithNearbyEntities() {} protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(6.0D); } public boolean getIsBatHanging() { return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0; } public void setIsBatHanging(boolean p_82236_1_) { byte b0 = this.dataWatcher.getWatchableObjectByte(16); if (p_82236_1_) { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 1))); } else { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -2))); } } /** * Returns true if the newer Entity AI code should be run */ protected boolean isAIEnabled() { return true; } /** * Called to update the entity's position/logic. */ public void onUpdate() { super.onUpdate(); if (this.getIsBatHanging()) { this.motionX = this.motionY = this.motionZ = 0.0D; this.posY = (double)MathHelper.floor_double(this.posY) + 1.0D - (double)this.height; } else { this.motionY *= 0.6000000238418579D; } } protected void updateAITasks() { super.updateAITasks(); if (this.getIsBatHanging()) { if (!this.worldObj.getBlock(MathHelper.floor_double(this.posX), (int)this.posY + 1, MathHelper.floor_double(this.posZ)).isNormalCube()) { this.setIsBatHanging(false); this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1015, (int)this.posX, (int)this.posY, (int)this.posZ, 0); } else { if (this.rand.nextInt(200) == 0) { this.rotationYawHead = (float)this.rand.nextInt(360); } if (this.worldObj.getClosestPlayerToEntity(this, 4.0D) != null) { this.setIsBatHanging(false); this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1015, (int)this.posX, (int)this.posY, (int)this.posZ, 0); } } } else { if (this.spawnPosition != null && (!this.worldObj.isAirBlock(this.spawnPosition.posX, this.spawnPosition.posY, this.spawnPosition.posZ) || this.spawnPosition.posY < 1)) { this.spawnPosition = null; } if (this.spawnPosition == null || this.rand.nextInt(30) == 0 || this.spawnPosition.getDistanceSquared((int)this.posX, (int)this.posY, (int)this.posZ) < 4.0F) { this.spawnPosition = new ChunkCoordinates((int)this.posX + this.rand.nextInt(7) - this.rand.nextInt(7), (int)this.posY + this.rand.nextInt(6) - 2, (int)this.posZ + this.rand.nextInt(7) - this.rand.nextInt(7)); } double d0 = (double)this.spawnPosition.posX + 0.5D - this.posX; double d1 = (double)this.spawnPosition.posY + 0.1D - this.posY; double d2 = (double)this.spawnPosition.posZ + 0.5D - this.posZ; this.motionX += (Math.signum(d0) * 0.5D - this.motionX) * 0.10000000149011612D; this.motionY += (Math.signum(d1) * 0.699999988079071D - this.motionY) * 0.10000000149011612D; this.motionZ += (Math.signum(d2) * 0.5D - this.motionZ) * 0.10000000149011612D; float f = (float)(Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) - 90.0F; float f1 = MathHelper.wrapAngleTo180_float(f - this.rotationYaw); this.moveForward = 0.5F; this.rotationYaw += f1; if (this.rand.nextInt(100) == 0 && this.worldObj.getBlock(MathHelper.floor_double(this.posX), (int)this.posY + 1, MathHelper.floor_double(this.posZ)).isNormalCube()) { this.setIsBatHanging(true); } } } /** * 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; } /** * Called when the mob is falling. Calculates and applies fall damage. */ protected void fall(float p_70069_1_) {} /** * Takes in the distance the entity has fallen this tick and whether its on the ground to update the fall distance * and deal fall damage if landing on the ground. Args: distanceFallenThisTick, onGround */ protected void updateFallState(double p_70064_1_, boolean p_70064_3_) {} /** * Return whether this entity should NOT trigger a pressure plate or a tripwire. */ public boolean doesEntityNotTriggerPressurePlate() { return true; } /** * Called when the entity is attacked. */ public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_) { if (this.isEntityInvulnerable()) { return false; } else { if (!this.worldObj.isRemote && this.getIsBatHanging()) { this.setIsBatHanging(false); } return super.attackEntityFrom(p_70097_1_, p_70097_2_); } } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound p_70037_1_) { super.readEntityFromNBT(p_70037_1_); this.dataWatcher.updateObject(16, Byte.valueOf(p_70037_1_.getByte("BatFlags"))); } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound p_70014_1_) { super.writeEntityToNBT(p_70014_1_); p_70014_1_.setByte("BatFlags", this.dataWatcher.getWatchableObjectByte(16)); } /** * Checks if the entity's current position is a valid location to spawn this entity. */ public boolean getCanSpawnHere() { int i = MathHelper.floor_double(this.boundingBox.minY); if (i >= 63) { return false; } else { int j = MathHelper.floor_double(this.posX); int k = MathHelper.floor_double(this.posZ); int l = this.worldObj.getBlockLightValue(j, i, k); byte b0 = 4; Calendar calendar = this.worldObj.getCurrentDate(); if ((calendar.get(2) + 1 != 10 || calendar.get(5) < 20) && (calendar.get(2) + 1 != 11 || calendar.get(5) > 3)) { if (this.rand.nextBoolean()) { return false; } } else { b0 = 7; } return l > this.rand.nextInt(b0) ? false : super.getCanSpawnHere(); } } }
-
Ici on récupère la distance entre la chauve souris et son spawn :
double d0 = (double)this.spawnPosition.posX + 0.5D - this.posX; double d1 = (double)this.spawnPosition.posY + 0.1D - this.posY; double d2 = (double)this.spawnPosition.posZ + 0.5D - this.posZ;
Ensuite on la déplace :
this.motionX += (Math.signum(d0) * 0.5D - this.motionX) * 0.10000000149011612D; this.motionY += (Math.signum(d1) * 0.699999988079071D - this.motionY) * 0.10000000149011612D; this.motionZ += (Math.signum(d2) * 0.5D - this.motionZ) * 0.10000000149011612D;
En gros, Math.signum renvoie 0 si le nombre fournit est 0, elle renvoie 1.0 si le nombre est supérieur à 0, et -1.0 si le nombre est inférieur à 0. On le multiplie par 0.5 pour faire un déplacement pas trop grand. On y soustrait le motion pour avoir un déplacement un peu random (je pense). et on le multiplie par 0.1… pour la même raison : aller moins vite.
float f = (float)(Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) - 90.0F; float f1 = MathHelper.wrapAngleTo180_float(f - this.rotationYaw); this.moveForward = 0.5F; this.rotationYaw += f1;
Et là je pense que tu auras reconnu le théorème d’un célèbre mathématicien. Ce qui permet de diriger la chauve-souris vers sa destination.
-
Merci de ta réponse, je comprends beaucoup mieux maintenant et j’ai réussi à faire volé mon oiseau. Tu avais raison le : this.motion… influence bien les mouvements. Encore merci à toi SCAREX