Résolu Un Timer
-
Après avoir fait moult recherches et crée un topic sur Ironcraft , c’est ici que je pose ma question. Mon mod ajoute des fusils ( pas un mod TRO D4RK KALL OF DIOUTY , hein ) mais mon problème , c’est que mes fusils tirent les balles instantanément , c’est bien pour une mitrailleuse mais pour un petit fusil :s
Voila mon code :package mods.nono.MGSmod.weapons; import mods.nono.MGSmod.ShotsType.EntityShoot; import mods.nono.MGSmod.ShotsType.EntityShootExplosive; import mods.nono.MGSmod.ShotsType.EntityShootExplosiveUber; import mods.nono.MGSmod.ShotsType.EntityShootSimple; import mods.nono.MGSmod.ShotsType.EntityShootSimpleTranq; import mods.nono.MGSmod.common.Main; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class W_MK22 extends Item { public W_MK22(int par1) { super(par1); this.maxStackSize = 1; // dit qu'il ne peut avoir que 1 pistolet this.setCreativeTab(Main.MGSTAB); } public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { boolean flag = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0; if(flag || par3EntityPlayer.inventory.hasItem(Main.SOammo.itemID)) { par2World.spawnEntityInWorld(new EntityShootSimpleTranq(par2World, par3EntityPlayer, 1)); par3EntityPlayer.inventory.consumeInventoryItem(Main.SOammo.itemID); } return par1ItemStack; } @Override public void registerIcons(IconRegister iconRegister) { itemIcon = iconRegister.registerIcon("nono/MGSmod:MK22"); } }
La classe EntityShootSimpleTranq :
package mods.nono.MGSmod.ShotsType; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public class EntityShootSimpleTranq extends EntityThrowable { private static final Entity thrower = null; private int ticksInGround; public EntityShootSimpleTranq(World par1World, EntityLiving par2EntityLiving, float speed) { super(par1World, par2EntityLiving); this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, speed, 1.0F); } public void setThrowableHeading(double par1, double par3, double par5, float par7, float par8) { float f2 = MathHelper.sqrt_double(par1 * par1 + par3 * par3 + par5 * par5); par1 /= (double)f2; par3 /= (double)f2; par5 /= (double)f2; par1 += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)par8; par3 += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)par8; par5 += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)par8; par1 *= (double)par7; par3 *= (double)par7; par5 *= (double)par7; this.motionX = par1; this.motionY = par3; this.motionZ = par5; float f3 = MathHelper.sqrt_double(par1 * par1 + par5 * par5); this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(par1, par5) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(par3, (double)f3) * 180.0D / Math.PI); this.ticksInGround = 0; } /* * if(var1.entityHit !=null){ * if(var1.entityHit !=null){ */ @Override protected void onImpact(MovingObjectPosition var1) { if(var1.entityHit != null) { var1.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.thrower), 0); this.setDead(); } else { this.setDead(); } } public void onUpdate() { super.onUpdate(); if(this.ticksExisted == 175) ; } protected float getGravityVelocity() { return 0; } }
Le truc que j’aimerais faire :
<> Tire l’entitée
<> Inutilisable Pendant x ticks ( 1 ticks = 1/20 de seconde je crois )
<> RéutilisableMerci d’avance pour vos réponses.
-
Dans le update, fait un truc dans le genre :
public int timer = nombre_de_ticks public int nombrre_de_tick = [TON NOMBRE DE TICKS] dans la méthode update : if(timer == nombre de ticks){ ton code timer = 0; } else { if ( timer <= nombre_de_tick ) { timer++; } else { } }
Explication :
Tu créer une variable ( timer ) qui sert va se mettre a 0 quand elle est utilisée, puis qui va monter de 1 a chaque ticks.
-
un timer normal en java :
for(int i = 1; i <= 10; i++) { /*Ton code */ }
Essaye maintenant comme ceci :
for(int i = 1; i <= 10; i++) { /*Ton code*/ }
En remplaçant 10 pour un gros chiffres, pour faire un bon timer :)___
Essaye ça :int nb = 0; do{ /*Ton code */ nb = 0; for(int i = 1; i <= 10/*Remplacer 10 par un gros nombre*/; i++) { } nb = 1; }while(nb = 1);
-
Merci, mais j’ai une erreur a :
package mods.nono.MGSmod.weapons; import mods.nono.MGSmod.ShotsType.EntityShoot; import mods.nono.MGSmod.ShotsType.EntityShootExplosive; import mods.nono.MGSmod.ShotsType.EntityShootExplosiveUber; import mods.nono.MGSmod.ShotsType.EntityShootSPAS12; import mods.nono.MGSmod.ShotsType.EntityShootSimple; import mods.nono.MGSmod.common.Main; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class W_SPAS12 extends Item { public W_SPAS12(int par1) { super(par1); this.maxStackSize = 1; //dit qu'il ne peut avoir que 1 pistolet this.setCreativeTab(Main.MGSTAB); } public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { int nb = 0; do{ boolean flag = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0; if (flag || par3EntityPlayer.inventory.hasItem(Main.plomb.itemID)) { par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 1)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 2)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 3)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 4)); par3EntityPlayer.inventory.consumeInventoryItem(Main.plomb.itemID); } nb = 0; for(int i = 1; i <= 60/*Remplacer 10 par un gros nombre*/; i++) { } nb = 1; }while(nb = 1); return par1ItemStack; } @Override public void registerIcons(IconRegister iconRegister) { itemIcon = iconRegister.registerIcon("nono/MGSmod:SPAS12"); } }
}while(nb = 1);
Et puis j’ai essayé ça :
package mods.nono.MGSmod.weapons; import mods.nono.MGSmod.ShotsType.EntityShoot; import mods.nono.MGSmod.ShotsType.EntityShootExplosive; import mods.nono.MGSmod.ShotsType.EntityShootExplosiveUber; import mods.nono.MGSmod.ShotsType.EntityShootSPAS12; import mods.nono.MGSmod.ShotsType.EntityShootSimple; import mods.nono.MGSmod.common.Main; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class W_SPAS12 extends Item { private int nombre_de_ticks; public int timer = nombre_de_ticks; public int nombrre_de_tick = 600; public W_SPAS12(int par1) { super(par1); this.maxStackSize = 1; //dit qu'il ne peut avoir que 1 pistolet this.setCreativeTab(Main.MGSTAB); } public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { if(timer == nombre_de_ticks){ // boolean flag = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0; if (flag || par3EntityPlayer.inventory.hasItem(Main.plomb.itemID)) { par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 1)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 2)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 3)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 4)); par3EntityPlayer.inventory.consumeInventoryItem(Main.plomb.itemID); } timer = 0; } else { if ( timer <= nombre_de_ticks ) { timer++; } else { } } return par1ItemStack; } @Override public void registerIcons(IconRegister iconRegister) { itemIcon = iconRegister.registerIcon("nono/MGSmod:SPAS12"); } }
Mais ça ne marche pas …
-
@Gugu42 Etant donné que les items n’ont pas de méthode update(), il faudrait préciser quelle méthode update!
De tête, je dirais qu’il faudrait intercepter les événements PlayerUpdateEvent (s’il existe, sinon c’est EntityUpdateEvent en vérifiant que l’entitée est bien un joueur) pour mettre à jour le timer.@MrCupCakeMonster Cela ne fera que faire freezer le jeu pendant un certain temps. Il va faire la boucle sans rafraîchir l’écran dans ce cas là.
EDIT: Nolan-XX, ce système ne fera pas grand chose, mais l’erreur ici est que tu as fait une affection à la place d’une condition. C’est-à-dire que tu dois vérifier que nb est égal à 1, comme ceci:
while(nb == 1)
-
@‘jglrxavpok’:
@Gugu42 Etant donné que les items n’ont pas de méthode update(), il faudrait préciser quelle méthode update!
De tête, je dirais qu’il faudrait intercepter les événements PlayerUpdateEvent (s’il existe, sinon c’est EntityUpdateEvent en vérifiant que l’entitée est bien un joueur) pour mettre à jour le timer.@MrCupCakeMonster Cela ne fera que faire freezer le jeu pendant un certain temps. Il va faire la boucle sans rafraîchir l’écran dans ce cas là.
EDIT: Nolan-XX, ce système ne fera pas grand chose, mais l’erreur ici est que tu as fait une affection à la place d’une condition. C’est-à-dire que tu dois vérifier que nb est égal à 1, comme ceci:
while(nb == 1)
J’ai plus le code de mon Oblitérateur B6 ( voir ma chaîne YouTube ) qui avait un cooldown ( Donc un timer ), donc j’ai pas retrouvé le méthode d’Update, mais c’était sûrement celle-ci
-
@‘Gugu42’:
@‘jglrxavpok’:
@Gugu42 Etant donné que les items n’ont pas de méthode update(), il faudrait préciser quelle méthode update!
De tête, je dirais qu’il faudrait intercepter les événements PlayerUpdateEvent (s’il existe, sinon c’est EntityUpdateEvent en vérifiant que l’entitée est bien un joueur) pour mettre à jour le timer.@MrCupCakeMonster Cela ne fera que faire freezer le jeu pendant un certain temps. Il va faire la boucle sans rafraîchir l’écran dans ce cas là.
EDIT: Nolan-XX, ce système ne fera pas grand chose, mais l’erreur ici est que tu as fait une affection à la place d’une condition. C’est-à-dire que tu dois vérifier que nb est égal à 1, comme ceci:
while(nb == 1)
J’ai plus le code de mon Oblitérateur B6 ( voir ma chaîne YouTube ) qui avait un cooldown ( Donc un timer ), donc j’ai pas retrouvé le méthode d’Update, mais c’était sûrement celle-ci
A part faire planter le jeu , ça ne marche pas …
-
package tutoriel.common; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class ItemTutorial extends Item { private boolean canShot; public ItemTutorial(int id) { super(id); this.setCreativeTab(CreativeTabs.tabMaterials); } public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if(canShot) { world.playSoundAtEntity(player, "modtutoriel:explosion", 1.0F, 1.0F); world.newExplosion(null, player.posX, player.posY, player.posZ, 5, true, true); canShot = false; } return stack; } public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean hasItemInHand) { if(hasItemInHand && world.getWorldTime() % 16L == 0L && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)entity; player.addChatMessage("tu peux tirer"); canShot = true; } } }
Bon parcontre je l’ai fais en 1.6, mais normalement ça devrait aussi fonctionner. Je me sers du temps de minecraft, si le reste de la division par 16 donne 0 alors le canshot passe sur true. J’ai essayé, ça marche très bien, avec ce code je peux créer une explosion tout les 3 secondes environ, alors que si je mets directement le code pour l’explosion or de la condition, je peux faire une explosion à chaque clic droit (donc facile 5 par secondes)
-
@‘robin4002’:
package tutoriel.common; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class ItemTutorial extends Item { private boolean canShot; public ItemTutorial(int id) { super(id); this.setCreativeTab(CreativeTabs.tabMaterials); } public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if(canShot) { world.playSoundAtEntity(player, "modtutoriel:explosion", 1.0F, 1.0F); world.newExplosion(null, player.posX, player.posY, player.posZ, 5, true, true); canShot = false; } return stack; } public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean hasItemInHand) { if(hasItemInHand && world.getWorldTime() % 16L == 0L && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)entity; player.addChatMessage("tu peux tirer"); canShot = true; } } }
Bon parcontre je l’ai fais en 1.6, mais normalement ça devrait aussi fonctionner. Je me sers du temps de minecraft, si le reste de la division par 16 donne 0 alors le canshot passe sur true. J’ai essayé, ça marche très bien, avec ce code je peux créer une explosion tout les 3 secondes environ, alors que si je mets directement le code pour l’explosion or de la condition, je peux faire une explosion à chaque clic droit (donc facile 5 par secondes)
Avec ce code , je ne peux plus tirer et le message “tu peux tirer” s’affiche en boucle :s …
-
Tu as fais un copier/coller exacte ou tu as juste repris ce que tu avais besoin ?
Pour le message, il te suffit d’enlever
EntityPlayer player = (EntityPlayer)entity;
player.addChatMessage(“tu peux tirer”);
Je l’avais mit pour les tests, tu peux l’enlever -
J’ai juste repris ce dont j’avais besoin …
Mon code :package mods.nono.MGSmod.weapons; import mods.nono.MGSmod.ShotsType.EntityShoot; import mods.nono.MGSmod.ShotsType.EntityShootExplosive; import mods.nono.MGSmod.ShotsType.EntityShootExplosiveUber; import mods.nono.MGSmod.ShotsType.EntityShootSPAS12; import mods.nono.MGSmod.ShotsType.EntityShootSimple; import mods.nono.MGSmod.common.Main; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class W_SPAS12 extends Item { private boolean canShot; public W_SPAS12(int par1) { super(par1); this.maxStackSize = 1; //dit qu'il ne peut avoir que 1 pistolet this.setCreativeTab(Main.MGSTAB); } public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player, ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { if(canShot) { boolean flag = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0; if (flag || par3EntityPlayer.inventory.hasItem(Main.plomb.itemID)) { par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 1)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 2)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 3)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 4)); par3EntityPlayer.inventory.consumeInventoryItem(Main.plomb.itemID); } canShot = false; } return stack; } public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean hasItemInHand) { if(hasItemInHand && world.getWorldTime() % 16L == 0L && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)entity; player.addChatMessage("tu peux tirer"); canShot = true; } } /*public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { boolean flag = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0; if (flag || par3EntityPlayer.inventory.hasItem(Main.plomb.itemID)) { par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 1)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 2)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 3)); par2World.spawnEntityInWorld(new EntityShootSPAS12(par2World, par3EntityPlayer, 4)); par3EntityPlayer.inventory.consumeInventoryItem(Main.plomb.itemID); } return par1ItemStack; }*/ @Override public void registerIcons(IconRegister iconRegister) { itemIcon = iconRegister.registerIcon("nono/MGSmod:SPAS12"); } }
-
Le canShot = false; déplace-le dans la condition pour tirer, après par3EntityPlayer.inventory.consumeInventoryItem(Main.plomb.itemID);
-
Aucun effet … je ne peux plus tirer :s
sinon Player133 est un pedobear o/ -
Je vois vraiment pas …
Si ça ne te dérange pas, tu peux me passer toutes tes sources pour que je puisse travailler directement dessus ?
Ha en passant, ceci :|| EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0
Est à enlever, car si un joueur trouve un moyen de mettre infinity sur ton arme, il aura plus besoin de munition.
-
Cette ligne ne correspond pas à ce qu’on veut faire:
world.getWorldTime() % 16L == 0L
Elle fait en sorte que le joueur puisse tirer toutes les 16 ticks (ça veut dire si on tire à 15 ticks, lors de la frame suivante on peut retirer), or on veut que il puisse retirer 16 ticks après avoir utilisé l’arme, peu importe quand on tire.
Exemple de code venant d’un jeu que je suis en train de développer (j’ai simplifié au max histoire que ce soit plus compréhensible):
public void update() { super.update(); if(shootTimer > 0) shootTimer–; if(Gdx.input.isKeyPressed(Keys.L)) // <-- Correspond à l'utilisation de l'arme { if(shootTimer == 0) { shoot(); } } } private void shoot() { shootTimer = 12; // <-- On dit que l'on devra attendre 12 frames (ou ticks) }
-
Ça fonctionne parfaitement, merci Xavpok :
package mods.nono.MGSmod.weapons; import mods.nono.MGSmod.ShotsType.EntityShoot; import mods.nono.MGSmod.ShotsType.EntityShootExplosive; import mods.nono.MGSmod.ShotsType.EntityShootExplosiveUber; import mods.nono.MGSmod.ShotsType.EntityShootSimple; import mods.nono.MGSmod.ShotsType.EntityShootSimpleTranq; import mods.nono.MGSmod.common.Main; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class W_MK22 extends Item { private int shootTimer; public W_MK22(int id) { super(id); this.maxStackSize = 1; // dit qu'il ne peut avoir que 1 pistolet this.setCreativeTab(Main.MGSTAB); } public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if(player.capabilities.isCreativeMode || player.inventory.hasItem(Main.SOammo.itemID)) { if(shootTimer == 0) { world.spawnEntityInWorld(new EntityShootSimpleTranq(world, player, 1)); player.inventory.consumeInventoryItem(Main.SOammo.itemID); shootTimer = 20; } } return stack; } public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean hasItemInHand) { if(shootTimer > 0) { shootTimer–; } } @Override public void registerIcons(IconRegister iconRegister) { itemIcon = iconRegister.registerIcon("nono/MGSmod:MK22"); } }
-
@‘jglrxavpok’:
Cette ligne ne correspond pas à ce qu’on veut faire:
world.getWorldTime() % 16L == 0L
Elle fait en sorte que le joueur puisse tirer toutes les 16 ticks (ça veut dire si on tire à 15 ticks, lors de la frame suivante on peut retirer), or on veut que il puisse retirer 16 ticks après avoir utilisé l’arme, peu importe quand on tire.
Exemple de code venant d’un jeu que je suis en train de développer (j’ai simplifié au max histoire que ce soit plus compréhensible):
public void update() { super.update(); if(shootTimer > 0) shootTimer–; if(Gdx.input.isKeyPressed(Keys.L)) // <-- Correspond à l'utilisation de l'arme { if(shootTimer == 0) { shoot(); } } } private void shoot() { shootTimer = 12; // <-- On dit que l'on devra attendre 12 frames (ou ticks) }
Merci a toi ! Grace a ton code ( et a robin4002) j’ai réussi ! Un grand merci !
-
comment faire pour inverser le timer pour que l’action s’effectue apres 15 ticks