Un Timer
-
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) > 0Est à 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 == 0LElle 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 == 0LElle 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